Skip to content

Your console

Where your team sets up its integration with Doshi and watches it run — keys, allowed origins, allowed IPs, rejected and recent exchanges, members, the pause, and the emails about Live changes.

Your Doshi console is where your team sets up and runs its integration. It holds both your environments, Live and Test, and its header switches between them. Its address is in Getting access.

The Integration tab of Settings, in the menu under your name, holds the Setup values, signing keys, allowed origins, allowed IPs, and rejected and recent exchanges of the environment on screen, and Members lists its members. The guides for the iframe, the SDK and the webview start there. In the Academy, each course and lesson has a Copy id action, for opening Doshi on it with start.

Your console shows only what your team has from Doshi. Without Rewards, there is no Rewards page, no Rewards roles and no earning rates. Without the Academy, there is no Academy page and no Academy editor role. Ask Doshi to add either.

You sign in with your work email. The console emails you a six-digit code, and there is no password.

You get in by invite. Doshi sends your team’s first invite, as an admin. After that, an admin invites a teammate from the Staff page with one of five roles, and can change their role, resend, withdraw or remove them there. An invite expires after 7 days unless it is resent.

Role What they see
Admin Everything, including the Staff page
Developer Settings > Integration, and Members without its reset or removal
Academy editor The Academy, where they write and publish
Rewards reviewer Rewards, where they decide held redemptions
Rewards manager Rewards, including the catalogue, prices and limits

A role change applies from the teammate’s next click. Your team always keeps at least one admin who has signed in, so the last one can be neither removed nor given another role.

One staff list covers both environments, so a teammate you invite works in Live and Test alike.

The console’s footer names your company and your role there. Open it for your name and email, and for Sign out.

Working for several companies? A person can work for more than one company, each by its own invite and with its own role, and one sign-in opens them all. The footer’s menu lists them. Pick one to switch: the console keeps your page and environment, or opens the first page your role there sees. Each company’s console shows only its own keys, members and staff.

No access yet? Ask whoever runs your team’s console for an invite. If your company has no console yet, email hello@doshi.app.

The Setup values tab holds the values your server and page are set up with, each to copy. Under them is the code that uses them, with your values filled in: your server’s signing code in Node, Java and curl, signed with your newest active key, and your page’s side for the iframe, the SDK and the webview. Each is the code these guides show.

Beside the Embed URL, the builder makes the embed URL that opens Doshi somewhere else. Pick where it opens, Learn home or one of your published courses or lessons, and a language. It gives you the iframe URL and the matching SDK mount options, start and locale, each to copy. Every role that sees the Integration tab sees it, so a developer finds course and lesson ids here without the Academy.

Your backend signs every assertion with a private key, and the console holds the public half. Add a key with Add key, in the Integration tab’s setup steps or, after your first exchange, on its Signing keys tab. There are three ways:

Way What happens
Generate a key The console makes an ES256 key pair in your browser and keeps the public half. It shows you the private key once, with the four DOSHI_* variables to copy. Doshi never has the private key, so if you lose it, delete the key and make another.
Add your public key You paste the public half of a key you made. Use this for a key in your HSM or KMS, so the private key never passes through a browser. We recommend it for Live.
Use a JWKS URL You name an HTTPS URL that publishes the key, and we fetch it from there.

The last two are bringing your own key, which says what a pasted key and a JWKS must hold.

Each key gets a kid we make, and every assertion it signs names that kid. An issuer holds up to five active keys. The Code button beside a key shows the signing code with its kid filled in.

Disable stops a key at once, and Enable brings it back. Delete stops it at once and cannot be undone. To change keys without downtime, see Rotating your keys.

The Allowed origins tab lists the pages that may show Doshi. Until your first exchange, the setup step Allow the pages that show Doshi holds the same list. One list covers the iframe and the SDK: an origin on it may frame our page, and its pages may call our API from a mounted SDK. Leave off any origin you would not allow to do either.

Each origin follows these rules:

  • A bare https:// origin: a scheme, a host and an optional port, such as https://app.acme.example or https://app.acme.example:8443.
  • A lowercase host.
  • No path, query or wildcard. https://app.acme.example/coach and https://*.acme.example are both refused.
  • http://localhost in Test only, port optional, so you can test from your own machine. http://127.0.0.1 works too. Live takes https:// only.
  • Up to 20 origins per environment.

An origin you add or remove takes effect within a minute. Our page’s Content-Security-Policy: frame-ancestors names exactly these origins, so a page on any other origin cannot frame it, and our API answers a mounted SDK only from these origins.

An origin marked Not published is saved but not yet in effect. Press Publish again.

The Allowed IPs tab lists the addresses your servers may call the token exchange from. Each environment has its own list, and they mean different things:

  • Live accepts exchanges only from addresses on its list. While the list is empty, the tab says Not set and Doshi refuses every Live exchange. Add your servers before you go live.
  • Test accepts any address while its list is empty. Adding one turns the check on, and from then on Test refuses other addresses as Live does.

Each entry is one IPv4 address, such as 203.0.113.7, or an IPv4 range, such as 203.0.113.0/24, with an optional label such as “prod NAT eu-west-2a”. A range can be /16 at widest. IPv6 is refused: our gateway is reached over IPv4 only, so an IPv6 entry would never match. A list holds up to 50 entries. A change takes effect at once.

Suggested addresses lists the addresses your server called from in the last 7 days that the list does not cover, each marked Rejected or Minted with when it was last seen. Press Add beside one to add it. A rejected one was refused for its address, and only an assertion signed with your own key is ever refused for that, so nobody else can put an address here. Behind a NAT or a proxy, the address is the one your traffic leaves from.

Before you delete an entry, the console names any address that exchanged in the last 7 days that only this entry covers, since its exchanges stop at once. Deleting the last Live entry stops every Live exchange, so you type the address to confirm it.

Admins and developers change the lists; anyone who sees the Integration tab reads them.

Until your first successful token exchange, the Integration tab shows four steps: copy your Setup values, add a signing key, allow your pages, and make your first exchange. Live has a fifth, Add your server’s IP, before the exchange. It shows the suggested addresses as they arrive, so you can make your first exchange, let Doshi refuse it, and add the address it came from in one click.

Under them, the first-exchange panel watches your newest key. It turns green when that key mints its first member token, and names the member it made. If your exchange is rejected instead, the panel shows what your server was told and how to fix it.

The Rejected exchanges tab groups every rejection we could tie to your issuer, by reason and kid. Each group shows what your server was told and the fix from the error table. Open a group for its latest attempts, each with its customer ID, source IP and a Reference.

Filter by the last 24 hours, 7 days or 30 days, and by reason, kid or customer ID.

A malformed request, or an assertion with no iss or with one we do not know, cannot be tied to you, so it is not here. If your server gets invalid_client and the tab is empty, your iss is missing or does not match Setup values exactly.

To ask about an older rejection, email hello@doshi.app with its Reference.

The Recent exchanges tab lists the latest 50 exchanges that minted a member token, newest first. Each row shows its time, kid, customer ID, the member’s name and customer_since, and your server’s source IP. Use it to check that a working exchange carried the customer you meant. Filter by customer ID. It matches exactly.

The name and customer_since are the member’s latest values, not what that one exchange sent. Admins and developers see this tab.

The Members page lists your members newest first, with each one’s customer ID (your sub), name, language and last exchange. Search by part of a customer ID or a name to check whether one person got in. Filter narrows the list by edition, language, or whether a member has exchanged yet. Select a column heading to sort by it, and select it again to reverse the order.

In Test, Reset sends a member back to their first run. It deletes their coaching history and progress, and keeps their account and customer ID.

In Live and Test, an admin’s Remove member’s data erases a customer who has left, and your server can do the same in batches. See Removing a member.

The Rewards page’s Catalogue tab holds the rewards your members redeem points for. Live and Test share it. A Rewards manager changes it; a Rewards reviewer reads it.

Add gift cards searches the gift card provider’s catalogue for your country and currency, by name and category. Tick several brands, choose the values once (5, 10 and 25 to start), and add them. Each gift card gets the values it comes in and goes last in the catalogue, published. One that comes in none of them arrives as a draft marked Pick a value. Its name starts as the brand’s in every language, and its image is copied from the provider.

You can also create an in-house reward, something you pay out yourself, with a name, a “what you get” line and a paid line per language. It starts as a draft.

In the catalogue, move a reward up or down, publish or unpublish it, change its values, rename it per language, replace its image, or delete it while no member has redeemed it. Only your default language must be filled in; another language left blank shows the default. A gift card the provider no longer offers is marked Removed by the provider.

The Rewards page’s Limits tab sets the price of every reward. A Rewards manager changes it; a Rewards reviewer reads it. Live and Test share it.

The point rate is a whole number of points per one unit of your currency, 1,000 to start. Change it now, or from a date and time to come. Times are in UTC. Members see a new rate the moment it applies, with nothing for you to run. A redemption keeps the price it was asked at.

An Offer is a different rate over the whole catalogue for a set time. It starts now or at a time to come, and the rate returns on its own when it ends. Two Offers cannot overlap. Edit an Offer until it ends, though a running one keeps its start. End now stops a running Offer; Withdraw removes one before it starts.

Chosen value lets members type a gift card’s amount between a smallest and a largest, in whole units. It is off to start.

Delivery email sends each gift card to an address the member gives as well. It is on to start. Turn it off if your bank forbids links in customer email: the redeem form then asks for no address and no email is sent.

The History tab lists every change to the catalogue and to these limits, with who made it, when, and the old and new values.

Pause integration stops Doshi minting member tokens for every key of the environment on screen at once. Every exchange is refused with invalid_client until you resume. A member already inside keeps their current member token until it expires.

If a private key may have leaked:

  1. Pause integration in the key’s environment.
  2. Delete the key.
  3. Add a new one, and sign with it.
  4. Resume.

Email hello@doshi.app only if you cannot sign in to your console.

When someone adds, deletes, enables or disables a signing key in Live, adds or deletes a Live allowed IP, or pauses or resumes your Live integration, Doshi emails every admin on your team who has signed in. Each change sends one email. It names who made the change, by the name your team gave them or else their email address, what they did, the key’s kid or the address, and the time in UTC. It links to your Live Integration tab.

The email carries no key material and no member data, so it is safe to forward. Changes in Test send no email, and nor do changes to allowed origins.

If you don’t recognise a change, check your team on the Staff page. If a key may have leaked, follow the steps under Pause integration.