curl --request GET \
--url https://app.sideshift.app/api/oauth/v1/payouts/contracts \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sideshift.app/api/oauth/v1/payouts/contracts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.sideshift.app/api/oauth/v1/payouts/contracts', 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://app.sideshift.app/api/oauth/v1/payouts/contracts",
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://app.sideshift.app/api/oauth/v1/payouts/contracts"
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://app.sideshift.app/api/oauth/v1/payouts/contracts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/payouts/contracts")
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{
"nextCursor": "eyJpZCI6ICJwcm9nX2FiYzEyMyJ9",
"hasMore": false,
"data": [
{
"id": "prog_abc123",
"amount": 625,
"currency": "USD",
"status": "active",
"createdAt": "2026-08-13T10:24:00.000Z",
"contractId": "prog_abc123",
"contractorId": "prog_abc123",
"description": "Example text.",
"contract": {},
"creator": {},
"calculationDetails": {},
"hasExistingTransfer": true
}
],
"programs": [
{
"id": "prog_abc123",
"name": "Spring TikTok Push",
"emoji": null
}
],
"creators": [
{
"id": "prog_abc123",
"name": "Spring TikTok Push"
}
]
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}List payout-table contracts
The payout-table contract list for the token tenant — each active contract with its owed-this-cycle math and campaign context. Requires the payouts:read scope.
curl --request GET \
--url https://app.sideshift.app/api/oauth/v1/payouts/contracts \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.sideshift.app/api/oauth/v1/payouts/contracts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.sideshift.app/api/oauth/v1/payouts/contracts', 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://app.sideshift.app/api/oauth/v1/payouts/contracts",
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://app.sideshift.app/api/oauth/v1/payouts/contracts"
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://app.sideshift.app/api/oauth/v1/payouts/contracts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/payouts/contracts")
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{
"nextCursor": "eyJpZCI6ICJwcm9nX2FiYzEyMyJ9",
"hasMore": false,
"data": [
{
"id": "prog_abc123",
"amount": 625,
"currency": "USD",
"status": "active",
"createdAt": "2026-08-13T10:24:00.000Z",
"contractId": "prog_abc123",
"contractorId": "prog_abc123",
"description": "Example text.",
"contract": {},
"creator": {},
"calculationDetails": {},
"hasExistingTransfer": true
}
],
"programs": [
{
"id": "prog_abc123",
"name": "Spring TikTok Push",
"emoji": null
}
],
"creators": [
{
"id": "prog_abc123",
"name": "Spring TikTok Push"
}
]
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Authorizations
OAuth 2.1 authorization code + PKCE (S256). Tokens are tenant-bound (company_id) and scoped. Discover endpoints via /.well-known/oauth-authorization-server.
Query Parameters
Page size (default 25, max 100). Messaging lists on SideShift's own messaging clamp values above 50 to 50.
1 <= x <= 100Opaque pagination cursor from a prior response's nextCursor.
Free-text match over contractor name, contract id, program, or campaign.
Filter to one or more campaign (program) ids. Repeat the query param for multiple values.
Filter to one or more creator ids. Repeat the query param for multiple values.
Response
The cursor-paginated payout-table contract list, plus the referenced programs and creators.
Show child attributes
Show child attributes
The set of programs referenced by the returned rows (for filter/display lookups).
Show child attributes
Show child attributes
The set of creators referenced by the returned rows (for filter/display lookups).
Show child attributes
Show child attributes