Scribiz Jobs API

The Jobs API from Scribiz — 5 operation(s) for jobs.

GitHub OpenAPI

Operations 6

POST /v1/ask Ask a question about a video #
POST /v1/context Start a job for a link or an upload #
GET /v1/jobs List the account's jobs #
DELETE /v1/jobs/{id} Cancel or delete a job #
GET /v1/jobs/{id} State, progress and the Context when done #
GET /v1/jobs/{id}/events Progress events of a job #

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/scribiz:scribiz-jobs-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

scribiz-jobs-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Scribiz Jobs API
  version: 1.0.0
  description: 'Operations tagged Jobs across 2 of this provider''s published API definitions: openapi.json, scribiz-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
  url: https://scribiz.com/api
tags:
- name: Jobs
paths:
  /v1/ask:
    post:
      description: 'One question about a Context. It costs 0.1 minute, or what it cost when that is more (priced like a proxied call, at $0.005 a minute): a question about a long video costs more than one about a short one. The check before the question uses the size of the Context. Never starts the on-screen layer.'
      operationId: ask
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AskRequest'
        description: JSON
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AskResponse'
          description: Answered.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: invalid_request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: unauthorized, invalid_api_key or invalid_token
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: quota_exceeded
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: insufficient_scope, session_required, account_required, turnstile_required, bad_origin
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: not_found
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: job_not_ready
        '413':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: body_too_large
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: rate_limited, too_many_in_flight, anonymous_limit, daily_spend_limit
      security:
      - apiKey:
        - all
      - bearer:
        - all
      - cookie: []
      - {}
      summary: Ask a question about a video
      tags:
      - Jobs
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/context:
    post:
      description: Quotes the job (length, minutes, plan limits), then queues it. The 202 body says what it will cost; follow `events_url` for progress and `result_url` for the Context.
      operationId: createContext
      parameters:
      - description: Repeats of the same key with the same body return the same job.
        in: header
        name: Idempotency-Key
        required: false
        schema:
          maxLength: 200
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContextRequest'
        description: JSON
      responses:
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobCreated'
          description: Queued.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: invalid_request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: unauthorized, invalid_api_key or invalid_token
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: 'quota_exceeded: out of minutes'
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: insufficient_scope, session_required, account_required, turnstile_required, bad_origin
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: not_found
        '413':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: video_too_long
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: The source cannot be read (source_unavailable, url_unsupported, ...).
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: rate_limited, too_many_in_flight, anonymous_limit, daily_spend_limit
        '451':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: blocked_content
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: busy, not_configured
      security:
      - apiKey:
        - all
      - bearer:
        - all
      - cookie: []
      - {}
      summary: Start a job for a link or an upload
      tags:
      - Jobs
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/jobs:
    get:
      description: 'The account''s jobs across every device and surface (web, phone + watch, Mac app, CLI, MCP, Telegram, WhatsApp) that are running or still have a result, newest first, without the results themselves (read one with GET /v1/jobs/{id}). `source_kind` names the origin in machine-readable form; `label` is the optional user tag. Needs an account: a job started without one is reached by its link.'
      operationId: listJobs
      parameters:
      - description: Jobs on a page (1 to 100, default 50).
        in: query
        name: limit
        schema:
          maximum: 100
          minimum: 1
          type: integer
      - description: 'Only jobs created before this time (epoch ms): pass `next_before` of the page before.'
        in: query
        name: before
        schema:
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  jobs:
                    items:
                      properties:
                        created_at:
                          type: integer
                        error_code:
                          type:
                          - string
                          - 'null'
                        expires_at:
                          type: integer
                        file_name:
                          type:
                          - string
                          - 'null'
                        finished_at:
                          type:
                          - integer
                          - 'null'
                        input:
                          type: object
                        job_id:
                          type: string
                        label:
                          type:
                          - string
                          - 'null'
                        media_seconds:
                          type:
                          - number
                          - 'null'
                        minutes_charged:
                          type:
                          - number
                          - 'null'
                        mode:
                          type: string
                        provider:
                          type:
                          - string
                          - 'null'
                        source_kind:
                          type: string
                        status:
                          enum:
                          - queued
                          - running
                          - succeeded
                          - failed
                          - canceled
                          type: string
                        title:
                          type:
                          - string
                          - 'null'
                        via:
                          type:
                          - string
                          - 'null'
                      type: object
                    type: array
                  next_before:
                    description: Null on the last page.
                    type:
                    - integer
                    - 'null'
                type: object
          description: One page of jobs.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: invalid_request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: unauthorized, invalid_api_key or invalid_token
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: insufficient_scope, session_required, account_required, turnstile_required, bad_origin
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: not_found
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: rate_limited, too_many_in_flight, anonymous_limit, daily_spend_limit
      security:
      - apiKey:
        - read
      - bearer:
        - read
      - cookie: []
      summary: List the account's jobs
      tags:
      - Jobs
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/jobs/{id}:
    delete:
      description: Cancels a job that is queued or running; deletes the result of one that has finished.
      operationId: cancelJob
      parameters:
      - description: The job id (job_...).
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
          description: Cancelled or deleted.
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Job'
          description: Cancel requested; the job is still winding down.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: invalid_request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: unauthorized, invalid_api_key or invalid_token
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: insufficient_scope, session_required, account_required, turnstile_required, bad_origin
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: not_found
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: rate_limited, too_many_in_flight, anonymous_limit, daily_spend_limit
      security:
      - apiKey:
        - all
      - bearer:
        - all
      - cookie: []
      - {}
      summary: Cancel or delete a job
      tags:
      - Jobs
    get:
      description: An account's job is readable by that account only. An anonymous job is readable by whoever holds its id, for 24 hours.
      operationId: getJob
      parameters:
      - description: The job id (job_...).
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Job'
          description: The job.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: invalid_request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: unauthorized, invalid_api_key or invalid_token
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: insufficient_scope, session_required, account_required, turnstile_required, bad_origin
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: not_found
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: job_expired
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: rate_limited, too_many_in_flight, anonymous_limit, daily_spend_limit
      security:
      - apiKey:
        - read
      - bearer:
        - read
      - cookie: []
      - {}
      summary: State, progress and the Context when done
      tags:
      - Jobs
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/jobs/{id}/events:
    get:
      description: 'Server-sent events. `id` is the event number (resume with Last-Event-ID), `event` is the type, `data` is the engine''s ProgressEvent as JSON. A `: ping` comment every 15 s. The stream ends after `done` or `error`.'
      operationId: jobEvents
      parameters:
      - description: The job id (job_...).
        in: path
        name: id
        required: true
        schema:
          type: string
      - in: header
        name: Last-Event-ID
        required: false
        schema:
          type: integer
      responses:
        '200':
          content:
            text/event-stream:
              schema:
                type: string
          description: The event stream.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: invalid_request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: unauthorized, invalid_api_key or invalid_token
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: insufficient_scope, session_required, account_required, turnstile_required, bad_origin
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: not_found
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: rate_limited, too_many_in_flight, anonymous_limit, daily_spend_limit
      security:
      - apiKey:
        - read
      - bearer:
        - read
      - cookie: []
      - {}
      summary: Progress events of a job
      tags:
      - Jobs
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
components:
  schemas:
    Error:
      properties:
        error:
          additionalProperties: true
          properties:
            code:
              description: snake_case.
              type: string
            engineCode:
              description: The engine's own code (QUOTA, SOURCE_UNAVAILABLE, ...) when there is one.
              type: string
            hint:
              type: string
            message:
              type: string
          required:
          - code
          - message
          type: object
      required:
      - error
      type: object
    ContextOptions:
      additionalProperties: false
      properties:
        detail:
          enum:
          - transcript
          - brief
          - full
        diarize:
          oneOf:
          - type: boolean
          - const: auto
        effort:
          deprecated: true
          description: 'Removed on 2026-10-09. Still accepted, whatever it holds, and ignored: the job runs as it would without it. Send `detail: "transcript"` for the words alone and `proofread: "full"` for the full proofread.'
        glossary:
          description: Accounts only. Terms, product names, and contact names for synthesis glossary corrections.
          items:
            maxLength: 100
            type: string
          maxItems: 50
          type: array
        include_words:
          description: Accounts only. Keep the word list in the result.
          type: boolean
        owner:
          additionalProperties: false
          description: Accounts only. Account owner name, notes, glossary, and time zone.
          properties:
            glossary:
              items:
                maxLength: 100
                type: string
              maxItems: 50
              type: array
            name:
              maxLength: 100
              type: string
            notes:
              maxLength: 300
              type: string
            time_zone:
              maxLength: 80
              type: string
          type: object
        proofread:
          oneOf:
          - type: boolean
          - enum:
            - terms
            - full
            - auto
        quality:
          description: Accounts only.
          enum:
          - standard
          - high
        visual:
          additionalProperties: false
          description: Accounts only.
          properties:
            fps:
              maximum: 2
              minimum: 0.1
              type: number
            max_scenes:
              maximum: 200
              minimum: 1
              type: integer
          type: object
        vocabulary:
          description: Accounts only.
          items:
            maxLength: 100
            type: string
          maxItems: 50
          type: array
      type: object
    ErrorInfo:
      description: 'The engine''s error: what a failed job carries and what the SSE `error` event holds.'
      properties:
        code:
          type: string
        hint:
          type: string
        message:
          type: string
        retryAfterMs:
          type: number
        retryable:
          type: boolean
        scope:
          enum:
          - job
          - queue
          - account
        stage:
          type: string
        status:
          type: number
      required:
      - code
      - message
      - retryable
      - scope
      - stage
      type: object
    AskRequest:
      additionalProperties: false
      description: Exactly one of job_id or context.
      properties:
        context:
          description: 'The Context of a finished job, exactly as it was returned (at most 1 MB). A link or a file reference is not a Context: it is refused with 400.'
          type: object
        job_id:
          type: string
        question:
          maxLength: 8000
          minLength: 1
          type: string
      required:
      - question
      type: object
    Job:
      properties:
        attempt:
          type: integer
        cache_hit:
          type:
          - boolean
          - 'null'
        cancel_requested:
          type: boolean
        created_at:
          description: Epoch milliseconds.
          type: integer
        degraded:
          type: object
        error:
          oneOf:
          - $ref: '#/components/schemas/ErrorInfo'
          - type: 'null'
        estimate:
          oneOf:
          - $ref: '#/components/schemas/Quote'
          - type: 'null'
        events_url:
          type: string
        expires_at:
          type: integer
        finished_at:
          type:
          - integer
          - 'null'
        input:
          type: object
        job_id:
          type: string
        minutes_charged:
          type:
          - number
          - 'null'
        mode:
          type: string
        progress:
          description: 0 to 1, never going backwards; null until known.
          type:
          - number
          - 'null'
        result:
          oneOf:
          - $ref: '#/components/schemas/Context'
          - type: 'null'
        result_url:
          type: string
        stage:
          type:
          - string
          - 'null'
        started_at:
          type:
          - integer
          - 'null'
        status:
          enum:
          - queued
          - running
          - succeeded
          - failed
          - canceled
      required:
      - job_id
      - status
      - mode
      - estimate
      - result
      - error
      - events_url
      - result_url
      - created_at
      - expires_at
      type: object
    JobCreated:
      properties:
        degraded:
          type: object
        estimate:
          $ref: '#/components/schemas/Quote'
        events_url:
          type: string
        idempotent_replay:
          type: boolean
        job_id:
          type: string
        mode:
          type: string
        queue_position:
          type: integer
        result_url:
          type: string
        status:
          type: string
        upload_id:
          type: string
      required:
      - job_id
      - status
      - events_url
      - result_url
      - estimate
      type: object
    Context:
      description: 'The result of a video: transcript, what was on screen, summary and chapters. Times are seconds. The same JSON the CLI writes with --format json.'
      properties:
        coverage:
          type: object
        id:
          description: youtube:<id>, instagram:<id>, ... or local:<key> for an upload.
          type: string
        meta:
          type: object
        produced:
          type: object
        schema:
          const: 1
        source:
          type: object
        synthesis:
          type:
          - object
          - 'null'
        tiers:
          items:
            type: object
          type: array
        transcript:
          type:
          - object
          - 'null'
        usage:
          type: object
        visual:
          type:
          - object
          - 'null'
        warnings:
          items:
            type: object
          type: array
      required:
      - schema
      - id
      - meta
      - source
      - transcript
      - visual
      - synthesis
      - tiers
      - usage
      - warnings
      type: object
    AskResponse:
      properties:
        answer:
          type: string
        citations:
          items:
            properties:
              end:
                type: number
              start:
                type: number
              text:
                type: string
            required:
            - start
            - end
            - text
            type: object
          type: array
        minutes_charged:
          type: number
        notes:
          items:
            type: string
          type: array
      required:
      - answer
      - citations
      - minutes_charged
      type: object
    ContextRequest:
      additionalProperties: false
      description: Exactly one of url or upload_id.
      properties:
        language:
          oneOf:
          - type: string
          - items:
              type: string
            maxItems: 5
            type: array
        mode:
          default: auto
          enum:
          - auto
          - captions
          - audio
          - visual
          - full
          - listen
          - watch
          - both
        options:
          $ref: '#/components/schemas/ContextOptions'
        replaces_job_id:
          description: Optional. When a second recording of the same moment arrives after a single-track upload job was already created, pass that job id (same owner, same primary upload hash) to credit its usage minutes and replace it in job listings.
          type: string
        secondary_offset_seconds:
          description: 'Only with secondary_upload_id. Add it to a time in the second recording to place it on the first one''s timeline (the second device''s start minus the first''s, in seconds). A hint: the offset is measured from the words.'
          maximum: 3600
          minimum: -3600
          type: number
        secondary_upload_id:
          description: 'Only with upload_id, and a different upload. A second recording of the same moment (another device''s microphone): both are read and fused into one transcript on the timeline of upload_id. Charged as one job of the longer of the two lengths.'
          type: string
        turnstile_token:
          description: Required for anonymous Listen and Watch when the server has Turnstile on.
          type: string
        upload_id:
          type: string
        url:
          maxLength: 2048
          type: string
      type: object
    Quote:
      properties:
        cached:
          description: 'Everything is already stored: nothing is charged.'
          type: boolean
        caption_credits:
          description: Maximum caption credits for a strict YouTube request. Media minutes are zero.
          minimum: 0
          type: integer
        charges_as:
          enum:
          - caption-item
          - captions
          - audio
          - visual
          - full
        length_known:
          const: false
          description: Present (false) when the length of the source could not be read before the run (a YouTube link that yt-dlp and the YouTube page both refused; a direct media link not yet downloaded). The job is charged from the length it measures.
        max_media_seconds:
          description: 'Only with `length_known: false` on a YouTube link: the longest stretch the job reads (a clip that ends there): never more than the plan allows per video and never more than the minutes left. `minutes` is the most the job can then use. When the server can get the video''s own captions they answer instead, also for a longer video, and the job costs less.'
          type: number
        media_seconds:
          description: 'Seconds of media the quote is for; null when the length is not known (`length_known: false`).'
          type:
          - number
          - 'null'
        minutes:
          description: 'Minutes this job uses when it runs as quoted (0 when cached), including the half minute for each media minute when the full proofread is part of it (`proofread: "full"` or a `vocabulary`). It is charged only if the pass runs. With `length_known: false`: the most it can use.'
          type: number
        tiers:
          items:
            enum:
            - captions
            - audio
            - visual
            - synthesis
          type: array
      required:
      - minutes
      - media_seconds
      - tiers
      - cached
      - charges_as
      type: object
  securitySchemes:
    apiKey:
      description: 'An API key (sbz_live_...), as X-API-Key. Keys are made in the dashboard or by `scribiz login`. Each key has one scope, named in an operation''s security requirement. `all`: Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read. `mcp`: The remote MCP server at /mcp. Includes read. `read`: Read jobs and their events.'
      in: header
      name: X-API-Key
      type: apiKey
      x-scopes:
        all: 'Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read.'
        mcp: The remote MCP server at /mcp. Includes read.
        read: Read jobs and their events.
    bearer:
      description: 'An API key (sbz_live_...) or a session token from the device flow. Each key has one scope, named in an operation''s security requirement. `all`: Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read. `mcp`: The remote MCP server at /mcp. Includes read. `read`: Read jobs and their events. A session token has every scope.'
      scheme: bearer
      type: http
      x-scopes:
        all: 'Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read.'
        mcp: The remote MCP server at /mcp. Includes read.
        read: Read jobs and their events.
    cookie:
      description: The browser session (same-origin /api/*).
      in: cookie
      name: better-auth.session_token
      type: apiKey
x-refined-from:
- openapi.json
- scribiz-openapi.json