Zerion subscriptions to transactions API

Operations related to subscriptions to transactions.

OpenAPI Specification

zerion-subscriptions-to-transactions-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  version: 1.0.0
  title: REST chains subscriptions to transactions API
  description: REST-like API provides access to rich Zerion ecosystem.
  contact:
    name: Zerion API
    url: https://developers.zerion.io/
    email: api@zerion.io
servers:
- description: Production API
  url: https://api.zerion.io
security:
- APIKeyBasicAuth: []
tags:
- name: subscriptions to transactions
  description: Operations related to subscriptions to transactions.
paths:
  /v1/tx-subscriptions/:
    get:
      operationId: findWalletTransactionsSubscription
      summary: Find subscriptions
      description: 'This endpoint finds subscriptions to new transactions associated with the wallets and chains. Currently response is limited to 1000 subscriptions in the response.


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: filter[chain_ids]
        in: query
        required: false
        description: Comma-separated chain ids. Finds subscriptions on the specified chains. Searches over all chains if omitted.
        style: form
        explode: false
        schema:
          type: array
          items:
            type: string
            example: polygon
      responses:
        '200':
          $ref: '#/components/responses/SubscriptionsResponse'
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
    post:
      operationId: createSubscriptionWalletTransactions
      summary: Create subscription
      description: "This endpoint subscribes to new transactions associated with the wallets.\n\n> NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.\n\n### Use Case\nThe main use case for the webhooks system is to send notifications, similar to push notifications in the Zerion App.\n\n### Setup Callback URL\nIf you want to use this endpoint to test how it works, you might use your dev key to start. It has limits: one subscription & maximum 5 wallets per subscription.\nYou may use callback URL from webhook.site to start from. If want use your custom - contact us at api@zerion.io, and we will whitelist your URL.\n\nIf you want to use this endpoint in your production environment, you should contact us and provide the following details:\n- Your email associated with the API key\n- The URL that you prefer using as the callback (or host).\n\nAfter we've whitelisted your callback URL (or host), you may start using this endpoint.\n\n### Note\n- **Subscription Validity**: Every subscription is valid for unlimited amount of time for production key, and one week for `dev` keys.\n- **Transaction Prices**: Prices are not attached to webhook notifications and will always be `null`. Prices are added to transactions in the backend after some time. To get prices, query the transactions endpoint by hash.\n- **Delivery Guarantees**: Webhook delivery is not guaranteed. If delivery fails three times, no further attempts will be made.\n- **Order of Dispatch**: The order of webhook dispatch is not guaranteed and may not correspond to the order of transactions occurring on the blockchain.\n\n### Callback Format and Signature Verification\nApproved clients will receive notifications via POST requests to their provided URL. These notifications will include a signed notification object in the body (specified below in the `Callback` section) and a signature in the headers.\n\nClients should verify the signature provided in the headers of the webhook request to ensure the authenticity of the data. The following headers will be included:\n- `X-Signature`: The signature of the request.\n- `X-Timestamp`: The timestamp of the request.\n- `X-Certificate-URL`: The URL to download the public certificate used to verify the signature.\n\n**To verify the signature:**\n1. Concatenate the `X-Timestamp` header value, the request body, and a newline character: `$timestamp + \"\\n\" + $request.body + \"\\n\"`\n2. Use the public certificate downloaded from the `X-Certificate-URL` header to verify the signature in the `X-Signature` header.\n\nExample code in go for message verification:\n\n```go\npackage signature\n\nimport (\n  \"crypto\"\n  \"crypto/rsa\"\n  \"crypto/sha256\"\n  \"crypto/x509\"\n  \"encoding/base64\"\n  \"encoding/pem\"\n  \"errors\"\n  \"github.com/stretchr/testify/assert\"\n  \"testing\"\n)\n\n// FetchCertificate fetches the certificate from the given URL\nfunc FetchCertificate() (*x509.Certificate, error) {\n  certBytes := certificate()\n  block, _ := pem.Decode(certBytes)\n  if block == nil || block.Type != \"CERTIFICATE\" {\n    return nil, errors.New(\"failed to decode PEM block containing the certificate\")\n  }\n\n  return x509.ParseCertificate(block.Bytes)\n}\n\nfunc certificate() []byte {\n  return []byte(`-----BEGIN CERTIFICATE-----\nMIIDMTCCAhmgAwIBAgIUDd3dFMswamyJ5A1bqF0nzS8v2wgwDQYJKoZIhvcNAQEL\nBQAwQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC1plcmlvbiBJbmMuMRwwGgYJKoZI\nhvcNAQkBFg1hcGlAemVyaW9uLmlvMB4XDTI0MDYyNzE1MzUzM1oXDTI1MDYyNzE1\nMzUzM1owQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC1plcmlvbiBJbmMuMRwwGgYJ\nKoZIhvcNAQkBFg1hcGlAemVyaW9uLmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAwcPVCPLDhS9dLA8s5J6GJ3t0+jWuUCFwI+q6c03xZnhCaz45FepN\nMTiApbvPw1Zm8F8JQB4BRp/F5anokNcDSl/qmNtj3M/z/FrsVvGnSH2FOkZu9TLU\nLTW5i8Q0LAYrpgiBHrTa2qrRXd2DiMrEs3QZVoylFYc9QIGet3SULPrlSsYEKxfB\niBZDoFw619NnV6/kBO8FS34Lc+WH5SNNHNnItRrxMv4DMAFyFajSn1IwV6LSWSNK\naPJHCzP/Omu95550HQKcXaJYNE/d99NrcLaFI2fCuEVd00nApFo5knKs0FiXpGca\nl3cLOQG5SCOzUOjQb6X5CynEV+0QiyYxDwIDAQABoyEwHzAdBgNVHQ4EFgQUVL4m\nu0PcI4nJGUS8syLi5DNL44YwDQYJKoZIhvcNAQELBQADggEBAKaA1oqW0D6KxvIp\nIZxWf02XK/YFYwxKV55Vas0VWlzNemE2IjlIj0tknZt0EiM9um2FC27U9n3u0ApS\nUDrk96dQ+/RY3T3fiuXysa3ZL05OpreRk0aPuFU9rB4iLTgFiv1G/X5XXJ8O7OQb\n48u0vQnYXjT/nt72TMUoakjZ68QsP64FkG8mcK62Tg+FVWB9YWTFc0wOjsOt9RzJ\nmuKCQ7qx7L1GhkxKX4ZhrYItsH1DzXjeP5aniZgLBSPbxt01tUrSjOGN5CLOpdG8\niOnAFP+Nz8S0h2C7hppOHgC+uxY285UrzAZQoMbCREMV+0Mq/aqdF1B6qoKGNGqL\nkFbUhvo=\n-----END CERTIFICATE-----\n`)\n}\n\nfunc VerifySignature(cert *x509.Certificate, message, signature string) error {\n  pubKey := cert.PublicKey.(*rsa.PublicKey)\n\n  hashed := sha256.Sum256([]byte(message))\n  sigBytes, err := base64.StdEncoding.DecodeString(signature)\n  if err != nil {\n    return err\n  }\n\n  return rsa.VerifyPKCS1v15(pubKey, crypto.SHA256, hashed[:], sigBytes)\n}\n\nfunc TestVerifySignature(t *testing.T) {\n  // Example usage\n  x509Cert, err := FetchCertificate()\n  assert.NoError(t, err)\n\n  xTimestamp := \"2024-07-31T00:17:36Z\"\n  xSignature := \"t65gdR8z3NGh/OQRPzGMFmw36JhDNvOe6LxL6K2hCd3SdYQoTGr76dAy1CpsX2G8XVOIYUIctUQvgICQvtDctVjkRZmXuQDvXHOmiJE0ZknORgjVLFoo5JRYKvwt3EPp6SMN7RtedIX17rH1s2Vp3GRQWSjzN7C/cNgInhCQOP0UDjYlaeNT/yW4B2Qt4uY01yK0YhvQJaFHN+NNr7DZAt4FJuDppItqjaYbHTaFNqLlpI1IX7YvQWVhEYTJY6M4T9IdcGYPJKDljckjvmj9mDHZeh/Y6w8eXjLziMSFvlhJeSn1kBIR3nS7lTcwFNv1CPxD3MM7VB++te3mBbFubg==\"\n  messageBody := `{\"data\":{\"attributes\":{\"timestamp\":\"2024-07-31T00:17:36.661896043Z\"},\"id\":\"15daee90-5028-4b4c-bd49-b4d43fa1a89e\",\"type\":\"callback\"},\"included\":[{\"attributes\":{\"application_metadata\":{\"contract_address\":\"0x8286d601a0ed6cf75e067e0614f73a5b9f024151\",\"method\":{\"id\":\"0x7859bb8d\",\"name\":\"\"}},\"approvals\":[],\"fee\":{\"fungible_info\":{\"flags\":{\"verified\":true},\"icon\":{\"url\":\"https://cdn.zerion.io/eth.png\"},\"implementations\":[{\"address\":\"\",\"chain_id\":\"redstone\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"polygon-zkevm\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"optimism\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"zksync-era\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"mode\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"base\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"ethereum\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"aurora\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"scroll\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"rari\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"astar-zkevm\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"arbitrum\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"zora\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"blast\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"linea\",\"decimals\":18},{\"address\":\"\",\"chain_id\":\"manta-pacific\",\"decimals\":18}],\"name\":\"Ethereum\",\"symbol\":\"ETH\"},\"price\":null,\"quantity\":{\"decimals\":18,\"float\":0.0000016785001958,\"int\":\"1678500195825\",\"numeric\":\"0.000001678500195825\"},\"value\":null},\"flags\":{\"is_trash\":false},\"hash\":\"0xbbcfb0ac5e466ded168794a162da334634fee3f95adfdb55392999f91b4c6d41\",\"mined_at\":\"2024-07-31T00:17:35Z\",\"mined_at_block\":7490818,\"nonce\":250,\"operation_type\":\"execute\",\"sent_from\":\"0xfc0f1b3fb88c5ab19e77a6f7d4d637272e71e684\",\"sent_to\":\"0x8286d601a0ed6cf75e067e0614f73a5b9f024151\",\"status\":\"confirmed\",\"transfers\":[]},\"id\":\"a65b2541c58a5908a7333480f0ac6792\",\"relationships\":{\"chain\":{\"id\":\"linea\",\"type\":\"chains\"},\"dapp\":{\"id\":\"\",\"type\":\"dapps\"}},\"type\":\"transactions\"}]}`\n\n  message := xTimestamp + \"\\n\" + messageBody + \"\\n\"\n\n  err = VerifySignature(x509Cert, message, xSignature)\n  assert.NoError(t, err)\n}\n```\n"
      tags:
      - subscriptions to transactions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - callback_url
              - addresses
              properties:
                callback_url:
                  type: string
                  description: 'Callback URL where updates will be delivered to

                    '
                  example: https://webhook.site/fcd606d2-f5bd-4832-9874-ff07c980b5a3
                addresses:
                  type: array
                  description: 'Addresses of the wallets to create subscription for. Maximum 100 addresses per subscription.

                    Note: Free tier accounts are limited to 5 addresses per subscription.

                    '
                  items:
                    type: string
                    description: Address of the wallet.
                    example: '0x42b9df65b219b3dd36ff330a4dd8f327a6ada990'
                chain_ids:
                  type: array
                  description: 'Subscribe for transactions from specified chains. Leave empty to subscribe for all supported chains.

                    You can find available chain ids in chain endpoints.

                    '
                  items:
                    type: string
                    example: polygon
      responses:
        '201':
          $ref: '#/components/responses/SubscriptionResponse'
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
      callbacks:
        TransactionCallback:
          <your webhook URL>:
            post:
              summary: Notification
              requestBody:
                $ref: '#/components/requestBodies/NotificationResponse'
              responses:
                '200':
                  description: Successful callback processing
                '400':
                  description: Invalid request
                '500':
                  description: Server error
  /v1/tx-subscriptions/{subscription_id}:
    get:
      operationId: GetWalletTransactionsSubscription
      summary: Find subscription by ID
      description: 'This endpoint by ID returns subscription to new transactions associated with the wallets and chains.


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
      responses:
        '200':
          $ref: '#/components/responses/SubscriptionResponse'
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
    delete:
      operationId: DeleteWalletTransactionsSubscription
      summary: Delete subscription by ID
      description: 'This endpoint deletes existing subscription


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
      responses:
        '204':
          description: Successful subscription deletion with no content
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v1/tx-subscriptions/{subscription_id}/wallets:
    get:
      operationId: GetSubscribedWalletsInSubscription
      summary: Find wallets within subscription
      description: 'This endpoint by subscription ID returns wallets within specific subscription.


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - $ref: '#/components/parameters/SubscriptionWalletsPage'
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      responses:
        '200':
          $ref: '#/components/responses/SubscriptionWalletsResponse'
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
    patch:
      operationId: PatchSubscribedWalletsInSubscription
      summary: Patch wallets within subscription
      description: 'This endpoint works by subscription ID. It patches wallets list within specific subscription.


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                add:
                  type: array
                  maxItems: 100
                  description: 'Addresses of the wallets to add to subscription. Maximum 100 addresses per request.

                    '
                  items:
                    type: string
                    description: Address of the wallet.
                    example: '0x42b9df65b219b3dd36ff330a4dd8f327a6ada990'
                remove:
                  type: array
                  maxItems: 100
                  description: 'Addresses of the wallets to remove from subscription. Maximum 100 addresses per request.

                    '
                  items:
                    type: string
                    description: Address of the wallet.
                    example: '0x42b9df65b219b3dd36ff330a4dd8f327a6ada990'
      responses:
        '200':
          description: Successful callback processing
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
    put:
      operationId: ReplaceSubscribedWalletsInSubscription
      summary: Replace wallets within subscription
      description: 'This endpoint works by subscription ID. It replaces wallets list within specific subscription.


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                wallets:
                  type: array
                  description: 'Addresses of the wallets to replace current list with

                    '
                  items:
                    type: string
                    description: Address of the wallet.
                    example: '0x42b9df65b219b3dd36ff330a4dd8f327a6ada990'
      responses:
        '200':
          description: Successful callback processing
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v1/tx-subscriptions/{subscription_id}/wallets/count:
    get:
      operationId: GetSubscribedWalletsCountInSubscription
      summary: Count wallets within subscription
      description: 'This endpoint returns the count of wallets within a specific subscription by subscription ID.


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      responses:
        '200':
          $ref: '#/components/responses/SubscriptionWalletsCountResponse'
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '404':
          $ref: '#/components/responses/NotFoundResponse'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v1/tx-subscriptions/{subscription_id}/callback_url:
    patch:
      operationId: UpdateCallbackUrlInSubscription
      summary: Update callback URL within subscription
      description: 'This endpoint updates the callback URL for a specific subscription.


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. There is a non-zero probability that IDs may change in the future, and this should not result in any breaking changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                callback_url:
                  type: string
                  description: 'The new callback URL to be used for the subscription.

                    '
                  example: https://webhook.site/new-callback-url
      responses:
        '200':
          description: Successfully updated callback URL
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v1/tx-subscriptions/{subscription_id}/enable:
    patch:
      operationId: EnableSubscription
      summary: Enable a specific subscription
      description: 'This endpoint sets the status of a specific subscription to "enabled".


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. This ensures flexibility and future-proofing against ID format changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      responses:
        '204':
          description: Successfully updated subscription status to enabled
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v1/tx-subscriptions/{subscription_id}/disable:
    patch:
      operationId: DisableSubscription
      summary: Disable a specific subscription
      description: 'This endpoint sets the status of a specific subscription to "disabled".


        > NOTE: Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions. This ensures flexibility and future-proofing against ID format changes.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      responses:
        '204':
          description: Successfully updated subscription status to disabled
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v1/tx-subscriptions/{subscription_id}/chain_ids:
    patch:
      operationId: UpdateChainIdsInSubscription
      summary: Update chain IDs within subscription
      description: 'This endpoint updates the list of chain IDs associated with a specific subscription.


        > NOTE:

        > - Consider all IDs as abstract strings, without making any assumptions about their format or relying on such assumptions.

        > - The chain IDs provided will replace the existing chain IDs associated with the subscription.

        '
      tags:
      - subscriptions to transactions
      parameters:
      - name: subscription_id
        in: path
        required: true
        description: ID of the subscription
        schema:
          type: string
          example: 77e77447-1586-40e8-a75b-467ef939a0b1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                chain_ids:
                  type: array
                  description: 'The list of new chain IDs to replace the current associated chain IDs in the subscription.

                    '
                  items:
                    type: string
                    description: A chain ID.
                    example: ethereum
      responses:
        '200':
          description: Successfully updated chain IDs
        '400':
          $ref: '#/components/responses/MalformedParameters'
        '401':
          $ref: '#/components/responses/UnauthenticatedError'
        '429':
          $ref: '#/components/responses/TooManyRequests'
components:
  schemas:
    Response-20:
      type: object
      required:
      - data
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Container-17'
    Act:
      type: object
      required:
      - id
      - type
      properties:
        id:
          type: string
          description: Unique identifier of the act within the transaction.
          example: '1'
        type:
          $ref: '#/components/schemas/ActType'
        fee_kind:
          type: string
          description: "Classification of the fee for acts of type `fee`. Omitted for non-fee acts.\n\nPossible values:\n  - ui — Fee charged by the UI / client application (e.g., a wallet or dApp frontend)\n  - jito — Jito tip paid on Solana for priority inclusion\n"
          enum:
          - ui
          - jito
          example: ui
        sent_from:
          type: string
          description: Address of the actual sender of this act. Only set when it differs from the transaction-level `sent_from`, e.g. in ERC-4337 bundler transactions.
          example: '0x42b9df65b219b3dd36ff330a4dd8f327a6ada990'
        application_metadata:
          $ref: '#/components/schemas/DAppInfo-2'
    Attributes-18:
      type: object
      required:
      - count
      properties:
        count:
          type: integer
          format: int64
          description: Number of wallets within the subscription
          example: 42
    RelationshipContainer:
      type: object
      required:
      - type
      - id
      properties:
        type:
          type: string
          description: Subscription resource type
          example: subscription
        id:
          type: string
          description: Subscription unique identifier
          example: 8bf9db31-eb59-4fa9-973c-34e3428acf5d
    ContainerShort:
      type: object
      required:
      - type
      - id
      properties:
        type:
          type: string
          description: Chain resource type.
          example: chains
        id:
          type: string
          description: Chain unique identifier.
          example: polygon
    Attributes-16:
      type: object
      required:
      - timestamp
      - callback_url
      - address
      properties:
        timestamp:
          type: string
          description: Timestamp when notification was generated.
          example: '2024-07-31T00:17:36Z'
        callback_url:
          type: string
          description: URL to the callback endpoint.
          example: https://example.com/callback
        address:
          type: string
          description: Address of the subscription wallet.
          example: '0x42b9df65b219b3dd36ff330a4dd8f327a6ada990'
    PaginatedRelationship:
      type: object
      required:
      - links
      - data
      properties:
        links:
          $ref: '#/components/schemas/PaginatedRelationshipLinks'
        data:
          $ref: '#/components/schemas/RelationshipContainer'
    Response-23:
      type: object
      required:
      - links
      - data
      properties:
        links:
          $ref: '#/components/schemas/ResponseLinks-20'
        data:
          $ref: '#/components/schemas/Container-19'
    Container-17:
      type: object
      required:
      - type
      - id
      - attributes
      - relationships
      properties:
        type:
          type: string
          example: transactions_subscription
        id:
          type: string
          description: Unique ID of the transaction subscription.
          example: 52d994a173d755e99845e861d534a419
        attributes:
          $ref: '#/components/schemas/Attributes-15'
        relationships:
          $ref: '#/components/schemas/Relationships-9'
    Delegation:
      type: object
      description: Delegation created on an EVM chain.
      required:
      - address
      - act_id
      properties:
        chain_id:
          type: string
          example: ethereum
        address:
          type: string
          example: '0x42b9df65b219b3dd36ff330a4dd8f327a6ada990'
        act_id:
          type: string
          example: '1'
    Container-20:
      type: object
      required:
      - type
      - id
      - attributes
      - relationships
      properties:
        type:
          type: string
          example: transactions_subscription_wallets_count
        id:
          type: string
          description: Unique ID
          example: 52d994a173d755e99845e861d534a419-wallets-count
        attributes:
          $ref: '#/components/schemas/Attributes-18'
        relationships:
          $ref: '#/components/schemas/Relationships-11'
    MarketDataChanges:
      type: object
      properties:
        percent_1d:
          type: number
          nullable: true
          format: double
          description: Price relative change in percent for 1 day
          example: -0.7379066649086338
        percent_30d:
          type: number
          nullable: true
          format: double
          description: Price relative change in percent for 30 days
          example: -2.499465618806962
        percent_90d:
          type: number
          nullable: true
          format: double
          description: Price relative change in percent for 90 days
          example: 11.316340269371775
        percent_365d:
          type: number
          nullable: true
          format: double
          description: Price relative change in percent for 1 year
          example: null
    RelationshipLinks:
      type: object
      required:
      - related
      properties:
        related:
          type: string
          format: url
          description: URL to the current chain.
          example: https://api.zerion.io/v1/chains/polygon
    Included-3:
      type: array
      items:
        $ref: '#/components/schemas/Container-4'
    Relationship:
      type: object
      required:
      - links
      - data
      properties:
        links:
          $ref: '#/components/schemas/RelationshipLinks'
        data:
          $ref: '#/components/schemas/ContainerShort'
    Container-18:
      type: object
      required:
      - type
      - id
      - attributes
      - relationships
      properties:
        type:
          type: string
          example: transaction_notification
        id:
          type: string
          description: Unique ID of the notification.
          example: 52d994a173d755e99845e861d534a419
        attributes:
          $ref: '#/components/schemas/Attributes-16'
        relationships:
          $ref: '#/components/schemas/Relationships-10'
    Relationships-9:
      type: object
      properties:
        chains:
          type: array
          items:
            $ref: '#/components/schemas/Relationship'
    CollectionInfo:
      type: object
      required:
      - id
      - name
      - icon_url
      properties:
        id:
          type: string
          description: Collection id.
        name:
          type: string
          description: Collection name.
          example: '0x60a26d69263ef43e9a68964ba141263f19d71d51'
        icon_url:
          type: string
          description: Identifier of the act to which the transfer belongs.
          example: '1'
    Approval:
      type: object
      required:
      - quantity
 

# --- truncated at 32 KB (59 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/zerion/refs/heads/main/openapi/zerion-subscriptions-to-transactions-api-openapi.yml