curl --request GET \
--url https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions \
--header 'API-Key: <api-key>' \
--header 'API-Nonce: <api-key>' \
--header 'API-Sign: <api-key>'import requests
url = "https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions"
headers = {
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'API-Key': '<api-key>', 'API-Sign': '<api-key>', 'API-Nonce': '<api-key>'}
};
fetch('https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"API-Nonce: <api-key>",
"API-Sign: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions")
.header("API-Key", "<api-key>")
.header("API-Sign", "<api-key>")
.header("API-Nonce", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["API-Key"] = '<api-key>'
request["API-Sign"] = '<api-key>'
request["API-Nonce"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "TX-2025-0001",
"timestamp": "2025-09-12T14:23:11Z",
"type": "swap",
"status": "successful",
"details": {
"type": "swap",
"quote_id": "Q-2025-0001"
},
"spend": {
"sub_total": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "5000.00",
"amount_in_quote": "5000.00"
},
"total": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "5025.00",
"amount_in_quote": "5025.00"
},
"timestamp": "2025-09-12T14:23:11Z",
"fee": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "25.00",
"amount_in_quote": "25.00"
},
"balance": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "4975.00",
"amount_in_quote": "4975.00"
}
},
"receive": {
"sub_total": {
"symbol": "BTC",
"name": "Bitcoin",
"type": "crypto",
"amount": "0.08064516",
"amount_in_quote": "5000.00"
},
"total": {
"symbol": "BTC",
"name": "Bitcoin",
"type": "crypto",
"amount": "0.08064516",
"amount_in_quote": "5000.00"
},
"timestamp": "2025-09-12T14:23:11Z",
"balance": {
"symbol": "BTC",
"name": "Bitcoin",
"type": "crypto",
"amount": "0.58064516",
"amount_in_quote": "35990.00"
}
}
}
],
"quote_symbol": "USD",
"quote_type": "fiat",
"next_page_token": "MjoyRHuBXSgoe0mDHt-iFALROW46EGdvk_trgja31Vwr7H4"
}List portfolio transactions
Lists account portfolio transactions with optional filters for type, asset, status, transaction ID, originating reference, time range, and sort direction. Results are cursor-paginated. Results are ordered newest first by default; set sort_direction=asc for oldest first. Page tokens are valid for up to 24 hours. A page can contain fewer than page_size matching transactions, including no transactions, while still returning next_page_token; continue until the token is absent.
Transactions can appear asynchronously. To discover new activity, poll this operation with the applicable types filters and an appropriate time range, omitting statuses or including in_progress while a transaction is being processed. For a transfer created by POST /v1/transfers, use types=transfer and the from account from the create request. For an accepted derivatives transfer created by POST /v1/accounts/{account_id}/transfers/derivatives, use types=transfer and the account_id from the request path. The transfer_id returned by either create operation is the id in a reference with kind=transfer. Once the transaction appears, that reference can be submitted in references for deterministic subsequent lookup. A transfer may appear with status=in_progress before it reaches the terminal successful or failed status; filtering only by successful can therefore hide a newly materialized transfer. The first Portfolio response after a transfer is created may contain no matching transaction even when a generic transfer has status=complete or a derivatives transfer has status=accepted; continue polling until the transaction is present.
For deposits and withdrawals, reference.kind=funding identifies the originating funding transaction. For deposits, it is not the deposit destination or a payment reference from bank-transfer instructions; those values describe how to make the payment and are not accepted by references. For withdrawals, use types=withdrawal and, when the originating funding identifier is known, submit it in references as the id with kind=funding. Poll with statuses omitted until the withdrawal appears, then continue polling without that filter until its status is terminal: successful or failed. Filtering only by in_progress is useful for discovering pending withdrawals, but it excludes terminal results and must be removed or changed before polling for completion. Once a funding transaction appears, its reference can be used for deterministic subsequent lookup. The returned Portfolio transaction id uses the TX namespace and is distinct from the funding identifier in reference.id.
curl --request GET \
--url https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions \
--header 'API-Key: <api-key>' \
--header 'API-Nonce: <api-key>' \
--header 'API-Sign: <api-key>'import requests
url = "https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions"
headers = {
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'API-Key': '<api-key>', 'API-Sign': '<api-key>', 'API-Nonce': '<api-key>'}
};
fetch('https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"API-Nonce: <api-key>",
"API-Sign: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions")
.header("API-Key", "<api-key>")
.header("API-Sign", "<api-key>")
.header("API-Nonce", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.services.payward.com/v1/accounts/{account_id}/portfolio/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["API-Key"] = '<api-key>'
request["API-Sign"] = '<api-key>'
request["API-Nonce"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "TX-2025-0001",
"timestamp": "2025-09-12T14:23:11Z",
"type": "swap",
"status": "successful",
"details": {
"type": "swap",
"quote_id": "Q-2025-0001"
},
"spend": {
"sub_total": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "5000.00",
"amount_in_quote": "5000.00"
},
"total": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "5025.00",
"amount_in_quote": "5025.00"
},
"timestamp": "2025-09-12T14:23:11Z",
"fee": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "25.00",
"amount_in_quote": "25.00"
},
"balance": {
"symbol": "USD",
"name": "US Dollar",
"type": "fiat",
"amount": "4975.00",
"amount_in_quote": "4975.00"
}
},
"receive": {
"sub_total": {
"symbol": "BTC",
"name": "Bitcoin",
"type": "crypto",
"amount": "0.08064516",
"amount_in_quote": "5000.00"
},
"total": {
"symbol": "BTC",
"name": "Bitcoin",
"type": "crypto",
"amount": "0.08064516",
"amount_in_quote": "5000.00"
},
"timestamp": "2025-09-12T14:23:11Z",
"balance": {
"symbol": "BTC",
"name": "Bitcoin",
"type": "crypto",
"amount": "0.58064516",
"amount_in_quote": "35990.00"
}
}
}
],
"quote_symbol": "USD",
"quote_type": "fiat",
"next_page_token": "MjoyRHuBXSgoe0mDHt-iFALROW46EGdvk_trgja31Vwr7H4"
}Authorizations
Your public API key. Identifies the partner making the request.
HMAC signature over the request, computed with your private key.
Monotonically increasing nonce included in the request signature.
Path Parameters
Globally unique public identifier for an account.
14 - 42Query Parameters
Opaque token returned as next_page_token in the previous response. Omit to request the first page.
1 - 256Filter by transaction type.
Category of portfolio transaction. swap and price_trigger_swap represent both successful executions and failed execution attempts; use status to distinguish them. deposit and withdrawal represent incoming and outgoing funding transactions, respectively. transfer represents both transfers between accounts and movements between an account's spot and futures balances.
swap, price_trigger_swap, earn_reward, deposit, withdrawal, transfer, recurring_swap Maximum number of results to return. Ignored when page_token is present.
1 <= x <= 25Filter transactions by specific assets.
Show child attributes
Show child attributes
Lower bound of the transaction timestamp filter. RFC 3339 timestamp.
Upper bound of the transaction timestamp filter. RFC 3339 timestamp.
Filter transactions by lifecycle status. When polling a newly created transfer or withdrawal through completion, omit this filter or provide an empty array so both in_progress and the terminal successful or failed status can be observed. Filtering only by in_progress discovers pending transactions but excludes terminal results; remove or change that filter before polling for completion.
Lifecycle statuses available to filter transactions.
in_progress, successful, failed Filter transactions by specific transaction IDs.
Sort order for transaction results by timestamp.
asc, desc Asset to use for quoting amounts and fees in the response. Quoting is best-effort based on rates at transaction time. If not provided or if quoting is unavailable, quoted fields will be null.
1 - 16Quote asset classification. Supports fiat and stablecoin.
fiat, stablecoin Filter by originating references. Entries are ORed together and combined with types and other filters using AND semantics. Reference kind selects the originating system namespace. For a deposit or withdrawal, use kind=funding and the originating funding identifier. For a transfer, use kind=transfer and the transfer_id returned by POST /v1/transfers or an accepted POST /v1/accounts/{account_id}/transfers/derivatives request. Reference identifiers are distinct from the TX identifiers accepted by ids.
Show child attributes
Show child attributes
Response
Successful response
List of portfolio transactions matching the query parameters. Always present; serialized as an empty array when no transactions match.
Show child attributes
Show child attributes
The asset used as the quote currency for all amount_in_quote fields. Present only when quote_symbol was requested.
Quote asset classification. Supports fiat and stablecoin.
fiat, stablecoin Opaque token for retrieving the next page. Absent when there are no more results.
1 - 256