Skip to main content
The Sente API is one HTTP surface for the whole account lifecycle: connect or register an account at a third-party app, watch the run that drives it, read the verification email that lands in the account’s own inbox, and hand the logged-in session to your code. Everything below applies to every endpoint — read it once, then work from the per-resource pages.

Base URL

All endpoints accept and return JSON. Request bodies are validated with zod; invalid input returns 400 with the validation issues in the error field.
The dashboard at app.sente.run talks to Sente through its own internal proxy (session-authenticated) — that is not the public API. Integrations always use https://api.sente.run/v1 with an API key.

Authentication

Every /v1 endpoint requires an API key. Create one on the dashboard (API keys page). Keys look like sk_sente_... and are stored hashed — copy the key when it is shown, because it is never displayed again. Pass it in either header:
A missing key returns 401 {"error":"missing api key"}; an unknown or revoked key returns 401 {"error":"invalid api key"}. Keys are org-scoped. Every resource belongs to the organization that created it. Requesting another org’s resource returns 404 — the API never confirms that a resource exists outside your org.

Error format

Errors are JSON objects with an error field. Errors your code should branch on also carry a stable code:
Filter parameters are not validated against a value set. GET /v1/runs?status=nope returns [] rather than a 400 — an empty result is not proof that a filter name was spelled correctly.

Rate and abuse caps

Sente sends from a shared mail domain and drives real browsers, so per-org caps protect deliverability and browser capacity for everyone. Plan-level caps are on Limits. Caps are checked before any side effect — a 429 send never reached the mail provider, a 429 run never started a browser. Failed runs never count against quota, so a run that fails on the app’s side costs you nothing.
A global per-org daily run brake sits underneath the plan caps, and the tighter of the two wins. On paid plans that brake, not the plan number, is usually what you hit first — it protects shared browser capacity during early access. Tell us if it’s in your way.

Check your usage

GET /v1/usage returns the plan’s caps and current consumption in one call — use it to back off before a 429 rather than after.
accounts.used counts registrations whose status is active and has no cap of its own — accounts are limited indirectly, by the run and identity caps.

Resources

Quickstart

One call to a working account, end to end.

Accounts

Why the account is the object and the identity is plumbing.

Limits

What blocks a run, and what each plan allows.