ctlsurf Services API

The services API from ctlsurf — 6 operation(s) for services.

GitHub OpenAPI

Operations 6

GET /api/v1/services/identity Service Identity #
GET /api/v1/services/me/usage My Service Usage #
POST /api/v1/services/llm/v1/messages Llm Messages #
POST /api/v1/services/llm/messages Llm Messages #
POST /api/v1/services/transcription/session Transcription Session #
POST /api/v1/services/transcription/reconcile Trigger Transcription Reconcile #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/ctlsurf-com:ctlsurf-com-services-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

ctlsurf-com-services-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Ctlsurf Com Services API
  version: 0.1.0
  description: 'Operations tagged services across 2 of this provider''s published API definitions: ctlsurf-com-openapi.json, ctlsurf-com-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://app.ctlsurf.com
  description: ctlsurf application host (documented MCP endpoint https://app.ctlsurf.com/api/mcp; spec served at /openapi.json)
tags:
- name: Services
paths:
  /api/v1/services/identity:
    get:
      tags:
      - Services
      summary: Service Identity
      description: 'Who is this app/service key signed in as.


        Used by the CtlSurf Sidekick to show the signed-in user + organization in

        its header. Any valid Business app/service key (or member JWT) may call it;

        `resolve_service_context` already enforces the Business entitlement.'
      operationId: service_identity_api_v1_services_identity_get
      security:
      - HTTPBearer: []
      parameters:
      - name: X-Org-Id
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: X-Org-Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/services/me/usage:
    get:
      tags:
      - Services
      summary: My Service Usage
      description: 'The signed-in member''s own managed-services usage (Settings -> My Usage).


        Aggregates across every org the user holds a seat in. Returns

        has_managed_services=false for users with no Business seat, so the Settings

        panel can hide itself for Free/Pro accounts.'
      operationId: my_service_usage_api_v1_services_me_usage_get
      security:
      - HTTPBearer: []
      parameters:
      - name: range
        in: query
        required: false
        schema:
          type: string
          description: 'Window: current | 30d | 90d'
          default: current
          title: Range
        description: 'Window: current | 30d | 90d'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MyServiceUsageResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/services/llm/v1/messages:
    post:
      tags:
      - Services
      summary: Llm Messages
      description: Proxy an LLM completion. Model is server-selected; tokens are metered.
      operationId: llm_messages_api_v1_services_llm_v1_messages_post
      security:
      - HTTPBearer: []
      parameters:
      - name: schema
        in: query
        required: false
        schema:
          type: string
          pattern: ^(anthropic|openai)$
          default: anthropic
          title: Schema
      - name: X-Org-Id
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: X-Org-Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/services/llm/messages:
    post:
      tags:
      - Services
      summary: Llm Messages
      description: Proxy an LLM completion. Model is server-selected; tokens are metered.
      operationId: llm_messages_api_v1_services_llm_messages_post
      security:
      - HTTPBearer: []
      parameters:
      - name: schema
        in: query
        required: false
        schema:
          type: string
          pattern: ^(anthropic|openai)$
          default: anthropic
          title: Schema
      - name: X-Org-Id
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: X-Org-Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/services/transcription/session:
    post:
      tags:
      - Services
      summary: Transcription Session
      description: 'Mint a short-lived Deepgram grant token so the client streams audio

        directly to Deepgram (audio never transits ctlsurf). Usage is reconciled

        post-hoc from Deepgram by the returned tags (Phase 2b).'
      operationId: transcription_session_api_v1_services_transcription_session_post
      security:
      - HTTPBearer: []
      parameters:
      - name: X-Org-Id
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: X-Org-Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/services/transcription/reconcile:
    post:
      tags:
      - Services
      summary: Trigger Transcription Reconcile
      description: 'Super-admin: run transcription usage reconciliation now.


        Pulls Deepgram per-request usage and writes idempotent ServiceUsage rows.

        Also runs automatically on a schedule (see the lifespan background task);

        this endpoint is for on-demand runs and backfills. Returns the run stats.'
      operationId: trigger_transcription_reconcile_api_v1_services_transcription_reconcile_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
      - HTTPBearer: []
components:
  schemas:
    MyServiceUsageResponse:
      properties:
        has_managed_services:
          type: boolean
          title: Has Managed Services
        range:
          type: string
          title: Range
          default: current
        transcription_seconds:
          type: integer
          title: Transcription Seconds
          default: 0
        transcription_minutes_used:
          type: number
          title: Transcription Minutes Used
          default: 0
        included_minutes_per_seat:
          type: integer
          title: Included Minutes Per Seat
          default: 0
        llm_input_tokens:
          type: integer
          title: Llm Input Tokens
          default: 0
        llm_output_tokens:
          type: integer
          title: Llm Output Tokens
          default: 0
        estimated_cost_usd:
          type: number
          title: Estimated Cost Usd
          default: 0
        sessions:
          type: integer
          title: Sessions
          default: 0
        series:
          items:
            $ref: '#/components/schemas/DailyUsage'
          type: array
          title: Series
          default: []
      type: object
      required:
      - has_managed_services
      title: MyServiceUsageResponse
      description: A single member's own managed-services usage (Settings -> My Usage).
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    DailyUsage:
      properties:
        date:
          type: string
          format: date
          title: Date
        transcription_seconds:
          type: integer
          title: Transcription Seconds
        llm_input_tokens:
          type: integer
          title: Llm Input Tokens
        llm_output_tokens:
          type: integer
          title: Llm Output Tokens
        estimated_cost_usd:
          type: number
          title: Estimated Cost Usd
      type: object
      required:
      - date
      - transcription_seconds
      - llm_input_tokens
      - llm_output_tokens
      - estimated_cost_usd
      title: DailyUsage
      description: One day of managed-services usage, for the trend charts.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer
x-refined-from:
- ctlsurf-com-openapi.json
- ctlsurf-com-openapi.yml