curl --request GET \
--url https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/ratesimport requests
url = "https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates', 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.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates"
req, _ := http.NewRequest("GET", url, nil)
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.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": [
{
"timestamp": "2026-01-01T00:00:00Z",
"open": "94000.10",
"high": "94520.00",
"low": "93875.25",
"close": "94250.12",
"volume": "123.456789"
},
{
"timestamp": "2026-01-01T00:15:00Z",
"open": "94250.12",
"high": "94425.75",
"low": "94190.00",
"close": "94381.50",
"volume": "98.765432"
}
],
"quote_symbol": "USD",
"quote_type": "fiat",
"start_timestamp": "2026-01-01T00:00:00Z",
"end_timestamp": "2026-01-01T00:30:00Z",
"interval": "PT15M",
"page_size": 20
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 400,
"code": "bad_request",
"causes": [
{
"field": "country",
"message": "must be a valid ISO 3166-1 alpha-2 country code"
}
]
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 401,
"code": "unauthenticated"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 403,
"code": "forbidden"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 404,
"code": "not_found"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 429,
"code": "resource_exhausted"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 500,
"code": "internal"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 501,
"code": "unimplemented"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 503,
"code": "unavailable"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 504,
"code": "deadline_exceeded"
}
}List asset rates
List historical OHLCV candles for a single asset against a quote asset.
Return open, high, low, close, and base-asset volume for each available candle, in chronological order. Use close to plot a price time-series.
Prices are expressed in the quote asset per unit of the requested asset. Some candles use derived rates: their high and low values are price bounds that may not correspond to executed trades. Their volume comes from the underlying market used to price the requested asset, expressed in units of that asset.
For example, when BTC/JPY prices are derived from BTC/USD and USD/JPY, volume represents BTC traded in the BTC/USD market during the interval. It does not represent BTC/JPY trading activity.
Intervals without trades may carry forward prior prices with zero volume. The current, incomplete candle may be included and can change until the interval ends.
Pages cover consecutive portions of the requested time window. Continue with next_page_token until it is absent, even if data is empty. An empty page means no prices are available for that portion of the window. History is limited to the most recent 5,760 candles and may be shorter for some intervals.
Geographic restrictions apply according to country.
curl --request GET \
--url https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/ratesimport requests
url = "https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates', 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.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates"
req, _ := http.NewRequest("GET", url, nil)
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.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.services.payward.com/v1/assets/{asset_type}/{asset_symbol}/rates")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": [
{
"timestamp": "2026-01-01T00:00:00Z",
"open": "94000.10",
"high": "94520.00",
"low": "93875.25",
"close": "94250.12",
"volume": "123.456789"
},
{
"timestamp": "2026-01-01T00:15:00Z",
"open": "94250.12",
"high": "94425.75",
"low": "94190.00",
"close": "94381.50",
"volume": "98.765432"
}
],
"quote_symbol": "USD",
"quote_type": "fiat",
"start_timestamp": "2026-01-01T00:00:00Z",
"end_timestamp": "2026-01-01T00:30:00Z",
"interval": "PT15M",
"page_size": 20
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 400,
"code": "bad_request",
"causes": [
{
"field": "country",
"message": "must be a valid ISO 3166-1 alpha-2 country code"
}
]
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 401,
"code": "unauthenticated"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 403,
"code": "forbidden"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 404,
"code": "not_found"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 429,
"code": "resource_exhausted"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 500,
"code": "internal"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 501,
"code": "unimplemented"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 503,
"code": "unavailable"
}
}{
"error": {
"type": "assets_error",
"instance": "5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"status": 504,
"code": "deadline_exceeded"
}
}Path Parameters
Classification of the asset (fiat, crypto, stablecoin, or xstock).
fiat, crypto, xstock, stablecoin Ticker symbol of an asset (e.g., BTC, USDC, EUR).
1 - 16Query Parameters
ISO 3166-1 alpha-2 country code used to apply geo restrictions (e.g., "US", "GB"). Required.
^[A-Z]{2}$Ticker symbol of the quote asset.
1 - 16Classification of the quote asset.
fiat Inclusive lower bound of the rate window. Defaults to end_timestamp - 7 days.
Exclusive upper bound of the rate window. Defaults to "now".
Sampling interval.
PT1M, PT5M, PT15M, PT30M, PT60M, PT4H, P1D, P7D, P15D Maximum number of results to return. Ignored when page_token is present.
1 <= x <= 100Opaque token returned as next_page_token in the previous response. Omit to request the first page.
1 - 256Response
Successful response
Available candles for this page's portion of the requested time window, in chronological order.
Show child attributes
Show child attributes
Quote asset symbol the prices are denominated in.
Classification of the quote asset.
fiat Resolved start of the window after defaults were applied.
Resolved end of the window after defaults were applied.
Resolved interval after defaults were applied.
PT1M, PT5M, PT15M, PT30M, PT60M, PT4H, P1D, P7D, P15D Maximum number of results returned on this page. Echoes the page_size query parameter.
1 <= x <= 100Opaque token for retrieving the next page. Absent when there are no more results.
1 - 256