Skip to Content
We are live but in Staging πŸŽ‰
API ReferenceConventions

API Reference

AppID exposes two distinct API surfaces β€” don’t mix them up:

SurfaceBaseAuthFor
Control planehttps://api.dodil.io/v1/appidPlatform bearer (dodil auth login token)You β€” managing pools, users, tenants, stores
Issuer APIhttps://appid.dodil.io/{org}/{pool}None / end-user credentials / pool tokensYour app and its end users

Control-plane conventions

  • Org-free requests. No request carries an organization β€” the gateway resolves your org from the bearer and scopes every call to it.
  • Envelope: responses arrive as { "data": …, "status": "success" } with camelCase fields.
  • Errors map from the underlying RPC: 400 invalid argument, 403 permission denied (missing role/scope), 404 not found, 409 conflict, 503 pool busy (migration in its locked phase).
  • Authorization is scope-checked per method β€” the scope names and the appid.admin / appid.viewer roles are listed in Auth and Access.

Route map

AreaRoutesPage
Pools, connections, keys, user storesPOST/GET /pools, GET/PATCH/DELETE /pools/{pool}, …/connections, …/rotate-keys, …/user-store, …/user-store/migratePools
Users & tenants…/users, …/users/{id}/…, …/tenants, …/tenants/{tenant}/membersUsers & Tenants
HealthGET /v1/appid/healthzβ€”

Issuer API

The per-pool public surface β€” discovery, JWKS, authorize/token, signup, recover/reset/verify, userinfo, branding β€” is documented on its own page: Issuer API. It is intentionally not behind api.dodil.io; it must be reachable by browsers and by anyone verifying your tokens.

gRPC

The control plane is a gRPC service (dodil.appid.v1.AppIdService) that the gateway maps to the REST routes above; the protos live in dodilio/proto-appid. Field names below are shown in their REST (camelCase) form.