Paper Instruments API

Paper Instruments API as documented publicly: 8 operations. Contract generated from the documentation by API Evangelist (2026-10-29); not the provider's own document.

Operations 8

GET /v1 GET /v1 #
POST /v1/chat/completions Create a chat completion. #
POST /v1/messages Send a message to the Ultramarine API using the Anthropic Messages format. #
GET /v1/models Lists available models. #
GET /v1/models/{id} Retrieves one model. #
GET /v1/pricing Returns the current rates without authentication. #
POST /v1/responses POST /v1/responses #
GET /v1/usage Call GET /v1/usage with an API key for organization usage in the current UTC calendar month. #

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/paper-instruments:paper-instruments-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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

paper-instruments-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: Paper Instruments API
  version: '2026-10-29'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-10-29: 8 operation(s) read from 7 public documentation page(s) (each operation
    names its page in x-source). This is not the provider''s published contract; Paper Instruments has published no machine-readable contract
    that the pipeline could find. Engine: anthropic.'
  x-evidence-tiers:
    code-example: 1
    documentation: 7
    pages-with-code: 2
    pages-read: 7
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-10-29'
  x-generator: generate-contract-from-docs.py
  x-engine: anthropic
  x-sources:
  - https://docs.paperinstruments.com/docs/ultramarine
  - https://docs.paperinstruments.com/docs/ultramarine/messages
  - https://docs.paperinstruments.com/docs/ultramarine/responses
  - https://docs.paperinstruments.com/docs/ultramarine/chat-completions
  - https://docs.paperinstruments.com/docs/ultramarine/billing
  - https://docs.paperinstruments.com/docs/ultramarine/sticky-sessions
  - https://docs.paperinstruments.com/docs/ultramarine/rate-limits
servers:
- url: https://api.paperinstruments.com
paths:
  /v1:
    get:
      operationId: get_v1
      tags:
      - Api
      summary: GET /v1
      x-source: https://docs.paperinstruments.com/docs/ultramarine
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl pip install -U openai example.py import os \n from openai import OpenAI \n client = OpenAI( \n base_url = \"https://api.paperinstruments.com/v1\"\
          \ , \n api_key = os.environ[ \"PAPERINSTRUMENTS_API_KEY\" ], \n ) \n stream = client.chat.completions.create( \n model = \"ultramarine-1-flash\"\
          \ , \n messages = [{ \"role\" : \"user\" , \"content\" : \"Explain EBITDA in two sentences.\" }], \n reasoning_effort = \"max\" , \n\
          \ m"
  /v1/chat/completions:
    post:
      operationId: post_v1_chat_completions
      tags:
      - Chat
      summary: Create a chat completion.
      x-source: https://docs.paperinstruments.com/docs/ultramarine/chat-completions
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
        description: Bearer $PAPERINSTRUMENTS_API_KEY
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1ChatCompletionsRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1ChatCompletionsResponse'
      x-evidence:
        kind: documentation
  /v1/messages:
    post:
      operationId: post_v1_messages
      tags:
      - Messages
      summary: Send a message to the Ultramarine API using the Anthropic Messages format.
      x-source: https://docs.paperinstruments.com/docs/ultramarine/messages
      parameters:
      - name: model
        in: query
        required: true
        schema:
          type: string
        description: Required. ultramarine-1-flash
      - name: max_tokens
        in: query
        required: true
        schema:
          type: integer
        description: Required. Positive integer, including reasoning. The default output limit is 65,536 tokens.
      - name: messages
        in: query
        required: true
        schema:
          type: array
        description: Required. user and assistant turns, ending with a user turn
      - name: system
        in: query
        required: false
        schema:
          type: string
        description: String or text blocks
      - name: output_config.effort
        in: query
        required: false
        schema:
          type: string
        description: 'low, high, or max. Default: max'
      - name: output_config.format
        in: query
        required: false
        schema:
          type: object
        description: '{"type": "json_schema", "schema": {...}}'
      - name: thinking
        in: query
        required: false
        schema:
          type: object
        description: '{"type": "adaptive"}, optionally with "display": "omitted"'
      - name: stream
        in: query
        required: false
        schema:
          type: boolean
        description: true or false
      - name: tools
        in: query
        required: false
        schema:
          type: array
        description: Custom tools with name, description, input_schema, and optional strict
      - name: tool_choice
        in: query
        required: false
        schema:
          type: string
        description: 'auto, any, none, or {"type": "tool", "name": "..."}, with optional disable_parallel_tool_use'
      - name: temperature
        in: query
        required: false
        schema:
          type: number
        description: 'Number, 0–1. Default and recommended: 1'
      - name: top_p
        in: query
        required: false
        schema:
          type: number
        description: 'Number, 0–1. Default and recommended: 0.95'
      - name: top_k
        in: query
        required: false
        schema:
          type: integer
        description: 'Integer, -1 or greater. Default and recommended: -1 (disabled)'
      - name: metadata.user_id
        in: query
        required: false
        schema:
          type: string
        description: String, up to 512 characters
      - name: cache_control
        in: query
        required: false
        schema:
          type: object
        description: '{"type": "ephemeral"}'
      - name: context_management
        in: query
        required: false
        schema:
          type: object
        description: '{"edits": [{"type": "clear_thinking_20251015", "keep": "all"}]}'
      - name: anthropic-version
        in: header
        required: false
        schema:
          type: string
        description: '2023-06-01'
      - name: x-session-id
        in: header
        required: false
        schema:
          type: string
        description: Optional. A stable conversation ID for sticky routing
      - name: anthropic-beta
        in: header
        required: false
        schema:
          type: string
        description: claude-code-20250219, mid-conversation-system-2026-04-07, effort-2025-11-24, interleaved-thinking-2025-05-14, context-management-2025-06-27
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1MessagesRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1MessagesResponse'
      x-evidence:
        kind: documentation
  /v1/models:
    get:
      operationId: get_v1_models
      tags:
      - Models
      summary: Lists available models.
      x-source: https://docs.paperinstruments.com/docs/ultramarine/chat-completions
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/models/{id}:
    get:
      operationId: get_v1_models_id
      tags:
      - Models
      summary: Retrieves one model.
      x-source: https://docs.paperinstruments.com/docs/ultramarine/chat-completions
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/pricing:
    get:
      operationId: get_v1_pricing
      tags:
      - Pricing
      summary: Returns the current rates without authentication.
      x-source: https://docs.paperinstruments.com/docs/ultramarine/billing
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1PricingResponse'
      x-evidence:
        kind: documentation
  /v1/responses:
    post:
      operationId: post_v1_responses
      tags:
      - Responses
      summary: POST /v1/responses
      x-source: https://docs.paperinstruments.com/docs/ultramarine/responses
      parameters:
      - name: model
        in: query
        required: true
        schema:
          type: string
        description: ultramarine-1-flash
      - name: input
        in: query
        required: false
        schema:
          type: string
        description: 'A string or an array of Responses input items. Default: []'
      - name: instructions
        in: query
        required: false
        schema:
          type: string
        description: Optional string. Send instructions again on subsequent requests.
      - name: reasoning.effort
        in: query
        required: false
        schema:
          type: string
        description: 'low, high, or max. Default: max'
      - name: max_output_tokens
        in: query
        required: false
        schema:
          type: integer
        description: Positive integer, including reasoning. Omit to use the default output limit of 65,536 tokens.
      - name: store
        in: query
        required: false
        schema:
          type: boolean
        description: Only false is supported, which is the default.
      - name: stream
        in: query
        required: false
        schema:
          type: boolean
        description: 'Boolean. Default: false. Use true for typed server-sent events.'
      - name: tools
        in: query
        required: false
        schema:
          type: array
        description: Array of function, mcp, or web_search definitions.
      - name: tool_choice
        in: query
        required: false
        schema:
          type: string
        description: auto, none, required, or object with type and name/web_search
      - name: parallel_tool_calls
        in: query
        required: false
        schema:
          type: boolean
        description: Boolean
      - name: max_tool_calls
        in: query
        required: false
        schema:
          type: integer
        description: 'Integer, 1–15; default: 4'
      - name: text.format
        in: query
        required: false
        schema:
          type: string
        description: '{"type":"text"}, {"type":"json_object"}, or json_schema'
      - name: temperature
        in: query
        required: false
        schema:
          type: number
        description: 'Number, 0–2. Default and recommended: 1'
      - name: top_p
        in: query
        required: false
        schema:
          type: number
        description: 'Number, 0–1. Default and recommended: 0.95'
      - name: metadata
        in: query
        required: false
        schema:
          type: string
        description: 'Up to 16 string pairs. Keys: at most 64 characters; values: at most 512.'
      - name: prompt_cache_key
        in: query
        required: false
        schema:
          type: string
        description: Optional string cache hint. Cache hits are not guaranteed.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1ResponsesRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1ResponsesResponse'
      x-evidence:
        kind: documentation
  /v1/usage:
    get:
      operationId: get_v1_usage
      tags:
      - Usage
      summary: Call GET /v1/usage with an API key for organization usage in the current UTC calendar month.
      x-source: https://docs.paperinstruments.com/docs/ultramarine/billing
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1UsageResponse'
      x-evidence:
        kind: documentation
components:
  schemas:
    PostV1ChatCompletionsRequest:
      type: object
      properties:
        model:
          type: string
          description: ultramarine-1-flash
        messages:
          type: string
          description: 'Required, non-empty array. Roles: system, user, assistant, tool'
        reasoning_effort:
          type: string
          description: 'low, high, or max. Default: max'
        max_completion_tokens:
          type: string
          description: Positive integer, including reasoning
        stream:
          type: string
          description: 'Boolean. Default: false'
        stream_options:
          type: string
          description: 'Set {"include_usage": true} to receive stream usage'
        tools:
          type: string
          description: Function tools and tool selection
        tool_choice:
          type: string
          description: Tool selection
        parallel_tool_calls:
          type: string
          description: Parallel tool calls
        response_format:
          type: string
          description: 'Structured output: json_object or json_schema, or plain text'
        temperature:
          type: string
          description: 'Number, 0–2. Default and recommended: 1'
        top_p:
          type: string
          description: 'Number, 0–1. Default and recommended: 0.95'
        top_k:
          type: string
          description: 'Integer, -1 or greater. Default and recommended: -1'
        min_p:
          type: string
          description: Minimum-probability sampling control
        presence_penalty:
          type: string
          description: Token selection control
        frequency_penalty:
          type: string
          description: Token selection control
        repetition_penalty:
          type: string
          description: Token selection control
        logit_bias:
          type: string
          description: Token selection control
        logprobs:
          type: string
          description: Token probabilities
        top_logprobs:
          type: string
          description: Token probabilities. Must be an integer, 0–20
        n:
          type: string
          description: 'Integer, 1–16. Default: 1'
        stop:
          type: string
          description: A string or up to 16 non-empty strings, each at most 1,024 characters
        seed:
          type: string
          description: Sampling seed
        prompt_cache_key:
          type: string
          description: Optional cache hint
        user:
          type: string
          description: User identifier
      required:
      - model
      - messages
    PostV1ChatCompletionsResponse:
      type: object
      properties:
        choices:
          type: string
        usage:
          type: string
    PostV1MessagesRequest:
      type: object
      properties:
        model:
          type: string
          description: Required. ultramarine-1-flash
        max_tokens:
          type: integer
          description: Required. Positive integer, including reasoning
        messages:
          type: array
          description: Required. user and assistant turns, ending with a user turn
        system:
          type: string
          description: String or text blocks
        output_config:
          type: object
          description: Object with effort and format fields
        thinking:
          type: object
          description: '{"type": "adaptive"}, optionally with "display": "omitted"'
        stream:
          type: boolean
          description: true or false
        tools:
          type: array
          description: Custom tools with name, description, input_schema, and optional strict
        tool_choice:
          type: string
          description: auto, any, none, or tool object
        temperature:
          type: number
          description: Number, 0–1
        top_p:
          type: number
          description: Number, 0–1
        top_k:
          type: integer
          description: Integer, -1 or greater
        metadata:
          type: object
          description: Object with user_id field
        cache_control:
          type: object
          description: '{"type": "ephemeral"}'
        context_management:
          type: object
          description: Object with edits array
      required:
      - model
      - max_tokens
      - messages
    PostV1MessagesResponse:
      type: object
      properties:
        type:
          type: string
          description: Response type
        error:
          type: object
          description: Error object containing type and message
        request_id:
          type: string
          description: Request ID prefixed with req_
    GetV1PricingResponse:
      type: object
      properties:
        web_search_per_1k_usd:
          type: number
    PostV1ResponsesRequest:
      type: object
      properties:
        model:
          type: string
          description: Required. ultramarine-1-flash
        input:
          type: string
          description: 'A string or an array of Responses input items. Default: []'
        instructions:
          type: string
          description: Optional string. Send instructions again on subsequent requests.
        reasoning:
          type: object
          description: 'reasoning.effort: low, high, or max. Default: max'
        max_output_tokens:
          type: integer
          description: Positive integer, including reasoning.
        store:
          type: boolean
          description: Only false is supported, which is the default.
        previous_response_id:
          type: string
          description: Unsupported.
        stream:
          type: boolean
          description: 'Boolean. Default: false.'
        tools:
          type: array
          description: Array of function, mcp, or web_search definitions.
        tool_choice:
          type: string
          description: auto, none, required, or object
        parallel_tool_calls:
          type: boolean
          description: Boolean.
        max_tool_calls:
          type: integer
          description: 'Integer, 1–15; default: 4'
        text:
          type: object
          description: text.format field
        temperature:
          type: number
          description: 'Number, 0–2. Default and recommended: 1'
        top_p:
          type: number
          description: 'Number, 0–1. Default and recommended: 0.95'
        metadata:
          type: object
          description: Up to 16 string pairs.
        prompt_cache_key:
          type: string
          description: Optional string cache hint.
      required:
      - model
    PostV1ResponsesResponse:
      type: object
      properties:
        status:
          type: string
          description: Response status
        output_text:
          type: string
          description: The text output of the response
        output:
          type: array
          description: Each step's reasoning and messages, plus tool calls
        usage:
          type: object
          description: Token usage including input_tokens, output_tokens, total_tokens
        id:
          type: string
          description: Response ID
    GetV1UsageResponse:
      type: object
      properties:
        available_nanodollars:
          type: number
        reserved_nanodollars:
          type: number
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
security:
- apiKey: []
tags:
- name: Api
- name: Chat
- name: Messages
- name: Models
- name: Pricing
- name: Responses
- name: Usage