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.
API Keys
Section titled “API Keys”List API keys
Section titled “List API keys”Returns all active API keys in your workspace, ordered by creation date (newest first).
Scope: api_keys.read
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.
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | 25 | Number of results per page (max 100). |
cursor | string | — | Cursor from a previous response’s next_cursor. |
Create an API key
Section titled “Create an API key”Creates a new API key. The raw key value is returned only once in the response — store it immediately.
Scope: api_keys.write
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" }'| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | A descriptive label for the key. |
scopes | string[] | No | Permissions granted to the key. Defaults to none. |
expires_at | string | No | ISO 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" }}Revoke an API key
Section titled “Revoke an API key”Permanently revokes an API key. Any request made with a revoked key will return 401 Unauthorized.
Scope: api_keys.write
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.
API key fields
Section titled “API key fields”| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for the key. |
name | string | Label you assigned when creating the key. |
key_prefix | string | First characters of the key, useful for identification. |
scopes | string[] | Permissions granted to the key. |
expires_at | string | null | ISO 8601 expiration timestamp, or null if the key does not expire. |
last_used_at | string | null | ISO 8601 timestamp of the last request made with this key. |
created_at | string | ISO 8601 timestamp of when the key was created. |
key | string | The raw key value. Only present in the create response. |
List seat assignments
Section titled “List seat assignments”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
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_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" } ] }}Assign a seat
Section titled “Assign a seat”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
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" }'| Parameter | Type | Required | Description |
|---|---|---|---|
membership_id | string | Yes | The workspace member’s ID (URL path parameter). |
entitlement_id | string | No | Entitlement to assign the seat under. Defaults to the highest-priority active entitlement. |
Response
{ "data": { "membership_id": "mem_001", "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." }}Set seat capacity
Section titled “Set seat capacity”Adjusts the seat capacity for an entitlement. This is useful when you need to scale seats up or down programmatically.
Scope: seats.write
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" }'| Parameter | Type | Required | Description |
|---|---|---|---|
capacity | integer | Yes | The new seat capacity. |
entitlement_id | string | No | Entitlement to update. Defaults to the highest-priority active entitlement. |
reason | string | No | Audit 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" }}Seat assignment fields
Section titled “Seat assignment fields”| Field | Type | Description |
|---|---|---|
id | string | Unique assignment identifier. |
membership_id | string | The workspace member’s ID. |
entitlement_id | string | The entitlement the seat is assigned under. |
member_email | string | Email address of the assigned member. |
member_name | string | Display name of the assigned member. |
started_at | string | ISO 8601 timestamp of when the seat was assigned. |
ended_at | string | null | ISO 8601 timestamp of when the seat was removed, or null if active. |
Entitlement fields
Section titled “Entitlement fields”| Field | Type | Description |
|---|---|---|
id | string | Unique entitlement identifier. |
plan_key | string | The plan this entitlement belongs to (e.g., pro, enterprise). |
seat_capacity | integer | Maximum number of seats allowed. |
seat_unlimited | boolean | Whether the entitlement has unlimited seats. |
active_seats | integer | Number of seats currently assigned. |
enforcement_mode | string | How capacity limits are enforced (e.g., hard, soft). |