Data API
Endpoint specification
Data API allows partners to retrieve information about your users and any orders associated with your Partner ID. It also includes support for direct user creation if enabled for your Partner ID.
Endpoint URLs:
| Endpoint | URL | Method |
|---|---|---|
| Orders | https://partner-sandbox.wert.io/api/external/orders |
GET |
| Offramp Orders | https://partner-sandbox.wert.io/api/external/offramp-orders |
GET |
| Users | https://partner-sandbox.wert.io/api/external/users |
GET |
| User Create | https://partner-sandbox.wert.io/api/external/users/create |
POST |
| Offramp Bank Account Create | https://partner-sandbox.wert.io/api/external/offramp/users/{user_id}/bank-accounts |
POST |
| Card Register | https://cards-reg-iframe-sandbox.wert.io/api/v1/partner/register |
POST |
| Endpoint | URL | Method |
|---|---|---|
| Orders | https://partner.wert.io/api/external/orders |
GET |
| Offramp Orders | https://partner.wert.io/api/external/offramp-orders |
GET |
| Users | https://partner.wert.io/api/external/users |
GET |
| User Create | https://partner.wert.io/api/external/users/create |
POST |
| Offramp Bank Account Create | https://partner.wert.io/api/external/offramp/users/{user_id}/bank-accounts |
POST |
| Card Register | https://cards.wert.io/api/v1/partner/register |
POST |
Authentication
To authenticate your requests, include your API key in the HTTP header of every request.
| Header Key | Value |
|---|---|
X-Api-Key |
your-unique-api-key |
Your API key carries many privileges, so keep it secure.
Your API key is provided exclusively by Wert during onboarding. Store it safely in your backend.
Never share your key. If you suspect a compromise, contact us immediately to issue a new one.
Note: Sandbox and Production keys are unique to their respective environments and are not interchangeable.
API Reference
Get orders
Get detailed orders data associated with your partner account.
Request Details
Endpoint: GET /api/external/orders
GET /api/external/orders👉 Refer to endpoints table for a full link.
Limits:
- Threshold: 10 requests per second.
Parameters
Configure your request using the parameters below to search and filter order results.
| Parameter | Description | Possible Values |
|---|---|---|
limit |
The number of orders you want to retrieve. Defaults to 20. |
0 to 20 |
cursor_id |
Fetches the next page of results using the next_cursor_id from a previous response.Defaults to an empty string. |
01KAQWBNWWGG06HR5T9Z35A3WD |
search_by |
Allows setting order_id, click_id, or external_order_id to find specific orders. |
Comma-separated order IDs, click IDs, or external order IDs, for example 2FX6Yz. |
order_by |
Sets the order as ascending or descending. Defaults to desc. |
asc / desc |
start_date |
Filters orders with created_at after this timestamp. |
YYYY-MM-DDTHH:MM:SSZ, for example 2025-11-19T23:59:59.00Z. |
end_date |
Filters orders with created_at up to this timestamp. |
YYYY-MM-DDTHH:MM:SSZ |
Date filtering reference
- Use
start_dateandend_datetogether to return orders for a specific period.- Use a narrow time range if you have a high volume of orders. The maximum is 20 orders per request.
Example Requests
# 1. Get the 10 most recent orders (default)
curl -X GET 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key'
# 2. Retrieve 20 orders using a cursor and ascending order
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'limit=20' \
-d 'cursor_id=01KAQWBNWWGG06HR5T9Z35A3WD' \
-d 'order_by=asc'
# 3. Search for orders using a single click_id
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'search_by=click_id'
# 4. Search for orders using a single external_order_id
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'search_by=2FX6Yz'
# 5. Search using multiple click_ids and order_ids
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'search_by=click_id1,click_id2,order_id1,order_id2'
# 6. Filter orders by status
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'status=failed'
# 7. Filter orders by date range
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'start_date=2025-11-19T00:00:00Z' \
-d 'end_date=2025-11-19T23:59:59Z'
# 8. Filter orders by status and commodity
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'status=failed' \
-d 'commodity=tt_amoy.erc-20.polygon'Response Details
Orders Response
Upon a successful request, the response includes the following fields:
| Variable | Description |
|---|---|
success |
Indicates if the request was successfully processed. |
data |
An array containing the retrieved order objects. See order object. |
next_cursor_id |
The cursor string used to fetch the next page of results. |
total |
The count of orders matching the search criteria. When cursor_id is set, only orders after the cursor are counted. |
Order Object
The following fields represent the schema for each order in the data array. Parameters marked as filterable can be used to customize your queries by using the filter name shown in the table.
| Variable | Description | Filterable | Filter Name |
|---|---|---|---|
order_id |
The unique identifier for the order in Wert's database. | Yes | search_by |
click_id |
The identifier you pass to Wert when you initialise the widget. | Yes | search_by |
currency |
The base currency for the order. | No | - |
currency_amount |
The value of the order in the base currency. | No | - |
external_order_id |
The unique identifier for an order. Used in partner dashboard and customer emails. | Yes | search_by |
crypto |
The crypto asset purchased or sent to the smart contract. | Yes | commodity |
crypto_amount |
The amount of the crypto asset purchased or sent to the smart contract. | No | - |
user_id |
The unique identifier for the user in Wert's database. | Yes | user_id |
status |
The status of the order. See statuses. | Yes | status |
card_id |
The unique identifier for the card used in Wert's database. | Yes | card_id |
created_at |
Timestamp of when the order was created (UTC). | No | - |
changed_at |
Timestamp of when the order was last updated (UTC). | No | - |
partner_fee |
Partner revenue fee amount in the charged currency. | No | - |
partner_fee_percent |
The percentage of fees collected as partner revenue. | No | - |
wert_fee |
Wert revenue fee amount in the charged currency. | No | - |
wert_fee_percent |
The percentage of fees collected as Wert revenue. | No | - |
tx_id |
Blockchain transaction hash. | Yes | tx_id |
processed_through |
The acquirer who processed the card payment. | No | - |
card_brand |
Visa, Mastercard, etc. | No | - |
fail_reason |
Payment error code. Refer to error code descriptions. | Yes | fail_reason |
payment_type |
Authentication method of the payment, for example 3ds_v2. |
Yes | payment_type |
additional_data |
Additional information. | No | - |
address |
The address specified for the order. | No | - |
sc_input_data |
Smart contract input data sent in the transaction. | No | - |
payment_method |
Available payment methods. Refer to payment methods. | No | - |
Example Response
{
"success": true,
"data": [
{
"additional_data": null,
"address": "0x8b444bf218D83Bd567E625383EB2e5A25f707599",
"card_brand": "VISA",
"card_id": "01KHB8JNDE3NJ1NG8F1C087X6K",
"changed_at": "2026-06-02 08:45:44",
"click_id": "click_id",
"created_at": "2026-06-02 08:44:43",
"crypto": "tt.erc-20-sc.base",
"crypto_amount": 12.92,
"currency": "USD",
"currency_amount": 14.25,
"external_order_id": "zvLHq",
"fail_reason": "",
"order_id": "01KT3R3BQ2ZRBHZN58E6VVY5F3",
"partner_fee": 0.14,
"partner_fee_percent": 0.01,
"payment_type": "non_3ds",
"payment_method": "card",
"processed_through": "worldpay",
"sc_input_data": "0x48bc17bf0000000000000000000000008b444bf218d83bd567e625383eb2e5a25f70759900000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000b34d0f8c020c000000000000000000000000000000000000000000000000000000000000000001c20000000000000000000000000000000000000000000000000618a2d524ef00000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d574e7a6d5a6b77664531393967386e6b415373583950636d6136796b425747344373734376336b456e764a700000000000000000000000",
"status": "success",
"tx_id": "0xe6456e64a1e6d7f226deb7ff344cb5321a3a997165ea24569465493ff7385216",
"user_id": "01HQRBTDW17YQSZFBWZY7807B1",
"wert_fee": 1,
"wert_fee_percent": 0.05
}
],
"next_cursor_id": "01KAQWBNWWGG06HR5T9Z35A3WD",
"total": 1
}Order Status
The following order statuses are available:
| Status | Description |
|---|---|
| success | The order was successful and has been sent on the blockchain |
| failed | The order has failed and will not be sent on the blockchain |
| cancelled | The payment for the order was processed but the order was later cancelled |
| pending | The order is being processed but it hasn't been sent on the blockchain |
| progress | The order is being processed but payment has not yet been completed |
| created | The order has been created but payment has not yet been processed |
Payment Error Codes
The following table identifies the specific cause of transaction failures returned in the fail_reason field in order object. Use these codes to provide accurate troubleshooting steps to your users.
| Error Code | Description |
|---|---|
4000 |
We weren’t able to charge the user’s card and the order was not completed. The user can try again. |
4001 |
The transaction failed due to an incorrect CVV/CVC. The user can try again ensuring they enter the correct CVV/CVC. |
400240104012 |
Payment was declined by the card issuer. The user should contact them for further details. |
4003 |
Incorrect card details. The user can try again ensuring they enter valid card details. |
4004 |
Insufficient balance. The user should add funds to their card and try again. |
4005 |
Card limit was exceeded. The user should use a different card to complete their purchase. |
4011 |
Card validation failed. The user can add a valid card and try again. |
4013 |
Payment was declined due to risk assessment. |
4014 |
Name on the bank payment account doesn't match the verified identity. The user should contact support for further assistance. |
4015 |
Payment wasn't received within the expected time. |
4016 |
Payment was received after the order timeout period. Funds will be refunded shortly. |
4017 |
Payment amount doesn't match the order amount. |
4018 |
Payment was canceled by the user. No funds were charged. |
Get offramp orders
Get detailed offramp orders data associated with your partner account. In an offramp order, the user sells USDC for a USD payout to their bank account.
Request Details
Endpoint: GET /api/external/offramp-orders
GET /api/external/offramp-orders👉 Refer to endpoints table for a full link.
Parameters
Configure your request using the parameters below to search and filter offramp order results.
| Parameter | Description | Possible Values |
|---|---|---|
limit |
The number of orders you want to retrieve. Defaults to 20. Values from 1 to 19 are applied as given. Any other value returns up to 20 orders. |
1 to 20 |
cursor_id |
Fetches the next page of results using the next_cursor_id from a previous response.Defaults to an empty string. |
01KAQWBNWWGG06HR5T9Z35A3WD |
search_by |
Finds orders by one value: an exact order_id, or the beginning of an external_order_id or click_id. Prefix matching is case-insensitive. |
A single value, for example 2FX6Yz. Comma-separated values are not supported. |
status |
Filters orders by their current status, the same value returned in the status field. See offramp order statuses. |
One value: created, awaiting_deposit, crypto_received, transfer_pending, completed, failed, expired, on_hold, or cancelled. |
start_date |
Filters orders with created_at at or after this timestamp. |
YYYY-MM-DDTHH:MM:SSZ, for example 2025-11-19T00:00:00Z. |
end_date |
Filters orders with created_at up to this timestamp. |
YYYY-MM-DDTHH:MM:SSZ |
Pagination reference
- Orders are returned newest first.
- Pass the
next_cursor_idfrom the previous response ascursor_idto get the next page. An emptynext_cursor_idmeans there are no more orders.- The maximum is 20 orders per request.
Example Requests
# 1. Get the 20 most recent offramp orders (default)
curl -X GET 'https://partner-sandbox.wert.io/api/external/offramp-orders' \
-H 'X-Api-Key: your-unique-api-key'
# 2. Retrieve the next 10 orders using a cursor
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/offramp-orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'limit=10' \
-d 'cursor_id=01KAQWBNWWGG06HR5T9Z35A3WD'
# 3. Find an order by its order_id
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/offramp-orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'search_by=01KAQWBNWWGG06HR5T9Z35A3WD'
# 4. Search by the beginning of an external_order_id or click_id
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/offramp-orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'search_by=2FX6'
# 5. Filter orders by status
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/offramp-orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'status=completed'
# 6. Filter orders by date range
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/offramp-orders' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'start_date=2025-11-19T00:00:00Z' \
-d 'end_date=2025-11-19T23:59:59Z'Response Details
Offramp Orders Response
Upon a successful request, the response includes the following fields:
| Variable | Description |
|---|---|
success |
Indicates if the request was successfully processed. |
data |
An array containing the retrieved offramp order objects. See offramp order object. |
next_cursor_id |
The cursor string used to fetch the next page of results. An empty string means there are no more orders. |
total |
The count of offramp orders matching the search criteria. The count does not depend on cursor_id. |
Offramp Order Object
The following fields represent the schema for each order in the data array. Parameters marked as filterable can be used to customize your queries by using the filter name shown in the table. Amounts are returned as strings.
| Variable | Description | Filterable | Filter Name |
|---|---|---|---|
order_id |
The unique identifier for the order in Wert's database. | Yes | search_by |
external_order_id |
The short identifier for the order. Omitted when the order has none. | Yes | search_by |
click_id |
The click ID passed when the order was opened. Always present, and can be an empty string. | Yes | search_by |
user_id |
The unique identifier for the user in Wert's database. | No | - |
status |
The current status of the order. See statuses. | Yes | status |
created_at |
Timestamp of when the order was created (UTC), in YYYY-MM-DD HH:MM:SS format. |
Yes | start_date / end_date |
changed_at |
Timestamp of when the order was last updated (UTC), in YYYY-MM-DD HH:MM:SS format. |
No | - |
quoted_amount |
The USDC amount set when the order was created. | No | - |
incoming_amount |
The USDC amount received from the user. Omitted if no deposit has been recorded. | No | - |
fee_amount |
The fee deducted from the payout, in USD. Omitted if it has not been calculated. | No | - |
outgoing_amount |
The amount paid out to the user's bank account, in USD. Omitted if it has not been calculated. | No | - |
tx_id |
Blockchain transaction hash of the user's deposit. Omitted if no deposit has been recorded. | No | - |
account_number_last4 |
The last four digits of the bank account the order pays out to. | No | - |
network |
The blockchain network of the deposit: ethereum, polygon or base. |
No | - |
asset |
The crypto asset sold: USDC. |
No | - |
Example Response
{
"success": true,
"data": [
{
"account_number_last4": "6789",
"asset": "USDC",
"changed_at": "2026-06-02 09:12:05",
"click_id": "click_id",
"created_at": "2026-06-02 08:44:43",
"external_order_id": "zvLHq",
"fee_amount": "1.5",
"incoming_amount": "100",
"network": "ethereum",
"order_id": "01KT3R3BQ2ZRBHZN58E6VVY5F3",
"outgoing_amount": "98.5",
"quoted_amount": "100",
"status": "completed",
"tx_id": "0xe6456e64a1e6d7f226deb7ff344cb5321a3a997165ea24569465493ff7385216",
"user_id": "01HQRBTDW17YQSZFBWZY7807B1"
}
],
"next_cursor_id": "",
"total": 1
}Offramp Order Status
The status field and the status filter use the following values:
createdawaiting_depositcrypto_receivedtransfer_pendingcompletedfailedexpiredon_holdcancelled
If Wert support overrides the status of an order, status returns the overridden value and the status filter matches it.
Offramp Order Errors
Possible error responses from the Offramp Orders endpoint.
{
"message": "search_by accepts one order id or external id prefix"
}{
"message": "unknown offramp order status"
}{
"error": "ERR_UNAUTHORIZED",
"success": false
}A missing X-Api-Key header, or a parameter in the wrong format (for example, a non-numeric limit or a malformed date), also returns 400, with the reason in a msg field.
Get users
Fetch detailed users data you have created or served.
Request Details
Endpoint: GET /api/external/users
GET /api/external/users👉 Refer to endpoints table for a full link.
Limits:
- Threshold: 10 requests per second.
Parameters
Configure your request using the parameters below to search and filter user results.
| Parameter | Description | Possible Values |
|---|---|---|
limit |
The number of users you want to retrieve. | 0 to 20 |
offset |
Skips the specified number of users. Defaults to 0. |
10 |
order_by |
Sets the order as ascending or descending. Defaults to desc. |
asc / desc |
from |
Filters users with created_at after this timestamp. |
YYYY-MM-DDTHH:MM:SSZ, for example 2025-11-19T23:59:59.00Z. |
to |
Filters users with created_at up to this timestamp. |
YYYY-MM-DDTHH:MM:SSZ |
Date filtering reference
- Use
fromandtotogether to return users for a specific period.- Use a narrow time range if you have a high number of users. The maximum is 20 users per request.
Example request
### 1. Get the most recent users (Default)
curl -X GET 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key'
### 2. Retrieve 20 users from a specific offset
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'limit=20' \
-d 'offset=20'
### 3. Search for a specific user by ID
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'user_ids=user_id'
### 4. Search for multiple users (comma-separated IDs)
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'user_ids=user_id1,user_id2,user_id3'
### 5. Filter users by KYC status (e.g., success)
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'lkyc_status=success'
### 6. Filter by date range (When users were created)
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'from=2025-11-20T00:00:00.00Z' \
-d 'to=2025-11-20T23:59:59.00Z'
### 7. Filter users by phone country
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'phone_country=RU'
### 8. Filter users by kyc country
curl -X GET -G 'https://partner-sandbox.wert.io/api/external/users' \
-H 'X-Api-Key: your-unique-api-key' \
-d 'kyc_country=RUS'
Response Details
Users Response
Upon a successful request, the response includes the following fields:
| Variable | Description |
|---|---|
success |
Indicates if the request was successfully processed. |
data |
An array containing the retrieved user objects. See user object. |
total |
The total count of users matching the search criteria. |
User Object
The following fields represent the schema for each user in the data array. Parameters marked as filterable can be used to customize your queries by using the filter name shown in the table.
| Variable | Description | Filterable | Filter Name |
|---|---|---|---|
user_id |
User's Wert ID. | Yes | user_ids |
country |
User's KYC country. alpha3 | Yes | kyc_country |
phone |
User's masked phone number. | No | - |
phone_country |
User's phone country. alpha2 | Yes | phone_country |
lkyc_status |
User's non-document verification status. | Yes | lkyc_status |
fkyc_status |
User's document verification status. | Yes | fkyc_status |
banned |
Indicates whether the user is banned by Wert. | No | - |
created_at |
Date and time of the user's creation (UTC). | Yes | to / from |
limits.crypto_remaining |
The user's current crypto limit left in USD. Zero if no KYC or active KYC is not success. | No | - |
limits.crypto_spending |
How much in USD the user has already spent from the current crypto limits. | No | - |
limits.digital_goods_remaining |
The user's current NFT limit left in USD. Zero if no KYC or active KYC is not success. | No | - |
limits.digital_goods_spending |
How much in USD the user has already spent from the current NFT limits. | No | - |
linked_payment_methods |
An array of objects representing the user's saved payment options. See linked payment methods object. | No | - |
Linked Payment Methods
| Variable | Description |
|---|---|
linked_payment_methods.cards.brand |
Payment method brand. |
linked_payment_methods.cards.card_id |
Payment method card ID associated with Wert. |
linked_payment_methods.cards.created_at |
Payment method creation date. |
linked_payment_methods.cards.last_digits |
Payment method last digits. |
linked_payment_methods.method |
Payment method. |
Example Response
{
"data": [
{
"country": "DEU",
"created_at": "2025-11-19T11:21:48.200421Z",
"fkyc_status": "retry",
"limits": {
"crypto_remaining": "0",
"crypto_spending": "0",
"digital_goods_remaining": "0",
"digital_goods_spending": "0"
},
"linked_payment_methods": [
{
"cards": [
{
"brand": "VISA",
"card_id": "01KADXN9TN3QEMG9DHWX6G7Y0S",
"created_at": "2025-11-19T11:23:09.526895Z",
"last_digits": "1000"
}
],
"method": "bank_card"
}
],
"lkyc_status": "failed",
"phone": "+49*****356",
"phone_country": "DE",
"user_id": "01KADXJS47C9B1WG8V3ZNM2SV7"
},
{
"country": "DEU",
"created_at": "2025-11-19T11:19:44.098153Z",
"fkyc_status": "not initiated",
"limits": {
"crypto_remaining": "6000",
"crypto_spending": "0",
"digital_goods_remaining": "6000",
"digital_goods_spending": "0"
},
"linked_payment_methods": [],
"lkyc_status": "success",
"phone": "+49*****355",
"phone_country": "DE",
"user_id": "01KADXEZZQF8DQEPP4AE28SKBX"
},
{
"country": "DEU",
"created_at": "2025-11-19T11:14:42.380854Z",
"fkyc_status": "not initiated",
"limits": {
"crypto_remaining": "6000",
"crypto_spending": "0",
"digital_goods_remaining": "6000",
"digital_goods_spending": "0"
},
"linked_payment_methods": [],
"lkyc_status": "success",
"phone": "+49*****354",
"phone_country": "DE",
"user_id": "01KADX5RRHCHDMPFWEEFX2YDS6"
}
],
"success": true,
"total": 3
}Create User
Create users via the API. This will generate a Wert profile for the user and initiate Light KYC on their behalf. If the KYC check is successful, the user will be taken directly to the payment step in the widget. Contact our support team to request this feature for your Partner ID.
Request Details
Endpoint: POST /api/external/users/create
POST /api/external/users/create👉 Refer to endpoints table for a full link.
Non-English characters should be standardized to English before passing to API.
Parameters
Configure your request using the parameters below to create user via API.
| Property | Required | Validation |
|---|---|---|
| has_accepted_terms_of_service | ✅ | possible values: true, false |
| phone | ✅ | +1234567890 |
| ✅ | [email protected] | |
| first_name | ✅ | 2–30 characters; A-Z, a-z, 0-9; No special characters (?, @, #, $, etc.); Cannot be all numeric |
| middle_name | Optional | 2–30 characters; A-Z, a-z, 0-9; No special characters (?, @, #, $, etc.); Cannot be all numeric |
| last_name | ✅ | 2–30 characters; A-Z, a-z, 0-9; No special characters (?, @, #, $, etc.); Cannot be all numeric |
| date_of_birth | ✅ | format: YYYY-MM-DD |
| country_of_residence | ✅ | alpha3 country code; |
| state_of_residence | ✅ | alpha2 US state code; |
| tin | Optional | For USA, a Social Security number: dashes and spaces are ignored, and exactly 9 digits are stored as 000-00-0000. For any other country, the trimmed value is stored as given. A blank value is rejected. The value is not returned. |
Example request
Example of user data to create a user with Wert and initiate an automatic LKYC.
curl -X POST 'https://partner.wert.io/api/external/users/create' \
-H 'X-Api-Key: your-unique-api-key' \
-H 'Content-Type: application/json' \
-d '{
"has_accepted_terms_of_service": true,
"phone": "+1234567890",
"email": "[email protected]",
"first_name": "John",
"middle_name": "Paul",
"last_name": "Doe",
"date_of_birth": "1990-01-01",
"country_of_residence": "USA",
"state_of_residence": "CA",
"tin": "000-00-0000"
}'Response Details
Possible response from User Creation endpoint. Refer to user creation error codes for more details.
{
"created_at": "string",
"user_id": "string",
}{
"field": "phone",
"message": "Invalid phone format"
}{
"field": "email",
"message": "Invalid email format"
}{
"field": "date_of_birth",
"message": "Invalid date_of_birth format"
}{
"field": "first_name",
"message": "Invalid first_name format"
}{
"field": "country_of_residence",
"message": "Invalid country_of_residence format"
}{
"field": "tin",
"message": "Invalid tin"
}{
"message": "ERR_UNAUTHORIZED"
}{
"field": "has_accepted_terms_of_service",
"message": "user must accept the terms of service"
}{
"field": "country_of_residence",
"message": "restricted country"
}{
"field": "partner_id",
"message": "user creation is not allowed"
}{
"message": "A user with this phone already exists",
"user_id": "USER_ID",
"created_at": "{creation date and time}"
}User Creation Error Codes
| Error code | Description |
|---|---|
400 |
Bad request. Ensure all required fields are present and meet validation criteria. |
401 |
Unauthorized. Check your API key or contact support. |
403 |
Forbidden. Ensure the user is 18+ years old, country and state are supported, and the user has accepted the terms and conditions. |
409 |
Conflict. A user with the same phone number may already exist. |
429 |
Too Many Requests. Retry later. |
500 |
Internal Server Error. |
Create offramp bank account
Add a US bank account to an existing user for offramp payouts. The user must be one you have created or served, and offramp must be available for your Partner ID.
Request Details
Endpoint: POST /api/external/offramp/users/USER_ID/bank-accounts
POST /api/external/offramp/users/USER_ID/bank-accounts👉 Refer to endpoints table for a full link.
Limits:
- Requests are rate limited per partner. When the limit is reached, the API returns
429with aRetry-Afterheader. - A user can have up to 3 active bank accounts.
- If the user already has an active bank account with the same
routing_numberandaccount_number, the API returns409with the existingbank_account_id.
Parameters
Replace USER_ID in the path with the user's Wert ID, and configure the request body using the parameters below.
| Property | Required | Validation |
|---|---|---|
| account_holder_name | ✅ | 1–128 characters; leading and trailing spaces are removed |
| account_number | ✅ | 4–17 digits, only numbers |
| routing_number | ✅ | 9 digits, only numbers; must be a valid ABA routing number |
| account_type | ✅ | possible values: checking, savings |
| alias | Optional | Up to 64 characters; leading and trailing spaces are removed. If omitted or empty, the alias is four middle dots, a space, and the last four digits of the account number, for example ···· 6789 |
| Optional | A valid email address. Omit it or send null to use the email on the user's offramp profile, or the user's email if the profile has none |
Example request
# 1. Create a bank account with the required fields only
curl -X POST 'https://partner-sandbox.wert.io/api/external/offramp/users/USER_ID/bank-accounts' \
-H 'X-Api-Key: your-unique-api-key' \
-H 'Content-Type: application/json' \
-d '{
"account_holder_name": "Jane Doe",
"account_number": "123456789",
"routing_number": "021000021",
"account_type": "checking"
}'
# 2. Create a bank account with an alias and an email
curl -X POST 'https://partner-sandbox.wert.io/api/external/offramp/users/USER_ID/bank-accounts' \
-H 'X-Api-Key: your-unique-api-key' \
-H 'Content-Type: application/json' \
-d '{
"account_holder_name": "Jane Doe",
"account_number": "123456789",
"routing_number": "021000021",
"account_type": "savings",
"alias": "Main savings",
"email": "[email protected]"
}'Response Details
Possible responses from the Offramp Bank Account Create endpoint. Refer to offramp bank account error codes for more details.
{
"account_number_last4": "6789",
"account_type": "checking",
"alias": "···· 6789",
"bank_account_id": "01KB2YQ8V7C3N4M5P6R7S8T9VW",
"created_at": "2026-10-29T12:34:56.789123Z"
}{
"errors": [
{
"field": "routing_number",
"message": "invalid ABA routing number checksum"
}
]
}{
"errors": [
{
"field": "email",
"message": "no email on the offramp profile or the user"
}
]
}{
"message": "ERR_UNAUTHORIZED"
}{
"message": "user is banned"
}{
"message": "offramp is not available"
}{
"message": "user not found"
}{
"code": "BANK_LIMIT",
"message": "maximum of 3 bank accounts reached"
}{
"bank_account_id": "{existing bank_account_id}",
"message": "bank account already exists"
}The response has no body. The Retry-After header holds the number of seconds to wait before retrying.
Offramp Bank Account Error Codes
| Error code | Description |
|---|---|
400 |
Bad request. The errors array lists each field that failed validation. A body that is not valid JSON, a field of the wrong type, or an email that is not a valid address returns 400 with an empty body. A missing X-Api-Key header returns 400 with the reason in a msg field. |
401 |
Unauthorized. Check your API key or contact support. |
403 |
Forbidden. The user is banned, or offramp is not available for your Partner ID. |
404 |
Not found. The user does not exist or is not one of your users. |
409 |
Conflict. The user already has 3 active bank accounts (code is BANK_LIMIT), or already has an active bank account with the same routing and account number (bank_account_id is the existing account). |
429 |
Too Many Requests. Retry after the number of seconds in the Retry-After header. |
500 |
Internal Server Error. |
Card Register
Allows you to register users cards directly from your backend. This requires PCI DSS certification, please get in touch with Wert team to request this feature for your Partner ID. Only works for users who have been created by the user creation API above.
Request Details
Endpoint: POST /api/v1/partner/register
POST /api/v1/partner/register👉 Refer to endpoints table for a full link.
Parameters
Configure your request using the parameters below to register a card for an existing user.
| Property | Required | Validation |
|---|---|---|
| card_number | ✅ | String, 12–19 |
| exp_month | ✅ | 2 digits, only numbers |
| exp_year | ✅ | 4 digits, only numbers |
| user_id | ✅ | Must match an existing user in database |
| billing_address.country | ✅ | alpha2 country code |
| billing_address.state | Conditional | Required for USA & Canada only; Not required for other countries; alpha2 state code |
| billing_address.postal_code | ✅ | 2–10 characters; ^[a-zA-Z0-9[:space:]-]*; Character “-” is allowed |
| billing_address.city | ✅ | String, 2–25 characters; A–Z, a–z, 0–9; No special or non-English characters; Cannot be all numeric |
| billing_address.street | ✅ | String, 2–35 characters; A–Z, a–z, 0–9; No special or non-English characters; Cannot be all numeric; Spaces allowed |
Example request
Example of card data registered on behalf of an existing user.
curl --location 'https://cards.wert.io/api/v1/partner/register' \
--header 'x-api-key: your-unique-api-key' \
--header 'Content-Type: application/json' \
--data '{
"card_number": "4001590000000001",
"exp_month": "01",
"exp_year": "2029",
"user_id": "USER_ID",
"billing_address": {
"country": "AD",
"postal_code": "11111",
"city": "City",
"street": "Street house number 6"
}
}'Response Details
Possible responses from Card Register endpoint.
{
"body": {
"card_id": "string"
},
"status": "ok"
}Card details validation
{
"status": "error",
"error_description": "Invalid card"
}{
"status": "error",
"error_description": "Invalid exp month"
}{
"status": "error",
"error_description": "Invalid year"
}{
"status": "error",
"error_description": "Card expired"
}Billing address & business validation
{
"code": 121,
"status": "error",
"error_description": "invalid billing address information",
"request_id": "string"
}{
"code": 109,
"status": "error",
"error_description": "attempt to register more cards than allowed"
}{
"code": 113,
"status": "error",
"error_description": "card already registered"
}{
"code": 309,
"status": "error",
"error_description": "user not found"
}{
"code": 310,
"status": "error",
"error_description": "user banned"
}{
"code": 1022,
"status": "error",
"error_description": "restricted action"
}{
"code": 1023,
"status": "error",
"error_description": "partner not allowed"
}{
"code": 9002,
"status": "error",
"error_description": "invalid partner key"
}{
"code": 1006,
"status": "error",
"error_description": "partner is blocked"
}Updated 1 day ago

