Link Demo Playground
Launch the real hosted Connect flow against BillerAPI's sandbox — no real biller and no integration code. Sign in, paste your sandbox client id, pick a biller and a scenario, and step through Connect exactly as your users would.
Everything here runs against sandbox
link_token using the sandbox API key from your signed-in dashboard and opens the hosted /connect page in a new tab. No real biller is contacted and no money moves. Grab a sandbox client id at /developer/keys.Get a sandbox client id at /developer/keys. When you're signed in, we pair it with your sandbox secret automatically to mint the token.
Outcome
Successful link
Credentials accepted; one residential account; one bill due in 15 days.
The hosted flow uses this biller's canonical magic account 4242424242 automatically — any username/password drives the Successful link scenario.
See the magic account numbers reference for every scenario.
Launch sandbox Connect
Mints a sandbox link_token for sb_utility and opens /connect in a new tab.
Mint the link_token server-side — your secret never reaches the browser. The Launch button above does it client-side with your signed-in sandbox secret. That's fine for a demo, but never ship your secret to the browser in production.
# Mint a sandbox link_token, then open
# /connect?linkToken=<link_token>&client_id=<your sandbox client id>
# (both query params are required — /connect cannot initialize from one alone)
curl -X POST https://sandbox.api.billerapi.com/v1/link-tokens \
-H "Authorization: Bearer $BILLERAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "client_user_id": "docs_demo", "biller_id": "sb_utility" }'
# => { "link_token": "sb_link_tok_...", "link_token_id": "sb_ltk_...", "expires_at": "..." }How the flow fits together
Server mints a link_token
POST /v1/link-tokens with your client id + API key. Sandbox keys use the bak_test_ prefix; production keys use bak_live_. The mint belongs on YOUR backend.
Browser launches Connect with the token
The Elements SDK .connect({ linkToken }).open() opens the hosted /connect iframe. The playground opens it in a new tab instead so you can watch the whole flow.
onEvent streams the funnel
As the user moves through panes, the hosted page emits connect/* events to your onEvent handler — connect/view, connect/authenticated, connect/error, and so on.
Webhooks confirm the outcome
link.completed (interactive) or link_token.completed (backgrounded) is the authoritative signal that the link is ready. SDK callbacks are UX hints only.
Next steps
- → Elements SDK guide — wire
.connect()into your own app. - → Connect Events reference — the full
connect/*onEvent taxonomy. - → Magic account numbers — every sandbox scenario and the account number that triggers it.
- → Set up webhooks — confirm link outcomes server-side.