Complete REST API documentation. All endpoints use JSON and require Bearer token authentication.
/api/v1/campaigns
List Campaigns
Returns all campaigns for the authenticated merchant, with pagination.
Parameters
| page | number | Page number (default: 1) |
| limit | number | Results per page (default: 25, max: 100) |
Example
curl https://linkjolt.io/api/v1/campaigns \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": [
{
"id": "PAbeJtXF39gDMUPYGZqZX",
"name": "Pro Campaign",
"trackingCode": "7PtIfIqd",
"status": "active",
"commissionType": "percentage",
"commissionValue": "20",
"conversions": 47,
"revenue": "12350.00",
"createdAt": "2026-01-15T10:30:00Z"
}
],
"pagination": { "page": 1, "limit": 25, "total": 3, "totalPages": 1 }
}/api/v1/campaigns
Create Campaign
Create a campaign programmatically. It is created on your API key's brand with an auto-generated tracking code and returned in the same shape as Get Campaign. Requires the Ultimate or Scale plan. Live keys only (campaigns are live objects, so test keys are rejected).
Parameters
| name* | string | Campaign name (min 2 characters) |
| commissionType* | string | "percentage" or "fixed" |
| commissionValue* | number | Commission rate (percent) or fixed amount |
| status | string | "active" (default), "inactive", or "expired" |
| description | string | Campaign description |
| targetUrl | string | Destination URL affiliates link to |
| autoApproveAffiliates | boolean | Auto-approve affiliates who join (default false) |
| isPublic | boolean | List in the Discovery marketplace (default true) |
| enableRecurringCommissions | boolean | Pay commission on renewals (Ultimate/Scale) |
Example
curl https://linkjolt.io/api/v1/campaigns \
-X POST \
-H "Authorization: Bearer lj_pk_live_your_key" \
-H "Content-Type: application/json" \
-d '{"name":"API Campaign","commissionType":"percentage","commissionValue":20}'Response
{
"data": {
"id": "PAbeJtXF39gDMUPYGZqZX",
"name": "API Campaign",
"trackingCode": "7PtIfIqd",
"status": "active",
"commissionType": "percentage",
"commissionValue": "20",
"conversions": 0,
"revenue": null,
"createdAt": "2026-07-12T10:30:00Z",
"affiliateCount": 0
}
}/api/v1/conversions
List Conversions
Returns conversions with optional filters for status, campaign, affiliate, and date range.
Parameters
| status | string | Filter: pending, approved, paid, rejected |
| campaignId | string | Filter by campaign ID |
| affiliateId | string | Filter by affiliate ID |
| from | date | Start date (ISO 8601) |
| to | date | End date (ISO 8601) |
| page | number | Page number |
| limit | number | Results per page |
Example
curl "https://linkjolt.io/api/v1/conversions?status=pending&from=2026-04-01" \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": [
{
"id": "stripe_7PtIfIqd_1234567890",
"campaignId": "PAbeJtXF39gDMUPYGZqZX",
"affiliateId": "lRCbRMSvBcGg4HszLCXLr",
"amount": "100.00",
"taxAmount": null,
"commission": "20.00",
"currency": "usd",
"status": "pending",
"conversionType": "one_time",
"createdAt": "2026-04-12T06:58:07Z"
}
],
"pagination": { "page": 1, "limit": 25, "total": 47, "totalPages": 2 }
}/api/v1/conversions
Create Conversion
Manually create a conversion record. Commission is calculated automatically based on campaign settings (including tiered commissions if enabled).
Parameters
| campaignId* | string | Campaign ID |
| affiliateId* | string | Affiliate ID |
| amount* | number | Sale amount in dollars |
| orderId | string | Unique order ID for deduplication |
| clickId | string | LinkJolt click ID (enables fraud detection) |
| customerEmail | string | Customer email (enables the self-referral fraud check; shown on the commissions page) |
| customerName | string | Customer name (shown on the commissions page) |
Example
curl -X POST https://linkjolt.io/api/v1/conversions \
-H "Authorization: Bearer lj_pk_your_key" \
-H "Content-Type: application/json" \
-d '{"campaignId":"abc","affiliateId":"xyz","amount":99}'Response
{
"data": {
"id": "conv_abc123",
"campaignId": "PAbeJtXF39gDMUPYGZqZX",
"affiliateId": "aff_xyz",
"amount": 99.00,
"commission": 19.80,
"currency": "usd",
"status": "pending",
"orderId": "invoice-2026-001",
"conversionType": "one_time",
"isTest": false,
"createdAt": "2026-04-15T10:30:00Z"
}
}/api/v1/me
Verify API Key
Lightweight ping endpoint to verify your API key works. Returns your merchant info, key permissions, plan, and current rate limit status.
Example
curl https://linkjolt.io/api/v1/me \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": {
"merchant": { "id": "m_abc", "businessName": "Acme Inc", "email": "team@acme.com" },
"apiKey": { "id": "k_123", "name": "Production", "permissions": { "read": true, "write": false }, "keyType": "live" },
"plan": "professional",
"rateLimit": { "limit": 60, "remaining": 59, "resetAt": 1713100860 }
}
}/api/v1/stats
Get Stats
Returns aggregate statistics: total revenue, commissions, conversions, and affiliate count for a date range.
Parameters
| from | date | Start date (default: first of current month) |
| to | date | End date (default: now) |
Example
curl "https://linkjolt.io/api/v1/stats?from=2026-04-01" \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": {
"totalRevenue": 12350.00,
"totalTax": 0.00,
"totalCommissions": 2470.00,
"totalConversions": 47,
"totalClicks": 1820,
"totalAffiliates": 12,
"periodStart": "2026-04-01T00:00:00Z",
"periodEnd": "2026-04-13T23:59:59Z"
}
}/api/v1/campaigns/:id
Get Campaign
Fetch a single campaign by ID with full details, affiliate count, and the 10 most recent conversions.
Parameters
| id* | string | Campaign ID (path parameter) |
Example
curl https://linkjolt.io/api/v1/campaigns/CAMPAIGN_ID \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": {
"id": "PAbeJtXF39gDMUPYGZqZX",
"name": "Pro Campaign",
"trackingCode": "7PtIfIqd",
"commissionType": "percentage",
"commissionValue": 20,
"affiliateCount": 12,
"recentConversions": [ /* ... */ ],
"createdAt": "2026-01-15T10:30:00Z"
}
}/api/v1/affiliates
List Affiliates
List affiliates across your campaigns. Filter by campaignId or status. Excludes rejected affiliates.
Parameters
| campaignId | string | Filter by campaign ID |
| status | string | Filter: approved, pending |
| page | number | Page number |
| limit | number | Results per page (max 100) |
| sort | string | e.g. name:asc, joinedAt:desc |
Example
curl "https://linkjolt.io/api/v1/affiliates?status=approved" \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": [
{
"id": "aff_xyz",
"name": "Jane Smith",
"email": "jane@example.com",
"status": "approved",
"campaignId": "camp_abc",
"campaignName": "Pro Campaign",
"joinedAt": "2026-03-10T09:00:00Z"
}
],
"pagination": { "page": 1, "limit": 25, "total": 12, "totalPages": 1 }
}/api/v1/affiliates/:id
Get Affiliate
Fetch a single affiliate with all their campaign associations and aggregated earnings across your campaigns.
Parameters
| id* | string | Affiliate ID (path parameter) |
Example
curl https://linkjolt.io/api/v1/affiliates/AFFILIATE_ID \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": {
"id": "aff_xyz",
"name": "Jane Smith",
"email": "jane@example.com",
"campaigns": [
{ "campaignId": "camp_abc", "campaignName": "Pro", "status": "approved", "joinedAt": "..." }
],
"earnings": {
"totalRevenue": 2350.00,
"totalCommissions": 470.00,
"totalConversions": 12,
"uniqueClicks": 340
}
}
}/api/v1/affiliates/invite
Invite Affiliate
Send an email invitation to an affiliate for a specific campaign. Enforces your plan's affiliate limit.
Parameters
| email* | string | Affiliate email address |
| name | string | Affiliate name (optional) |
| campaignId* | string | Campaign to invite them to |
Example
curl https://linkjolt.io/api/v1/affiliates/invite \
-X POST \
-H "Authorization: Bearer lj_pk_your_key" \
-H "Content-Type: application/json" \
-d '{"email":"jane@example.com","campaignId":"camp_abc"}'Response
{
"data": {
"id": "inv_abc",
"email": "jane@example.com",
"name": "Jane Smith",
"campaignId": "camp_abc",
"status": "pending",
"isTest": false,
"createdAt": "2026-04-14T12:00:00Z"
}
}/api/v1/affiliates
Create Affiliate
Create an affiliate directly (no email invite, no sign-up) and attach them to a campaign, auto-approved. The affiliate has no login account: they are a tracking and payout record you pay directly. Returns a ready-to-share tracking link. Enforces your plan's affiliate limit.
Parameters
| email* | string | Affiliate email address (globally unique) |
| name | string | Affiliate name (defaults to the email if omitted) |
| campaignId* | string | Campaign to add them to |
Example
curl https://linkjolt.io/api/v1/affiliates \
-X POST \
-H "Authorization: Bearer lj_pk_your_key" \
-H "Content-Type: application/json" \
-d '{"email":"jane@example.com","name":"Jane Smith","campaignId":"camp_abc"}'Response
{
"data": {
"id": "aff_abc",
"name": "Jane Smith",
"email": "jane@example.com",
"status": "approved",
"campaignId": "camp_abc",
"campaignName": "Summer Launch",
"trackingLink": "https://linkjolt.io/redirect?tc=SUMMER24&aff=aff_abc",
"createdVia": "api",
"joinedAt": "2026-06-22T12:00:00Z"
}
}/api/v1/conversions/:id
Update Conversion
Approve or reject a conversion. Cannot change conversions that have already been paid.
Parameters
| id* | string | Conversion ID (path parameter) |
| status* | string | New status: "approved" or "rejected" |
Example
curl https://linkjolt.io/api/v1/conversions/CONVERSION_ID \
-X PATCH \
-H "Authorization: Bearer lj_pk_your_key" \
-H "Content-Type: application/json" \
-d '{"status":"approved"}'Response
{
"data": {
"id": "conv_abc",
"status": "approved",
"amount": 100.00,
"commission": 20.00,
"updatedAt": "2026-04-14T12:00:00Z"
}
}/api/v1/webhooks
Manage Webhooks
Manage outbound webhook subscriptions. GET lists all, POST creates a new one, DELETE deactivates one. PATCH /api/v1/webhooks/:id updates url/events or re-enables a paused subscription (active: true, resets the failure count). GET /api/v1/webhooks/:id/deliveries lists recent delivery attempts.
Parameters
| url* | string | (POST) HTTPS URL to deliver events to |
| events* | string[] | (POST) e.g. ["conversion.created","payout.completed"] |
| active | boolean | (PATCH /:id) true re-enables a paused subscription and resets its failure count |
Example
# Create
curl https://linkjolt.io/api/v1/webhooks \
-X POST \
-H "Authorization: Bearer lj_pk_your_key" \
-H "Content-Type: application/json" \
-d '{"url":"https://yourapp.com/hooks","events":["conversion.created"]}'
# List
curl https://linkjolt.io/api/v1/webhooks \
-H "Authorization: Bearer lj_pk_your_key"
# Re-enable a paused subscription (resets failure count)
curl https://linkjolt.io/api/v1/webhooks/WEBHOOK_ID \
-X PATCH \
-H "Authorization: Bearer lj_pk_your_key" \
-H "Content-Type: application/json" \
-d '{"active":true}'
# Recent delivery attempts (?limit= up to 100)
curl https://linkjolt.io/api/v1/webhooks/WEBHOOK_ID/deliveries \
-H "Authorization: Bearer lj_pk_your_key"Response
// POST response — secret shown ONCE
{
"data": {
"id": "wh_abc",
"url": "https://yourapp.com/webhooks/linkjolt",
"events": ["conversion.created", "payout.completed"],
"secret": "hex_32_bytes...",
"active": true,
"createdAt": "..."
}
}/api/v1/webhooks/:id/rotate
Rotate Webhook Secret
Generate a new signing secret for a webhook. Old secret stops working immediately. Returns new secret once.
Parameters
| id* | string | Webhook subscription ID (path parameter) |
Example
curl https://linkjolt.io/api/v1/webhooks/WEBHOOK_ID/rotate \
-X POST \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": {
"id": "wh_abc",
"secret": "new_hex_secret...",
"message": "Secret rotated. Update your webhook verification code with this new secret."
}
}/api/v1/webhooks/:id/test
Test Webhook
Send a signed "ping" event to the webhook URL. Returns the HTTP status and response body so you can verify your endpoint works.
Parameters
| id* | string | Webhook subscription ID (path parameter) |
Example
curl https://linkjolt.io/api/v1/webhooks/WEBHOOK_ID/test \
-X POST \
-H "Authorization: Bearer lj_pk_your_key"Response
{
"data": {
"success": true,
"httpStatus": 200,
"responseBody": "OK",
"url": "https://yourapp.com/webhooks/linkjolt"
}
}Conventions
sort (e.g. ?sort=createdAt:desc) and page/limit.X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, and X-API-Version headers.{ error: { code, message, details? } }Retry-After.