Skip to main content

User Management API

All endpoints require admin access and are scoped to an organization instance.

You can find your Instance ID and API Key on the API Keys settings page.

Fill in your region, instance ID, and API key above. The URLs and curl commands below will update automatically.


List Users

Returns all users in the organization.

GEThttps://us1.oodle.ai/v1/api/instance/{instance}/users
NameTypeDescription
querystringOptional. Filter users by email or name (case-insensitive substring match).

Response: 200 OK

{
"users": [
{
"user_id": "auth0|abc123",
"email": "[email protected]",
"name": "Alice",
"picture": "https://..."
}
]
}

curl:

curl -s -X GET \
'https://us1.oodle.ai/v1/api/instance/{instance}/users' \
-H 'x-api-key: your-api-key'

Send Invitation

Send a single invitation to join the organization.

POSThttps://us1.oodle.ai/v1/api/instance/{instance}/users/invitations

Request body:

FieldTypeRequiredDescription
emailstringYesInvitee email address. Must match an existing member domain.
rolesstring[]YesRoles to assign: Admin, Editor, Viewer, Data Ingestion.
sender_emailstringYesEmail of the org member sending the invite.

Response: 200 OK

{
"id": "uinv_ABC123",
"email": "[email protected]",
"inviter": "Alice",
"roles": ["Admin"],
"expires_at": "2026-03-22T00:00:00Z",
"created_at": "2026-02-20T00:00:00Z"
}

Requirements:

  • The invitee's email domain must match the domain of an existing user in the organization. For example, if all current users have @acme.com emails, you can only invite @acme.com addresses.
  • sender_email must belong to a current member of the organization.
  • You cannot invite yourself.

Errors:

CodeReason
400Missing/invalid field, self-invite, domain mismatch, sender not an org member.

curl:

curl -s -X POST \
'https://us1.oodle.ai/v1/api/instance/{instance}/users/invitations' \
-H 'x-api-key: your-api-key' \
-H 'Content-Type: application/json' \
-d '{
"email": "[email protected]",
"roles": ["Admin"],
"sender_email": "[email protected]"
}'

Bulk Send Invitations

Send multiple invitations in a single request. Each invitation is processed sequentially; per-item results are returned so that partial failures do not abort the batch.

POSThttps://us1.oodle.ai/v1/api/instance/{instance}/users/invitations/bulk

Request body:

FieldTypeRequiredDescription
sender_emailstringYesEmail of the org member sending the invites.
invitationsobject[]YesArray of invitations (max 100).
invitations[].emailstringYesInvitee email address.
invitations[].rolesstring[]YesRoles to assign.

Response: 200 OK

Each item in items corresponds positionally to the input array. Failed items include an error string; successful items include an invitation object.

{
"items": [
{
"email": "[email protected]",
"invitation": {
"id": "uinv_ABC123",
"email": "[email protected]",
"inviter": "Alice",
"roles": ["Admin"],
"expires_at": "2026-03-22T00:00:00Z",
"created_at": "2026-02-20T00:00:00Z"
}
},
{
"email": "[email protected]",
"error": "domain does not match existing member domains"
}
]
}

Requirements:

  • Maximum 100 invitations per request.
  • Each invitee's email domain must match the domain of an existing user in the organization.
  • sender_email must belong to a current member of the organization.
  • You cannot include your own email in the invitations.

Errors:

CodeReason
400Missing sender, empty invitations, exceeds 100 limit, per-item validation.

curl:

curl -s -X POST \
'https://us1.oodle.ai/v1/api/instance/{instance}/users/invitations/bulk' \
-H 'x-api-key: your-api-key' \
-H 'Content-Type: application/json' \
-d '{
"sender_email": "[email protected]",
"invitations": [
{ "email": "[email protected]", "roles": ["Admin"] },
{ "email": "[email protected]", "roles": ["Viewer"] }
]
}'

List Invitations

Returns all pending invitations for the organization.

GEThttps://us1.oodle.ai/v1/api/instance/{instance}/users/invitations
NameTypeDescription
querystringOptional. Filter invitations by email (case-insensitive substring match).

Response: 200 OK

{
"invitations": [
{
"id": "uinv_ABC123",
"email": "[email protected]",
"inviter": "Alice",
"roles": ["Admin"],
"expires_at": "2026-03-22T00:00:00Z",
"created_at": "2026-02-20T00:00:00Z"
}
]
}

curl:

curl -s -X GET \
'https://us1.oodle.ai/v1/api/instance/{instance}/users/invitations' \
-H 'x-api-key: your-api-key'

Get Invitation

Fetch a single invitation by ID.

GEThttps://us1.oodle.ai/v1/api/instance/{instance}/users/invitations/{invitationId}

Response: 200 OK

{
"id": "uinv_ABC123",
"email": "[email protected]",
"inviter": "Alice",
"roles": ["Admin"],
"expires_at": "2026-03-22T00:00:00Z",
"created_at": "2026-02-20T00:00:00Z"
}

Errors:

CodeReason
400Invalid invitation ID format.
404Invitation not found.

curl:

curl -s -X GET \
'https://us1.oodle.ai/v1/api/instance/{instance}/users/invitations/{invitationId}' \
-H 'x-api-key: your-api-key'

Delete Invitation

Delete a pending invitation.

DELETEhttps://us1.oodle.ai/v1/api/instance/{instance}/users/invitations/{invitationId}

Response: 200 OK

Errors:

CodeReason
400Invalid invitation ID format.
404Invitation not found.

curl:

curl -s -X DELETE \
'https://us1.oodle.ai/v1/api/instance/{instance}/users/invitations/{invitationId}' \
-H 'x-api-key: your-api-key'

Common Error Response

All error responses follow this format:

{
"errors": [
{
"message": "description of what went wrong",
"code": "400"
}
]
}

Authorization

All User Management API endpoints require an Admin role API key. Requests made with non-admin keys will be rejected.


Support

If you need assistance or have any questions, please reach out to us through: