curl --request GET \
--url https://api.kraken.com/affiliate/v1/cpa-progress \
--header 'API-Key: <api-key>' \
--header 'API-Nonce: <api-key>' \
--header 'API-Sign: <api-key>'import requests
url = "https://api.kraken.com/affiliate/v1/cpa-progress"
headers = {
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'API-Key': '<api-key>', 'API-Sign': '<api-key>', 'API-Nonce': '<api-key>'}
};
fetch('https://api.kraken.com/affiliate/v1/cpa-progress', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kraken.com/affiliate/v1/cpa-progress"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"progress": {
"bounties": [
{
"bounty_position": 0,
"description": "Complete the first CPA requirements",
"reward_amount": "50.00",
"reward_asset": "USDC",
"status": "in_progress",
"progress_availability": "available",
"conditions": [
{
"label": "Margin trading volume",
"kind": "amount",
"state": "incomplete",
"measurement": {
"current": "20.00",
"target": "100.00",
"unit": "USD",
"percentage": "20"
}
},
{
"label": "Account verification",
"kind": "binary",
"state": "complete"
}
]
},
{
"bounty_position": 1,
"description": "Complete the second CPA requirements",
"reward_amount": "80.00",
"reward_asset": "USDC",
"status": "qualified_payment_pending",
"qualified_at": "2026-09-30T14:22:09Z",
"progress_availability": "available",
"conditions": [
{
"label": "Futures trading volume",
"kind": "amount",
"state": "complete",
"measurement": {
"current": "1000.00",
"target": "1000.00",
"unit": "USD",
"percentage": "100"
}
}
]
}
]
}
}Get CPA Progress
Return CPA qualification progress for one referred trader belonging to the authenticated affiliate.
Pass the full iiban returned by Get Daily Activity. The response lists
each CPA bounty separately with its reward, status, requirements, exact
measurable values, and completion percentage. A measurable requirement
can remain at 100 percent while an additional non-numeric step, such
as a hold period, is still incomplete.
Bounties that have qualified or paid remain visible. A bounty can also
report expired, no_longer_eligible, or not_tracked. When
progress_availability is unavailable, condition measurements may be
omitted.
Unknown IIBANs, referrals belonging to another affiliate, and traders
who opted out of activity sharing return 404.
Region-specific bounties that do not apply to the trader are omitted,
so bounties can be empty.
Successful responses are the object itself. Errors are a non-2xx
status with a typed error body, not a wrapped { "error", "result" }.
API Key Permissions Required: select the Query affiliate participants checkbox.
curl --request GET \
--url https://api.kraken.com/affiliate/v1/cpa-progress \
--header 'API-Key: <api-key>' \
--header 'API-Nonce: <api-key>' \
--header 'API-Sign: <api-key>'import requests
url = "https://api.kraken.com/affiliate/v1/cpa-progress"
headers = {
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'API-Key': '<api-key>', 'API-Sign': '<api-key>', 'API-Nonce': '<api-key>'}
};
fetch('https://api.kraken.com/affiliate/v1/cpa-progress', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kraken.com/affiliate/v1/cpa-progress"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"progress": {
"bounties": [
{
"bounty_position": 0,
"description": "Complete the first CPA requirements",
"reward_amount": "50.00",
"reward_asset": "USDC",
"status": "in_progress",
"progress_availability": "available",
"conditions": [
{
"label": "Margin trading volume",
"kind": "amount",
"state": "incomplete",
"measurement": {
"current": "20.00",
"target": "100.00",
"unit": "USD",
"percentage": "20"
}
},
{
"label": "Account verification",
"kind": "binary",
"state": "complete"
}
]
},
{
"bounty_position": 1,
"description": "Complete the second CPA requirements",
"reward_amount": "80.00",
"reward_asset": "USDC",
"status": "qualified_payment_pending",
"qualified_at": "2026-09-30T14:22:09Z",
"progress_availability": "available",
"conditions": [
{
"label": "Futures trading volume",
"kind": "amount",
"state": "complete",
"measurement": {
"current": "1000.00",
"target": "1000.00",
"unit": "USD",
"percentage": "100"
}
}
]
}
]
}
}Authorizations
Query Parameters
Was this page helpful?