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
The "API-Key" header should contain your API key.
Authenticated requests should be signed with the "API-Sign" header, using a signature generated with your private key, nonce, encoded payload, and URI path.
The "API-Nonce" header should contain an always-increasing 64-bit integer, most commonly a Unix timestamp in milliseconds. Each request must use a nonce greater than the nonce of the previous request signed with the same API key.
Query Parameters
Full Kraken account identifier returned by Get Daily Activity. Spaced and compact forms are accepted.
14Response
CPA progress for the requested referred trader.
CPA qualification progress for one referred trader.
CPA qualification progress for one referral relationship.
Show child attributes
Show child attributes
Was this page helpful?