• Welcome to Skillset
  • Integrations
    • API access
    • Skillset MCP
  • Knowledge and support
    • Create, review, and publish knowledge articles
    • Troubleshooting and support
  • Tickets
    • Configure AI assistance
    • Manage access and data protection
    • Set up your workspace and integrations

Powered by Skillset

Powered by Skillset

  1. Home
  2. /Integrations
  3. /API access

API access

Updated 4 days ago

Use the Skillset REST API to read and create tickets and search knowledge articles from your own scripts and services.

Base URL

https://app.skillset.co/api/v1

All requests and responses use JSON. Requests act as the Skillset user who owns the credential and are limited to that user's access.

Authentication

Send a credential as a Bearer token on every request:

Authorization: Bearer 
API keyOAuth
Best forScripts, cron jobs, back-end servicesApps where each user signs in
SetupCreate in Skillset settingsAutomatic client registration
Lifetime30, 90, or 365 days, or no expirationShort-lived access token plus refresh token
Works with MCPNoYes, with a token issued for the MCP resource

API keys

  1. In Skillset, open Settings → Account → API keys.
  2. Select Create API key, enter a name, and choose scopes.
  3. Choose an expiration.
  4. Copy the key. It is shown only once.

Store keys in a secret manager. To rotate, create a new key, deploy it, then revoke the old one; revocation takes effect on the next request.

Warning: Never put a key in a URL, source control, logs, or a support message.

OAuth

Skillset supports OAuth 2.1 with automatic client registration, so no client ID or secret needs to be issued to you.

ItemValue
Resourcehttps://app.skillset.co/api/v1
Protected resource metadatahttps://app.skillset.co/.well-known/oauth-protected-resource/api/v1
Authorization server metadatahttps://clerk.skillset.co/.well-known/oauth-authorization-server
Client registrationDynamic Client Registration (RFC 7591) or Client ID Metadata Documents
Grant typeAuthorization code with PKCE (S256)
RefreshRequest the offline_access scope
  1. Fetch the protected resource metadata, then the authorization server metadata, to find the authorization, token, registration, and revocation endpoints.
  2. Register your client once and keep the client ID. Native and CLI apps register as public clients (token_endpoint_auth_method=none) with a loopback redirect URI.
  3. Redirect the user to the authorization endpoint with response_type=code, your scopes, a random state, a PKCE challenge, and resource=https://app.skillset.co/api/v1.
  4. Verify state on the callback and exchange the code and PKCE verifier at the token endpoint.

Refresh with grant_type=refresh_token and the same resource. Each refresh token works once: store the new pair, and never run two refreshes at the same time, or the grant may be revoked. Revoke tokens at the revocation endpoint.

Note: Tokens are bound to one resource. A token for the MCP server (https://app.skillset.co/api/v1/mcp) is rejected by the REST API, and the reverse.

Scopes

ScopeGrants
knowledge:readSearch and read knowledge articles
tickets:readList and read tickets
tickets:writeCreate and update tickets
tickets:deleteDelete tickets

Each request must have the required scope and be allowed by the user's current workspace role. Scopes never add workspace access, and write or delete scopes do not include read.

Quickstart

1. List your workspaces.

curl https://app.skillset.co/api/v1/me/contexts \
  -H "Authorization: Bearer $SKILLSET_API_KEY"
[
  {
    "tenant_id": "11111111-1111-4111-8111-111111111111",
    "tenant_slug": "example",
    "tenant_name": "Example",
    "role": "member",
    "workspaces": [{ "slug": "support", "name": "Support", "role": "member" }]
  }
]

2. Use a tenant_id and workspace slug in the path.

WS=https://app.skillset.co/api/v1/tenants/$TENANT_ID/workspaces/support

curl "$WS/tickets?limit=10" -H "Authorization: Bearer $SKILLSET_API_KEY"
curl "$WS/knowledge/search?q=password%20reset" -H "Authorization: Bearer $SKILLSET_API_KEY"

The same calls in Python (pip install httpx):

import os
import httpx

ws = f"/api/v1/tenants/{os.environ['TENANT_ID']}/workspaces/support"
with httpx.Client(
    base_url="https://app.skillset.co",
    headers={"Authorization": f"Bearer {os.environ['SKILLSET_API_KEY']}"},
) as client:
    tickets = client.get(f"{ws}/tickets", params={"limit": 10})
    tickets.raise_for_status()
    print(tickets.json())

Endpoints

Workspace endpoints are relative to /api/v1/tenants/{tenant_id}/workspaces/{workspace_slug}.

MethodPathScopeDescription
GET/api/v1/me/contextsnoneOrganizations and workspaces you can access
GET/ticketstickets:readList tickets
GET/tickets/{id}tickets:readGet a ticket
POST/ticketstickets:writeCreate a ticket
PATCH/tickets/{id}tickets:writeUpdate a ticket
DELETE/tickets/{id}tickets:deleteDelete a ticket
GET/knowledge/articlesknowledge:readList articles
GET/knowledge/searchknowledge:readSearch articles
GET/knowledge/articles/{article_id}knowledge:readGet an article

Tickets

{id} accepts the ticket UUID or its short ID, such as TKT-42.

List query parameters

ParameterTypeDescription
statusstringFilter by a status configured in the workspace
prioritystringFilter by a priority configured in the workspace
qstringText search on title and description
limitinteger1–200, default 50
offsetintegerDefault 0

Create body

FieldTypeRequiredDescription
titlestringYesUp to 500 characters
descriptionstringNoUp to 50,000 characters
prioritystringNoA priority configured in the workspace

Update accepts any of title, description, status, and priority. Requester, creator, and source come from the credential; other fields are rejected with 422.

curl -X POST "$WS/tickets" \
  -H "Authorization: Bearer $SKILLSET_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7f3c2a10-provision-laptop" \
  -d '{"title": "Provision laptop for new hire", "priority": "high"}'
{
  "id": "0b6f6f6e-2c1d-4c39-9d43-3d5f3a7e9b21",
  "short_id": "TKT-131",
  "title": "Provision laptop for new hire",
  "description": null,
  "status": "new",
  "priority": "high",
  "created_at": "2026-10-19T04:10:00Z",
  "updated_at": "2026-10-19T04:10:00Z",
  "resolved_at": null
}

Ticket creation requires the workspace to enable Set-up → Channels → API. Delete moves the ticket to the workspace Trash, where it can be restored for 30 days. Tickets linked to an external system such as Zendesk or Jira cannot be deleted through the API.

Knowledge

EndpointParametersReturns
GET /knowledge/articleslimit 1–200 (default 50), offsetarticles, total, limit, offset
GET /knowledge/searchq (required), limit 1–25 (default 10), offsetresults with article_id, title, snippet, score
GET /knowledge/articles/{article_id}noneFull article with content

Results include only collections the user can read. Knowledge is read-only.

Idempotency

Send an Idempotency-Key header on POST /tickets to make retries safe. A repeat with the same key and credential returns the original ticket with 200 instead of creating a duplicate (201). Use a new key for each new ticket. Keys are scoped to the credential, so check for the ticket before retrying with a rotated key.

Pagination

List endpoints use limit and offset and return total. Increase offset by limit until it reaches total.

Rate limits

BucketLimit
Reads (GET)120 requests per minute
Writes (all other methods)30 requests per minute

Limits apply per user, shared across all of that user's API keys, OAuth clients, and MCP sessions. Over the limit, the API returns 429 with a Retry-After header in seconds.

Errors

{
  "error": {
    "code": "insufficient_scope",
    "message": "Scope required: tickets:read",
    "request_id": "8cbb07d77357492b",
    "details": { "scope": "tickets:read" }
  }
}

Match on code; message is human-readable and may change.

StatusCodeMeaning
401unauthorizedMissing, expired, or revoked credential
403insufficient_scopeCredential lacks the scope in details.scope
403forbiddenUser is not a member of the organization or workspace
403api_intake_disabledWorkspace does not accept API tickets
403collection_not_readableUser cannot read the article's collection
404not_foundWorkspace, ticket, or article not found
409provider_linked_ticket_delete_unsupportedTicket is linked to an external system
422invalid_requestInvalid input; see details.problems
429rate_limitedWait for Retry-After
503verification_unavailableCredential could not be verified; retry

Include the request_id when contacting Skillset support.

Related

  • Skillset MCP: use Skillset from Claude and other AI clients.