end_pk_live_...) names your organization and nothing else. It is safe to embed in page source, ship in a bundle, or commit to a public repository.
It exists so a browser can call the API without holding anything sensitive. One endpoint accepts it - POST /v1/taps, which exchanges a tap for a session token - and it authorizes nothing on its own: the authority in that exchange is the one-time e value from the tap, which cannot be forged and works exactly once.
That endpoint takes an API key too. Same path, same request, same response - the credential you send is what changes, so a page with no backend behind it and a server-side integration use the same call.
Retrieve your key
List your organization’s keys. If you have none yet, one is created on the first call, so you always get something usable.Response
Response
key once at build or deploy time and inline the value; there is no reason for a browser to fetch it at runtime.
string
The credential itself. Send it as
Authorization: Bearer end_pk_live_....string
live or sandbox. Only live keys are issued today.string
Display name, to tell keys apart when you have more than one.
What it can and cannot do
Losing control of a publishable key does not expose your data. Someone else holding it can only do what any visitor to your page could already do: exchange a genuine tap they physically performed for a session token scoped to that one chip.
Before it works in a browser
A publishable key is only half of browser setup. Browser requests carrying one are matched against your organization’s origin allow-list, so add the origins your pages are served from before going live - see CORS origins. A request with noOrigin header is not origin-checked: the allow-list governs where the key may be embedded, not who may call the API. The one-time e value from the tap remains the authority.
Next steps
CORS origins
Allow-list the origins your pages are served from.
Host your own verify page
Build the post-tap experience on your domain, with or without a backend.

