curl --request GET \
--url https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay \
--header 'X-API-Key: <api-key>' \
--header 'X-API-Secret: <api-key>'import requests
url = "https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay"
headers = {
"X-API-Key": "<api-key>",
"X-API-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-API-Key': '<api-key>', 'X-API-Secret': '<api-key>'}
};
fetch('https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay', 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-uat.dimetrades.com/api/partner/market-lifecycle-events/replay",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>",
"X-API-Secret: <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-uat.dimetrades.com/api/partner/market-lifecycle-events/replay"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-API-Secret", "<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-uat.dimetrades.com/api/partner/market-lifecycle-events/replay")
.header("X-API-Key", "<api-key>")
.header("X-API-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
request["X-API-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"events": [
{
"sequenceId": 10450,
"eventType": "MARKET_CREATED",
"schemaVersion": 1,
"data": {
"marketId": "40996687",
"eventId": "1557438",
"title": "$2.800 or above",
"ticker": "NATGAS-28-4PM",
"status": "pending"
},
"occurredAt": 1753775990000
},
{
"sequenceId": 10451,
"eventType": "MARKET_STATUS_CHANGED",
"schemaVersion": 1,
"data": {
"marketId": "40996686",
"eventId": "1557438",
"fromStatus": "open",
"toStatus": "halted",
"reason": null
},
"occurredAt": 1753776000000
},
{
"sequenceId": 10453,
"eventType": "MARKET_STATUS_CHANGED",
"schemaVersion": 1,
"data": {
"marketId": "40996686",
"eventId": "1557438",
"fromStatus": "closed",
"toStatus": "settled",
"reason": "Settled YES by the resolution engine (automated)",
"result": "YES"
},
"occurredAt": 1753776300000
}
],
"requestedIds": [
10450,
10451,
10453
],
"missingIds": []
},
"errors": []
}Recover specific market lifecycle events by id
ISV-driven recovery for the market lifecycle WebSocket feed (see the “Market lifecycle feed” guide). The server keeps no per-brand cursor or delivery state for this feed at all — you detect a gap in sequenceId on your own live socket stream and ask for exactly the ids you’re missing here.
This is a flat id lookup, not a paginated range query: pass the exact sequenceIds you need, in any order, up to 500 per request. If you need to recover more than that, split them into multiple calls yourself — there is no server-side pagination or cursor for this endpoint.
Server-to-server only. Authenticated the same way as every other /partner/* endpoint — X-API-Key + X-API-Secret headers.
missingIds in the response is every id you asked for that wasn’t found. It deliberately does not distinguish “never existed” from “aged out of retention” — both just mean “not returned.” Retained history is 7 days by default (admin-configurable); a row is only ever deleted once it’s confirmed published downstream, so you will never lose an id that hasn’t actually been delivered somewhere — but a row that’s both published and past the retention window is gone for good.
curl --request GET \
--url https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay \
--header 'X-API-Key: <api-key>' \
--header 'X-API-Secret: <api-key>'import requests
url = "https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay"
headers = {
"X-API-Key": "<api-key>",
"X-API-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-API-Key': '<api-key>', 'X-API-Secret': '<api-key>'}
};
fetch('https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay', 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-uat.dimetrades.com/api/partner/market-lifecycle-events/replay",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>",
"X-API-Secret: <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-uat.dimetrades.com/api/partner/market-lifecycle-events/replay"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-API-Secret", "<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-uat.dimetrades.com/api/partner/market-lifecycle-events/replay")
.header("X-API-Key", "<api-key>")
.header("X-API-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-uat.dimetrades.com/api/partner/market-lifecycle-events/replay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
request["X-API-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"events": [
{
"sequenceId": 10450,
"eventType": "MARKET_CREATED",
"schemaVersion": 1,
"data": {
"marketId": "40996687",
"eventId": "1557438",
"title": "$2.800 or above",
"ticker": "NATGAS-28-4PM",
"status": "pending"
},
"occurredAt": 1753775990000
},
{
"sequenceId": 10451,
"eventType": "MARKET_STATUS_CHANGED",
"schemaVersion": 1,
"data": {
"marketId": "40996686",
"eventId": "1557438",
"fromStatus": "open",
"toStatus": "halted",
"reason": null
},
"occurredAt": 1753776000000
},
{
"sequenceId": 10453,
"eventType": "MARKET_STATUS_CHANGED",
"schemaVersion": 1,
"data": {
"marketId": "40996686",
"eventId": "1557438",
"fromStatus": "closed",
"toStatus": "settled",
"reason": "Settled YES by the resolution engine (automated)",
"result": "YES"
},
"occurredAt": 1753776300000
}
],
"requestedIds": [
10450,
10451,
10453
],
"missingIds": []
},
"errors": []
}Authorizations
ISV / partner credential — public half. Required on every request.
Identifies the integration partner (ISV) making the call. Issued by Dime
Trades when the ISV is onboarded and sent on every /partner/* endpoint:
X-API-Key: dt_pk_live_7f3c9a2e5b18
- On the two partner endpoints that create accounts or issue tokens (
POST /partner/customers,POST /partner/customers/login), it is accompanied byX-API-Secretand is the only authentication — there is no user token yet. - On every other partner endpoint it is sent alongside the user's
Authorization: Bearer <token>: the API key says which platform is calling, the bearer token says which user it is calling for.
Credentials are scoped to one or more brands; using a key with a brandId outside that scope returns 403. Staging and production keys are separate.
The key identifies your platform — treat it as a backend credential.
ISV / partner credential — secret half. Sent on every /partner/* endpoint.
The confidential counterpart to X-API-Key. It is required, together with the key, on every /partner/* endpoint: register, login, refresh-token, logout, kyc, wallet-instructions and the replay endpoints. Outside /partner/* — the ordinary user API, called with a user's bearer token — the key is sent without the secret.
X-API-Key: dt_pk_live_7f3c9a2e5b18
X-API-Secret: dt_sk_live_9d41ba07c6e2f85a3b7c1049de26f8b1
A request to a /partner/* endpoint that has a key without its matching secret is rejected with 401. The secret is shown once at issue time and stored only as a hash on our side — if it is lost or exposed, rotate the pair from the partner console rather than asking for a copy. Never ship it in a browser or mobile client: anyone holding it can mint a token for any of your users.
Query Parameters
Comma-separated sequenceIds to recover, e.g. 10450,10451,10453. Up to 500 per request.
