Prerequisites
- Payward Services API credentials (see Authentication Guide)
- A verified user with at least one account
Only cryptocurrency deposits are supported. Fiat deposits are not available through the Payward Services API.
Crypto deposits
Deposit workflow
Query available deposit methods for the target asset.
GET /v1/accounts/{account_id}/funds/deposits/methods/ {asset_symbol}Create deposit address
Generate a new deposit address for the user.
POST /v1/accounts/{account_id}/funds/deposits/addressesDisplay address to user
Retrieve and display the deposit address in your UI.
GET /v1/accounts/{account_id}/funds/deposits/addressesCompleted deposits will appear in
GET /v1/accounts/{account_id}/portfolio/transactions?types=deposit.Step 1: list deposit methods
Query available deposit methods for a crypto asset. Use the method’sid from the response (passed as method_id) when creating an address in Step 2.
Most cryptocurrency deposits are free, with minimum deposit amounts varying by asset. A few cryptocurrencies are
charged an
address_setup_fee (a one-time fee on the user’s first deposit to a new address) or a per-deposit fee.Response example
network, fee, minimum, and network_info.est_confirmation_time. Pass the method’s id back as method_id when creating a deposit address.
Step 2: create a deposit address
Generate a deposit address using the methodid from Step 1 as method_id. Display the address to the user so they can send crypto from an external wallet.
Some networks (e.g., XRP, XLM) require a tag or memo in addition to the address. If
tag or memo is present in the
response, your UI must display it and instruct the user to include it when sending funds. Deposits sent without the
required tag/memo may be lost.Step 3: list deposit addresses
Retrieve existing deposit addresses for a given asset and method. Use this to display previously generated addresses to users without creating new ones each time.Response example
Recommended UI flow
Best practices
- Always display tag/memo: For networks that require a tag or memo (XRP, XLM, etc.), prominently display it alongside the address. Missing tags/memos can result in lost funds.
- Set expectations: Show
minimumamounts andest_confirmation_timefrom the methods response so users know what to expect before sending funds. - Use fresh responses: Available methods, addresses and limits are user-specific and may change based on account standing, remaining limits, or regional regulations. Fetch fresh data before displaying options rather than relying on cached results.
Crypto withdrawals
Withdrawals are key-based: you save an address once, then use itskey in each withdrawal request.
Withdrawal workflow
List withdrawal methods
Query available withdrawal methods for the target asset.
GET /v1/accounts/{account_id}/funds/withdrawals/methods/ {asset_symbol}Validate address (optional)
Verify the destination address is valid before saving.
POST /v1/funds/withdrawals/addresses/validateSave address (create key)
Store the validated withdrawal address for the user.
POST /v1/accounts/{account_id}/funds/withdrawals/addressesPreview / submit withdrawal
Submit the withdrawal request.
POST /v1/accounts/{account_id}/funds/withdrawalsStep 1: list withdrawal methods
Call this first to determine the method’sid (passed as method_id in later requests), fee estimates, limits, and optional fee_token.
Response example
Step 2: validate withdrawal address (recommended)
This endpoint validates the destination before you save it.Step 3: save withdrawal address
Save the address once and keep the returnedkey for future withdrawals.
Step 4: preview and submit a withdrawal
Usepreview=true to quote fees and totals without creating a withdrawal, then submit with preview=false.
Statuses
| Status | Description |
|---|---|
pending | Withdrawal detected and being processed |
held | Held for review |
success | Completed successfully |
failure | Failed (terminal) |
Withdrawal best practices
- Use idempotency keys: Always generate a unique UUIDv4 and send it as the
Idempotency-KeyHTTP header per intended withdrawal to avoid duplicate sends on retries. Replayed responses includeIdempotent-Replayed: true. - Preview first: Run a preview request immediately before submit so users can confirm
amount,fee, andtotal. - Refresh expired fee tokens:
fee_tokenvalues are short-lived. If a withdrawal is rejected due to an expired/invalid token, fetch withdrawal methods again (or run a fresh preview) to get a newfee_tokenand retry. - Persist key ownership: Store which
keybelongs to each user and enforce access checks in your app. - Handle memo/tag networks: For XRP/XLM-like networks, capture and persist memo/tag fields when addresses are saved.
- Monitor with webhooks: Subscribe to
withdrawal.status_updatedand reconcile events against your internal withdrawal records.
Common errors
| HTTP status | Cause | Remediation |
|---|---|---|
400 Bad Request | Invalid payload (e.g. malformed key, amount, or unrecognized asset_symbol) | Validate the request payload before sending |
401 Unauthorized | Missing or invalid API credentials | Verify API-Key and API-Sign headers |
404 Not Found | Saved withdrawal key does not exist | Re-list saved addresses and use an existing key |
409 Conflict | Withdrawal key already exists, or Idempotency-Key reused with a different payload | Choose a unique key, or reuse the same Idempotency-Key only for identical retries |
429 Too Many Requests | Rate limit exceeded | Back off and retry with exponential delay |
API reference
| Endpoint | Method | Description |
|---|---|---|
/v1/accounts/{account_id}/funds/deposits/methods/{asset_symbol} | GET | List deposit methods for an asset |
/v1/accounts/{account_id}/funds/deposits/addresses | POST | Create a new deposit address |
/v1/accounts/{account_id}/funds/deposits/addresses | GET | List existing deposit addresses |
/v1/accounts/{account_id}/funds/withdrawals/methods/{asset_symbol} | GET | List withdrawal methods for an asset |
/v1/funds/withdrawals/addresses/validate | POST | Validate a withdrawal address without saving it |
/v1/accounts/{account_id}/funds/withdrawals/addresses | POST | Save a withdrawal address |
/v1/accounts/{account_id}/funds/withdrawals/addresses | GET | List saved withdrawal addresses |
/v1/accounts/{account_id}/funds/withdrawals/addresses/{key} | PATCH | Rename a saved withdrawal key |
/v1/accounts/{account_id}/funds/withdrawals/addresses/{key} | DELETE | Delete a saved withdrawal address |
/v1/accounts/{account_id}/funds/withdrawals | POST | Preview or submit a withdrawal |
/v1/funds/transactions | GET | List funding (deposit and withdrawal) transactions |
/v1/webhooks | POST | Register for deposit.status_updated and withdrawal.status_updated webhooks |