API Documentation

Base URL: https://endorso.com/api/v1

All responses are JSON. Authentication via Authorization: Bearer <api_key> or x-api-key header.

POST/api/v1/partners/registerPublic (rate limited: 3/hr)

Register a new partner. Returns an API key. Email verification required before the key works.

Request
curl -X POST https://endorso.com/api/v1/partners/register \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-fitness-bot",
    "email": "dev@example.com",
    "app_url": "https://mybot.app",
    "description": "AI fitness coach that recommends gear"
  }'
Response
{
  "partner": {
    "id": 42,
    "name": "my-fitness-bot",
    "slug": "my-fitness-bot",
    "tag": "my-fitness-bot",
    "tier": "free",
    "status": "pending_verification"
  },
  "api_key": "na_8f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e",
  "message": "Partner registered. Check your email to verify..."
}
GET/api/v1/partners/verifyPublic

Verify partner email. Called via the link in the verification email. Activates the API key.

Request
# Clicked from email — opens in browser
https://endorso.com/api/v1/partners/verify?token=abc123...
GET/api/v1/partners/meAPI Key

Get stats and profile for the authenticated partner.

Request
curl https://endorso.com/api/v1/partners/me \
  -H "Authorization: Bearer na_8f2a..."
GET/api/v1/programsPublic (rate limited: 50/min)

Search the program catalog. Filter by domain, keyword, category, region, traffic type permissions.

Request
# Search by keyword
curl "https://endorso.com/api/v1/programs?q=fitness&limit=5"

# Filter by domain
curl "https://endorso.com/api/v1/programs?domain=nike.com"

# Filter by network + region
curl "https://endorso.com/api/v1/programs?network=awin&region=US"
GET/api/v1/networksPublic (rate limited: 50/min)

List available affiliate networks. Filter by status, search by name, filter API-enabled only.

Request
# All networks
curl "https://endorso.com/api/v1/networks"

# API-enabled only
curl "https://endorso.com/api/v1/networks?api_only=true"

# Search
curl "https://endorso.com/api/v1/networks?q=impact"

Rate Limits

EndpointLimitWindow
POST /partners/register3 requestsper hour
POST /links/match30 requestsper minute
GET /programs50 requestsper minute
GET /networks50 requestsper minute

Rate limit headers: X-RateLimit-Remaining, Retry-After (on 429).

Error Codes

CodeMeaning
400Bad request — missing required fields
401Unauthorized — missing or invalid API key
409Conflict — partner name/email already exists
429Rate limited — check Retry-After header
503Service unavailable — admin access not configured