Activity History
Query and filter transaction history.
Before You Start
Read the following guides before proceeding:
| Guide | Why |
|---|---|
| Getting Started | Platform overview and setup |
| Api Basics | Required headers and request configuration |
| Authentication | How to obtain access tokens |
| Onboarding | User 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/cardis deprecated. Use the v2 activity feed with?types=CardTransactionto 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
| Parameter | Type | Required | Description |
|---|---|---|---|
page_number | integer | No | Page number, 0-based (default: 0) |
page_size | integer | No | Results per page (default: 25, max: 50) |
sort | string | No | name (default) or usage |
types | string[] | No | Filter by activity type(s). Pass as repeated params (types=CardTransaction&types=Sepa). Case-insensitive. |
subject | string | No | Filter by subject — a card ID, wallet address, or account reference (UUID or address) |
typesandsubjectare mutually exclusive — send one or the other, not both.- To filter by several types, repeat the
typesparameter — 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.
| Field | Description |
|---|---|
data[].id | Activity id — this is the transaction id; use it with Get a Single Activity |
data[].type | Activity type (see Activity Types) |
data[].status | Pending, Completed, or Failed |
data[].status_reason | Machine-readable reason for the current status (optional) |
data[].chain_id | EIP-155 chain this entry was recorded on. Only v3 can return entries from more than one chain in a single feed |
data[].direction | Inbound, Outbound, or Internal |
data[].source / destination | The parties involved (see Subject Types) |
data[].source_amount / destination_amount | Amounts charged / received, each with amount_precise (base units) and decimals alongside the float amount |
data[].rate | Average rate applied to the activity (optional) |
data[].reference | Reference/memo for the activity (optional) |
data[].operations | The individual operations of the transaction (see Operations) |
data[].activity_steps | Processing 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:
| Header | Value |
|---|---|
Authorization | Bearer <access_token> |
X-User-Wallet | The user's wallet (EOA) address |
X-Chain-Id | Chain id — 84532 (sandbox) or 8453 (production) |
| Path parameter | Description |
|---|---|
{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"
}
]
}| Field | Description |
|---|---|
id | Activity id (the transaction id) |
user_address | Owner's wallet (EOA) address |
chain_id | EIP-155 chain this entry was recorded on |
type | Activity type (see Activity Types) |
status | Pending, Completed, or Failed |
status_reason | Machine-readable reason for the status (optional) |
direction | Inbound, Outbound, or Internal |
source / destination | The parties involved (see Subject Types) |
source_amount / destination_amount | Amounts charged / received, each with amount_precise (base units) and decimals alongside the float amount |
rate | Average rate applied to the activity (optional) |
reference | Reference/memo (optional) |
operations | On-chain operations of the transaction, each with its own status (see Operations) |
activity_steps | Processing stages, each with a status and timestamps (see Activity Steps) |
created_at | ISO 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
| Parameter | Type | Required | Description |
|---|---|---|---|
predicate | string | Yes | Search term. 1–128 characters, matching ^[A-Za-z0-9 \-_.@:/+]{1,128}$ |
page_number | integer | No | Page to return |
page_size | integer | No | Results 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 Details | Description |
|---|---|
predicate: Predicate is required | Empty or whitespace-only term |
predicate: Invalid format for predicate | Disallowed 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
| Parameter | Type | Required | Description |
|---|---|---|---|
page_number | integer | No | Page number, 0-based (default: 0) |
page_size | integer | No | Results per page (default: 25, max: 50) |
sort | string | No | name (default) or usage |
types | string[] | No | Filter by activity type(s). Pass as repeated params (types=CardTransaction&types=Sepa). Case-insensitive. |
subject | string | No | Filter by subject — a card ID, wallet address, or account reference (UUID or address) |
typesandsubjectare mutually exclusive — send one or the other, not both.- To filter by several types, repeat the
typesparameter — 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 returns400. - 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
statustonulland does not includestatus_reasonon 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 parameter | Description |
|---|---|
{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).
| Field | Description |
|---|---|
operation_id | Unique identifier of the operation (UUID) |
hash | On-chain transaction hash of the operation |
operation_amount | Amount in crypto (negative when debited from the user) |
transaction_amount | Amount in fiat currency (negative when debited) |
resulting_balance | Balance 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 |
rate | Rate effective for the operation |
status | Operation status — Pending, Completed, or Failed in v2/v3; null in v1 |
status_reason | Reason 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, onlyCompletedoperations are returned and each operation'sstatuscomes back asnull.
Activity Types
| Type | Direction | Description |
|---|---|---|
Crypto | Both | On-chain crypto transfer |
Deposit | Inbound | Deposit into the user's wallet |
Withdrawal | Outbound | Withdrawal from the user's wallet |
Exchange | Internal | Token exchange within wallet |
CardTransaction | Both | Card transaction (purchase or refund) |
ExternalCardTransaction | Both | Transaction on an external card |
CardTransfer | Outbound | Push to card transfer |
CardFeesPayment | Outbound | Card-related fee payment |
Sepa | Both | SEPA bank transfer |
AchPush | Both | ACH push transfer |
AchPull | Both | ACH pull transfer |
FasterPayment | Both | UK Faster Payments transfer |
Swift | Both | SWIFT international transfer |
YieldClaim | Inbound | Yield/reward claim |
Activity Directions
| Direction | Description |
|---|---|
Inbound | Funds received into user's wallet |
Outbound | Funds sent from user's wallet |
Internal | Movement within user's accounts (e.g., exchange) |
Activity Statuses
| Status | Description |
|---|---|
Pending | Transaction in progress |
Completed | Transaction successfully finished |
Failed | Transaction failed (see status_reason) |
Activity Steps
Multi-step transactions include an activity_steps array showing progression through each processing stage.
| Step Type | Description |
|---|---|
Initiated | Transaction started |
CryptoIn | Tokens credited to user wallet |
CryptoOut | Tokens debited from user wallet |
BankIn | Fiat received from bank |
BankOut | Fiat sent to bank |
CardIn | Fiat received from card network |
CardOut | Fiat sent to card network |
Review | Manual or compliance review |
Reversal | Transaction reversed |
SyntheticWrap | Tokens wrapped to synthetic tokens |
SyntheticUnwrap | Tokens unwrapped from synthetic tokens |
Completed | Transaction 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 Type | Description | Fields |
|---|---|---|
Wallet | User wallet | address |
ExternalWallet | External crypto address | address |
Cards | User's card | id, pan_last, payment_system |
ExternalCard | External card (push to card) | id, pan_last, payment_system |
Merchant | Card merchant | id, name, category, full_address |
SepaBankAccount | SEPA bank account | iban, bic, owner_name |
AchBankAccount | ACH bank account | account_number, routing_number, owner_name |
FasterPaymentBankAccount | UK bank account | account_number, sort_code, owner_name |
SwiftBankAccount | SWIFT bank account | iban, 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 Reason | Issue | Description |
|---|---|---|
ErrorInvalidField | mutually_exclusive | Both types and subject provided |
ErrorInvalidField | max_exceeded | page_size is greater than 50 |
ErrorInvalidField | mutually_exclusive | Both 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"
}
]
}Updated about 1 month ago

