sk_…) key. Use it to register wallets as contacts, ingest form submissions, send pushes, and launch campaigns, everything that reads or writes data.
In plain terms. This is the toolkit your backend uses to talk to Onchain Suite directly, no dashboard, no browser. A developer keeps one secret key on the server and calls these to register wallets, pull in consented emails, send a push, or kick off a campaign. If all you want is notifications inside your dApp, you don’t need this, use the in-app SDK instead.
Authentication
Every call carries your secret key in a header. Two forms are accepted, use whichever your HTTP client makes easy:A
sk_test_… key runs against your workspace in test mode, which is the safe way to integrate before going live, custom events sent with a test key are dry-run, for example. Read-only keys reject writes with 403. See API keys for scopes, rolling, and revocation.Quickstart: ingest a capture
The highest-value first call for most backends: hand a consented email (and optional wallet) to a capture form from your server. If the form uses double opt-in, this kicks off the confirmation email; on confirmation the contact joins the bound list and can fire an automation.{token} is the form’s token), or the request 404s. See capture forms for the body fields and the confirmation flow.
The server-to-server surface
A secret key unlocks a small, deliberate set of endpoints. Reads never expose the email address itself.Email can’t be set through
POST /identify, by design. The only consent-first path for an address is a capture form, embedded or ingested server-side with the endpoint above.POST /identifyis idempotent on the wallet, lower-cases the address, and rejects any personal identifier (email,phone,name) with400 PERSONAL_IDENTIFIER_REJECTED. To attach traits, send a custom event instead.POST /campaigns/{id}/sendtakes a prepared campaign id, not thecampaignRunIdreturned by/inapp/push. It can’t compose or retarget; it launches what’s already in the dashboard.GET /contactsreturns a per-contactemailReachableandpushReachable(andtags), never the email itself.emailReachableistrueonly for a real, sendable email, a wallet-only contact’s synthetic placeholder address doesn’t count, so an email-first audience can key a send off it.pushReachableistruefor a connected wallet (an in-app push target). Narrow the list with?tag=and?hasWallet=true|false.GET /events/catalogis a dashboard (session) route, not a secret-key one, so ask_key gets401there.- Lists and tags are populated server-side with
tags/listIds/addToListonPOST /events(see custom events). Finding a list’s ID, adding contacts already in your audience, and renaming or deleting a list are dashboard (session) actions under/audience/…, not secret-key routes — see Tags, lists & segments.

