Skip to main content
The object you work with is an account — your agent’s login at one third-party app. You get one with a single call:
  • Connect an account you already own (POST /v1/connections), or
  • Register a new one where the app’s terms permit it (POST /v1/registrations).
Both return the same object plus the run that logs in. Everything else — the credential vault, the logged-in browser session, the mailbox that receives verification codes — hangs off that account. The email address is plumbing. You don’t create one first; omit identityId and Sente provisions the backing identity for you.

One call

The account

The API returns the same projection everywhere (POST /v1/connections calls it connection, POST /v1/registrations calls it registration — same object, same id space, reg_…): kind is the whole security boundary between the two paths: The two never co-mingle at the same app. register over a connected account returns 409 ALREADY_CONNECTED; connect over a created one returns 409 ALREADY_REGISTERED.

The identity is plumbing

An identity is a real mailbox on sente.run. It exists so verification email has somewhere to land — and, for a created account, so the app has an address to sign up with. When you omit identityId, Sente derives the local part from the app’s hostname: Addresses are globally unique, so a taken local part gets a random suffix rather than an error. If the create then fails, the auto-provisioned identity is rolled back, so a failed connect doesn’t eat your plan’s identity cap.
Auto-provisioning is per call, not per app. Two connect calls for the same app with no identityId produce two identities and two separate accounts — and consume two identity slots. Keep the returned id (or pass identityId) when you mean “the account I already made”.

One account per (identity, app origin)

The uniqueness key is the identity plus the app’s origin — scheme, host and port, lowercased, path and query stripped.
  • https://app.example.com/signup and https://app.example.com/ are the same account.
  • https://example.com and https://app.example.com are different accounts.
That makes the create calls idempotent for one identity:
Runs and sessions serialize per identity: one run at a time, one live browser session. Ten accounts under ten identities work in parallel; ten under one identity queue behind each other.

When to pass identityId

Creating one explicitly is a normal call:

What is stored where

One consequence worth planning around: every app under one identity emails the same address. That is what makes verification work without per-app inbox plumbing — and why an identity shared across ten apps has one busy mailbox.

Failure paths

Next steps

Connect an account you own

The owner-authorized path: credentials in write-only, TOTP re-login, revoke at any time.

Register a new account

Where terms permit — including what reliably doesn’t work.

Sessions

Turn an account into a logged-in browser: CDP URL or Playwright storageState.

Runs

The job that does the logging in: lifecycle, statuses, error codes.