curl --request GET \
--url https://api.portfobit.com/api/v1/market-data/candles \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.portfobit.com/api/v1/market-data/candles"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.portfobit.com/api/v1/market-data/candles', 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.portfobit.com/api/v1/market-data/candles",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.portfobit.com/api/v1/market-data/candles"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.portfobit.com/api/v1/market-data/candles")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portfobit.com/api/v1/market-data/candles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"symbol": "BTC/USDT",
"instrument_type": "spot",
"source": "ccxt",
"source_venue": "binance",
"interval": "1h",
"candles": [
{
"open_time": "2026-08-07T07:00:00Z",
"close_time": "2026-08-07T08:00:00Z",
"open": "59800.00",
"high": "60100.00",
"low": "59700.00",
"close": "60000.00",
"base_volume": "123.45",
"quote_volume": null,
"is_closed": true
}
],
"requested_from": "2026-08-07T07:00:00Z",
"requested_to": null,
"coverage": {
"is_complete": true
},
"fetched_at": "2026-08-07T08:00:01Z"
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-07T08:00:01Z"
}
}{
"error": {
"code": "invalid_candle_interval",
"message": "interval must be a supported CCXT timeframe",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-14T08:00:00Z"
}
}{
"error": {
"code": "market_venue_not_available",
"message": "The requested market venue is not available.",
"details": {
"venue": "binance"
}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-08T08:00:00Z"
}
}{
"error": {
"code": "market_candles_unsupported",
"message": "connector does not support market candle queries",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-14T08:00:00Z"
}
}{
"error": {
"code": "market_upstream_rate_limited",
"message": "The market-data provider is rate limited.",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-08T08:00:00Z"
}
}{
"error": {
"code": "unavailable",
"message": "market data is unavailable",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-14T08:00:00Z"
}
}List bounded CEX OHLCV candles
Requires marketdata:read. Returns a bounded raw OHLCV series from one CEX credential already connected by this user. It never reads a balance or position, uses an internal valuation price or cache, persists candles, retries across venues, or falls back to another venue. The accepted interval enum is the complete CCXT v4.5.65 exchange.timeframes key union; a specific CEX can support only a subset. Maximum lookback from from is 1 day for 1s, 3 days for 10s, 7 days for 1m, 21 days for 3m, 30 days for 5m, 60 days for 10m, 90 days for 15m, 180 days for 30m, 270 days for 45m, 1 year for 1h, 2 years for 2h/3h/4h, 3 years for 6h/8h, 4 years for 12h, and 5 years for day/week/month/year intervals. Month and year close times use CCXT’s 30-day and 365-day timeframe semantics, not a guaranteed CEX calendar boundary.
curl --request GET \
--url https://api.portfobit.com/api/v1/market-data/candles \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.portfobit.com/api/v1/market-data/candles"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.portfobit.com/api/v1/market-data/candles', 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.portfobit.com/api/v1/market-data/candles",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.portfobit.com/api/v1/market-data/candles"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.portfobit.com/api/v1/market-data/candles")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portfobit.com/api/v1/market-data/candles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"symbol": "BTC/USDT",
"instrument_type": "spot",
"source": "ccxt",
"source_venue": "binance",
"interval": "1h",
"candles": [
{
"open_time": "2026-08-07T07:00:00Z",
"close_time": "2026-08-07T08:00:00Z",
"open": "59800.00",
"high": "60100.00",
"low": "59700.00",
"close": "60000.00",
"base_volume": "123.45",
"quote_volume": null,
"is_closed": true
}
],
"requested_from": "2026-08-07T07:00:00Z",
"requested_to": null,
"coverage": {
"is_complete": true
},
"fetched_at": "2026-08-07T08:00:01Z"
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-07T08:00:01Z"
}
}{
"error": {
"code": "invalid_candle_interval",
"message": "interval must be a supported CCXT timeframe",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-14T08:00:00Z"
}
}{
"error": {
"code": "market_venue_not_available",
"message": "The requested market venue is not available.",
"details": {
"venue": "binance"
}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-08T08:00:00Z"
}
}{
"error": {
"code": "market_candles_unsupported",
"message": "connector does not support market candle queries",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-14T08:00:00Z"
}
}{
"error": {
"code": "market_upstream_rate_limited",
"message": "The market-data provider is rate limited.",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-08T08:00:00Z"
}
}{
"error": {
"code": "unavailable",
"message": "market data is unavailable",
"details": {}
},
"meta": {
"request_id": "req_01J2K8B7QW",
"generated_at": "2026-08-14T08:00:00Z"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
CCXT unified symbol, for example BTC/USDT or ETH/USDT:USDT.
Complete CCXT v4.5.65 exchange.timeframes key union. Actual availability depends on the selected CEX.
1s, 10s, 1m, 3m, 5m, 10m, 15m, 30m, 45m, 1h, 2h, 3h, 4h, 6h, 8h, 12h, 1d, 3d, 5d, 7d, 1w, 2w, 3w, 4w, 1M, 3M, 4M, 5M, 1y Optional connected CEX venue. When supplied, it is a strict source constraint; when omitted, one healthy connected venue is selected.
Optional RFC 3339 UTC start time. Together with to, only candles whose open time is in [from, to) are returned.
Optional RFC 3339 UTC end time. It must not be in the future; when provided without from, the service derives from from limit.
Maximum candles from one bounded upstream request.
1 <= x <= 500Include the current unfinished candle and mark it with is_closed: false.