List own price alerts
curl --request GET \
--url https://www.oceanx.trade/api/v1/price-alerts \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/price-alerts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.oceanx.trade/api/v1/price-alerts', 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://www.oceanx.trade/api/v1/price-alerts",
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://www.oceanx.trade/api/v1/price-alerts"
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://www.oceanx.trade/api/v1/price-alerts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/price-alerts")
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": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"assetKey": {
"chain_id": "<string>",
"contract": "<string>"
},
"pool": "<string>",
"metric": "price",
"quote": "usd",
"quoteAsset": "<string>",
"threshold": "<string>",
"condition": {
"kind": "above"
},
"mode": "once",
"hysteresisPct": "<string>",
"cooldownMin": 720,
"expiresAtMs": 4503599627370495,
"deliveryChannels": [
"in_app"
],
"configVersion": 4503599627370496,
"status": "draft",
"createdAtMs": 4503599627370495,
"lastTriggeredAtMs": 4503599627370495,
"eligibilityReason": "<string>",
"deliveryStatus": "<string>",
"state": {
"baseline": "<string>",
"lastSampleTsMs": 4503599627370495,
"lastSampleSeq": 4503599627370495,
"awaitingRearm": true,
"cooldownUntilMs": 4503599627370495
}
}
],
"nextCursor": "<string>",
"meta": {
"requestId": "<string>",
"source": "copy-trading-store",
"methodVersion": "<string>",
"observedAtMs": null,
"staleAfterMs": null,
"coverage": "<string>",
"completeHistory": true,
"snapshotExpiresAtMs": 4503599627370495,
"pagination": "service_keyset",
"cursorTtlMs": 300000,
"mode": {
"disabled": true,
"dryRun": true,
"liveExecutionAvailable": false
},
"limits": {
"maxPerTradeUsd": 123,
"dailyCapUsd": 123,
"slippageBps": 123,
"targets": 4503599627370495
}
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}Price Alerts
List own price alerts
Owner comes exclusively from the bearer key. Caller owner fields are rejected. Scopes are opt-in and independent of md.read and trading authority. Every request consumes the existing REST key limiter. URLs <=8 KiB and bodies <=32 KiB; no-store and credential-free CORS including PATCH/Idempotency-Key/If-Match. Uses the existing alert-eval service owner guard and durable journal. This adapter preserves its draft/arm/reviewed-replacement lifecycle and configVersion semantics. New configs are USD price crossing alerts with in-app delivery and zero hysteresis; reads also project existing app-native configurations. No webhook association/delivery. Default lists all states. active=true selects active/offline_pending; false selects other states. Encrypted five-minute cursors bind owner/filters/limit. Service keyset order is createdAt descending then ID descending; state/filter membership can change between pages. This is not an immutable snapshot. A final empty page is possible.
GET
/
api
/
v1
/
price-alerts
List own price alerts
curl --request GET \
--url https://www.oceanx.trade/api/v1/price-alerts \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/price-alerts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.oceanx.trade/api/v1/price-alerts', 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://www.oceanx.trade/api/v1/price-alerts",
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://www.oceanx.trade/api/v1/price-alerts"
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://www.oceanx.trade/api/v1/price-alerts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/price-alerts")
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": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"assetKey": {
"chain_id": "<string>",
"contract": "<string>"
},
"pool": "<string>",
"metric": "price",
"quote": "usd",
"quoteAsset": "<string>",
"threshold": "<string>",
"condition": {
"kind": "above"
},
"mode": "once",
"hysteresisPct": "<string>",
"cooldownMin": 720,
"expiresAtMs": 4503599627370495,
"deliveryChannels": [
"in_app"
],
"configVersion": 4503599627370496,
"status": "draft",
"createdAtMs": 4503599627370495,
"lastTriggeredAtMs": 4503599627370495,
"eligibilityReason": "<string>",
"deliveryStatus": "<string>",
"state": {
"baseline": "<string>",
"lastSampleTsMs": 4503599627370495,
"lastSampleSeq": 4503599627370495,
"awaitingRearm": true,
"cooldownUntilMs": 4503599627370495
}
}
],
"nextCursor": "<string>",
"meta": {
"requestId": "<string>",
"source": "copy-trading-store",
"methodVersion": "<string>",
"observedAtMs": null,
"staleAfterMs": null,
"coverage": "<string>",
"completeHistory": true,
"snapshotExpiresAtMs": 4503599627370495,
"pagination": "service_keyset",
"cursorTtlMs": 300000,
"mode": {
"disabled": true,
"dryRun": true,
"liveExecutionAvailable": false
},
"limits": {
"maxPerTradeUsd": 123,
"dailyCapUsd": 123,
"slippageBps": 123,
"targets": 4503599627370495
}
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"requestId": "<string>"
}Authorizations
An OceanX API key, created in the app under Settings → Developer API. Send it as Authorization: Bearer ox_live_…. Required scopes are operation-specific: market reads use md.read, tracker uses tracker.read, copy reads use copy.read, and alert operations use alerts.read or alerts.write. New scopes require explicit selection and grant no trading authority. Existing perps operations retain their documented scopes.
Query Parameters
Required range:
1 <= x <= 200Opaque owner-bound cursor; repeat original filters and limit.
Maximum string length:
512Available options:
solana, ethereum, base, bnb, arbitrum, polygon, monad, hyperevm, robinhood Base58 Solana mint or 0x-prefixed 40-hex EVM address, according to chain. Fresh qualified service data is required.
Maximum string length:
128