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.
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.
The transfer_id returned by create 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
POST /v1/transfers may contain no matching transaction even when the create response
has status=complete; continue polling until the transaction is present.
For deposits, reference.kind=funding identifies the materialized funding transaction.
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.
Discover a new deposit by polling with the applicable type, asset, and time filters. Once
the transaction appears, its Funding reference can be used for deterministic subsequent
lookup. The returned transaction id uses the TX namespace and is distinct from the
reference identifier.
Successful swap and price_trigger_swap transactions include the executed quote identifier
in details.quote_id. Failed swap attempts are returned with status=failed and include a
type-specific details.failure_reason.
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
Account ID
Query 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 executed
transactions; failed execution attempts are not returned.
swap, price_trigger_swap, earn_reward, deposit, withdrawal, transfer Maximum number of results to return. Defaults to 20 when omitted.
1 <= x <= 25Filter transactions by specific assets.
Show child attributes
Show child attributes
RFC 3339 timestamp.
RFC 3339 timestamp.
Filter transactions by their lifecycle status. A successful filter also returns
transactions with no lifecycle status; those results omit status. For newly created
transfers, omit this filter or include in_progress while waiting for the transaction
to reach a terminal status.
Lifecycle statuses available to filter transactions.
in_progress, successful, failed Filter transactions by specific transaction IDs.
Sort order for transaction results by timestamp. Defaults to desc.
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.
3 - 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 transfer, use kind=transfer and the
transfer_id returned by POST /v1/transfers. 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