A read-only REST API and MCP server over your shops' repair orders, appointments, calls, messages, contacts, vehicles, goals, campaigns and attribution. One key, one set of scopes, both doors. This page is open — no key needed to read it.

Base URL https://okto-partner-api.oktorocket.io
Interactive docs /swagger · Machine-readable spec /openapi.json (no key required)

Swagger & the OpenAPI spec

Two ways in, both open (no key needed to view them):

# Generate a typed client from the spec (example)
npx @openapitools/openapi-generator-cli generate \
  -i https://okto-partner-api.oktorocket.io/openapi.json \
  -g typescript-fetch -o ./okto-client

Authentication

Every /v1/* and /mcp request needs your key in the x-api-key header. Authorization: Bearer is not accepted — the gateway rejects it with 403 before the API sees it.

curl "https://okto-partner-api.oktorocket.io/v1/sites" \
  -H "x-api-key: $OKTO_KEY"

A bare {"message":"Forbidden"} is from the gateway (check the header/key). Anything in application/problem+json is from the API (valid key; the issue is scope, parameters or the record). A record outside your scope returns 404, not 403.

Keys are issued by the OktoRocket team against your tenant with only the scopes you ask for. Tell us the shops, the scopes, and whether you want REST, MCP or both — it's one key either way.

Sign in as an OktoRocket user (Cognito)

Where user sign-in has been enabled, you can call the API as yourself with a Cognito access token instead of an API key — the same login you use for OktoRocket. The token surface lives under /oauth (a route that accepts the bearer token and does not require an x-api-key); the plain /v1 and /mcp paths remain key-only. Until sign-in is enabled, use your x-api-key on /v1:

curl "https://okto-partner-api.oktorocket.io/oauth/v1/sites" \
  -H "Authorization: Bearer $COGNITO_ACCESS_TOKEN"

No key is provisioned: the shops and data you can read are resolved automatically from your user account's tenant access, and you get the full read-only scope set. The token must be an access token from the OktoRocket user pool, issued with the openid and email scopes so your verified email can be read. Access tokens are short-lived — refresh them the usual OAuth way.

Admin access only. Signing in with your user account requires the Admin role on the tenant; you then get read access to every shop in that tenant. Any other role — including Manager — is authenticated but returns 403 — no tenant access, because only an Admin sees every shop. There is no per-shop sign-in — if you are site-scoped, or need a machine-to-machine grant, use a tenant/site-scoped API key instead.

MCP clients that support OAuth can sign you in automatically: point the client at /oauth/mcp and it discovers the flow from /.well-known/oauth-protected-resource (a 401 on /oauth/mcp returns a WWW-Authenticate pointer), then opens the OktoRocket login in your browser and attaches the token — no manual paste. Connectors that require Dynamic Client Registration (Claude, ChatGPT/Codex, Grok) are supported too: the server publishes /.well-known/oauth-authorization-server and POST /oauth/register, which creates a callback-bound client id automatically. Add the server URL and sign in; no callback registration or client secret is required from you.

Set up the MCP server on a coding agent

The MCP server speaks streamable HTTP at /mcp with the same key. Where user sign-in is enabled, point the client at /oauth/mcp instead and send an Authorization: Bearer <Cognito access token> in place of the x-api-key header. Point any MCP-capable client at it; the agent discovers the tools and their filters on its own.

Claude, ChatGPT/Codex, and Grok custom connections

In the product's custom connector, app, or MCP settings, add this remote server URL:

https://okto-partner-api.oktorocket.io/oauth/mcp

Choose OAuth or sign in when prompted. The client discovers registration and opens the OktoRocket login automatically. Your OktoRocket user must be an Admin for at least one enabled tenant. This is the recommended customer path while public directory listings are deferred.

If the client supports static request headers instead, use https://okto-partner-api.oktorocket.io/mcp with x-api-key: YOUR_KEY. API keys remain supported and are better for service accounts or site-scoped access; do not put an API key on the OAuth URL.

Claude Code

claude mcp add --transport http oktorocket \
  https://okto-partner-api.oktorocket.io/mcp \
  --header "x-api-key: YOUR_KEY"

Or add it to .mcp.json (project) / ~/.claude.json (user):

{
  "mcpServers": {
    "oktorocket": {
      "type": "http",
      "url": "https://okto-partner-api.oktorocket.io/mcp",
      "headers": { "x-api-key": "YOUR_KEY" }
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

{
  "mcpServers": {
    "oktorocket": {
      "url": "https://okto-partner-api.oktorocket.io/mcp",
      "headers": { "x-api-key": "YOUR_KEY" }
    }
  }
}

Any other streamable-HTTP MCP client

Use the same three facts: transport http (streamable HTTP), URL https://okto-partner-api.oktorocket.io/mcp, header x-api-key: YOUR_KEY. Only POST /mcp is routed; a client that also probes GET /mcp gets a 403 on that probe and should carry on. The transport is stateless — no session to keep alive.

Scopes

One key spans REST and MCP; scopes are per entity family and enforced the same way for a URL or a tool call.

ScopeUnlocks
read:sitesShops this key can see — timezone, active flag, shop software
read:repair-ordersRepair orders, line detail, financial totals, rollover, RO analytics
read:paymentsPMS cash: paid ROs per site (amount paid, totals, method breakdown) — money only, no card data
read:appointmentsAppointments with customer/vehicle, booking status, lead source
read:callsCall history — direction, duration, answering extension, labels, AdvisorIQ score
read:messagingMessage metadata, and bodies on the detail endpoint
read:contactsContacts, searchable by name, company, phone or email
read:vehiclesVehicles per contact — VIN, plate, engine, transmission
read:goalsMonthly shop goals, per-advisor targets, and pacing analytics
read:campaignsCampaign definitions, sends, runs, and the attribution suite
read:usersUsers (secret-redacted) and site employee maps — resolve an advisor id to a person

Authenticated REST requests and MCP tool calls are audited in partner_audit_log. Both record the caller and tenant scope; OAuth calls include the user identity and OAuth client id. REST entries include method, route template, status, application request id and duration; MCP entries include tool, arguments summary and record count. REST auditing never records credentials, query strings, request bodies or response data. Gateway access logs also capture request status and latency, including requests rejected before authentication.

Paging & errors

Notes for coding agents

Changelog

Newest first. See /openapi.json for exact request/response shapes.

Latest

Earlier