Skip to content

API Keys & Seats

Manage API keys and seat assignments programmatically.

Use these endpoints to create and revoke API keys, list seat assignments, assign seats to workspace members, and adjust seat capacity.

Returns all active API keys in your workspace, ordered by creation date (newest first).

Scope: api_keys.read

Terminal window
curl https://api.skipup.ai/api/v1/api_keys \
-H "Authorization: Bearer sk_live_your_key_here"

Response

{
"data": [
{
"id": "key_abc123",
"name": "Production integration",
"key_prefix": "sk_live_abc1....",
"scopes": ["meeting_requests.read", "meeting_requests.write"],
"expires_at": "2026-12-31T23:59:59Z",
"last_used_at": "2026-02-05T14:30:00Z",
"created_at": "2026-01-15T10:00:00Z"
}
],
"meta": {
"has_more": false,
"next_cursor": null
}
}

This endpoint uses cursor-based pagination. See Errors & Rate Limits for pagination details.

ParameterTypeDefaultDescription
limitinteger25Number of results per page (max 100).
cursorstringCursor from a previous response’s next_cursor.

Creates a new API key. The raw key value is returned only once in the response — store it immediately.

Scope: api_keys.write

Terminal window
curl -X POST https://api.skipup.ai/api/v1/api_keys \
-H "Authorization: Bearer sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "CI pipeline",
"scopes": ["meeting_requests.read"],
"expires_at": "2027-01-01T00:00:00Z"
}'
ParameterTypeRequiredDescription
namestringYesA descriptive label for the key.
scopesstring[]NoPermissions granted to the key. Defaults to none.
expires_atstringNoISO 8601 expiration timestamp. Omit for a non-expiring key.

Response 201 Created

{
"data": {
"id": "key_def456",
"name": "CI pipeline",
"key_prefix": "sk_live_def4....",
"scopes": ["meeting_requests.read"],
"expires_at": "2027-01-01T00:00:00Z",
"last_used_at": null,
"created_at": "2026-02-06T12:00:00Z",
"key": "sk_live_def456ghi789jkl012mno345pqr678"
}
}

Permanently revokes an API key. Any request made with a revoked key will return 401 Unauthorized.

Scope: api_keys.write

Terminal window
curl -X DELETE https://api.skipup.ai/api/v1/api_keys/key_abc123 \
-H "Authorization: Bearer sk_live_your_key_here"

Returns 204 No Content on success.

FieldTypeDescription
idstringUnique identifier for the key.
namestringLabel you assigned when creating the key.
key_prefixstringFirst characters of the key, useful for identification.
scopesstring[]Permissions granted to the key.
expires_atstring | nullISO 8601 expiration timestamp, or null if the key does not expire.
last_used_atstring | nullISO 8601 timestamp of the last request made with this key.
created_atstringISO 8601 timestamp of when the key was created.
keystringThe raw key value. Only present in the create response.

Returns all active seat assignments along with entitlement metadata. Use this to see who has a seat and how many are available.

Scope: seats.read

Terminal window
curl https://api.skipup.ai/api/v1/seats \
-H "Authorization: Bearer sk_live_your_key_here"

Response

{
"data": [
{
"id": "asgn_abc123",
"membership_id": "mem_001",
"entitlement_id": "ent_pro",
"member_email": "[email protected]",
"member_name": "Alice Chen",
"started_at": "2026-01-10T08:00:00Z",
"ended_at": null
}
],
"meta": {
"entitlements": [
{
"id": "ent_pro",
"plan_key": "pro",
"seat_capacity": 50,
"seat_unlimited": false,
"active_seats": 32,
"enforcement_mode": "hard"
}
]
}
}

Assigns a seat to a workspace member. If your workspace has multiple entitlements, you can specify which one; otherwise the highest-priority active entitlement is used.

Scope: seats.write

Terminal window
curl -X POST https://api.skipup.ai/api/v1/seats/mem_001/assign \
-H "Authorization: Bearer sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"entitlement_id": "ent_pro"
}'
ParameterTypeRequiredDescription
membership_idstringYesThe workspace member’s ID (URL path parameter).
entitlement_idstringNoEntitlement to assign the seat under. Defaults to the highest-priority active entitlement.

Response

{
"data": {
"membership_id": "mem_001",
"email": "[email protected]",
"entitlement_id": "ent_pro",
"assignment_id": "asgn_abc123",
"started_at": "2026-02-06T12:00:00Z"
}
}

If the seat capacity has been reached or the member already has a seat, you’ll receive a 422 Unprocessable Entity error:

{
"error": {
"type": "validation_error",
"message": "No seats available for this entitlement."
}
}

Adjusts the seat capacity for an entitlement. This is useful when you need to scale seats up or down programmatically.

Scope: seats.write

Terminal window
curl -X POST https://api.skipup.ai/api/v1/seats/capacity \
-H "Authorization: Bearer sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"capacity": 75,
"entitlement_id": "ent_pro",
"reason": "Scaling up for Q2 hiring"
}'
ParameterTypeRequiredDescription
capacityintegerYesThe new seat capacity.
entitlement_idstringNoEntitlement to update. Defaults to the highest-priority active entitlement.
reasonstringNoAudit log message. Defaults to “Set via API”.

Response

{
"data": {
"id": "ent_pro",
"plan_key": "pro",
"seat_capacity": 75,
"seat_unlimited": false,
"active_seats": 32,
"enforcement_mode": "hard"
}
}
FieldTypeDescription
idstringUnique assignment identifier.
membership_idstringThe workspace member’s ID.
entitlement_idstringThe entitlement the seat is assigned under.
member_emailstringEmail address of the assigned member.
member_namestringDisplay name of the assigned member.
started_atstringISO 8601 timestamp of when the seat was assigned.
ended_atstring | nullISO 8601 timestamp of when the seat was removed, or null if active.
FieldTypeDescription
idstringUnique entitlement identifier.
plan_keystringThe plan this entitlement belongs to (e.g., pro, enterprise).
seat_capacityintegerMaximum number of seats allowed.
seat_unlimitedbooleanWhether the entitlement has unlimited seats.
active_seatsintegerNumber of seats currently assigned.
enforcement_modestringHow capacity limits are enforced (e.g., hard, soft).