Référence
Les tableaux ci-dessous sont produits à partir des schémas que les routes appliquent réellement. Ils ne peuvent pas décrire autre chose que le comportement en vigueur.
GET /v1/programs
Le répertoire public, trié par score d’attractivité décroissant. Les mêmes lignes pour toutes les clés.
Returns published affiliate programmes, most attractive first. The directory is public data: every key sees the same rows. Results are cursor-paginated.
Paramètres
| Nom | Emplacement | Type | Requis | Description |
|---|---|---|---|---|
vertical | requête | saas | ecommerce | infoproduit | finance | sante | voyage | mode | maison | jeux | services | immobilier | autre | non | Restrict to one industry. |
model | requête | cps | cpa | cpl | recurring | hybrid | non | Restrict to one payout model. |
market | requête | string | non | ISO 3166-1 alpha-2 country code, case-insensitive. |
recurring | requête | true | false | non | Keep only programs whose commission repeats, or only those that do not. |
minScore | requête | integer (0–100) | non | Minimum attractiveness score. |
limit | requête | integer (1–100) · défaut 25 | non | Items per page, 1-100. |
cursor | requête | string | non | Opaque cursor returned as `page.nextCursor` by the previous call. |
Requête
curl -s 'https://getaff.org/api/v1/programs?vertical=saas&minScore=60&limit=2' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Réponse
{
"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"
}
}Champs de la réponse
| Nom | 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. |
Erreurs possibles
400401429503
GET /v1/programs/{slug}
Une fiche publiée, par son identifiant d’URL.
Returns a single published programme by slug. Unpublished and rejected submissions are not reachable through this endpoint.
Paramètres
| Nom | Emplacement | Type | Requis | Description |
|---|---|---|---|---|
slug | chemin | string | oui | Program slug, as returned by GET /v1/programs. |
Requête
curl -s 'https://getaff.org/api/v1/programs/northstack-northstack' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Réponse
{
"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"
}
}Champs de la réponse
| Nom | 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. |
Erreurs possibles
401404429
GET /v1/me
Le compte qui appelle : plan, capacités, plateformes connectées et plafond de débit. Aucun identifiant de plateforme n’est jamais renvoyé.
Plan, capabilities, connected networks and the rate limit that applies to this key. Network credentials are never exposed by any endpoint, under any parameter.
Paramètres
Aucun paramètre.
Requête
curl -s 'https://getaff.org/api/v1/me' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Réponse
{
"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
}
}
}Champs de la réponse
| Nom | 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 |
Erreurs possibles
401403429
GET /v1/commissions
Vos commissions, les plus récentes d’abord. Les montants ne sont ni convertis ni additionnés entre devises.
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.
Paramètres
| Nom | Emplacement | Type | Requis | Description |
|---|---|---|---|---|
network | requête | string | non | Restrict to one network. |
status | requête | pending | approved | declined | paid | unknown | non | Restrict to one normalised status. |
from | requête | string (^\d{4}-\d{2}-\d{2}$) | non | Inclusive lower bound on the transaction date, YYYY-MM-DD (UTC). |
to | requête | string (^\d{4}-\d{2}-\d{2}$) | non | Inclusive upper bound on the transaction date, YYYY-MM-DD (UTC). |
limit | requête | integer (1–100) · défaut 25 | non | Items per page, 1-100. |
cursor | requête | string | non | Opaque cursor returned as `page.nextCursor` by the previous call. |
Requête
curl -s 'https://getaff.org/api/v1/commissions?from=2026-07-01&status=approved&limit=2' \
-H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'Réponse
{
"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
}
}Champs de la réponse
| Nom | 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. |
Erreurs possibles
400401429503
Toutes les erreurs partagent la même forme. Branchez votre logique sur code, jamais sur message.