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

# Get RPC operation result

> Returns the saved response of a settled prepaid operation. Results are kept 24 hours, and each can be transferred three times in total, including the original response. While the operation is pending the answer is 202 with Retry-After 5; after expiry it is 410. [Idempotency and recovery](/guides/idempotency).



## OpenAPI

````yaml /api-reference/rpc.json get /operations/{id}/result
openapi: 3.0.3
info:
  title: Lumeus RPC
  version: '2026-09-15'
  description: >-
    Lumeus RPC: Stellar JSON-RPC 2.0 over `POST /`, with Lumeus keys, metering
    and limits. Sign up at https://app.lumeus.dev: Free, Starter, Growth and
    Scale plans are self-serve, Enterprise by agreement.


    - **Pricing.** Testnet is free: Testnet requests cost no credits and are
    never billed. Each organization can make 10,000 Testnet requests a day
    across Activity, Assets and RPC (unlimited on Enterprise); the count resets
    at 00:00 UTC, and a request over it answers 429 rate_limited with
    Retry-After set to the seconds until then. Mainnet requests draw from the
    plan's monthly credits. A Mainnet call costs its method credits plus one
    credit per started 64 KiB of response. Each call of a batch counts as one
    request, and a batch that would cross the daily Testnet cap is refused
    whole. Plans, limits and credit weights: `GET
    https://api.lumeus.dev/v1/plans`.

    - **Authentication.** Send `Authorization: Bearer <key>`. Testnet:
    `lum_test_…`; Mainnet: `lum_live_…`. A key works only on its own network, so
    pick the server that matches it (the other network answers 401). Publishable
    `lum_pub_…` keys call read-only methods only, from an allowed browser
    origin. Dashboard sessions and webhook keys are not accepted.

    - **Headers.** Every response carries X-Request-Id; authenticated responses
    carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; 429 and 503
    carry Retry-After.

    - **Errors.** JSON-RPC 2.0 error objects. Gateway errors carry the
    machine-readable code as the string error.data and the request ID as
    error.request_id (see [errors](/guides/errors)). A JSON-RPC error can arrive
    with HTTP 200, from the node or for one call of a batch, so check error
    before reading result. The REST routes (`/operations/...`, `/healthz`,
    `/readyz`) answer flat JSON errors.

    - **CORS.** Browser calls (CORS) are allowed from https://docs.lumeus.dev
    (the Try it playground of this reference) and https://app.lumeus.dev only,
    without cookies; responses expose ETag, Link, Location, Retry-After,
    X-Request-Id, X-Lumeus-Operation-Id, X-Lumeus-Idempotency and
    RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (errors included).
    Other websites cannot read responses made with a server key: use a
    publishable key with your own allowed origins ([browser
    keys](/guides/browser-keys)).
  license:
    name: Lumeus API contract
servers:
  - url: https://rpc-testnet.lumeus.dev
    description: Testnet (default)
  - url: https://rpc.lumeus.dev
    description: Mainnet
security:
  - Bearer: []
tags:
  - name: JSON-RPC
    description: >-
      Stellar JSON-RPC 2.0 over `POST /`: one call or a batch of up to 20. Each
      method has its own page with parameters, result fields and a real
      response.
  - name: Results
    description: >-
      Recover the saved result of a long prepaid call without running it again.
      Only prepaid accounts receive operation IDs; every other account gets 404
      here.
  - name: Health
    description: Liveness and readiness probes for monitoring. No authentication.
paths:
  /operations/{id}/result:
    get:
      tags:
        - Results
      summary: Get RPC operation result
      description: >-
        Returns the saved response of a settled prepaid operation. Results are
        kept 24 hours, and each can be transferred three times in total,
        including the original response. While the operation is pending the
        answer is 202 with Retry-After 5; after expiry it is 410. [Idempotency
        and recovery](/guides/idempotency).
      operationId: getRpcOperationResult
      parameters:
        - name: id
          in: path
          required: true
          description: >-
            The operation ID from the X-Lumeus-Operation-ID header (or Location)
            of the original 202 response. The example ID is a placeholder and
            answers 404.
          schema:
            type: string
            example: rpo_ue_00000000000000000000000000000000
            x-default: rpo_ue_00000000000000000000000000000000
          example: rpo_ue_00000000000000000000000000000000
      responses:
        '200':
          description: The saved response, with its original status and body.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/RPCResponse'
                  - type: array
                    items:
                      $ref: '#/components/schemas/RPCResponse'
              example:
                jsonrpc: '2.0'
                id: 1
                result:
                  status: healthy
                  latestLedger: 5331530
                  latestLedgerCloseTime: '1792681237'
                  oldestLedger: 5244415
                  oldestLedgerCloseTime: '1792245662'
                  ledgerRetentionWindow: 120960
          headers:
            X-Request-Id:
              description: >-
                Identifier of this request: req_ followed by 24 hex characters.
                Error bodies repeat it as request_id. Quote it when contacting
                support.
              schema:
                type: string
                pattern: ^req_[0-9a-f]{24}$
            RateLimit-Limit:
              description: >-
                Requests per minute of the bucket that answered: the plan rate,
                the dashboard session floor of 120, or a publishable key's
                per-IP rate.
              schema:
                type: integer
            RateLimit-Remaining:
              description: Whole requests left in the bucket after this one.
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the bucket is full again.
              schema:
                type: integer
        '202':
          description: Pending; retry after Retry-After (5) seconds.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Operation'
              example:
                id: rpo_ue_00000000000000000000000000000000
                state: pending_billing
                network: testnet
                generation: testnet-2025-12-18-v2
                result_url: /operations/rpo_ue_00000000000000000000000000000000/result
                result_expires_at: null
                dedup_until: '2026-10-23T09:15:04Z'
                max_result_transfers: 3
          headers:
            X-Request-Id:
              description: >-
                Identifier of this request: req_ followed by 24 hex characters.
                Error bodies repeat it as request_id. Quote it when contacting
                support.
              schema:
                type: string
                pattern: ^req_[0-9a-f]{24}$
            RateLimit-Limit:
              description: >-
                Requests per minute of the bucket that answered: the plan rate,
                the dashboard session floor of 120, or a publishable key's
                per-IP rate.
              schema:
                type: integer
            RateLimit-Remaining:
              description: Whole requests left in the bucket after this one.
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the bucket is full again.
              schema:
                type: integer
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
        '401':
          $ref: '#/components/responses/HTTP401_2'
        '403':
          $ref: '#/components/responses/HTTP403_2'
        '404':
          $ref: '#/components/responses/HTTP404'
        '405':
          $ref: '#/components/responses/HTTP405_3'
        '410':
          $ref: '#/components/responses/HTTP410'
        '429':
          $ref: '#/components/responses/HTTP429_2'
        '503':
          $ref: '#/components/responses/HTTP503_3'
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >-
            # Use the operation ID from the X-Lumeus-Operation-ID header of your
            202 response; the placeholder answers 404.

            curl --fail-with-body -sS
            'https://rpc-testnet.lumeus.dev/operations/rpo_ue_00000000000000000000000000000000/result'
            \
              -H "Authorization: Bearer $LUMEUS_API_KEY"
        - lang: javascript
          label: JavaScript
          source: >-
            // Node 18+ (ES module)

            // Use the operation ID from the X-Lumeus-Operation-ID header of
            your 202 response; the placeholder answers 404.

            const res = await
            fetch('https://rpc-testnet.lumeus.dev/operations/rpo_ue_00000000000000000000000000000000/result',
            {
              method: 'GET',
              headers: {
                Authorization: `Bearer ${process.env.LUMEUS_API_KEY}`,
              },
            });

            console.log(res.status, JSON.stringify(await res.json(), null, 2));
        - lang: python
          label: Python
          source: >-
            # Use the operation ID from the X-Lumeus-Operation-ID header of your
            202 response; the placeholder answers 404.

            import json

            import os


            import requests


            res = requests.get(
                "https://rpc-testnet.lumeus.dev/operations/rpo_ue_00000000000000000000000000000000/result",
                headers={"Authorization": f"Bearer {os.environ['LUMEUS_API_KEY']}"},
                timeout=30,
            )

            print(res.status_code, json.dumps(res.json(), indent=2))
components:
  schemas:
    RPCResponse:
      type: object
      properties:
        jsonrpc:
          type: string
          enum:
            - '2.0'
        id:
          type: integer
          description: >-
            The id of your call, echoed unchanged (a string id comes back as a
            string). null when the gateway cannot read the id, for example for
            invalid JSON.
          nullable: true
        result:
          type: object
          additionalProperties: true
          description: >-
            The method result, as returned by stellar-rpc 29. Its fields depend
            on the method: see the method pages (for example
            [getHealth](/api/rpc/getHealth) or [getEvents](/api/rpc/getEvents))
            or the components named after the method with a Result suffix
            (getHealthResult, getEventsResult, ...).
        error:
          $ref: '#/components/schemas/RPCError'
      required:
        - jsonrpc
        - id
      oneOf:
        - title: Result
          required:
            - result
          not:
            required:
              - error
        - title: Error
          required:
            - error
          not:
            required:
              - result
      description: >-
        A JSON-RPC 2.0 response: result on success, error otherwise. A JSON-RPC
        error can arrive with HTTP 200 (for example from the node, or for one
        child of a batch). Gateway errors carry the code string in error.data
        and the request ID in error.request_id; they echo your id when the body
        is a parseable single request and use a null id when it cannot be
        determined. Preserve integer IDs exactly; avoid unsafe JavaScript
        numeric IDs. The gateway never answers 502 or 504.
    Operation:
      type: object
      properties:
        id:
          type: string
        state:
          type: string
          description: >-
            Lifecycle state; completed means the result has settled, not
            necessarily a successful transaction.
        network:
          type: string
          enum:
            - mainnet
            - testnet
        generation:
          type: string
        result_url:
          type: string
          description: Relative URL on this product host.
        result_expires_at:
          type: string
          format: date-time
          nullable: true
        dedup_until:
          type: string
          format: date-time
          nullable: true
        error_code:
          type: string
        max_result_transfers:
          type: integer
          description: Three total transfers including the initial response.
          enum:
            - 3
      required:
        - id
        - state
        - network
        - generation
        - result_url
        - max_result_transfers
    RPCError:
      type: object
      properties:
        code:
          type: integer
          description: >-
            JSON-RPC code. Gateway errors: -32700 parse error, -32600 invalid
            request (also a body over 1 MiB), -32601 unsupported method, -32602
            invalid params, -32000 policy or availability (401, 402, 403, 413
            response too large, 429, 503). Errors from the Stellar node keep its
            own code.
        message:
          type: string
          description: Human-readable; may change. Branch on data.
        data:
          type: string
          description: >-
            Gateway errors: the machine-readable code as a plain string, so that
            every Stellar SDK can parse it. The values are the shared error
            codes plus submission_outcome_unknown. Errors from the Stellar node
            keep the node's own data, if any. invalid_request: 400: invalid
            input, including a malformed Idempotency-Key or an unknown or
            repeated query parameter (Webhooks also uses it for an oversized
            request body, 413). Fix the request; do not retry unchanged.
            unauthorized: 401: missing, revoked, invalid or wrong-network
            credential. payment_required: 402 (Mainnet): monthly credit quota
            exhausted on a hard-capped plan. forbidden: 403: the key or account
            policy does not allow this action. not_found: 404 (Webhooks also
            410): the resource does not exist in this organization and network.
            method_not_allowed: 405: the route does not accept this method.
            conflict: 409: conflicting request identity, idempotency key,
            funding or recovery state. response_too_large: 413: the result
            exceeds the response budget; lower limit or narrow the request.
            rate_limited: 429: a rate, concurrency or credit-cap limit was
            reached, or (Activity, Assets and RPC on Testnet) the daily Testnet
            request cap (message `daily Testnet request cap of 10000 reached;
            resets at 00:00 UTC`, Retry-After until 00:00 UTC). Wait Retry-After
            seconds (a refused request consumes nothing). A Retry-After greater
            than 60 means the daily Testnet cap: wait until 00:00 UTC or switch
            to Mainnet. RPC carries it as the string error.data. internal_error:
            500 or another unexpected 5xx; quote request_id when contacting
            support. unavailable: 503: another temporary failure (billing, rate
            limiter, queue); retry after Retry-After seconds.
            submission_outcome_unknown: 503 (RPC sendTransaction only): the
            transaction reached the node but its answer was lost; poll
            getTransaction with error.transaction_hash before building a new
            transaction. Resubmitting the same signed envelope is safe (the node
            answers DUPLICATE).
        request_id:
          type: string
          description: >-
            Gateway errors: the same value as the X-Request-Id header; quote it
            when contacting support.
        transaction_hash:
          type: string
          description: >-
            submission_outcome_unknown only: the hash of the submitted
            transaction. Poll getTransaction with it.
      required:
        - code
        - message
      example:
        code: -32000
        message: valid API key required
        data: unauthorized
        request_id: req_0123456789abcdef01234567
    Error:
      type: object
      properties:
        error:
          type: string
          description: Human-readable message. It may change; branch on code.
        code:
          type: string
          description: >-
            Machine-readable error code. Branch on code, not on the error text,
            which may change. RPC carries the same codes as the string
            error.data of a JSON-RPC error. invalid_request: 400: invalid input,
            including a malformed Idempotency-Key or an unknown or repeated
            query parameter (Webhooks also uses it for an oversized request
            body, 413). Fix the request; do not retry unchanged. unauthorized:
            401: missing, revoked, invalid or wrong-network credential.
            payment_required: 402 (Mainnet): monthly credit quota exhausted on a
            hard-capped plan. forbidden: 403: the key or account policy does not
            allow this action. not_found: 404 (Webhooks also 410): the resource
            does not exist in this organization and network.
            topic_search_disabled: 404: contract-event topic search is not
            enabled on this network. method_not_allowed: 405: the route does not
            accept this method. conflict: 409: conflicting request identity,
            idempotency key, funding or recovery state. generation_changed: 409:
            the index generation or network changed since the snapshot was
            taken; restart the walk without generation and snapshot_ledger.
            history_unavailable: 409 (Assets): as_of_ledger is not answered from
            the balance history; start a snapshot job (POST /snapshots) or retry
            later. precondition_failed: 412 (Webhooks): the subscription version
            changed; fetch the current ETag. response_too_large: 413: the result
            exceeds the response budget; lower limit or narrow the request.
            precondition_required: 428 (Webhooks): If-Match with the
            subscription ETag is required. rate_limited: 429: a rate,
            concurrency or credit-cap limit was reached, or (Activity, Assets
            and RPC on Testnet) the daily Testnet request cap (message `daily
            Testnet request cap of 10000 reached; resets at 00:00 UTC`,
            Retry-After until 00:00 UTC). Wait Retry-After seconds (a refused
            request consumes nothing). A Retry-After greater than 60 means the
            daily Testnet cap: wait until 00:00 UTC or switch to Mainnet. RPC
            carries it as the string error.data. internal_error: 500 or another
            unexpected 5xx; quote request_id when contacting support.
            not_implemented: 501: the feature is not enabled on this host. busy:
            503: reads are saturated (the queue wait expired or the database
            refused another query or ran short of memory). Retry the same
            request after Retry-After (2) seconds. query_timeout: 503: the read
            ran out of time. Do not retry unchanged right away: narrow the
            ledger range (since_ledger/until_ledger) or lower limit; Retry-After
            is 30. index_not_ready: 503: the index or snapshot is not ready yet
            or is rebuilding; retry after Retry-After seconds. topic_coverage:
            503: the effective range is outside the contract-event topic index
            coverage (the message states it); pass a range inside it or retry
            after Retry-After (60) seconds. unavailable: 503: another temporary
            failure (billing, rate limiter, queue); retry after Retry-After
            seconds.
          enum:
            - invalid_request
            - unauthorized
            - payment_required
            - forbidden
            - not_found
            - topic_search_disabled
            - method_not_allowed
            - conflict
            - generation_changed
            - history_unavailable
            - precondition_failed
            - response_too_large
            - precondition_required
            - rate_limited
            - internal_error
            - not_implemented
            - busy
            - query_timeout
            - index_not_ready
            - topic_coverage
            - unavailable
        request_id:
          type: string
          description: >-
            Identifier of this request, the same value as the X-Request-Id
            header. Quote it when contacting support.
      required:
        - error
  responses:
    HTTP401_2:
      description: >-
        Missing, invalid, revoked or expired key, or a key for the other network
        (code unauthorized). Keys work only on the network they were created
        for.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: unauthorized
            error: valid API key required
            request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
      headers:
        X-Request-Id:
          description: >-
            Identifier of this request: req_ followed by 24 hex characters.
            Error bodies repeat it as request_id. Quote it when contacting
            support.
          schema:
            type: string
            pattern: ^req_[0-9a-f]{24}$
    HTTP403_2:
      description: >-
        This key or account cannot call this route (code forbidden): for example
        a read-only key on a workspace route, or a publishable key on a route or
        from an origin it does not allow.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: forbidden
            error: publishable keys cannot read RPC operations
            request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
      headers:
        X-Request-Id:
          description: >-
            Identifier of this request: req_ followed by 24 hex characters.
            Error bodies repeat it as request_id. Quote it when contacting
            support.
          schema:
            type: string
            pattern: ^req_[0-9a-f]{24}$
    HTTP404:
      description: >-
        No such operation on this network (code not_found). Accounts without
        prepaid access never receive an operation ID.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: not_found
            error: RPC operation not found
            request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
      headers:
        X-Request-Id:
          description: >-
            Identifier of this request: req_ followed by 24 hex characters.
            Error bodies repeat it as request_id. Quote it when contacting
            support.
          schema:
            type: string
            pattern: ^req_[0-9a-f]{24}$
    HTTP405_3:
      description: >-
        This path does not accept the HTTP method you sent (code
        method_not_allowed). The Allow header lists the methods it accepts.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: method_not_allowed
            error: >-
              method POST is not allowed on
              /operations/rpo_ue_00000000000000000000000000000000/result;
              allowed: GET, HEAD
            request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
      headers:
        X-Request-Id:
          description: >-
            Identifier of this request: req_ followed by 24 hex characters.
            Error bodies repeat it as request_id. Quote it when contacting
            support.
          schema:
            type: string
            pattern: ^req_[0-9a-f]{24}$
    HTTP410:
      description: The result expired or was deleted.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Operation'
          example:
            id: rpo_ue_00000000000000000000000000000000
            state: expired
            network: testnet
            generation: testnet-2025-12-18-v2
            result_url: /operations/rpo_ue_00000000000000000000000000000000/result
            result_expires_at: '2026-10-23T09:15:04Z'
            dedup_until: '2026-10-23T09:15:04Z'
            max_result_transfers: 3
      headers:
        X-Request-Id:
          description: >-
            Identifier of this request: req_ followed by 24 hex characters.
            Error bodies repeat it as request_id. Quote it when contacting
            support.
          schema:
            type: string
            pattern: ^req_[0-9a-f]{24}$
    HTTP429_2:
      description: >-
        The rate limit of this route was reached (code rate_limited). Wait
        Retry-After seconds. This route does not count toward the daily Testnet
        request cap, so its Retry-After is never the time until 00:00 UTC.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: rate_limited
            error: RPC recovery rate limit exceeded
            request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
      headers:
        X-Request-Id:
          description: >-
            Identifier of this request: req_ followed by 24 hex characters.
            Error bodies repeat it as request_id. Quote it when contacting
            support.
          schema:
            type: string
            pattern: ^req_[0-9a-f]{24}$
        RateLimit-Limit:
          description: >-
            Requests per minute of the bucket that answered: the plan rate, the
            dashboard session floor of 120, or a publishable key's per-IP rate.
          schema:
            type: integer
        RateLimit-Remaining:
          description: Whole requests left in the bucket after this one.
          schema:
            type: integer
        RateLimit-Reset:
          description: Seconds until the bucket is full again.
          schema:
            type: integer
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
    HTTP503_3:
      description: >-
        Recovery is temporarily unavailable (code unavailable). Retry after
        Retry-After (5) seconds.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: unavailable
            error: RPC result unavailable
            request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
      headers:
        X-Request-Id:
          description: >-
            Identifier of this request: req_ followed by 24 hex characters.
            Error bodies repeat it as request_id. Quote it when contacting
            support.
          schema:
            type: string
            pattern: ^req_[0-9a-f]{24}$
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
      description: >-
        Send `Authorization: Bearer <key>`. Testnet: `lum_test_…`; Mainnet:
        `lum_live_…`. A key works only on its own network, so pick the server
        that matches it (the other network answers 401). Publishable `lum_pub_…`
        keys call read-only methods only, from an allowed browser origin.
        Dashboard sessions and webhook keys are not accepted.

````

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