Overview

API Reference

Base URL, authentication, request/response envelope, and available endpoints for the Affitor Tracking API.

View as Markdown

The Affitor Tracking API lets your backend record affiliate events — clicks, signups, sales, and refunds — and retrieve program performance data.


Base URL

https://api.affitor.com

All paths below are relative to this base. Strapi serves v1 routes under /api, so the full path for a tracking endpoint is:

https://api.affitor.com/api/v1/track/sale
Info

A machine-readable OpenAPI 3.1 spec is available for the tracking endpoints — import it into Postman, Insomnia, code generators, or an AI coding agent.


Authentication

Different endpoints use different auth modes.

EndpointAuth requiredHow to pass
POST /api/v1/track/clickNoneNo token needed
POST /api/v1/track/leadOptional (server mode)Authorization: Bearer <program_api_key>
POST /api/v1/track/saleRequiredAuthorization: Bearer <program_api_key>
POST /api/v1/track/refundRequiredAuthorization: Bearer <program_api_key>

Your program API key (api_token) is found in the Affitor dashboard under your program settings.

Server mode vs browser mode (lead endpoint)

POST /api/v1/track/lead supports two modes:

  • Browser mode: called by affitor-tracker.js from the customer's browser. No Bearer token. Attribution is proved by the click_id cookie value passed in the body.
  • Server mode: called from your backend. Include Authorization: Bearer <program_api_key>. Send the click_id with your customer_key: a first lead with only customer_key answers 400, because Affitor saves your key on the customer only when a lead settles.

Response envelope

All endpoints return JSON. A successful tracking call includes "success": true; the readiness endpoint returns its verdict object instead, with no success field. On an error, error is an object — never a plain string.

Success shape:

{
  "success": true
}

Sale and refund responses include additional IDs:

{
  "success": true,
  "sale_id": 42,
  "commission_id": 17,
  "message": "Sale tracked successfully"
}

Error shape:

{
  "data": null,
  "error": {
    "status": 400,
    "name": "BadRequestError",
    "message": "transaction_id is required and must be a string",
    "details": {}
  }
}

Read error.message, not error — interpolating the object prints [object Object]. The readiness endpoint uses a different envelope, and so does any endpoint refusing a key past its rotation deadline. Both shapes are laid out in the error reference.


Endpoint families

/api/v1/track/* — Tracking API (v1)

The primary integration surface. Writes to the v1 event tables (affiliate_click_events, affiliate_lead_events, affiliate_sale_events).

MethodPathPurpose
POST/api/v1/track/clickRecord an affiliate link click
POST/api/v1/track/leadRecord a customer signup
POST/api/v1/track/saleRecord a completed sale and create a commission
POST/api/v1/track/refundReverse the commission for a previously tracked sale

/api/tracking/* — Dashboard endpoints

There is no /api/tracking/ alias for click, lead, sale, or refund. The four /api/v1/track/* paths above are the only ones that accept tracking calls from your backend.

The /api/tracking/ paths that do exist back the Affitor dashboard, not a server-to-server integration. They authenticate with a signed-in dashboard session and require an active workspace membership on the program — taken from the path, or from program_id in the body on the two POST routes that have no path parameter. A Bearer program API key is not accepted on any of them:

MethodPathPurpose
GET/api/tracking/status/:programIdIntegration status for the program
GET/api/tracking/events/:programIdRecent click, lead, and sale events
GET/api/tracking/performance/:programIdAggregated performance metrics
GET/api/tracking/readiness/:programIdReadiness verdict for the program
POST/api/tracking/testCreate a test event from the dashboard verifier
POST/api/tracking/check-test-eventsCheck whether those test events landed
POST/api/tracking/run-verification/:programIdRun the synthetic click → lead → sale chain

To reach readiness from your own backend, call GET /api/v1/programs/me/readiness with your program API key instead — it derives the program from the key, so there is no program ID in the path.


Test mode

Pass "additional_data": { "test_mode": true } in any tracking request body to create a flagged test record without affecting real attribution, commission, or metric state. Test records are marked is_test: true in the database.


Endpoint pages

Share feedback

Tell us what is missing or unclear on “API Reference”.

Last updated Oct 17, 2026

On this page

Share feedback

Tell us what is missing or unclear on “API Reference”.