> ## 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.

# Search the web

> Runs up to three web searches and returns the top pages with excerpts. Each call costs 1,000 micros, a tenth of a credit. A failed call costs nothing.



## OpenAPI

````yaml /openapi.json post /v1/search
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/search:
    post:
      summary: Search the web
      description: >-
        Runs up to three web searches and returns the top pages with excerpts.
        Each call costs 1,000 micros, a tenth of a credit. A failed call costs
        nothing.
      operationId: search
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
            example:
              model: parallel-search
              queries:
                - go 1.27 release notes
              objective: What changed in the standard library?
      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/SearchResults'
              example:
                object: search.results
                results:
                  - url: https://go.dev/doc/go1.27
                    title: Go 1.27 Release Notes
                    published: null
                    excerpts:
                      - |-
                        ## Standard library
                        ...
        '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_parameter
              when: >-
                queries, a query, or objective is out of range. The message
                names it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  message: queries must be a list of 1 to 3 strings.
                  type: invalid_request_error
                  param: null
                  code: invalid_parameter
          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'
        '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:
    SearchRequest:
      type: object
      required:
        - model
        - queries
      additionalProperties: false
      properties:
        model:
          type: string
          description: A search model's id, such as parallel-search.
        queries:
          type: array
          minItems: 1
          maxItems: 3
          items:
            type: string
            minLength: 1
            maxLength: 200
        objective:
          type: string
          maxLength: 500
          description: What you want to learn. The search uses it to choose the excerpts.
    SearchResults:
      type: object
      required:
        - object
        - results
      properties:
        object:
          const: search.results
        results:
          type: array
          maxItems: 10
          items:
            type: object
            required:
              - url
              - title
              - published
              - excerpts
            properties:
              url:
                type: string
              title:
                type: string
                description: Empty when the page has none.
              published:
                type:
                  - string
                  - 'null'
                description: YYYY-MM-DD, or null when unknown.
              excerpts:
                type: array
                items:
                  type: string
                description: >-
                  The excerpts of all results together hold at most 8,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.