Sign Up

Invitations

POST /invitations/accept

POST
/invitations/accept

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.

Authorization

user_jwt
headerAuthorizationBearer <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.

Request Body

application/json
  1. 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*string

dtni_ plus 43 base64url characters, exactly as the link carries it.

Response Body

Accepted invitation

application/json
  1. response
org_id*string
Formatuuid
role*string
roles*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"  ]}
POST
/invitations/decline

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.

Authorization

user_jwt
headerAuthorizationBearer <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.

Request Body

application/json
  1. 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*string

dtni_ plus 43 base64url characters, exactly as the link carries it.

Response Body

Declined invitation

application/json
  1. response
declined*string
Formatuuid
curl -X POST 'https://example.com/invitations/decline' \  -H 'Content-Type: application/json' \  -d '{  "token": "string"}'
{  "declined": "8472b7e9-45ca-44c9-a1cb-dcc5df992fd8"}

POST /invitations/lookup

POST
/invitations/lookup

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.

Authorization

user_jwt
headerAuthorizationBearer <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.

Request Body

application/json
  1. 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*string

dtni_ plus 43 base64url characters, exactly as the link carries it.

Response Body

The pending invitation the token refers to

application/json
  1. response

What POST /invitations/lookup shows the token holder before they decide.

email*string

The invited address — the one the email went to.

expires_at*string

When the invitation stops being acceptable (RFC 3339).

id*string
Formatuuid
invited_by?|

The inviter's display name, else their email; null when the inviting account no longer exists.

org_id*string
Formatuuid
org_name*string
role*string
roles*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"  ]}
GET
/orgs/{id}/invitations

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.

Authorization

user_jwt
headerAuthorizationBearer <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.

Path Parameters

id*string

Organization id

Formatuuid

Response Body

Organization invitations

application/json
  1. 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"      ]    }  ]}
POST
/orgs/{id}/invitations

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.

Authorization

user_jwt
headerAuthorizationBearer <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.

Path Parameters

id*string

Organization id

Formatuuid

Request Body

application/json
  1. body
email*string
roles?array<string>|

Absent ⇒ ["developer"]; an explicit empty array is a 400.

Items1 <= items

Response Body

Created or refreshed invitation

application/json
  1. 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*string
expires_at*string

When the invitation stops being acceptable (RFC 3339).

id*string
Formatuuid
org_id*string
Formatuuid
role*string
roles*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"  ]}
DELETE
/orgs/{id}/invitations/{invitation_id}

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.

Authorization

user_jwt
headerAuthorizationBearer <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.

Path Parameters

id*string

Organization id

Formatuuid
invitation_id*string

Invitation id

Formatuuid

Response Body

Revoked invitation

application/json
  1. response
revoked*string
Formatuuid
curl -X DELETE 'https://example.com/orgs/497f6eca-6276-4993-bfeb-53cbbbba6f08/invitations/497f6eca-6276-4993-bfeb-53cbbbba6f08'
{  "revoked": "139b8438-b6c7-4494-8941-ce249af5d379"}