> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trymorse.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Read a web page

> Reads one public web page and returns its text. Each call costs 1,000 micros, a tenth of a credit. A failed call costs nothing.



## OpenAPI

````yaml /openapi.json post /v1/fetch
openapi: 3.1.1
info:
  title: Morse API
  version: '1'
  description: >-
    The Morse API serves chat, image, web search, and page-reading models
    through an OpenAI-compatible interface. Each request pays with your Morse
    account's credits.


    Send an API key from the Morse app with every request, in the Authorization
    header as Bearer sk_morse_.... A key acts for its account and always pays
    with credits, never with a plan's included use. One credit is $0.01. GET
    /v1/models lists prices in micro-dollars, 10,000 to the credit. Keep keys on
    your server. Browsers on other sites cannot call the API.


    All of an account's keys and its owner's use of the Morse app share one
    budget of requests per minute and one limit on requests in flight. The
    account's plan sets both. A request refused for either limit carries
    Retry-After, the number of seconds to wait. A retried POST is a new request,
    and the API charges it again.


    An error reply is JSON in the Error shape, with a stable code. A path the
    API does not serve returns 404 as plain text, and a wrong method returns 405
    as plain text.
servers:
  - url: https://api.trymorse.ai
security:
  - apiKey: []
paths:
  /v1/fetch:
    post:
      summary: Read a web page
      description: >-
        Reads one public web page and returns its text. Each call costs 1,000
        micros, a tenth of a credit. A failed call costs nothing.
      operationId: fetch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FetchRequest'
            example:
              model: parallel-extract
              url: https://go.dev/doc/go1.27
      responses:
        '200':
          description: The result.
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
            X-Funding:
              $ref: '#/components/headers/X-Funding'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FetchResult'
              example:
                object: fetch.result
                url: https://go.dev/doc/go1.27
                title: Go 1.27 Release Notes
                published: null
                content: |-
                  # Go 1.27 Release Notes
                  ...
                truncated: true
        '400':
          description: The request is malformed.
          x-error-codes:
            - code: invalid_request_body
              when: >-
                The body is not a JSON object, a field has the wrong JSON type,
                or model is missing.
            - code: invalid_parameter
              when: >-
                A field has a value the endpoint refuses. The message names the
                field.
            - code: duplicate_json_key
              when: A JSON object in the body repeats a key.
            - code: invalid_url
              when: >-
                url is missing, or not an http or https URL of at most 2,048
                characters on a public host and the default port.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: >-
                    url must be an http or https URL of at most 2048 characters,
                    without credentials, on a public host and the default port,
                    80, or 443.
                  type: invalid_request_error
                  param: null
                  code: invalid_url
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
        '401':
          description: The key is missing or wrong.
          x-error-codes:
            - code: invalid_api_key
              when: >-
                The Authorization header is missing or not Bearer, the key is
                unknown or revoked, or a token that starts with sk_ is not a
                whole sk_morse_ key.
            - code: invalid_token
              when: >-
                The bearer token is not a Morse API key. Send the whole
                sk_morse_ key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: Incorrect API key provided.
                  type: invalid_request_error
                  param: null
                  code: invalid_api_key
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
        '402':
          description: The account's credits do not cover the request.
          x-error-codes:
            - code: insufficient_balance
              when: >-
                The balance is below the amount the request must hold. While the
                balance is negative, the API refuses every metered request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: The account balance does not cover this request. Add credit.
                  type: insufficient_balance
                  param: null
                  code: insufficient_balance
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
        '403':
          description: The key's account may not make this request.
          x-error-codes:
            - code: account_disabled
              when: Morse has disabled the key's account.
            - code: account_deleted
              when: The key's account has been deleted.
            - code: account_under_18
              when: The account's owner said they are under 18.
            - code: model_requires_plan
              when: >-
                The model needs a higher plan than the account's, even when
                credits pay for the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: This account has been disabled. Contact support.
                  type: invalid_request_error
                  param: null
                  code: account_disabled
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
        '404':
          description: The model does not exist, or it is not a model for this endpoint.
          x-error-codes:
            - code: model_not_found
              when: No model of this endpoint's type has that name.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: The requested model does not exist.
                  type: invalid_request_error
                  param: null
                  code: model_not_found
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
        '408':
          description: The request body arrived too slowly.
          x-error-codes:
            - code: request_timeout
              when: The request body did not arrive within one minute.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: The request body did not arrive in time.
                  type: invalid_request_error
                  param: null
                  code: request_timeout
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
        '413':
          description: The request body is too large.
          x-error-codes:
            - code: request_too_large
              when: The body is over 64 KiB.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: Request body is too large.
                  type: invalid_request_error
                  param: null
                  code: request_too_large
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
        '422':
          description: Morse could not read the page. The call costs nothing.
          x-error-codes:
            - code: fetch_failed
              when: The provider returned no content for the page.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: The page could not be read.
                  type: upstream_error
                  param: null
                  code: fetch_failed
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '429':
          description: >-
            The account is over its rate limit or its concurrency limit. Search
            and fetch each also allow 30 calls a minute per account. Wait the
            number of seconds in Retry-After, then retry.
          x-error-codes:
            - code: rate_limit_exceeded
              when: >-
                The account used up its requests per minute. All of the
                account's keys and its owner's use of the Morse app share one
                budget.
            - code: concurrency_limit_exceeded
              when: >-
                The account already has its maximum number of requests in
                flight. Retry-After is 1.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: >-
                    Rate limit reached for this account. Retry after the time in
                    the Retry-After header.
                  type: requests
                  param: null
                  code: rate_limit_exceeded
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
        '502':
          description: The web provider failed.
          x-error-codes:
            - code: upstream_error
              when: The provider failed or did not answer in time.
            - code: upstream_unavailable
              when: >-
                The provider is unavailable right now. Retry later, or choose
                another model.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: The web provider failed.
                  type: upstream_error
                  param: null
                  code: upstream_error
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '503':
          description: >-
            Morse or the provider is busy or unavailable. Retry the request
            later.
          x-error-codes:
            - code: service_unavailable
              when: Morse could not start the request. Retry it.
            - code: server_busy
              when: Morse is busy. Retry-After is 1.
            - code: upstream_busy
              when: >-
                The web provider is busy for every Morse account. Retry-After
                says when to retry.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: The web provider is busy. Try again shortly.
                  type: upstream_error
                  param: null
                  code: upstream_busy
          headers:
            X-Morse-Version:
              $ref: '#/components/headers/X-Morse-Version'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
components:
  schemas:
    FetchRequest:
      type: object
      required:
        - model
        - url
      additionalProperties: false
      properties:
        model:
          type: string
          description: A fetch model's id, such as parallel-extract.
        url:
          type: string
          maxLength: 2048
          description: >-
            An http or https URL on a public host and the default port, 80 or
            443, without credentials. The fragment is dropped.
    FetchResult:
      type: object
      required:
        - object
        - url
        - title
        - published
        - content
        - truncated
      properties:
        object:
          const: fetch.result
        url:
          type: string
        title:
          type:
            - string
            - 'null'
        published:
          type:
            - string
            - 'null'
          description: YYYY-MM-DD, or null when unknown.
        content:
          type: string
          description: The page's text, often Markdown, at most 12,000 characters.
        truncated:
          type: boolean
          description: Whether the content was cut at 12,000 characters.
    Error:
      type: object
      description: >-
        Every JSON error reply has this shape. Branch on code, which is stable.
        The message is for people and can change.
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - message
            - type
            - param
            - code
          properties:
            message:
              type: string
              description: A sentence that says what went wrong and what to do.
            type:
              type: string
              description: >-
                The error's family, such as invalid_request_error,
                insufficient_balance, plan, requests, upstream_error, or
                server_error. plan means the account's plan does not allow the
                model, even when credits pay for the request.
            param:
              type:
                - string
                - 'null'
              description: Always null on the endpoints documented here.
            code:
              type: string
              description: >-
                The specific error. Each operation lists the codes it can
                return.
  headers:
    X-Morse-Version:
      description: The running build. Every reply carries it.
      schema:
        type: string
    X-Funding:
      description: >-
        What pays for the request. With a key, the value is always credits. A
        request that Morse refuses before it bills anything has no X-Funding.
      schema:
        type: string
        enum:
          - credits
          - included
    X-Request-Id:
      description: >-
        An id for this request. Quote it when you contact support about the
        request. An error that arrives after the request starts carries it too.
        A request that Morse refuses before it bills anything has no
        X-Request-Id.
      schema:
        type: string
    Retry-After:
      description: Whole seconds to wait before retrying, at least 1.
      schema:
        type: integer
        minimum: 1
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      bearerFormat: sk_morse_...
      description: An API key from the Morse app. It starts with sk_morse_.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.