What a Domain is
A Domain is Five9’s own tenant boundary. You never type its identifier in: when you create a Five9 credential, GetDialed calls Five9 with the credentials you supplied, reads back the canonical Domain identifier fromgetVCCConfiguration, and binds the credential to that Domain — creating the record if this is the first time your account has connected to it.
The label comes from the catalog. Each platform publishes a tenancy_unit describing what it calls its own tenant record, so the API can label it correctly without a hard-coded lookup:
A Postmark Server is a narrower boundary than an Account, and that is the point. A Postmark account can hold many servers, and a server owns its own token, its own suppression list, its own inbound hook and its own message history. Anchoring on the server rather than the account is what keeps one connection’s mail — including the message content Postmark retains after delivery — out of another’s reach. See connecting Postmark.
A tenant’s identity always comes from the provider, never from you. There is no field to type an account id into on either platform — GetDialed calls the provider with the material you supplied and reads the canonical identifier back. That is what makes the record trustworthy as a budget key: an operator-typed identifier could collide with another account’s, drift after a rename, or simply be wrong, and every one of those failures would show up as two tenants quietly sharing one provider budget.The one exception is a tenant you name yourself, where there is no provider identity to discover — and those are marked
is_manual precisely so the two are never confused.Tenants you name yourself
Not every platform publishes a way to identify your account with it, and not every credential is tied to a vendor at all. For those, you supply the label instead of the platform: passtenant_name when creating the credential and GetDialed files it under a manual tenant of that name, in the same call. There is no create-the-tenant-first step.
A manual tenant is the same kind of record as a discovered one — it is listed, renamed and retired the same way — with two differences worth knowing:
- Its budget is empty. There is no provider publishing rate caps for it, so there are no caps to seed and nothing to correct against a live reading.
- Its name is unique to your organization only. Two organizations may both have a tenant called
acme-crm; nothing is claimed platform-wide.
is_manual on the tenant record tells the two apart, and you can filter a list on it.
One tenant, one budget
Five9’s rate limits are counted per Domain, not per login. Two credentials using two different Five9 users against the same Domain draw down the same 20-calls-per-minute upload allowance. GetDialed models that directly: the second credential resolves to a Domain that already exists, so it binds to the existing record rather than creating a duplicate. Every credential carries the resultingtenancy_id back-reference:
tenancy_id is server-managed — you cannot set it on create or update, and any value you send is ignored. Credentials sharing a tenancy_id are credential lanes into one budget.
One account per Domain
A Five9 Domain belongs to exactly one GetDialed account, platform-wide. This is not a per-organization check: if any other GetDialed account has already connected that Domain, your create is refused.POST /credentialsreturns409 Conflictwith a message telling you the Domain is already connected to another account and to reach out to us for support. Nothing is stored — no credentials, no record.- Both credential-test endpoints report the same thing at
200witherror: "PERMISSION_DENIED", so you find out before you save. Testing writes nothing either way.
Resolution is a network call to Five9. If the credentials are wrong or Five9 cannot be reached, creating the credential fails with a
400 rather than storing a credential that has no Domain. The failure message tells you which of the two happened without echoing anything Five9 said back.Rate buckets and effective limits
A Domain groups its limits into rate buckets, keyed by Five9’s ownapiOperationType names (Query, Modify, Upload, and so on). Each bucket holds the raw provider caps for three windows — 60 seconds, 3,600 seconds (one hour), and 86,400 seconds (one day) — seeded from the catalog defaults and then corrected against a live getCallCountersState reading taken on the same session that resolved the Domain.
On top of the raw caps sits a safety margin: a percentage, set per bucket, that can only ever reduce the budget.
1–100; anything above 100 is rejected, because a margin above the provider cap would hand out budget Five9 never granted, and 0 would be a permanent outage rather than a safety margin.
The stored minimum interval is not on this read surface yet. The bucket response above reports the caps, the margin, the payload cap and the effective budget; the pacing floor is enforced but not yet returned. To see the default your platform ships, read the service’s
rate_buckets in the catalog, which does publish it.sync_status tells you where the caps came from:
stale is a deliberate outcome, not a failure to fix. A garbled or zero-valued counter reading never overwrites a good stored cap, because a bad reading that zeroed a budget would silently stop all delivery against that Domain. Inspect sync_status rather than the status code when you refresh.
The caps above are the denominators; how much of each is left right now is a separate read. Quota and progress covers the remaining-budget surface, the queue depth with its estimated completion, a pre-flight cost estimate for an upload you have not sent yet, and — because several credentials can share one Domain’s budget — which credential has been spending it.
Lanes and ordering
Actions against a Domain are placed into one of four named dispatch lanes:
The catalog seeds a default lane per action. An admin can override that placement for their own Domain (
lane_overrides) and fix the order actions run in within a lane (lane_order). Ordering is an explicit ordered list of action IDs, not a numeric weight — the lane set is fixed and finite so the resulting order is deterministic and explainable.
Lane prioritization is in force: dispatch is paced against the effective budget, the lane order above decides who claims each freed call, and every lane carries a maximum wait that overrides that order rather than letting a busy lane starve a quieter one. Changing lane_overrides changes the order your work actually dispatches in. See lane order and the starvation floor for the weights, the per-lane bounds, and how the within-lane priority boost interacts with them. A lane can also be paused individually.
Endpoints
There are two views onto the same records./v1/tenants is the platform-agnostic one — it lists every tenant you hold across every platform, including the ones you named yourself. /v1/platforms/five9/domains is the Five9-flavored one, and it is where the Five9-specific operations live: the rate-bucket and lane tuning, the live limits refresh, and the quota surfaces.
All tenants — /v1/tenants
A rename changes the label and nothing else. A tenant’s identity is fixed when it is created, because every record that points at it — your credentials, its stored rate budget, queued work — is keyed on that identity. Nothing is keyed on the label, so renaming affects no credential, no budget and no queued work. Any field other than
label in the body is rejected with 422 rather than quietly ignored.
A retire is guarded, and never cascades. DELETE /tenants/{tenancy_id} is refused with 409 while anything still references the tenant — its credentials, its stored rate-limit budget, or queued dispatch work — because those records are keyed on it and would be left pointing at nothing. The refusal names which category is blocking and how many references it found. Nothing is written on a refusal, so the same request can be retried once the references are gone.
No credential and no stored secret is ever removed by retiring a tenant. The record is archived rather than destroyed and its tuned rate-limit configuration is kept, so re-adding the same provider account later restores your margins and lane settings instead of starting from defaults. Retiring an already-retired tenant succeeds — the operation is idempotent.
A tenancy id belonging to another organization returns 404, never 403, on all four.
Five9 Domains — /v1/platforms/five9/domains
Domains are system-managed: they are created by credential binding and released when the last bound credential is deleted, so there is deliberately no create endpoint here.
Reading one:
null is rejected rather than treated as “clear this”, and an empty body is a no-op that returns the record unchanged. A Domain ID belonging to another organization returns 404, never 403.
Next steps
Credentials
Create the credentials that bind to a tenant.
Integration catalog
See the published rate buckets a Domain seeds its caps from.
Batched delivery
Bulk writes that consume the Upload bucket.
API reference
Full request and response schemas for every Domain endpoint.