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

# Read async job result

> Read the provider result of an async job, such as clado/bulk-contacts. Pass the apiCallId returned by the submit call. Locus reads the job id from that call's receipt. Reads are free and never create a new charge, so polling the same call again is safe. Access follows the submit endpoint's scope. Set waitSeconds to wait on the server for up to 45 seconds. When state is pending, call again after pollAfterMs. When nextPage is present, call again with its skip and limit to read the next page.



## OpenAPI

````yaml /api-reference/openapi.json post /wrapped/credits/calls/{callId}/result
openapi: 3.1.0
info:
  title: Locus Pro API
  description: >-
    Access paid tools, manage prepaid balances, and build usage billing. Send
    money as exact decimal strings and reuse Idempotency-Key on retries.
    Management routes require a scoped server key or authorized dashboard
    session. Sensitive workspace changes require an owner or admin with recent
    MFA or passkey verification, except where an operation documents a stricter
    boundary. Interactive agents use MCP OAuth; unattended agents use scoped
    Agent Connections. Browser widgets use end-user tokens.
  version: 0.7.0
servers:
  - url: https://api.paywithlocus.com/api
    description: Production
  - url: https://api.stage.paywithlocus.com/api
    description: Stage — evaluation and integration testing
security:
  - secretKey: []
tags:
  - name: Authentication
    description: Email-verified self-serve account creation and dashboard identity
  - name: Tenants
    description: Tenant profile, keys, and settings (dashboard session or secret key)
  - name: Workspace members
    description: Invite-only human workspace membership and role administration
  - name: Catalog
    description: Enable/disable APIs and set markups
  - name: Custom APIs
    description: Feature-gated enterprise BYOK providers and schema-backed custom actions
  - name: End users
    description: End-user accounts, tokens, and allocations
  - name: Top-ups
    description: Locus-hosted checkout top-ups and quotes
  - name: Ledger
    description: Burn/top-up history and earnings
  - name: Webhooks
    description: Signed events, delivery inspection, and replay
  - name: Burn
    description: Metered pay-per-use calls
  - name: MCP
    description: Stateless Streamable HTTP transport and MCP tool-result contracts
  - name: Okibi Identity
    description: >-
      Feature-gated Okibi identity verification and scoped native CLI credential
      bootstrap
  - name: Widget
    description: End-user JWT surface; a matching publishable key is optional
  - name: Agent-native onboarding
    description: >-
      Self-registration, human Stripe funding handoff, and restricted account
      setup for headless agents
  - name: Hosted Workflows
    description: >-
      Tenant-private TypeScript Workflow definitions, immutable versions,
      bounded runs, artifacts, and recovery
  - name: Agent connections
    description: Scoped, expiring, revocable credentials for agent execution
  - name: Recipes
    description: >-
      Search, research, extraction, enrichment, and travel outcomes across
      providers
paths:
  /wrapped/credits/calls/{callId}/result:
    post:
      tags:
        - Burn
      summary: Read async job result
      description: >-
        Read the provider result of an async job, such as clado/bulk-contacts.
        Pass the apiCallId returned by the submit call. Locus reads the job id
        from that call's receipt. Reads are free and never create a new charge,
        so polling the same call again is safe. Access follows the submit
        endpoint's scope. Set waitSeconds to wait on the server for up to 45
        seconds. When state is pending, call again after pollAfterMs. When
        nextPage is present, call again with its skip and limit to read the next
        page.
      parameters:
        - name: callId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: The apiCallId of the submit call.
        - $ref: '#/components/parameters/SessionBindingHeader'
        - name: X-Locus-End-User
          in: header
          required: false
          schema:
            $ref: '#/components/schemas/ExternalUserId'
          description: Secret-key callers must repeat the original end user.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                waitSeconds:
                  type: integer
                  minimum: 0
                  maximum: 45
                  default: 0
                  description: >-
                    Seconds to wait on the server for the job to finish. 0 reads
                    the current state once.
                skip:
                  type: integer
                  minimum: 0
                  description: Result offset for paged results. Copy it from nextPage.
                limit:
                  type: integer
                  minimum: 1
                  description: Results per page for paged results. Copy it from nextPage.
      responses:
        '200':
          description: Job state and provider result. No credits charged.
          content:
            application/json:
              schema:
                type: object
                required:
                  - apiCallId
                  - provider
                  - endpoint
                  - statusEndpoint
                  - jobId
                  - state
                  - result
                  - billing
                properties:
                  apiCallId:
                    type: string
                    format: uuid
                  provider:
                    type: string
                  endpoint:
                    type: string
                    description: The submit endpoint.
                  statusEndpoint:
                    type: string
                    description: The provider status endpoint Locus read.
                  jobId:
                    type: string
                  state:
                    type: string
                    enum:
                      - pending
                      - completed
                      - failed
                  pollAfterMs:
                    type: integer
                    description: Present when state is pending.
                  nextPage:
                    type: object
                    required:
                      - skip
                    properties:
                      skip:
                        type: integer
                      limit:
                        type: integer
                    description: >-
                      Present when more result pages remain. Pass these values
                      as skip and limit.
                  result:
                    description: >-
                      The provider status body. When state is completed it holds
                      the final result.
                  billing:
                    type: object
                    required:
                      - chargedCredits
                    properties:
                      chargedCredits:
                        type: string
        '400':
          description: >-
            Invalid waitSeconds, skip, or limit (invalid_request), or skip or
            limit sent for a result that is not paged (pagination_unsupported)
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                  - message
                properties:
                  error:
                    type: string
                  code:
                    type: string
                  message:
                    type: string
        '403':
          description: >-
            Credential cannot call the submit endpoint
            (credential_endpoint_denied)
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                  - message
                properties:
                  error:
                    type: string
                  code:
                    type: string
                  message:
                    type: string
        '404':
          description: >-
            No job for this call id is visible to this credential, or the
            provider no longer has it (job_not_found)
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                  - message
                properties:
                  error:
                    type: string
                  code:
                    type: string
                  message:
                    type: string
        '409':
          description: The call did not start an async job (not_async_job)
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                  - message
                properties:
                  error:
                    type: string
                  code:
                    type: string
                  message:
                    type: string
        '424':
          description: >-
            The provider status read failed. Retry; reads are free
            (upstream_error)
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                  - message
                properties:
                  error:
                    type: string
                  code:
                    type: string
                  message:
                    type: string
        '429':
          description: Tenant rate limit exceeded
      security:
        - secretKey: []
        - endUserToken: []
        - agentConnection: []
components:
  parameters:
    SessionBindingHeader:
      name: X-Locus-Session-Id
      in: header
      required: false
      schema:
        type: string
        minLength: 16
        maxLength: 128
        pattern: ^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$
      description: >-
        Required only when the end-user JWT carries sid. Send the original
        high-entropy session value; sid is its SHA-256 fingerprint. Ignored for
        secret-key authentication.
  schemas:
    ExternalUserId:
      type: string
      minLength: 1
      maxLength: 200
      pattern: ^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,199}$
      description: >-
        Case-sensitive immutable ID in the tenant namespace. Prefer an
        identity-provider subject, not an email address.
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      description: Tenant secret key (lcr_…). Server-side only.
    endUserToken:
      type: http
      scheme: bearer
      description: >-
        60-3600 second end-user JWT minted via /credits/end-users/{id}/token. If
        the JWT has sid, send the original session value in X-Locus-Session-Id;
        sid contains only its SHA-256 fingerprint. Bearer tokens are replayable
        until expiry; use short TTLs, optional session binding, and
        Idempotency-Key on operations.
    agentConnection:
      type: http
      scheme: bearer
      description: >-
        Scoped lcac_ credential. Tenant-managed Agent Connections authorize only
        their bound MCP and wrapped execution surfaces. A bootstrap connection
        for a self-registered agent additionally authorizes the explicit
        /credits/agent/* self-service routes for its own account; neither form
        authorizes general tenant management.

````