API reference / Events
List events
GET/v1/events
API key requiredCursor pagination
Events of the project for the key’s environment (user.*, kyc.*, transaction.*, withdrawal.*), newest first. Same identifiers as webhook deliveries.
Authentication#
Send a secret API key as Authorization: Bearer <key>. Both tp_test_… and tp_live_… keys work; the key decides which environment you read and write. See Authentication.
Parameters#
Query
| Name | Type | Description |
|---|---|---|
limit | integer | Number of items per page (1 to 100).Default 20 |
starting_after | string | Cursor: id of the last item of the previous page. |
type | string | Filter on the type.One ofuser.createduser.suspendeduser.unsuspendedkyc.approvedkyc.rejectedtransaction.receivedtransaction.completedwithdrawal.completedwithdrawal.failed |
See Pagination for how to walk through pages.
Responses#
200Page of events.
Headers
X-Request-IdRequest identifier.X-RateLimit-LimitQuota of the current window.X-RateLimit-RemainingRequests remaining in the window.X-RateLimit-ResetSeconds before the quota renews.
Body
objectstringrequiredalways "list"
Example
"list"dataarray of EventrequiredidstringrequiredIdentifier, prefixed with
evt_.pattern: ^evt_[0-9a-f-]{36}$
Example
"evt_0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"objectstringrequiredalways "event"
Example
"event"typestringrequiredEvent type.
One of
user.createduser.suspendeduser.unsuspendedkyc.approvedkyc.rejectedtransaction.receivedtransaction.completedwithdrawal.completedwithdrawal.failedExample
"user.created"created_atstringrequiredEvent date.
format: date-time
Example
"2026-10-08T09:30:00.000Z"livemodebooleanrequiredtruefor a live key,falsefor a sandbox key.Example
falsedataobjectrequiredContent.
objectone of User | Kyc | TransactionrequiredSnapshot of the resource concerned, at the time of the event: a
userforuser.*, akycforkyc.*, atransactionfortransaction.*andwithdrawal.*. Discriminate on itsobjectfield.- Variant
UserEnd user attached to your project.
idstringrequiredOpaque identifier.
Example
"4821"objectstringrequiredalways "user"
Example
"user"phonestringrequiredPhone number in E.164 format.
Example
"+33612345678"external_idstring | nullrequiredYour own identifier for this user.
Example
"cust_8f2a"verifiedbooleanrequiredThe phone number has been verified.
Example
truekyc_statusstringrequiredIdentity verification (KYC) status.
One of
nonependingapprovedrejectedExample
"approved"suspendedbooleanrequiredThe user is suspended and can no longer transact.
Example
falselivemodebooleanrequiredtruefor a live key,falsefor a sandbox key.Example
falsewallet_statusstringrequiredState of the user’s wallet.
ready: the wallet exists.pending: its creation is in progress or being retried (never blocks the user; pollGET /v1/users/{id}/wallets).failed: creation was abandoned after repeated errors (contact support).none: no wallet is created at this step.One of
nonependingreadyfailedExample
"ready"created_atstringrequiredCreation date.
format: date-time
Example
"2026-10-08T09:30:00.000Z"last_login_atstring | nullrequiredLast sign-in.
format: date-time
Example
"2026-10-08T09:30:00.000Z"
- Variant
KycIdentity verification (KYC) status of a user.
objectstringrequiredalways "kyc"
Example
"kyc"user_idstringrequiredUser concerned.
Example
"4821"statusstringrequiredStatus.
One of
nonependingapprovedrejectedExample
"approved"livemodebooleanrequiredtruefor a live key,falsefor a sandbox key.Example
false
- Variant
TransactionMovement of a user (deposit, withdrawal, payment, transfer).
idstringrequiredOpaque identifier.
Example
"90412"objectstringrequiredalways "transaction"
Example
"transaction"user_idstringrequiredUser concerned.
Example
"4821"typestringrequiredKind of movement.
One of
depositwithdrawalpaymenttransferExample
"deposit"directionstringrequiredDirection, from the wallet’s point of view.
One of
inoutExample
"in"amount_usdnumberrequiredAmount in USDC (1 USDC = 1 USD).
Example
100fee_usdnumber | nullrequiredFee applied (the project’s effective fees), when known.
Example
0.6statusstringrequiredStatus.
One of
pendingcompletedfailedExample
"completed"fiat_currencystring | nullrequiredFiat currency (deposits and withdrawals).
One of
EURUSDExample
"USD"fiat_amountnumber | nullrequiredFiat amount.
Example
100livemodebooleanrequiredtruefor a live key,falsefor a sandbox key.Example
falsecreated_atstringrequiredCreation date.
format: date-time
Example
"2026-10-08T09:31:00.000Z"
has_morebooleanrequiredMore items remain: call again with
starting_afterset to theidof the last item.Example
false
{
"object": "list",
"data": [],
"has_more": false
}400Invalid request (malformed JSON, unknown cursor, invalid Idempotency-Key header).
Example: invalid_cursor
{
"error": {
"type": "invalid_request_error",
"code": "invalid_cursor",
"message": "starting_after: unknown cursor",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}401Missing, invalid or revoked API key.
Example: missing_api_key
{
"error": {
"type": "authentication_error",
"code": "missing_api_key",
"message": "Provide your API key as \"Authorization: Bearer <key>\"",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: invalid_api_key
{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "The API key is invalid",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: api_key_revoked
{
"error": {
"type": "authentication_error",
"code": "api_key_revoked",
"message": "This API key has been revoked",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}403Organization suspended, live access not enabled, or sandbox-only route.
Example: organization_suspended
{
"error": {
"type": "permission_error",
"code": "organization_suspended",
"message": "Your organization is suspended. Contact Tilt Pay support.",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: live_not_enabled
{
"error": {
"type": "permission_error",
"code": "live_not_enabled",
"message": "Live access has not been enabled for your organization yet",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: sandbox_only
{
"error": {
"type": "permission_error",
"code": "sandbox_only",
"message": "This route is only available with a sandbox API key",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}422Invalid parameter, or Idempotency-Key reused with a different body.
Example: validation_error
{
"error": {
"type": "invalid_request_error",
"code": "validation_error",
"message": "phone: has an invalid format",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: idempotency_key_reuse
{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reuse",
"message": "This Idempotency-Key was already used with a different request",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}429Rate limit exceeded. Retry after the Retry-After delay (seconds).
Example: rate_limit_exceeded
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too many requests. Slow down and retry after the delay in Retry-After.",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}500Internal error. Retry; give request_id to support if it persists.
Example: internal_error
{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Internal server error",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Headers on every response
X-Request-IdIdentifier of the request, also present in error bodies. Give it to support.X-API-VersionVersion of the API that answered.X-RateLimit-Limit / -Remaining / -ResetQuota of your key for the current window. See Rate limits.
Errors#
Errors share one format, described in Errors. Branch your code on error.code.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_cursor | Unknown starting_after cursor. |
| 401 | missing_api_key | Missing, invalid or revoked API key. |
| 401 | invalid_api_key | Missing, invalid or revoked API key. |
| 401 | api_key_revoked | Missing, invalid or revoked API key. |
| 403 | organization_suspended | Organization suspended, live access not enabled, or sandbox-only route. |
| 403 | live_not_enabled | Organization suspended, live access not enabled, or sandbox-only route. |
| 403 | sandbox_only | Organization suspended, live access not enabled, or sandbox-only route. |
| 422 | validation_error | Invalid parameter, or Idempotency-Key reused with a different body. |
| 422 | idempotency_key_reuse | Invalid parameter, or Idempotency-Key reused with a different body. |
| 429 | rate_limit_exceeded | Rate limit exceeded. Retry after the Retry-After delay (seconds). |
| 500 | internal_error | Internal error. Retry; give request_id to support if it persists. |