This is a separate surface from the workspace REST API. It has
its own base URL, its own key, and its own webhooks. An agency key manages your sub-accounts; a
workspace key acts inside one workspace. The two are not interchangeable.
Base URL
All endpoints live under a single version prefix:What you can manage
Sub-accounts
Provision a customer workspace with its owner, rename it, and suspend or restore access.
Subscriptions & add-ons
Assign a base plan to a sub-account and grant or revoke add-ons on top of it.
Plans
List your plan and add-on catalogue to discover the uuids the other endpoints take.
Webhooks
Register endpoints and subscribe to sub-account lifecycle events.
How it works
Authentication
One agency API key (
dmly_ag_…) authenticates you and scopes every request to your own
sub-accounts.Webhook events
Six sub-account lifecycle events, signed and delivered to your endpoint.
Conventions
- Identifiers are UUIDs. Sub-accounts, plans, add-ons and webhook endpoints are addressed by
their public
uuid. - You only ever see your own. Every request is scoped to the agency the key belongs to; an
unknown uuid, or one belonging to another agency, returns
404. - Lists paginate with
?per_pageand?page, default 25, capped at 100.?limitis not accepted here (that alias exists only on the workspace REST API), and an unrecognised parameter is ignored, so?limit=100quietly returns 25 rows. OnlyGET /workspacesis paginated; the plan catalogue and webhook lists are short and return a plaindataarray with nometa. - Rate limit: 120 requests per minute per agency key. See Authentication.
- JSON in, JSON out. Send
Content-Type: application/jsonon writes.
Billing model
Sub-account subscriptions are agency-billed: assigning a plan or granting an add-on copies the plan’s limits onto the workspace directly. There is no customer Stripe checkout in this flow, and changing a plan never un-suspends a locked sub-account. You settle with DMLY; how you bill your own customers is up to you.Getting a key
Mint an agency key from the agency console under Configuration → API. See Authentication. The whole surface can also be disabled fleet-wide during an incident, in which case every endpoint returns503 until it is switched back
on.

