xuly.io
Developer

REST API reference

OAuth2 + API key auth. JSON everywhere. Rate-limited per key. OpenAPI spec on every endpoint.

Authentication

Pass Authorization: Bearer sk_… on every request. Create keys in Settings → API keys. Rate limit: 300 req/min per key.

Pagination & filtering

Cursor-based. Default page size 100, max 1000. Every list endpoint accepts ?limit, ?cursor, and field-level filters like ?brand=stake.

Sample request

Request
curl -sS "https://api.xuly.io/v1/stats/aggregate?from=2026-03-01&to=2026-04-01&group_by=brand,source" \
  -H "Authorization: Bearer ${AFFDASH_API_KEY}" \
  -H "Accept: application/json"
Response
{
  "period": { "from": "2026-03-01", "to": "2026-04-01" },
  "currency": "EUR",
  "rows": [
    {
      "brand": "LeoVegas",
      "source": "organic-blog",
      "clicks": 12040,
      "signups": 980,
      "ftd_count": 412,
      "ngr": 34210.50,
      "commission": 9578.94
    }
  ],
  "totals": { "clicks": 12040, "ngr": 34210.50, "commission": 9578.94 }
}

Endpoints

Full OpenAPI spec: openapi.yaml

  • GET/v1/statsstats:read
  • GET/v1/stats/aggregatestats:read
  • GET/v1/brandspublic
  • GET/v1/integrationsintegrations:read
  • POST/v1/integrationsintegrations:write
  • PATCH/v1/integrations/:idintegrations:write
  • POST/v1/integrations/:id/syncintegrations:write
  • GET/v1/sync-runsintegrations:read
  • GET/v1/campaignscampaigns:read
  • POST/v1/campaignscampaigns:write
  • GET/v1/sourcescampaigns:read
  • GET/v1/dealsdeals:read
  • GET/v1/sub-affiliatessub-affiliates:read
  • POST/v1/sub-affiliatessub-affiliates:write
  • GET/v1/invoicesinvoices:read
  • POST/v1/webhookswebhooks:manage
  • DELETE/v1/webhooks/:idwebhooks:manage
  • GET/v1/alertsstats:read
  • POST/v1/alerts/:id/acknowledgestats:read