Reference
The tables below are produced from the schemas the routes actually enforce. They cannot describe anything other than current behaviour.
GET /v1/programs
The public directory, sorted by attractiveness score, highest first. The same rows for every key.
Returns published affiliate programmes, most attractive first. The directory is public data: every key sees the same rows. Results are cursor-paginated.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
vertical | query | saas | ecommerce | infoproduit | finance | sante | voyage | mode | maison | jeux | services | immobilier | autre | no | Restrict to one industry. |
model | query | cps | cpa | cpl | recurring | hybrid | no | Restrict to one payout model. |
market | query | string | no | ISO 3166-1 alpha-2 country code, case-insensitive. |
recurring | query | true | false | no | Keep only programs whose commission repeats, or only those that do not. |
minScore | query | integer (0–100) | no | Minimum attractiveness score. |
limit | query | integer (1–100) · default 25 | no | Items per page, 1-100. |
cursor | query | string | no | Opaque cursor returned as `page.nextCursor` by the previous call. |
Request
curl -s 'https://getaff.org/api/v1/programs?vertical=saas&minScore=60&limit=2' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Response
{
"data": [
{
"slug": "northstack-northstack",
"name": "NorthStack",
"host": "northstack.io",
"site": "https://northstack.io",
"pitch": "Managed Postgres for teams that ship on Fridays. Free tier, usage billing.",
"vertical": "saas",
"model": "recurring",
"commission": "25% recurring",
"recurring": true,
"cookieDays": 90,
"payout": "monthly",
"minPayout": 50,
"markets": [
"FR",
"BE",
"CH",
"DE"
],
"platform": "in-house",
"signupUrl": "https://northstack.io/partners",
"score": 78,
"image": "",
"createdAt": "2026-03-11T09:24:00.000Z"
}
],
"page": {
"limit": 2,
"hasMore": true,
"nextCursor": "Wzc4LCJ2SzlxIl0"
}
}Response fields
| Name | Type | Description |
|---|---|---|
data | Programme[] | |
data[].slug | string | Stable identifier used in the directory URL. |
data[].name | string | |
data[].host | string | Advertiser domain, without scheme. |
data[].site | string | Advertiser website. |
data[].pitch | string | One-paragraph description written by the advertiser. |
data[].vertical | saas | ecommerce | infoproduit | finance | sante | voyage | mode | maison | jeux | services | immobilier | autre | |
data[].model | cps | cpa | cpl | recurring | hybrid | Payout model. |
data[].commission | string | Commission as advertised, free text (e.g. "30%", "50 EUR"). |
data[].recurring | boolean | True when the commission repeats on renewals. |
data[].cookieDays | integer | Attribution window, in days. |
data[].payout | weekly | biweekly | monthly | net30 | net60 | Payment cadence. |
data[].minPayout | number | Minimum balance before payment, in the advertiser currency. |
data[].markets | string[] | ISO 3166-1 alpha-2 country codes. |
data[].platform | string | Affiliate platform hosting the program. Empty when in-house. |
data[].signupUrl | string | Where an affiliate applies. |
data[].score | integer | GetAff attractiveness score, 0-100. See /docs for how it is computed. |
data[].image | string | Illustration URL. Empty when none is available. |
data[].createdAt | string | ISO 8601 timestamp of publication. |
page | PageInfo | |
page.limit | integer | Number of items requested for this page. |
page.hasMore | boolean | True when a further page exists. |
page.nextCursor | string | null | Opaque cursor. Pass it back as `cursor` to fetch the next page. Do not parse it. |
Possible errors
400401429503
GET /v1/programs/{slug}
One published programme, by its URL identifier.
Returns a single published programme by slug. Unpublished and rejected submissions are not reachable through this endpoint.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
slug | path | string | yes | Program slug, as returned by GET /v1/programs. |
Request
curl -s 'https://getaff.org/api/v1/programs/northstack-northstack' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Response
{
"data": {
"slug": "northstack-northstack",
"name": "NorthStack",
"host": "northstack.io",
"site": "https://northstack.io",
"pitch": "Managed Postgres for teams that ship on Fridays. Free tier, usage billing.",
"vertical": "saas",
"model": "recurring",
"commission": "25% recurring",
"recurring": true,
"cookieDays": 90,
"payout": "monthly",
"minPayout": 50,
"markets": [
"FR",
"BE",
"CH",
"DE"
],
"platform": "in-house",
"signupUrl": "https://northstack.io/partners",
"score": 78,
"image": "",
"createdAt": "2026-03-11T09:24:00.000Z"
}
}Response fields
| Name | Type | Description |
|---|---|---|
data | Programme | |
data.slug | string | Stable identifier used in the directory URL. |
data.name | string | |
data.host | string | Advertiser domain, without scheme. |
data.site | string | Advertiser website. |
data.pitch | string | One-paragraph description written by the advertiser. |
data.vertical | saas | ecommerce | infoproduit | finance | sante | voyage | mode | maison | jeux | services | immobilier | autre | |
data.model | cps | cpa | cpl | recurring | hybrid | Payout model. |
data.commission | string | Commission as advertised, free text (e.g. "30%", "50 EUR"). |
data.recurring | boolean | True when the commission repeats on renewals. |
data.cookieDays | integer | Attribution window, in days. |
data.payout | weekly | biweekly | monthly | net30 | net60 | Payment cadence. |
data.minPayout | number | Minimum balance before payment, in the advertiser currency. |
data.markets | string[] | ISO 3166-1 alpha-2 country codes. |
data.platform | string | Affiliate platform hosting the program. Empty when in-house. |
data.signupUrl | string | Where an affiliate applies. |
data.score | integer | GetAff attractiveness score, 0-100. See /docs for how it is computed. |
data.image | string | Illustration URL. Empty when none is available. |
data.createdAt | string | ISO 8601 timestamp of publication. |
Possible errors
401404429
GET /v1/me
The calling account: plan, capabilities, connected networks and rate ceiling. No network credential is ever returned.
Plan, capabilities, connected networks and the rate limit that applies to this key. Network credentials are never exposed by any endpoint, under any parameter.
Parameters
No parameters.
Request
curl -s 'https://getaff.org/api/v1/me' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Response
{
"data": {
"uid": "kJ2p8wQxYb",
"email": "[email protected]",
"plan": "pro",
"capabilities": {
"acquisition": {
"enabled": true,
"configured": true,
"enabledAt": "2026-02-04T08:11:00.000Z"
},
"monetisation": {
"enabled": true,
"configured": true,
"enabledAt": "2026-02-04T08:40:00.000Z"
}
},
"networks": [
{
"network": "awin",
"status": "ok",
"connectedAt": "2026-02-04T08:40:00.000Z",
"lastSyncAt": "2026-07-25T03:12:00.000Z",
"accounts": 1,
"programs": 34,
"transactions": 1209
}
],
"key": {
"prefix": "gaff_live_9fA2xQ1p",
"label": "Reporting cron",
"scopes": [
"read"
]
},
"rateLimit": {
"limit": 600,
"windowSeconds": 60
}
}
}Response fields
| Name | Type | Description |
|---|---|---|
data | Account | |
data.uid | string | Stable account identifier. |
data.email | string | null | |
data.plan | free | pro | |
data.capabilities | object | Acquisition and monetisation are independent and can both be active. |
data.capabilities.acquisition | CapabilityState | |
data.capabilities.monetisation | CapabilityState | |
data.networks | ConnectedNetwork[] | Connected affiliate networks. Never credentials. |
data.networks[].network | string | Network identifier, e.g. "awin", "impact". |
data.networks[].status | never | ok | partial | auth_failed | error | Outcome of the last synchronisation. |
data.networks[].connectedAt | string | null | |
data.networks[].lastSyncAt | string | null | |
data.networks[].accounts | integer | How many accounts this connection exposes. |
data.networks[].programs | integer | |
data.networks[].transactions | integer | |
data.key | object | The key that authenticated this call. Never the key itself. |
data.key.prefix | string | |
data.key.label | string | |
data.key.scopes | read[] | |
data.rateLimit | object | |
data.rateLimit.limit | integer | Requests allowed per window, for this plan. |
data.rateLimit.windowSeconds | integer |
Possible errors
401403429
GET /v1/commissions
Your commissions, most recent first. Amounts are never converted or summed across currencies.
Commissions collected from the networks connected to the calling account, most recent first. Amounts are reported in the currency the network used and are never converted or summed across currencies.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
network | query | string | no | Restrict to one network. |
status | query | pending | approved | declined | paid | unknown | no | Restrict to one normalised status. |
from | query | string (^\d{4}-\d{2}-\d{2}$) | no | Inclusive lower bound on the transaction date, YYYY-MM-DD (UTC). |
to | query | string (^\d{4}-\d{2}-\d{2}$) | no | Inclusive upper bound on the transaction date, YYYY-MM-DD (UTC). |
limit | query | integer (1–100) · default 25 | no | Items per page, 1-100. |
cursor | query | string | no | Opaque cursor returned as `page.nextCursor` by the previous call. |
Request
curl -s 'https://getaff.org/api/v1/commissions?from=2026-07-01&status=approved&limit=2' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Response
{
"data": [
{
"id": "uid123_awin_884120933",
"network": "awin",
"externalId": "884120933",
"programName": "NorthStack",
"programExternalId": "20114",
"status": "approved",
"rawStatus": "confirmed",
"saleAmount": 240,
"commissionAmount": 60,
"currency": "EUR",
"clickedAt": "2026-06-30T18:02:11.000Z",
"transactedAt": "2026-07-01T10:15:04.000Z",
"subId": "newsletter-42"
}
],
"page": {
"limit": 2,
"hasMore": false,
"nextCursor": null
}
}Response fields
| Name | Type | Description |
|---|---|---|
data | Commission[] | |
data[].id | string | Stable identifier within GetAff. |
data[].network | string | |
data[].externalId | string | Identifier used by the network itself. |
data[].programName | string | null | |
data[].programExternalId | string | null | |
data[].status | pending | approved | declined | paid | unknown | Normalised status. `rawStatus` keeps the network wording. |
data[].rawStatus | string | null | |
data[].saleAmount | number | null | Order value, when the network reports it. |
data[].commissionAmount | number | Amount owed to the publisher. |
data[].currency | string | ISO 4217. Never converted: amounts are never summed across currencies. |
data[].clickedAt | string | null | |
data[].transactedAt | string | ISO 8601 timestamp of the transaction. |
data[].subId | string | null | Publisher sub-identifier, when one was passed. |
page | PageInfo | |
page.limit | integer | Number of items requested for this page. |
page.hasMore | boolean | True when a further page exists. |
page.nextCursor | string | null | Opaque cursor. Pass it back as `cursor` to fetch the next page. Do not parse it. |
Possible errors
400401429503