curl --request POST \
--url https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '{}'import requests
url = "https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking"
payload = {}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking', 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.recoupable.dev/api/catalogs/{catalogId}/stream-tracking",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"catalog_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "luminate",
"platform": "all_dsps",
"metric": "daily_streams",
"latest_run": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"catalog_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"revision": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduled_day": "2023-12-25",
"since": "2023-12-25",
"until": "2023-12-25",
"status": "queued",
"coverage": {},
"error": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z"
},
"territory": "worldwide",
"tracking": {
"catalog_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"owner_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"enabled": true,
"revision": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"updated_at": "2023-11-07T05:31:56Z"
},
"collection": {
"state": "started",
"run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_run_id": "<string>"
}
}Update Catalog Stream Tracking
Enable starts initial 62-day backfill and daily refresh at 09:00 UTC. Source window ends two UTC dates before the run date to allow reporting lag; source freshness is not guaranteed. New recordings join the next run. Maximum 250 recordings per catalog; larger catalogs fail before provider calls. Disable fences future writes and retains saved history. Refresh claims at most one run per UTC day and subscription revision; repeated enable is idempotent. If today was already claimed, collection.state=already_claimed_or_disabled and no duplicate provider work starts; failed claims can run again the next day. Failures are isolated by recording and exposed in coverage. Standard MCP manage_catalog_stream_tracking. Enabled tracking makes asynchronous provider calls. API-key/Privy bearer auth supported; identity overrides rejected. Requires API and database feature release. Unchanged daily values reuse their saved versions; new dates and corrections are appended, with fresh coverage/provenance receipts for every run.
curl --request POST \
--url https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '{}'import requests
url = "https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking"
payload = {}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking', 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.recoupable.dev/api/catalogs/{catalogId}/stream-tracking",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/catalogs/{catalogId}/stream-tracking")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"catalog_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "luminate",
"platform": "all_dsps",
"metric": "daily_streams",
"latest_run": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"catalog_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"revision": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"scheduled_day": "2023-12-25",
"since": "2023-12-25",
"until": "2023-12-25",
"status": "queued",
"coverage": {},
"error": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z"
},
"territory": "worldwide",
"tracking": {
"catalog_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"owner_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"enabled": true,
"revision": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"updated_at": "2023-11-07T05:31:56Z"
},
"collection": {
"state": "started",
"run_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_run_id": "<string>"
}
}Authorizations
Your Recoup API key. Learn more.
Path Parameters
Catalog owned by the authenticated account or an organization it currently belongs to.
Body
enable, disable, refresh Response
Tracking state and asynchronous collection receipt
luminate all_dsps daily_streams Run status, per-ISRC coverage, errors, window and completion timestamp.
Show child attributes
Show child attributes
worldwide Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?
