curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades \
--header 'X-Api-Key: <api-key>'import requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades"
headers = {"X-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades', 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://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades",
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>"
],
]);
$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://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<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://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"trades": [
{
"tradeId": "<string>",
"status": "matched",
"marketSymbol": "<string>",
"marketTitle": "<string>",
"eventId": "<string>",
"eventTitle": "<string>",
"categoryTags": [
"<string>"
],
"matchedAt": "<string>",
"settledAt": "<string>",
"txHash": "<string>",
"price": "<string>",
"quantity": "<string>",
"takerFee": {
"amount": "<string>",
"currency": "USDC",
"tokenId": "<string>"
},
"makerFee": {
"amount": "<string>",
"currency": "USDC",
"tokenId": "<string>"
},
"taker": {
"side": "BUY",
"walletAddress": "<string>",
"vaultAddress": "<string>",
"orderId": "<string>",
"orderType": "LIMIT",
"orderTimeInForce": "<string>",
"orderPlacedAt": "<string>",
"orderOriginalQty": "<string>",
"orderRemainingQty": "<string>"
},
"maker": {
"side": "BUY",
"walletAddress": "<string>",
"vaultAddress": "<string>",
"orderId": "<string>",
"orderType": "LIMIT",
"orderTimeInForce": "<string>",
"orderPlacedAt": "<string>",
"orderOriginalQty": "<string>",
"orderRemainingQty": "<string>"
}
}
],
"nextCursor": "<string>"
}Cross-wallet executed-trade feed (incremental, cursor-paginated)
Returns trades whose modifiedAt (GREATEST(createdAt, settledAt)) falls in [modifiedSince, ∞), ordered ascending. Pass nextCursor back as ?cursor= to fetch the next page; iterate until the response returns nextCursor: null. A trade may surface twice (matched, then settled) — upsert by tradeId on your side. Statuses included: matched, settlement_pending, settled, settlement_failed. Both legs are charged: takerFee and makerFee each carry that leg’s own fee, so the fee take for a fill is takerFee + makerFee — do not read takerFee as the trade total. A leg’s fee is in USDC when that leg SELLs and in OUTCOME_TOKENS when it BUYs, so the two legs of one fill are often in different currencies — do NOT collapse currencies before reconciling.
curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades \
--header 'X-Api-Key: <api-key>'import requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades"
headers = {"X-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades', 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://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades",
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>"
],
]);
$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://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<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://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades")
.header("X-Api-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/v1/partner/trades")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Api-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"trades": [
{
"tradeId": "<string>",
"status": "matched",
"marketSymbol": "<string>",
"marketTitle": "<string>",
"eventId": "<string>",
"eventTitle": "<string>",
"categoryTags": [
"<string>"
],
"matchedAt": "<string>",
"settledAt": "<string>",
"txHash": "<string>",
"price": "<string>",
"quantity": "<string>",
"takerFee": {
"amount": "<string>",
"currency": "USDC",
"tokenId": "<string>"
},
"makerFee": {
"amount": "<string>",
"currency": "USDC",
"tokenId": "<string>"
},
"taker": {
"side": "BUY",
"walletAddress": "<string>",
"vaultAddress": "<string>",
"orderId": "<string>",
"orderType": "LIMIT",
"orderTimeInForce": "<string>",
"orderPlacedAt": "<string>",
"orderOriginalQty": "<string>",
"orderRemainingQty": "<string>"
},
"maker": {
"side": "BUY",
"walletAddress": "<string>",
"vaultAddress": "<string>",
"orderId": "<string>",
"orderType": "LIMIT",
"orderTimeInForce": "<string>",
"orderPlacedAt": "<string>",
"orderOriginalQty": "<string>",
"orderRemainingQty": "<string>"
}
}
],
"nextCursor": "<string>"
}Authorizations
Partner / integrator key — format ps_live_<keyId>_<secret>. Partner keys are issued by PredictStreet; a user can also create keys bound to their own wallet from their account settings in the web app. Never ship to a browser. multi_wallet partners must additionally send X-User-Wallet: 0x<40-hex> on every authenticated request to declare the acting wallet. See the API keys guide for scope taxonomy, partner kinds, rate limits, and rotation procedure.
Query Parameters
ISO-8601 timestamp. Returns trades whose effective modification time (GREATEST of createdAt, settledAt) is at or after this value. Required — the partner feed is incremental-only by design to keep pagination keyset-deterministic.
"2026-05-01T00:00:00Z"
Opaque cursor returned in nextCursor from the previous page. Pass back unchanged. When omitted the page starts at the front of the modifiedSince window.
Page size. Defaults to 50, capped at 300. The partner-tier rate limit (default 600/min) is the real ceiling — small pages with many calls is gentler on the DB than rare giant pages, and the cursor model means a partner who hits nextCursor !== null just fetches the next batch on the next call without losing rows.
1 <= x <= 300Optional market-symbol filter (e.g. WC26-FINAL-ARG-BRA-…). When present, only trades from that one market are returned.