Activity History

Query and filter transaction history.

Before You Start

Read the following guides before proceeding:

GuideWhy
Getting StartedPlatform overview and setup
Api BasicsRequired headers and request configuration
AuthenticationHow to obtain access tokens
OnboardingUser and wallet registration

Overview

The activity feed provides paginated access to all user activities. Activities can be filtered by type (e.g., only card transactions) or by subject (e.g., all transactions for a specific card). Each activity groups its underlying on-chain operations in an operations[] array.

The feed has three versions — v1, v2 (recommended for a single-chain integration), and v3 (recommended once a user holds activity on more than one chain), each documented in full below. v1 and v2 diverge only in the operations array: v2 returns every operation of a transaction with its status, while v1 returns only completed operations (with status set to null). v3 returns the same shape as v2, read across every chain the user holds activity on rather than only the chain the request is made on, with each entry additionally reporting its own chain_id.

Every amount in the feed — source_amount, destination_amount, fee_amount, and each operation's
operation_amount / transaction_amount / resulting_balance — carries an amount_precise string (an
exact base-unit value) and a decimals count alongside the existing float amount, on v1, v2, and v3
alike. amount_precise is absent only where an amount is an aggregate this API could not reproduce
exactly, in which case the float remains the only value.

Deprecated: GET /api/v1/transactions/card is deprecated. Use the v2 activity feed with ?types=CardTransaction to retrieve card transactions.


Get Activity Feed (v2)

Recommended. Retrieve user activities with optional filtering. v2 returns every related operation of a transaction, each with its own status/status_reason.

Endpoint

GET /api/v2/activity/feed

Query Parameters

ParameterTypeRequiredDescription
page_numberintegerNoPage number, 0-based (default: 0)
page_sizeintegerNoResults per page (default: 25, max: 50)
sortstringNoname (default) or usage
typesstring[]NoFilter by activity type(s). Pass as repeated params (types=CardTransaction&types=Sepa). Case-insensitive.
subjectstringNoFilter by subject — a card ID, wallet address, or account reference (UUID or address)
  • types and subject are mutually exclusive — send one or the other, not both.
  • To filter by several types, repeat the types parameter — one value per occurrence. For example, to get card transactions and SEPA transfers: ?types=CardTransaction&types=Sepa.

Response

{
  "data": [
    {
      "id": "beedaf4f-d0de-48ee-8bdf-c6c624af90ef",
      "user_address": "0x465Da298F22977628d5F85471db9648C54D88C62",
      "chain_id": 8453,
      "source": {
        "type": "SepaBankAccount",
        "bank_account": {
          "iban": "MT22CFTE19870000000090010248742",
          "bic": "CFTEMTM1",
          "owner_name": "Alex Grey",
          "is_business": false
        }
      },
      "destination": {
        "type": "Wallet",
        "wallet": {
          "address": "0x032ec5FAFF69cB98EE11A480C5d1990458C6473C"
        }
      },
      "status": "Completed",
      "status_reason": "credit_done",
      "source_amount": {
        "amount": 50,
        "amount_precise": "50000000000000000000",
        "decimals": 18,
        "currency": "EUR"
      },
      "destination_amount": {
        "amount": 50,
        "amount_precise": "50000000000000000000",
        "decimals": 18,
        "token_symbol": "WEUR",
        "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
      },
      "rate": {
        "ticker": "EUR/WEUR",
        "rate": 1
      },
      "type": "Sepa",
      "reference": "NJOZWZXIUGWVETREJUJO",
      "direction": "Inbound",
      "operations": [
        {
          "hash": "0x0f06c300e33f6a53dc634ab17e7f8de085d01468d985ef8bcdc87a9f83da0a34",
          "operation_amount": {
            "amount": 50,
            "amount_precise": "50000000000000000000",
            "decimals": 18,
            "token_symbol": "WEUR",
            "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
          },
          "transaction_amount": {
            "amount": 50,
            "amount_precise": "50000000000000000000",
            "decimals": 18,
            "currency": "EUR"
          },
          "resulting_balance": {
            "amount": 1631.07,
            "amount_precise": "1631070000000000000000",
            "decimals": 18,
            "token_symbol": "WEUR",
            "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
          },
          "rate": {
            "ticker": "EUR/WEUR",
            "rate": 1
          },
          "status": "Completed",
          "operation_id": "beedaf4f-d0de-48ee-8bdf-c6c624af90ef"
        }
      ],
      "created_at": "2026-07-01T10:02:49.000Z",
      "activity_steps": [
        {
          "type": "Initiated",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "BankIn",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "Review",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "CryptoIn",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "Completed",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        }
      ]
    }
  ]
}

The source and destination shapes depend on the activity type — a card purchase, for example, has a Cards source and a Merchant destination. See Subject Types.

FieldDescription
data[].idActivity id — this is the transaction id; use it with Get a Single Activity
data[].typeActivity type (see Activity Types)
data[].statusPending, Completed, or Failed
data[].status_reasonMachine-readable reason for the current status (optional)
data[].chain_idEIP-155 chain this entry was recorded on. Only v3 can return entries from more than one chain in a single feed
data[].directionInbound, Outbound, or Internal
data[].source / destinationThe parties involved (see Subject Types)
data[].source_amount / destination_amountAmounts charged / received, each with amount_precise (base units) and decimals alongside the float amount
data[].rateAverage rate applied to the activity (optional)
data[].referenceReference/memo for the activity (optional)
data[].operationsThe individual operations of the transaction (see Operations)
data[].activity_stepsProcessing stages (see Activity Steps)

Get a Single Activity (v2)

Retrieve the complete record for one transaction by its id (the id the feed returns for each item).

Request

GET /api/v2/activity/single/{id}

There is no request body. Send the standard headers:

HeaderValue
AuthorizationBearer <access_token>
X-User-WalletThe user's wallet (EOA) address
X-Chain-IdChain id — 84532 (sandbox) or 8453 (production)
Path parameterDescription
{id}The activity id returned by the feed. This is the transaction id.

Response

200 OK with the activity object directly (not wrapped in a data array). Each entry in operations[] carries its own status:

{
  "id": "beedaf4f-d0de-48ee-8bdf-c6c624af90ef",
  "user_address": "0x465Da298F22977628d5F85471db9648C54D88C62",
  "chain_id": 8453,
  "source": {
    "type": "SepaBankAccount",
    "bank_account": {
      "iban": "MT22CFTE19870000000090010248742",
      "bic": "CFTEMTM1",
      "owner_name": "Alex Grey",
      "is_business": false
    }
  },
  "destination": {
    "type": "Wallet",
    "wallet": {
      "address": "0x032ec5FAFF69cB98EE11A480C5d1990458C6473C"
    }
  },
  "status": "Completed",
  "status_reason": "credit_done",
  "source_amount": {
    "amount": 50,
    "amount_precise": "50000000000000000000",
    "decimals": 18,
    "currency": "EUR"
  },
  "destination_amount": {
    "amount": 50,
    "amount_precise": "50000000000000000000",
    "decimals": 18,
    "token_symbol": "WEUR",
    "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
  },
  "rate": {
    "ticker": "EUR/WEUR",
    "rate": 1
  },
  "type": "Sepa",
  "reference": "NJOZWZXIUGWVETREJUJO",
  "direction": "Inbound",
  "operations": [
    {
      "hash": "0x0f06c300e33f6a53dc634ab17e7f8de085d01468d985ef8bcdc87a9f83da0a34",
      "operation_amount": {
        "amount": 50,
        "amount_precise": "50000000000000000000",
        "decimals": 18,
        "token_symbol": "WEUR",
        "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
      },
      "transaction_amount": {
        "amount": 50,
        "amount_precise": "50000000000000000000",
        "decimals": 18,
        "currency": "EUR"
      },
      "resulting_balance": {
        "amount": 1631.07,
        "amount_precise": "1631070000000000000000",
        "decimals": 18,
        "token_symbol": "WEUR",
        "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
      },
      "rate": {
        "ticker": "EUR/WEUR",
        "rate": 1
      },
      "status": "Completed",
      "operation_id": "beedaf4f-d0de-48ee-8bdf-c6c624af90ef"
    }
  ],
  "created_at": "2026-07-01T10:02:49.000Z",
  "activity_steps": [
    {
      "type": "Initiated",
      "status": "Completed",
      "created_at": "2026-07-01T10:03:00.000Z",
      "completed_at": "2026-07-01T10:03:00.000Z"
    },
    {
      "type": "BankIn",
      "status": "Completed",
      "created_at": "2026-07-01T10:03:00.000Z",
      "completed_at": "2026-07-01T10:03:00.000Z"
    },
    {
      "type": "Review",
      "status": "Completed",
      "created_at": "2026-07-01T10:03:00.000Z",
      "completed_at": "2026-07-01T10:03:00.000Z"
    },
    {
      "type": "CryptoIn",
      "status": "Completed",
      "created_at": "2026-07-01T10:03:00.000Z",
      "completed_at": "2026-07-01T10:03:00.000Z"
    },
    {
      "type": "Completed",
      "status": "Completed",
      "created_at": "2026-07-01T10:03:00.000Z",
      "completed_at": "2026-07-01T10:03:00.000Z"
    }
  ]
}
FieldDescription
idActivity id (the transaction id)
user_addressOwner's wallet (EOA) address
chain_idEIP-155 chain this entry was recorded on
typeActivity type (see Activity Types)
statusPending, Completed, or Failed
status_reasonMachine-readable reason for the status (optional)
directionInbound, Outbound, or Internal
source / destinationThe parties involved (see Subject Types)
source_amount / destination_amountAmounts charged / received, each with amount_precise (base units) and decimals alongside the float amount
rateAverage rate applied to the activity (optional)
referenceReference/memo (optional)
operationsOn-chain operations of the transaction, each with its own status (see Operations)
activity_stepsProcessing stages, each with a status and timestamps (see Activity Steps)
created_atISO 8601 creation timestamp

Search Activities (v2)

Full-text search over the authenticated owner's activities. Use it for a search box; use the feed's
filters for structured narrowing.

GET /api/v2/activity/search

Query Parameters

ParameterTypeRequiredDescription
predicatestringYesSearch term. 1–128 characters, matching ^[A-Za-z0-9 \-_.@:/+]{1,128}$
page_numberintegerNoPage to return
page_sizeintegerNoResults per page. Defaults to 25, maximum 50

The allowed character set is deliberately narrow — quotes, backslashes, backticks, semicolons,
brackets, pipes and control characters are all refused. Strip them client-side rather than
forwarding raw user input and handling the 400.

The response is the same ActivityFeedResponse shape as GET /api/v2/activity/feed, documented
above. Results are scoped to the authenticated owner; there is no cross-user search.

Errors

Error DetailsDescription
predicate: Predicate is requiredEmpty or whitespace-only term
predicate: Invalid format for predicateDisallowed character or over 128 characters. allowed and max details carry the rule

Get Activity Feed (v3)

Same response shape as v2 — including chain_id, the *_precise amount fields,
and operations[].resulting_balance — read across every chain the user holds activity on, regardless of
the chain the request is made on. Recommended once a user can hold a card whose funding wallet lives on a
chain other than the one the request is made on, such as a Bridge-rail card.

GET /api/v3/activity/feed

Takes the same page_number, page_size, sort, types, and subject query parameters as v2, with the
same mutual exclusivity between types and subject. A response spanning several chains carries entries
whose chain_id differs from each other and from the session's X-Chain-Id — nothing else in an entry says
which chain it belongs to, so read chain_id rather than assuming the session's.

Get a Single Activity (v3)

GET /api/v3/activity/single/{id}

Same request and response shape as Get a Single Activity (v2), read regardless
of which chain the activity was recorded on.


Search Activities (v3)

GET /api/v3/activity/search

Same predicate / page_number / page_size parameters and the same response shape as
Search Activities (v2), searching across every chain the user holds activity on.


Get Activity Feed (v1)

The earlier version of the activity feed. New integrations should use v2; v1 remains available for existing integrations. It returns activities in a data array and accepts the query parameters below. The behavioural difference from v2 is confined to the operations array (see Operations in v1).

Endpoint

GET /api/v1/activity/feed

Query Parameters

ParameterTypeRequiredDescription
page_numberintegerNoPage number, 0-based (default: 0)
page_sizeintegerNoResults per page (default: 25, max: 50)
sortstringNoname (default) or usage
typesstring[]NoFilter by activity type(s). Pass as repeated params (types=CardTransaction&types=Sepa). Case-insensitive.
subjectstringNoFilter by subject — a card ID, wallet address, or account reference (UUID or address)
  • types and subject are mutually exclusive — send one or the other, not both.
  • To filter by several types, repeat the types parameter — one value per occurrence. For example, to get card transactions and SEPA transfers: ?types=CardTransaction&types=Sepa. A single comma-separated value (?types=CardTransaction,Sepa) is not supported and returns 400.
  • To fetch one transaction, use Get a Single Activity (v1).

Response

Returns a data array of activity items. In v1, each item's operations[] includes only completed operations, and every operation's status is returned as null (status_reason is not included on an operation).

{
  "data": [
    {
      "id": "beedaf4f-d0de-48ee-8bdf-c6c624af90ef",
      "user_address": "0x465Da298F22977628d5F85471db9648C54D88C62",
      "source": {
        "type": "SepaBankAccount",
        "bank_account": {
          "iban": "MT22CFTE19870000000090010248742",
          "bic": "CFTEMTM1",
          "owner_name": "Alex Grey",
          "is_business": false
        }
      },
      "destination": {
        "type": "Wallet",
        "wallet": {
          "address": "0x032ec5FAFF69cB98EE11A480C5d1990458C6473C"
        }
      },
      "status": "Completed",
      "status_reason": "credit_done",
      "source_amount": {
        "amount": 50,
        "currency": "EUR"
      },
      "destination_amount": {
        "amount": 50,
        "token_symbol": "WEUR",
        "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
      },
      "rate": {
        "ticker": "EUR/WEUR",
        "rate": 1
      },
      "type": "Sepa",
      "reference": "NJOZWZXIUGWVETREJUJO",
      "direction": "Inbound",
      "operations": [
        {
          "hash": "0x0f06c300e33f6a53dc634ab17e7f8de085d01468d985ef8bcdc87a9f83da0a34",
          "operation_amount": {
            "amount": 50,
            "token_symbol": "WEUR",
            "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
          },
          "transaction_amount": {
            "amount": 50,
            "currency": "EUR"
          },
          "rate": {
            "ticker": "EUR/WEUR",
            "rate": 1
          },
          "status": null,
          "operation_id": "beedaf4f-d0de-48ee-8bdf-c6c624af90ef"
        }
      ],
      "created_at": "2026-07-01T10:02:49.000Z",
      "activity_steps": [
        {
          "type": "Initiated",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "BankIn",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "Review",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "CryptoIn",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        },
        {
          "type": "Completed",
          "status": "Completed",
          "created_at": "2026-07-01T10:03:00.000Z",
          "completed_at": "2026-07-01T10:03:00.000Z"
        }
      ]
    }
  ]
}

The operation's status comes back as null; in v2 this operation carries "status": "Completed".

Operations in v1

  • Includes only operations whose status is Completed.
  • Sets every operation's status to null and does not include status_reason on an operation.

To get the full operation breakdown — authorization, refund, and reversal, each with its own status — use v2.

Get a Single Activity (v1)

Fetch one transaction by its activity id:

GET /api/v1/activity/single/{id}
Path parameterDescription
{id}The activity id from the feed (this is the transaction's id)

Returns one activity item, following the v1 operation rules above: only completed operations, each with status set to null.


Operations

Each activity item carries an operations[] array — the individual on-chain operations that make up that one transaction. A single transaction can expose several operations in one activity item (e.g. an authorization, its refund, and a reversal).

FieldDescription
operation_idUnique identifier of the operation (UUID)
hashOn-chain transaction hash of the operation
operation_amountAmount in crypto (negative when debited from the user)
transaction_amountAmount in fiat currency (negative when debited)
resulting_balanceBalance of the operation's asset immediately after the operation applied, denominated in the same asset as operation_amount. Absent when the operation has no crypto leg
rateRate effective for the operation
statusOperation status — Pending, Completed, or Failed in v2/v3; null in v1
status_reasonReason for the operation status — present in v2/v3 when applicable, absent in v1

In v2, every related operation is returned, each with a populated status. In v1, only Completed operations are returned and each operation's status comes back as null.


Activity Types

TypeDirectionDescription
CryptoBothOn-chain crypto transfer
DepositInboundDeposit into the user's wallet
WithdrawalOutboundWithdrawal from the user's wallet
ExchangeInternalToken exchange within wallet
CardTransactionBothCard transaction (purchase or refund)
ExternalCardTransactionBothTransaction on an external card
CardTransferOutboundPush to card transfer
CardFeesPaymentOutboundCard-related fee payment
SepaBothSEPA bank transfer
AchPushBothACH push transfer
AchPullBothACH pull transfer
FasterPaymentBothUK Faster Payments transfer
SwiftBothSWIFT international transfer
YieldClaimInboundYield/reward claim

Activity Directions

DirectionDescription
InboundFunds received into user's wallet
OutboundFunds sent from user's wallet
InternalMovement within user's accounts (e.g., exchange)

Activity Statuses

StatusDescription
PendingTransaction in progress
CompletedTransaction successfully finished
FailedTransaction failed (see status_reason)

Activity Steps

Multi-step transactions include an activity_steps array showing progression through each processing stage.

Step TypeDescription
InitiatedTransaction started
CryptoInTokens credited to user wallet
CryptoOutTokens debited from user wallet
BankInFiat received from bank
BankOutFiat sent to bank
CardInFiat received from card network
CardOutFiat sent to card network
ReviewManual or compliance review
ReversalTransaction reversed
SyntheticWrapTokens wrapped to synthetic tokens
SyntheticUnwrapTokens unwrapped from synthetic tokens
CompletedTransaction finalized

Each step has its own status and timestamps for tracking progression.


Subject Types

Activities reference source and destination subjects that identify the parties involved.

Subject TypeDescriptionFields
WalletUser walletaddress
ExternalWalletExternal crypto addressaddress
CardsUser's cardid, pan_last, payment_system
ExternalCardExternal card (push to card)id, pan_last, payment_system
MerchantCard merchantid, name, category, full_address
SepaBankAccountSEPA bank accountiban, bic, owner_name
AchBankAccountACH bank accountaccount_number, routing_number, owner_name
FasterPaymentBankAccountUK bank accountaccount_number, sort_code, owner_name
SwiftBankAccountSWIFT bank accountiban, bic, owner_name

Filter Examples

Filter by Type

Get only card transactions:

GET /api/v2/activity/feed?types=CardTransaction

Get card and SEPA transactions — repeat the types param (do not comma-join):

GET /api/v2/activity/feed?types=CardTransaction&types=Sepa

Filter by Subject

subject returns every activity that involves one entity. It accepts either a UUID (a card ID or account reference) or a wallet address — pass one value, in whichever form fits the entity you're filtering by.

By a card ID (UUID) — returns that card's activities:

GET /api/v2/activity/feed?subject=00000000-0000-0000-0000-000000000001

By a wallet address — returns that wallet's activities:

GET /api/v2/activity/feed?subject=0xA7E41d5680dE394EaA2ed417169DFf56840Fb3EE

Fetch One Transaction

The feed cannot be filtered by transaction ID. To retrieve a single transaction, use its activity id:

GET /api/v2/activity/single/a1b2c3d4-e5f6-7890-1234-567890abcdef

Activity Webhook

Activities are also delivered via webhook as they occur.

Endpoint: POST {base_url}/v2/webhooks/activities

The payload carries the same fields as Get a Single Activity (v2), including
chain_id, the *_precise amount fields, and operations[].resulting_balance.

{
  "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
  "user_address": "0xA7E41d5680dE394EaA2ed417169DFf56840Fb3EE",
  "type": "Sepa",
  "direction": "Inbound",
  "status": "Completed",
  "source": {
    "type": "SepaBankAccount",
    "bank_account": {
      "iban": "DE89370400440532013000",
      "bic": "COBADEFFXXX",
      "owner_name": "Alex Grey",
      "is_business": false
    }
  },
  "destination": {
    "type": "Wallet",
    "wallet": {
      "address": "0xA7E41d5680dE394EaA2ed417169DFf56840Fb3EE"
    }
  },
  "source_amount": {
    "amount": 1000.00,
    "currency": "EUR"
  },
  "destination_amount": {
    "amount": 1000.00,
    "token_symbol": "WEUR",
    "token_address": "0x..."
  },
  "created_at": "2024-01-15T10:30:00Z",
  "activity_steps": [...]
}

Error Handling

Error ReasonIssueDescription
ErrorInvalidFieldmutually_exclusiveBoth types and subject provided
ErrorInvalidFieldmax_exceededpage_size is greater than 50
ErrorInvalidFieldmutually_exclusiveBoth types and subject provided

Error Response Format

Invalid subject format:

{
  "error_reason": "ErrorInvalidField",
  "error_description": "Invalid format for subject",
  "error_category": {
    "category": "CategoryValidationFailure",
    "http_status_code": 400
  },
  "error_details": [
    {
      "key": "field",
      "details": "subject"
    },
    {
      "key": "issue",
      "details": "invalid_format"
    }
  ]
}

Mutually exclusive parameters:

{
  "error_reason": "ErrorInvalidField",
  "error_description": "Fields are mutually exclusive",
  "error_category": {
    "category": "CategoryValidationFailure",
    "http_status_code": 400
  },
  "error_details": [
    {
      "key": "fields",
      "details": "types,subject"
    },
    {
      "key": "issue",
      "details": "mutually_exclusive"
    }
  ]
}

Did this page help you?