GetAff
Sign inList my program
API documentation

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

Parameters/v1/programs
NameInTypeRequiredDescription
verticalquerysaas | ecommerce | infoproduit | finance | sante | voyage | mode | maison | jeux | services | immobilier | autrenoRestrict to one industry.
modelquerycps | cpa | cpl | recurring | hybridnoRestrict to one payout model.
marketquerystringnoISO 3166-1 alpha-2 country code, case-insensitive.
recurringquerytrue | falsenoKeep only programs whose commission repeats, or only those that do not.
minScorequeryinteger (0–100)noMinimum attractiveness score.
limitqueryinteger (1–100) · default 25noItems per page, 1-100.
cursorquerystringnoOpaque cursor returned as `page.nextCursor` by the previous call.

Request

curl
curl -s 'https://getaff.org/api/v1/programs?vertical=saas&minScore=60&limit=2' \
  -H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Response

200 OK
{
  "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

Response fields/v1/programs
NameTypeDescription
dataProgramme[]
data[].slugstringStable identifier used in the directory URL.
data[].namestring
data[].hoststringAdvertiser domain, without scheme.
data[].sitestringAdvertiser website.
data[].pitchstringOne-paragraph description written by the advertiser.
data[].verticalsaas | ecommerce | infoproduit | finance | sante | voyage | mode | maison | jeux | services | immobilier | autre
data[].modelcps | cpa | cpl | recurring | hybridPayout model.
data[].commissionstringCommission as advertised, free text (e.g. "30%", "50 EUR").
data[].recurringbooleanTrue when the commission repeats on renewals.
data[].cookieDaysintegerAttribution window, in days.
data[].payoutweekly | biweekly | monthly | net30 | net60Payment cadence.
data[].minPayoutnumberMinimum balance before payment, in the advertiser currency.
data[].marketsstring[]ISO 3166-1 alpha-2 country codes.
data[].platformstringAffiliate platform hosting the program. Empty when in-house.
data[].signupUrlstringWhere an affiliate applies.
data[].scoreintegerGetAff attractiveness score, 0-100. See /docs for how it is computed.
data[].imagestringIllustration URL. Empty when none is available.
data[].createdAtstringISO 8601 timestamp of publication.
pagePageInfo
page.limitintegerNumber of items requested for this page.
page.hasMorebooleanTrue when a further page exists.
page.nextCursorstring | nullOpaque 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

Parameters/v1/programs/{slug}
NameInTypeRequiredDescription
slugpathstringyesProgram slug, as returned by GET /v1/programs.

Request

curl
curl -s 'https://getaff.org/api/v1/programs/northstack-northstack' \
  -H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Response

200 OK
{
  "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

Response fields/v1/programs/{slug}
NameTypeDescription
dataProgramme
data.slugstringStable identifier used in the directory URL.
data.namestring
data.hoststringAdvertiser domain, without scheme.
data.sitestringAdvertiser website.
data.pitchstringOne-paragraph description written by the advertiser.
data.verticalsaas | ecommerce | infoproduit | finance | sante | voyage | mode | maison | jeux | services | immobilier | autre
data.modelcps | cpa | cpl | recurring | hybridPayout model.
data.commissionstringCommission as advertised, free text (e.g. "30%", "50 EUR").
data.recurringbooleanTrue when the commission repeats on renewals.
data.cookieDaysintegerAttribution window, in days.
data.payoutweekly | biweekly | monthly | net30 | net60Payment cadence.
data.minPayoutnumberMinimum balance before payment, in the advertiser currency.
data.marketsstring[]ISO 3166-1 alpha-2 country codes.
data.platformstringAffiliate platform hosting the program. Empty when in-house.
data.signupUrlstringWhere an affiliate applies.
data.scoreintegerGetAff attractiveness score, 0-100. See /docs for how it is computed.
data.imagestringIllustration URL. Empty when none is available.
data.createdAtstringISO 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
curl -s 'https://getaff.org/api/v1/me' \
  -H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Response

200 OK
{
  "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

Response fields/v1/me
NameTypeDescription
dataAccount
data.uidstringStable account identifier.
data.emailstring | null
data.planfree | pro
data.capabilitiesobjectAcquisition and monetisation are independent and can both be active.
data.capabilities.acquisitionCapabilityState
data.capabilities.monetisationCapabilityState
data.networksConnectedNetwork[]Connected affiliate networks. Never credentials.
data.networks[].networkstringNetwork identifier, e.g. "awin", "impact".
data.networks[].statusnever | ok | partial | auth_failed | errorOutcome of the last synchronisation.
data.networks[].connectedAtstring | null
data.networks[].lastSyncAtstring | null
data.networks[].accountsintegerHow many accounts this connection exposes.
data.networks[].programsinteger
data.networks[].transactionsinteger
data.keyobjectThe key that authenticated this call. Never the key itself.
data.key.prefixstring
data.key.labelstring
data.key.scopesread[]
data.rateLimitobject
data.rateLimit.limitintegerRequests allowed per window, for this plan.
data.rateLimit.windowSecondsinteger

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

Parameters/v1/commissions
NameInTypeRequiredDescription
networkquerystringnoRestrict to one network.
statusquerypending | approved | declined | paid | unknownnoRestrict to one normalised status.
fromquerystring (^\d{4}-\d{2}-\d{2}$)noInclusive lower bound on the transaction date, YYYY-MM-DD (UTC).
toquerystring (^\d{4}-\d{2}-\d{2}$)noInclusive upper bound on the transaction date, YYYY-MM-DD (UTC).
limitqueryinteger (1–100) · default 25noItems per page, 1-100.
cursorquerystringnoOpaque cursor returned as `page.nextCursor` by the previous call.

Request

curl
curl -s 'https://getaff.org/api/v1/commissions?from=2026-07-01&status=approved&limit=2' \
  -H 'Authorization: Bearer gaff_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

Response

200 OK
{
  "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

Response fields/v1/commissions
NameTypeDescription
dataCommission[]
data[].idstringStable identifier within GetAff.
data[].networkstring
data[].externalIdstringIdentifier used by the network itself.
data[].programNamestring | null
data[].programExternalIdstring | null
data[].statuspending | approved | declined | paid | unknownNormalised status. `rawStatus` keeps the network wording.
data[].rawStatusstring | null
data[].saleAmountnumber | nullOrder value, when the network reports it.
data[].commissionAmountnumberAmount owed to the publisher.
data[].currencystringISO 4217. Never converted: amounts are never summed across currencies.
data[].clickedAtstring | null
data[].transactedAtstringISO 8601 timestamp of the transaction.
data[].subIdstring | nullPublisher sub-identifier, when one was passed.
pagePageInfo
page.limitintegerNumber of items requested for this page.
page.hasMorebooleanTrue when a further page exists.
page.nextCursorstring | nullOpaque cursor. Pass it back as `cursor` to fetch the next page. Do not parse it.

Possible errors

400401429503

Errors

All errors share the same shape. Branch your logic on code, never on message.

Errors
Open the OpenAPI specification
API — endpoint reference — GetAff