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

# Resolve which engine owns a key

> Authoritative, never advisory. 200 resolved:true names the owning engine; 200 resolved:false is a decided negative — nobody's key, or another tenant's, indistinguishably; 503 means the Courier cannot answer and the caller fails the payment closed. This operation never answers 404. A POST that reads: the key is personal data and travels in the body, never in a URL. An engine treats ANY status other than 200 and 422 as fail-closed — 404, 405, 429 and every 5xx included — and keys on the code (JDC-9001), never on the detail sentence. The 503 sentence names what could not answer — the ownership map, or the engine credential (registry or tenant database) — and both tell the engine to fail closed.



## OpenAPI

````yaml /pt/openapi/v3-current/jd-courier.yaml post /v1/ownership/lookup
openapi: 3.1.0
info:
  description: >-
    The JD Courier API. Operators use it to manage the engines, the ownership
    map, the delivery modes and bypass of each rail, the retained messages, the
    SPB send journal and reconciliation. Engines use it to resolve the owner of
    a key, claim their Pix Automático recurrences and declare their Pix
    Automático payment legs.
  title: JD Courier API
  version: v1.0.0
servers: []
security:
  - BearerAuth: []
tags:
  - description: >-
      The engine registry: the cores that consume the JD channel through the
      Courier, each with its participant set
    name: Engines
  - description: 'The ownership map: which engine owns each key. Every change is audited.'
    name: ownership
  - description: >-
      The rails: what each declares about itself, its state per tenant, and the
      bypass declaration
    name: channels
  - description: >-
      The engines' side of the ownership map: resolution for the on-us gate,
      authoritative and never advisory, the claim of a Pix Automático recurrence
      the engine holds, and the declaration of a payment leg it holds.
    name: ownership-query
  - description: >-
      The durable message store: redelivery on demand, without asking the vendor
      again
    name: ledger
  - description: >-
      Count reconciliation per rail: E(m) = C(m) + T(m) + R(m), the sequence
      gaps it saw, and the sends whose return leg never arrived
    name: assurance
  - description: >-
      The SPB send journal: every send, written before it leaves, and the sends
      whose outcome is unknown. A by-hand close records an operator's finding
      and never resends.
    name: send-journal
  - description: >-
      Per-(tenant, channel) state an operator acts on: lifting a durable channel
      halt
    name: channel-leases
  - description: >-
      Messages the Courier holds because no engine could receive them. A routing
      or delivery retention leaves by itself once its cause lifts, or when an
      operator asks for its routing decision to be run again.
    name: retained
paths:
  /v1/ownership/lookup:
    post:
      tags:
        - ownership-query
      summary: Resolve which engine owns a key
      description: >-
        Authoritative, never advisory. 200 resolved:true names the owning
        engine; 200 resolved:false is a decided negative — nobody's key, or
        another tenant's, indistinguishably; 503 means the Courier cannot answer
        and the caller fails the payment closed. This operation never answers
        404. A POST that reads: the key is personal data and travels in the
        body, never in a URL. An engine treats ANY status other than 200 and 422
        as fail-closed — 404, 405, 429 and every 5xx included — and keys on the
        code (JDC-9001), never on the detail sentence. The 503 sentence names
        what could not answer — the ownership map, or the engine credential
        (registry or tenant database) — and both tell the engine to fail closed.
      operationId: lookupOwnership
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OwnershipLookupRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OwnershipResolution'
          description: OK
        '400':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Bad Request
        '401':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Unauthorized
        '422':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Unprocessable Entity
        '500':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Internal Server Error
        '503':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Service Unavailable
      security:
        - engineCredentials:
            - ownership:read
components:
  schemas:
    OwnershipLookupRequest:
      additionalProperties: false
      properties:
        account:
          description: >-
            ACCOUNT only: the account number, digits with an optional trailing
            check-digit letter.
          maxLength: 256
          type: string
        branch:
          description: >-
            ACCOUNT only: a current account's branch, 1 to 4 digits. Omit it, or
            send it empty, for a payment account, which has none; empty is never
            branch 0.
          maxLength: 256
          type: string
        keyKind:
          description: The kind of key.
          enum:
            - ACCOUNT
            - DOCUMENT
            - PIX_KEY_EMAIL
            - PIX_KEY_PHONE
            - PIX_KEY_RANDOM
            - PAYMENT_ID
            - PIX_RECURRENCE_ID
          type: string
        keyValue:
          description: >-
            The key as the caller holds it, for every kind except ACCOUNT. Do
            not pre-normalize.
          maxLength: 256
          minLength: 1
          type: string
      required:
        - keyKind
      type: object
    OwnershipResolution:
      additionalProperties: false
      properties:
        engineId:
          description: Present only when resolved is true.
          type: string
        keyKind:
          enum:
            - ACCOUNT
            - DOCUMENT
            - PIX_KEY_EMAIL
            - PIX_KEY_PHONE
            - PIX_KEY_RANDOM
            - PAYMENT_ID
            - PIX_RECURRENCE_ID
          type: string
        keyValue:
          description: The normalized form the Courier resolved against.
          maxLength: 256
          type: string
        ownedByCaller:
          description: >-
            Present only when resolved is true: whether the owner is the engine
            whose credential made this call. Compare on this; an engine never
            needs its own registry id.
          type: boolean
        resolved:
          type: boolean
        resolvedAt:
          format: date-time
          type: string
        source:
          enum:
            - ASSIGNMENT_MAP
          type: string
      required:
        - resolved
        - keyKind
        - keyValue
        - source
        - resolvedAt
      type: object
    Detail:
      additionalProperties: true
      properties:
        code:
          description: >-
            Stable, machine-readable domain error code scoped to the emitting
            service (format: <SERVICE>-NNNN).
          type: string
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
        upstream:
          $ref: '#/components/schemas/Upstream'
          description: >-
            RFC 9457 extension member: the error a proxied third-party provider
            reported. Absent unless the emitting service explicitly surfaced
            one.
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
    Upstream:
      additionalProperties: false
      properties:
        code:
          description: The upstream provider's own error code, verbatim.
          examples:
            - E4001
          type: string
        message:
          description: >-
            The upstream provider's own error message, verbatim (bounded, never
            its raw response body).
          examples:
            - account not found at provider
          type: string
      type: object
  securitySchemes:
    BearerAuth:
      bearerFormat: JWT
      description: JWT bearer token issued by the identity provider.
      scheme: bearer
      type: http
    engineCredentials:
      description: Engines authenticate with an Access Manager application token.
      flows:
        clientCredentials:
          scopes:
            ownership:read: Read the ownership map
            ownership:write: >-
              Claim a Pix Automático recurrence or declare a Pix Automático
              payment leg, for the calling engine alone
          tokenUrl: https://access-manager.example.com/oauth2/token
      type: oauth2

````

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