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

# Subscribe Addresses to Snapshots

> Subscribe addresses to daily snapshots for one year. Every address sent comes back with a `status`: `created` for a new subscription, `already_subscribed` for a subscription that is still running, `expired` for one that has ended. Only new addresses are charged; existing subscriptions are left unchanged, and expired ones are renewed with POST /v1/snapshot-subscriptions/renew. Results are grouped by status, not in request order. New subscriptions start with `autoRenew: true`.

**Cost:** 1,200 credits per new address, per year. If the balance does not cover every new address, the request fails with 402 and nothing is created.

**Rate limit:** 360 req/min

**Get your API key:** [Dev Portal](https://data.octav.fi)



## OpenAPI

````yaml /openapi.json post /snapshot-subscriptions
openapi: 3.0.0
info:
  title: Octav API
  description: >-
    Comprehensive blockchain data API for portfolio management, transactions,
    and DeFi analytics
  version: 1.0.0
  contact:
    name: Octav Support
    url: https://octav.fi
    email: info@octav.fi
servers:
  - url: https://api.octav.fi/v1
    description: Production API
security:
  - bearerAuth: []
tags:
  - name: Portfolio
    description: Portfolio and holdings endpoints
  - name: Virtual Users
    description: Virtual user management and portfolio endpoints (Pro only)
  - name: Nav
    description: Net Asset Value endpoints
  - name: Wallet
    description: Wallet information endpoints
  - name: Transactions
    description: Transaction history endpoints
  - name: Approvals
    description: Token approval endpoints
  - name: Tokens
    description: Token data endpoints
  - name: Airdrops
    description: Airdrop eligibility endpoints
  - name: Snapshot Subscriptions
    description: >-
      Subscribe addresses to daily portfolio snapshots, renew them, and list
      what your key can read
  - name: Sync
    description: Data synchronization endpoints
  - name: Status
    description: Status check endpoints
  - name: Credits
    description: Credit balance endpoints
  - name: Chains
    description: Blockchain network and protocol endpoints
  - name: Contract Protocol
    description: Resolve a contract address to its DeFi protocol
  - name: Agent (x402)
    description: >-
      Pay-per-call endpoints for autonomous agents via the x402 protocol — no
      API key. A five-endpoint subset; the API-key REST endpoints above are the
      default.
  - name: Beacon Validators
    description: >-
      Ethereum beacon chain validator endpoints — details, rewards, withdrawals,
      and deposits (mainnet only)
  - name: Address Book
    description: >-
      Manage the wallet addresses saved to your account — the list a bundle
      draws from
  - name: Bundles
    description: Group saved address book addresses into named bundles
paths:
  /snapshot-subscriptions:
    post:
      tags:
        - Snapshot Subscriptions
      summary: Subscribe Addresses to Snapshots
      description: >-
        Subscribe addresses to daily snapshots for one year. Every address sent
        comes back with a `status`: `created` for a new subscription,
        `already_subscribed` for a subscription that is still running, `expired`
        for one that has ended. Only new addresses are charged; existing
        subscriptions are left unchanged, and expired ones are renewed with POST
        /v1/snapshot-subscriptions/renew. Results are grouped by status, not in
        request order. New subscriptions start with `autoRenew: true`.


        **Cost:** 1,200 credits per new address, per year. If the balance does
        not cover every new address, the request fails with 402 and nothing is
        created.


        **Rate limit:** 360 req/min


        **Get your API key:** [Dev Portal](https://data.octav.fi)
      operationId: subscribeSnapshots
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                addresses:
                  type: array
                  minItems: 1
                  maxItems: 500
                  description: >-
                    Addresses to subscribe, 1 to 500 per request. Addresses must
                    be unique within the request.
                  items:
                    type: object
                    properties:
                      address:
                        type: string
                        description: EVM or Solana address.
                      description:
                        type: string
                        description: >-
                          Optional description. Ignored for an address that
                          already has a subscription.
                    required:
                      - address
              required:
                - addresses
              example:
                addresses:
                  - address: '0x28c6c06298d514db089934071355e5743bf21d60'
                    description: New Fund
                  - address: '0xe760ad8df0a54aafd95e3bc271b65d224abeaa57'
                    description: Operations
                  - address: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045'
      responses:
        '200':
          description: Every address sent, with its status
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/SnapshotSubscriptionResult'
              example:
                data:
                  - address: '0x28c6c06298d514db089934071355e5743bf21d60'
                    description: New Fund
                    subscriptionStartDate: '2026-11-11T10:00:00.000Z'
                    subscriptionEndDate: '2027-11-11T10:00:00.000Z'
                    autoRenew: true
                    status: created
                  - address: '0xe760ad8df0a54aafd95e3bc271b65d224abeaa57'
                    description: Operations
                    subscriptionStartDate: '2026-03-02T14:05:11.000Z'
                    subscriptionEndDate: '2027-03-02T14:05:11.000Z'
                    autoRenew: true
                    status: already_subscribed
                  - address: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045'
                    description: Cold Wallet
                    subscriptionStartDate: '2025-10-20T11:00:00.000Z'
                    subscriptionEndDate: '2026-10-20T11:00:00.000Z'
                    autoRenew: false
                    status: expired
        '400':
          description: >-
            VALIDATION_ERROR: an address is malformed or unsupported, or the
            request repeats an address. Request-schema failures (missing or
            empty `addresses`, more than 500) instead return the API-wide
            `ValidationFailedError` shape: { "error": "Validation Failed",
            "details": { "body": [...] } }.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ApiErrorEnvelope'
                  - $ref: '#/components/schemas/ValidationFailedError'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: One or more addresses are invalid
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          description: >-
            NOT_ENOUGH_CREDITS: the balance does not cover the request. Nothing
            is charged or changed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              example:
                error:
                  code: NOT_ENOUGH_CREDITS
                  message: Not enough credits to renew / create snapshots
        '429':
          description: Rate limit exceeded — 360 requests/min
        '500':
          description: 'INTERNAL_ERROR: unexpected server-side failure.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
              example:
                error:
                  code: INTERNAL_ERROR
                  message: Error while subscribing addresses to snapshots
      security:
        - bearerAuth: []
components:
  schemas:
    SnapshotSubscriptionResult:
      type: object
      description: One address from a subscribe request and what happened to it.
      required:
        - address
        - subscriptionStartDate
        - subscriptionEndDate
        - autoRenew
        - status
      properties:
        address:
          type: string
          description: The normalized wallet address.
        description:
          type: string
          description: Your description of the address. May be empty.
        subscriptionStartDate:
          type: string
          format: date-time
          description: When the subscription started.
        subscriptionEndDate:
          type: string
          format: date-time
          description: When the subscription ends.
        autoRenew:
          type: boolean
          description: >-
            When true, the subscription renews itself for 1,200 credits on its
            end date. If the balance falls short it is not renewed and autoRenew
            turns false.
        status:
          type: string
          enum:
            - created
            - already_subscribed
            - expired
          description: >-
            `created`: new subscription, charged. `already_subscribed`: the
            subscription is still running. `expired`: the subscription has
            ended; renew it with POST /v1/snapshot-subscriptions/renew. Existing
            subscriptions are not charged or changed.
      example:
        address: '0x28c6c06298d514db089934071355e5743bf21d60'
        description: New Fund
        subscriptionStartDate: '2026-11-11T10:00:00.000Z'
        subscriptionEndDate: '2027-11-11T10:00:00.000Z'
        autoRenew: true
        status: created
    ApiErrorEnvelope:
      type: object
      description: >-
        Domain failures on the address book, bundle and snapshot subscription
        routes answer with this envelope. Some codes add extra fields alongside
        code and message.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - VALIDATION_ERROR
                - UNAUTHORIZED
                - ADDRESSBOOK_ENTRY_NOT_FOUND
                - ADDRESSBOOK_QUOTA_REACHED
                - ADDRESSBOOK_ENTRY_NOT_DELETABLE
                - BUNDLE_NOT_FOUND
                - BUNDLE_QUOTA_REACHED
                - BUNDLE_SIZE_LIMIT_EXCEEDED
                - BUNDLE_NAME_TAKEN
                - BUNDLE_MEMBERS_ALREADY_BUNDLED
                - BUNDLE_EMPTY
                - BUNDLE_ADDRESS_NOT_IN_ADDRESS_BOOK
                - DELEGATE_NOT_FOUND
                - NOT_ENOUGH_CREDITS
                - SNAPSHOTS_NOT_RENEWABLE
                - INTERNAL_ERROR
            message:
              type: string
            quota:
              type: integer
              description: The limit that was reached.
            current:
              type: integer
              description: Current count against that limit.
            limit:
              type: integer
              description: Maximum addresses a bundle may hold.
            name:
              type: string
              description: Bundle name that is already taken.
            bundleId:
              type: string
              description: Bundle that already holds these addresses.
            addresses:
              type: array
              items:
                type: string
              description: Addresses that are not in the address book.
            rejected:
              type: array
              description: >-
                SNAPSHOTS_NOT_RENEWABLE only: every address that cannot be
                renewed, with the reason.
              items:
                type: object
                properties:
                  address:
                    type: string
                  reason:
                    type: string
                    enum:
                      - not_subscribed
                      - license
                      - not_yet_renewable
          required:
            - code
            - message
    ValidationFailedError:
      type: object
      description: >-
        Returned when the request body does not match the endpoint's schema, for
        example `addresses` missing, empty, not an array or longer than 500.
      required:
        - error
        - details
      properties:
        error:
          type: string
          example: Validation Failed
        details:
          type: object
          description: The failing checks, grouped by request part (`body`, `query`).
          additionalProperties:
            type: array
            items:
              type: object
              properties:
                message:
                  type: string
                path:
                  type: array
                  items:
                    type: string
                type:
                  type: string
  responses:
    Unauthorized:
      description: Missing or invalid Bearer token
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: Unauthorized
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````

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