Skip to content

Referrals API

The referrals API lets you create referral codes, track conversion milestones, and manage rewards programmatically. All endpoints require a valid API key (publishable or secret).

Generate a referral code for a user. If the user already has a pending referral, the existing code is returned instead of creating a new one.

POST /v1/api/referral/create

Request body:

{
"user_id": "user_123",
"user_name": "Jane Doe",
"metadata": { "source": "dashboard" },
"ip": "203.0.113.42",
"device_id": "device_abc123"
}
FieldRequiredDescription
user_idYesYour internal user ID for the referrer
user_nameNoDisplay name (shown in the leaderboard)
metadataNoArbitrary JSON for your own use
ipNoReferrer’s IP address for fraud detection. Falls back to server-observed IP if omitted.
device_idNoReferrer’s device identifier for fraud detection (e.g. IDFA, GAID, or a fingerprint).

Response 200:

{
"referral_code": "ABC123",
"referral_url": "https://myapp.tolinku.com/ref/ABC123",
"referral_id": "doc_id"
}

referral_url is null if no domains are configured on the Appspace.

Errors:

StatusError
400user_id is required
400Maximum referrals per user reached
403Referrals are not enabled for this Appspace

Webhook: Dispatches referral.created with { referral_code, referrer_id, referral_url }.


Get the current status of a referral by its code.

GET /v1/api/referral/:code

URL parameters: :code is the referral code (e.g. ABC123).

Response 200:

{
"referrer_id": "user_123",
"status": "pending",
"milestone": "signed_up",
"milestone_history": [
{ "milestone": "installed", "timestamp": "2026-01-10T08:00:00Z" },
{ "milestone": "signed_up", "timestamp": "2026-01-11T09:00:00Z" }
],
"reward_type": "discount",
"reward_value": "20",
"reward_claimed": false,
"referee_reward_type": "credit",
"referee_reward_value": "10",
"referee_reward_claimed": false,
"created_at": "2026-01-09T12:00:00Z"
}

Errors:

StatusError
404Referral not found

Update the milestone on a pending referral without marking it complete. Useful for multi-step funnels (e.g. installed, then signed_up, then purchased).

POST /v1/api/referral/milestone

Request body:

{
"referral_code": "ABC123",
"milestone": "signed_up"
}
FieldRequiredDescription
referral_codeYesThe referral code
milestoneYesThe new milestone name

Response 200:

{
"referral": {
"id": "doc_id",
"referral_code": "ABC123",
"milestone": "signed_up",
"status": "pending",
"reward_type": "discount",
"reward_value": "20"
}
}

If the milestone update triggers auto-completion (based on your Appspace’s referral settings), the status will be "completed" and the referral.completed webhook fires.

Errors:

StatusError
400referral_code is required
400milestone is required
404Referral not found, expired, or invalid milestone

Mark a referral as completed. Call this when the referred user has taken the required action.

POST /v1/api/referral/complete

Request body:

{
"referral_code": "ABC123",
"referred_user_id": "user_456",
"referred_user_name": "John Doe",
"milestone": "completed",
"ip": "198.51.100.7",
"device_id": "device_xyz789"
}
FieldRequiredDescription
referral_codeYesThe referral code
referred_user_idYesYour internal user ID for the referred person
referred_user_nameNoDisplay name
milestoneNoDefaults to "completed"
ipNoReferred user’s IP address for fraud detection. Falls back to server-observed IP if omitted.
device_idNoReferred user’s device identifier for fraud detection.

Response 200:

{
"referral": {
"id": "doc_id",
"referrer_id": "user_123",
"referred_user_id": "user_456",
"status": "completed",
"milestone": "completed",
"completed_at": "2026-01-15T10:30:00Z",
"reward_type": "discount",
"reward_value": "20",
"referee_reward_type": "credit",
"referee_reward_value": "10"
}
}

Errors:

StatusError
400referral_code is required
400referred_user_id is required
404Referral not found
404Referral not found or already completed
409Referral flagged for abuse (includes reason field)

Abuse reasons: self_referral, already_referred, reverse_referral, same_ip, same_device. See Preventing abuse for details.

Webhook: Dispatches referral.completed with { referral_code, referrer_id, referred_user_id, milestone }.


Mark the reward as claimed for a completed referral.

POST /v1/api/referral/claim-reward

Request body:

{
"referral_code": "ABC123"
}

Response 200:

{
"success": true,
"referral_code": "ABC123",
"reward_claimed": true
}

Errors:

StatusError
400referral_code is required
404Referral not found or not completed

Mark the referee reward as claimed for a completed referral. Use this when the referred user redeems their reward.

POST /v1/api/referral/claim-referee-reward

Request body:

{
"referral_code": "ABC123"
}

Response 200:

{
"success": true,
"referral_code": "ABC123",
"referee_reward_claimed": true
}

Errors:

StatusError
400referral_code is required
404Referral not found or not completed

Get all referrals created by a specific user, with optional status filtering.

GET /v1/api/referral/by-user/:userId

URL parameters: :userId is the referrer’s user ID.

Query parameters:

ParamDefaultMaxDescription
limit50200Number of referrals to return
status(all)Filter by status: pending, completed, or expired

Response 200:

{
"referrals": [
{
"referral_code": "ABC123",
"referred_user_id": "user_456",
"referred_user_name": "John Doe",
"status": "completed",
"milestone": "first_purchase",
"milestone_history": [
{ "milestone": "pending", "timestamp": "2026-01-09T12:00:00Z" },
{ "milestone": "signed_up", "timestamp": "2026-01-11T09:00:00Z" },
{ "milestone": "first_purchase", "timestamp": "2026-01-15T10:30:00Z" }
],
"reward_type": "credit",
"reward_value": "10",
"reward_claimed": true,
"created_at": "2026-01-09T12:00:00Z",
"completed_at": "2026-01-15T10:30:00Z"
},
{
"referral_code": "DEF456",
"referred_user_id": null,
"referred_user_name": null,
"status": "pending",
"milestone": "pending",
"milestone_history": [
{ "milestone": "pending", "timestamp": "2026-02-01T08:00:00Z" }
],
"reward_type": null,
"reward_value": null,
"reward_claimed": false,
"created_at": "2026-02-01T08:00:00Z",
"completed_at": null
}
],
"total": 2
}

Errors:

StatusError
400userId is required

Get the top referrers ranked by completed referral count.

GET /v1/api/referral/leaderboard

Query parameters:

ParamDefaultMaxDescription
limit25100Number of entries to return

Response 200:

{
"leaderboard": [
{
"referrer_id": "user_123",
"referrer_name": "Jane Doe",
"total": 18,
"completed": 15,
"pending": 3,
"total_reward_value": "75"
},
{
"referrer_id": "user_456",
"referrer_name": "John Smith",
"total": 14,
"completed": 12,
"pending": 2,
"total_reward_value": "60"
}
]
}