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

# Read asset activity

> Returns the token movements of one asset, newest first. Send `since_ledger` or a `cursor`.

- No maximum range width. A page can hold fewer records than `limit`, or none, while `range_complete` is false (each page scans for about 8 seconds and stops at 16 MiB): follow `_links.next.href` until `range_complete` is true ([pagination](/activity/pagination)).
- Unknown or repeated query parameters return 400, so a typo or an unsupported filter never returns unfiltered data.



## OpenAPI

````yaml /api-reference/activity.json get /assets/{asset}/activity
openapi: 3.0.3
info:
  title: Lumeus Activity API
  version: '2026-09-15'
  description: >-
    Lumeus Activity API on Stellar. 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. 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 the GET data routes only, from an allowed browser
    origin. Webhook keys (`whk_…`) are not accepted here.

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

    - **Errors.** JSON with a machine-readable code (see
    [errors](/guides/errors)). A path with an empty, `.` or `..` segment answers
    400 invalid_request, a trailing slash answers 404 not_found, and a method
    the path does not accept answers 405 with an Allow header.

    - **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://api-testnet.lumeus.dev
    description: Testnet (default)
  - url: https://api.lumeus.dev
    description: Mainnet
security:
  - Bearer: []
tags:
  - name: Queries
    description: >-
      Decoded Stellar history: the token movements and contract events of an
      account, asset, contract or transaction, the network feed, contract-event
      topic search and transaction headers.
  - name: Results
    description: >-
      Recover the saved result of a long prepaid request without running it
      again. Only prepaid accounts receive operation IDs; every other account
      gets 404 here.
  - name: Workspace
    description: >-
      Your workspace (organization): its name, plan, current period usage and
      API base URLs. Served by the Activity host for every product.
  - name: API keys
    description: >-
      Create, list, update, rotate and revoke the `lum_` keys used by the
      Activity API, the Assets API and RPC.
  - name: Usage
    description: >-
      Credits and requests used, the free Testnet daily count, per-route
      breakdowns, time series and the request log of your keys.
  - name: Billing
    description: >-
      The public plan catalog, plan subscriptions through Stripe Checkout, the
      billing portal and payment status.
  - name: Retired
    description: >-
      Routes kept only so old clients get a clear answer. Do not use them in new
      code.
  - name: Health
    description: Liveness and readiness probes for monitoring. No authentication.
paths:
  /assets/{asset}/activity:
    get:
      tags:
        - Queries
      summary: Read asset activity
      description: >-
        Returns the token movements of one asset, newest first. Send
        `since_ledger` or a `cursor`.


        - No maximum range width. A page can hold fewer records than `limit`, or
        none, while `range_complete` is false (each page scans for about 8
        seconds and stops at 16 MiB): follow `_links.next.href` until
        `range_complete` is true ([pagination](/activity/pagination)).

        - Unknown or repeated query parameters return 400, so a typo or an
        unsupported filter never returns unfiltered data.
      operationId: readAssetActivity
      parameters:
        - name: asset
          in: path
          required: true
          description: >-
            `native`, or a SEP-11 asset `CODE:ISSUER` (case-sensitive).
            URL-encode the colon if your HTTP client requires it.
          schema:
            type: string
            example: BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX
            x-default: BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX
          example: BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX
        - name: order
          in: query
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
            example: desc
          description: >-
            Sort by ledger: desc (newest first) or asc. The route description
            gives the default.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 10
            example: 10
          description: >-
            Records per page. Larger values are clamped to max_page_size from
            `GET /v1/plans` (200), or account_max_page_size (1000) on account
            activity and both topic routes; the page reports the effective value
            as limit.
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Resume after this paging_token. Prefer following `_links.next.href`,
            which carries the cursor and the snapshot for you.
        - name: since_ledger
          in: query
          required: true
          schema:
            type: integer
            minimum: 0
            example: 5300000
            x-default: 5300000
          description: >-
            Required unless `cursor` is set (or, on contract activity, a topicN
            parameter). First ledger of the range, inclusive. Without
            until_ledger the range runs to the published tip
            (read_view.snapshot_ledger). A value past the tip returns an empty,
            complete page whose scanned_through_ledger is the tip.
          example: 5300000
        - name: until_ledger
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
          description: >-
            End of the range, exclusive. Requires since_ledger and must be
            greater than it. There is no maximum range width.
        - name: generation
          in: query
          required: false
          schema:
            type: string
          description: >-
            Index generation from read_view.generation. Send it together with
            snapshot_ledger to keep a walk on one snapshot; server links already
            include both.
        - name: snapshot_ledger
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 2147483647
          description: >-
            Read at this published snapshot (read_view.snapshot_ledger of an
            earlier page). Requires generation. Below read_view.first_ledger it
            answers 400; above the published tip, 503 index_not_ready.
        - name: Idempotency-Key
          in: header
          required: false
          description: >-
            Optional; reads do not need it. When sent it must be 8 to 128
            printable ASCII characters (0x21-0x7E: no spaces or control
            characters) in one header, otherwise 400. Prepaid accounts use it to
            recover a read without paying again; for every other account a valid
            key is accepted and has no effect.
          schema:
            type: string
            minLength: 8
            maxLength: 128
            pattern: ^[\x21-\x7E]{8,128}$
      responses:
        '200':
          description: A page of records read from one published snapshot.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Page'
              example:
                read_view:
                  network: testnet
                  generation: testnet-2025-12-18-v3
                  decoder_version: activity-v6-sdk-0.7.3-protocol-29
                  first_ledger: 3
                  snapshot_ledger: 5332633
                  published_through: 5332633
                range_complete: false
                limit: 10
                _links:
                  self:
                    href: >-
                      /assets/BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX/activity?generation=testnet-2025-12-18-v3&limit=10&order=desc&since_ledger=5300000&snapshot_ledger=5332633
                  next:
                    href: >-
                      /assets/BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX/activity?cursor=0022903368372477953-0000000000&generation=testnet-2025-12-18-v3&limit=10&order=desc&since_ledger=5300000&snapshot_ledger=5332633
                  prev:
                    href: >-
                      /assets/BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX/activity?cursor=0022903475746754561-0000000001&generation=testnet-2025-12-18-v3&limit=10&order=asc&since_ledger=5300000&snapshot_ledger=5332633
                _embedded:
                  records:
                    - id: testnet:5332631:60
                      kind: token_transfer
                      type: transfer
                      network: testnet
                      ledger: 5332631
                      closed_at: '2026-10-22T16:32:22Z'
                      tx_hash: >-
                        d2a32c5c3a38394dda5a18f06ce5b8a3ceaa0a6b6695fbd362f622f0fc94c2a4
                      tx_index: 29
                      operation_index: 1
                      asset: >-
                        BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX
                      contract_address: CAOWDS3FQ4RKAY3LP7EBRAN7QO2ZFPNXH2ITT47FSTEXPDZRNQHEQFS2
                      from: CBXZBQ6NW3TGPGLTR4JCG2VPVWFLCCHKDW75NJIXYXV7CJLNUO64VTFC
                      to: GCVBKZ2UVNPXGTQR3CAJEJL64Q4JSEVLN6643UKQI6NFNWDZD7HJE6EA
                      amount: '0.0000162'
                      amount_raw: '162'
                      paging_token: 0022903475746754561-0000000001
                    - id: testnet:5332625:60
                      kind: token_transfer
                      type: transfer
                      network: testnet
                      ledger: 5332625
                      closed_at: '2026-10-22T16:31:52Z'
                      tx_hash: >-
                        5a52f4f1caa0fd6f162697f89d095daf6407dadbce85cadcfd2c2d7a0c36897d
                      tx_index: 18
                      operation_index: 1
                      asset: >-
                        BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX
                      contract_address: CAOWDS3FQ4RKAY3LP7EBRAN7QO2ZFPNXH2ITT47FSTEXPDZRNQHEQFS2
                      from: CBXZBQ6NW3TGPGLTR4JCG2VPVWFLCCHKDW75NJIXYXV7CJLNUO64VTFC
                      to: GA3HLUKHVDWUUA6IUO2JJV6UTISELJKWZZPF7VOZZX5JIEX4M24WFHN7
                      amount: '0.0000583'
                      amount_raw: '583'
                      paging_token: 0022903449976905729-0000000001
          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
        '400':
          $ref: '#/components/responses/HTTP400_2'
        '401':
          $ref: '#/components/responses/HTTP401'
        '402':
          $ref: '#/components/responses/HTTP402'
        '403':
          $ref: '#/components/responses/HTTP403'
        '405':
          $ref: '#/components/responses/HTTP405_2'
        '409':
          $ref: '#/components/responses/HTTP409'
        '429':
          $ref: '#/components/responses/HTTP429'
        '503':
          $ref: '#/components/responses/HTTP503'
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >-
            curl --fail-with-body -sS
            'https://api-testnet.lumeus.dev/assets/BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX/activity?limit=10&since_ledger=5300000'
            \
              -H "Authorization: Bearer $LUMEUS_API_KEY"
        - lang: javascript
          label: JavaScript
          source: >-
            // Node 18+ (ES module)

            const res = await
            fetch('https://api-testnet.lumeus.dev/assets/BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX/activity?limit=10&since_ledger=5300000',
            {
              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: |-
            import json
            import os

            import requests

            res = requests.get(
                "https://api-testnet.lumeus.dev/assets/BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX/activity?limit=10&since_ledger=5300000",
                headers={"Authorization": f"Bearer {os.environ['LUMEUS_API_KEY']}"},
                timeout=30,
            )
            print(res.status_code, json.dumps(res.json(), indent=2))
components:
  schemas:
    Page:
      type: object
      properties:
        read_view:
          $ref: '#/components/schemas/ReadView'
        range_complete:
          type: boolean
          description: >-
            True when no matching record remains after this page in the
            requested range (until_ledger, else the snapshot). An exactly full
            final page is already complete. Follow _links.next only while this
            is false.
        scanned_through_ledger:
          type: integer
          description: >-
            Last ledger of the range whose matching records this walk has
            delivered. On every complete page, in both orders, it is the last
            ledger of the effective range: until_ledger - 1, or snapshot_ledger
            when until_ledger is absent or later; for a descending walk that
            holds only if the walk started at the top of its range. On an
            ascending page stopped early by the scan budget it is the last fully
            scanned ledger. When since_ledger is beyond snapshot_ledger (past
            the published tip) the page is empty and complete, has no next link,
            and reports snapshot_ledger, in both orders, so a sync loop can
            checkpoint it. Absent on other incomplete pages and on an empty
            range that ends before first_ledger.
        limit:
          type: integer
          description: >-
            Effective page size after clamping to the plan maximum:
            max_page_size, or account_max_page_size for account activity.
        _links:
          type: object
          properties:
            self:
              type: object
              properties:
                href:
                  type: string
                  description: Relative URL; resolve against this product host.
              required:
                - href
            next:
              type: object
              properties:
                href:
                  type: string
                  description: Relative URL; resolve against this product host.
              required:
                - href
              description: >-
                Present only while range_complete is false; absent on the last
                page. Its cursor always advances: past the last record or, when
                the scan budget stopped the page early (possibly with no
                records), past the last fully scanned ledger.
            prev:
              type: object
              properties:
                href:
                  type: string
                  description: Relative URL; resolve against this product host.
              required:
                - href
          required:
            - self
            - prev
        _embedded:
          type: object
          properties:
            records:
              type: array
              items:
                $ref: '#/components/schemas/Event'
          required:
            - records
      required:
        - range_complete
        - limit
        - _links
        - _embedded
        - read_view
    ReadView:
      type: object
      properties:
        network:
          type: string
          enum:
            - pubnet
            - testnet
        generation:
          type: string
        decoder_version:
          type: string
        first_ledger:
          type: integer
        snapshot_ledger:
          type: integer
        published_through:
          type: integer
          description: The frozen snapshot watermark, not the current moving tip.
      required:
        - network
        - generation
        - decoder_version
        - first_ledger
        - snapshot_ledger
        - published_through
    Event:
      type: object
      properties:
        id:
          type: string
          description: >-
            Deterministic event identity: `{network}:{ledger}:{n}` for
            token_transfer, `{network}:{ledger}:ce:{tx}:{op}:{event}` for
            contract_event. Activity and Webhooks give the same on-chain event
            the same id (same decoder release), so deduplicate on (network, id);
            after a Testnet reset ledger numbers repeat, so start a new store.
        kind:
          type: string
          enum:
            - token_transfer
            - contract_event
        type:
          type: string
          description: >-
            transfer, mint, burn, clawback, fee, or a custom contract event
            name.
        network:
          type: string
          description: 'Canonical payload vocabulary: pubnet is Mainnet.'
          enum:
            - pubnet
            - testnet
        ledger:
          type: integer
          minimum: 3
        closed_at:
          type: string
          format: date-time
        tx_hash:
          type: string
          pattern: ^[0-9a-fA-F]{64}$
        tx_index:
          type: integer
          description: One-based position within the ledger.
        operation_index:
          type: integer
          description: One-based operation index; absent for transaction-level fee events.
        asset:
          type: string
          description: native or CODE:ISSUER. May be absent for custom contract tokens.
        contract_address:
          type: string
        from:
          type: string
        to:
          type: string
        issuer:
          type: string
        to_muxed_id:
          type: string
          description: Unsigned integer string, never a JavaScript number.
        to_muxed_address:
          type: string
        to_muxed_text:
          type: string
        to_muxed_hash:
          type: string
        memo_type:
          type: string
        memo:
          type: string
        memo_xdr:
          type: string
        amount:
          type: string
          description: Decimal string; seven decimal places for Classic/SAC assets.
        amount_raw:
          type: string
          description: Exact signed integer string.
        topics:
          type: array
          items: {}
        data: {}
        topics_xdr:
          type: array
          items:
            type: string
            description: Base64 ScVal XDR.
        data_xdr:
          type: string
          description: Base64 ScVal XDR; authoritative typed representation.
        paging_token:
          type: string
          description: Activity collections only; opaque keyset cursor.
        rpc_event_id:
          type: string
          description: >-
            Activity collections only, contract_event records only: the Stellar
            RPC getEvents id of the same event (%019d-%010d). It differs from
            paging_token, which counts operations from one and orders token
            transfers and contract events together. Absent on token_transfer
            records, which do not map one-to-one onto RPC events.
      required:
        - id
        - kind
        - type
        - network
        - ledger
        - closed_at
        - tx_hash
        - tx_index
    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:
    HTTP400_2:
      description: >-
        Invalid input, including an unknown or repeated query parameter, or a
        missing since_ledger where the route requires one.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            No since_ledger or cursor:
              summary: No since_ledger or cursor
              value:
                code: invalid_request
                error: asset activity requires since_ledger or a cursor
                request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
            Unknown query parameter:
              summary: Unknown query parameter
              value:
                code: invalid_request
                error: >-
                  unknown query parameter "foo"; supported: order, limit,
                  cursor, since_ledger, until_ledger, generation,
                  snapshot_ledger
                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}$
    HTTP401:
      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: missing credentials
            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}$
    HTTP402:
      description: >-
        Mainnet only: the plan's monthly credits are used up on a hard-capped
        plan (Free; code payment_required). Upgrade, or wait for the next
        period. Testnet requests cost no credits, so Testnet never answers 402.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: payment_required
            error: >-
              monthly credit quota exhausted - top up credits or upgrade your
              plan
            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:
      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: >-
              this publishable key requires an Origin header matching one of its
              allowed origins
            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_2:
      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
              /assets/BTC:GAGVZMODPYFTULIVSY3RGFADIC5LF4LLSN37N4MFWGNZ57TYBXL2LQQX/activity;
              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}$
    HTTP409:
      description: >-
        The index generation changed since the snapshot in your cursor (code
        generation_changed). Restart the walk without generation and
        snapshot_ledger.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: generation_changed
            error: index generation or network changed; restart history sync
            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}$
    HTTP429:
      description: >-
        A rate or concurrency limit was reached, or on Testnet the
        organization's daily Testnet request cap (10,000 requests a day across
        Activity, Assets and RPC); the code is rate_limited for both. Wait
        Retry-After seconds. A rate_limited answer whose Retry-After is greater
        than 60 is the daily Testnet cap: wait until 00:00 UTC or switch to
        Mainnet. A refused request costs nothing and does not count toward the
        cap.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            Daily Testnet cap:
              summary: 'Daily Testnet request cap (Retry-After: seconds until 00:00 UTC)'
              value:
                code: rate_limited
                error: >-
                  daily Testnet request cap of 10000 reached; resets at 00:00
                  UTC
                request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
            Plan rate limit:
              summary: 'Plan rate limit (Retry-After: a few seconds)'
              value:
                code: rate_limited
                error: 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:
      description: >-
        History not ready for this snapshot (code index_not_ready), reads are
        saturated (busy), or the read ran out of time or exceeded its own memory
        limit (query_timeout). Every Activity 503 carries Retry-After. For busy
        and index_not_ready wait that many seconds (usually 2) and retry the
        same request; a busy read first queues for up to about 10 seconds before
        it is refused. For query_timeout (Retry-After 30) narrow the ledger
        range with since_ledger/until_ledger or lower limit before retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            Busy:
              summary: Reads are saturated (busy, Retry-After 2)
              value:
                code: busy
                error: activity history is busy; retry after the Retry-After delay
                request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
            Query timeout:
              summary: The read ran out of time (query_timeout, Retry-After 30)
              value:
                code: query_timeout
                error: >-
                  the read exceeded its time limit; narrow the ledger range
                  (since_ledger/until_ledger) or lower limit, then retry
                request_id: req_6f1c2a9b0e4d4c7a8b3f5e21
            History rebuilding:
              summary: History is rebuilding (index_not_ready, Retry-After 60)
              value:
                code: index_not_ready
                error: activity history is rebuilding
                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. Present on every Activity 503: 2
            for busy or a not-yet-readable snapshot, 30 for query_timeout, 60
            while history is rebuilding or outside the topic index coverage.
          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 the GET data routes only, from an allowed browser origin.
        Webhook keys (`whk_…`) are not accepted here.

````

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