Invitations
Accept the invitation an emailed dtni_ token refers to, seating the caller in the organization with the invitation's roles (an already-seated caller keeps their roles; the invitation is consumed either way). Possession of the token is the authorization; no organization permission is checked because the caller is not yet seated, and the caller's address is not compared with the invited one — the audit record carries both. Only an OIDC user JWT is admitted; dtno_ organization API keys are not.
user_jwtAuthorizationBearer <token>OIDC access token of a signed-in user (the dashboard/CLI login) used on the management plane: /me, /orgs*, /projects*, /invitations*, /roles, billing, audit, API-key, and service-account routes. Every management operation documents the org/project permission the authenticated member must hold.
application/json- body
The body of the three invitee routes (PLAN-INVITATION-EMAIL.md D4): the
dtni_ token from the invitation email's link. In the body, never a path
or query parameter, so it lands in no access log, span, or audit row.
token*stringdtni_ plus 43 base64url characters, exactly as the link carries it.
Accepted invitation
application/json- response
org_id*stringuuidrole*stringroles*array<string>curl -X POST 'https://example.com/invitations/accept' \ -H 'Content-Type: application/json' \ -d '{ "token": "string"}'{ "org_id": "a40f5d1f-d889-42e9-94ea-b9b33585fc6b", "role": "string", "roles": [ "string" ]}Decline the invitation an emailed dtni_ token refers to. Possession of the token is the authorization; no organization permission is checked because the caller is not yet seated. The row stays visible to the organization as declined until it is revoked or the address is re-invited. Only an OIDC user JWT is admitted; dtno_ organization API keys are not.
user_jwtAuthorizationBearer <token>OIDC access token of a signed-in user (the dashboard/CLI login) used on the management plane: /me, /orgs*, /projects*, /invitations*, /roles, billing, audit, API-key, and service-account routes. Every management operation documents the org/project permission the authenticated member must hold.
application/json- body
The body of the three invitee routes (PLAN-INVITATION-EMAIL.md D4): the
dtni_ token from the invitation email's link. In the body, never a path
or query parameter, so it lands in no access log, span, or audit row.
token*stringdtni_ plus 43 base64url characters, exactly as the link carries it.
Declined invitation
application/json- response
declined*stringuuidcurl -X POST 'https://example.com/invitations/decline' \ -H 'Content-Type: application/json' \ -d '{ "token": "string"}'{ "declined": "8472b7e9-45ca-44c9-a1cb-dcc5df992fd8"}Show the invitation an emailed dtni_ token refers to: the organization, the roles it would grant, who sent it, the invited address and the expiry. Possession of the token is the authorization; no organization permission is checked because the caller is not yet seated. A missing, used, declined, expired, or malformed token answers 404. Only an OIDC user JWT is admitted; dtno_ organization API keys are not.
user_jwtAuthorizationBearer <token>OIDC access token of a signed-in user (the dashboard/CLI login) used on the management plane: /me, /orgs*, /projects*, /invitations*, /roles, billing, audit, API-key, and service-account routes. Every management operation documents the org/project permission the authenticated member must hold.
application/json- body
The body of the three invitee routes (PLAN-INVITATION-EMAIL.md D4): the
dtni_ token from the invitation email's link. In the body, never a path
or query parameter, so it lands in no access log, span, or audit row.
token*stringdtni_ plus 43 base64url characters, exactly as the link carries it.
The pending invitation the token refers to
application/json- response
What POST /invitations/lookup shows the token holder before they decide.
email*stringThe invited address — the one the email went to.
expires_at*stringWhen the invitation stops being acceptable (RFC 3339).
id*stringuuidinvited_by?|The inviter's display name, else their email; null when the
inviting account no longer exists.
org_id*stringuuidorg_name*stringrole*stringroles*array<string>curl -X POST 'https://example.com/invitations/lookup' \ -H 'Content-Type: application/json' \ -d '{ "token": "string"}'{ "email": "string", "expires_at": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "invited_by": "string", "org_id": "a40f5d1f-d889-42e9-94ea-b9b33585fc6b", "org_name": "string", "role": "string", "roles": [ "string" ]}List the undecided invitations of one organization: pending, declined, and expired rows (each carries declined_at and expires_at so a consumer can tell them apart). The caller must be a seated member holding read:members. Only an OIDC user JWT is admitted on this route; dtno_ organization API keys are not.
user_jwtAuthorizationBearer <token>OIDC access token of a signed-in user (the dashboard/CLI login) used on the management plane: /me, /orgs*, /projects*, /invitations*, /roles, billing, audit, API-key, and service-account routes. Every management operation documents the org/project permission the authenticated member must hold.
id*stringOrganization id
uuidOrganization invitations
application/json- response
invitations*array<>curl -X GET 'https://example.com/orgs/497f6eca-6276-4993-bfeb-53cbbbba6f08/invitations'{ "invitations": [ { "declined_at": "string", "email": "string", "expires_at": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "role": "string", "roles": [ "string" ] } ]}Create or re-issue an organization invitation. Mints a single-use dtni_ token and, when the api has an SMTP mailer configured, emails the invitee a link carrying it after the request commits (a re-invite rotates the token and is the resend); without a mailer the response's accept_url carries the link instead. The caller must be a seated member holding write:members; the route also enforces the role-delegation rules for the invited role set. Only an OIDC user JWT is admitted on this route; dtno_ organization API keys are not.
user_jwtAuthorizationBearer <token>OIDC access token of a signed-in user (the dashboard/CLI login) used on the management plane: /me, /orgs*, /projects*, /invitations*, /roles, billing, audit, API-key, and service-account routes. Every management operation documents the org/project permission the authenticated member must hold.
id*stringOrganization id
uuidapplication/json- body
email*stringroles?array<string>|Absent ⇒ ["developer"]; an explicit empty array is a 400.
1 <= itemsCreated or refreshed invitation
application/json- response
accept_url?|The invitation link, carrying the single-use dtni_ token — present
ONLY when the api has no SMTP mailer configured, so a deployment
without email can hand the link over out of band
(PLAN-INVITATION-EMAIL.md D7). null when the invitation email was
handed to the mailer: the secret then has exactly one copy. Absolute
when the api knows the dashboard's URL, else the dashboard-relative
path /dashboard/user/invitations?token=….
email*stringexpires_at*stringWhen the invitation stops being acceptable (RFC 3339).
id*stringuuidorg_id*stringuuidrole*stringroles*array<string>curl -X POST 'https://example.com/orgs/497f6eca-6276-4993-bfeb-53cbbbba6f08/invitations' \ -H 'Content-Type: application/json' \ -d '{ "email": "string"}'{ "accept_url": "string", "email": "string", "expires_at": "string", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "org_id": "a40f5d1f-d889-42e9-94ea-b9b33585fc6b", "role": "string", "roles": [ "string" ]}Revoke an unaccepted organization invitation. The caller must be a seated member holding write:members; the route also enforces the current-side delegation rule for the invited role set. Only an OIDC user JWT is admitted on this route; dtno_ organization API keys are not.
user_jwtAuthorizationBearer <token>OIDC access token of a signed-in user (the dashboard/CLI login) used on the management plane: /me, /orgs*, /projects*, /invitations*, /roles, billing, audit, API-key, and service-account routes. Every management operation documents the org/project permission the authenticated member must hold.
id*stringOrganization id
uuidinvitation_id*stringInvitation id
uuidRevoked invitation
application/json- response
revoked*stringuuidcurl -X DELETE 'https://example.com/orgs/497f6eca-6276-4993-bfeb-53cbbbba6f08/invitations/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "revoked": "139b8438-b6c7-4494-8941-ce249af5d379"}