Core resources

Programs

Browse the merchant catalogue, apply on behalf of a channel, track approval state.

The program object

A program is a merchant campaign as LinkApprove presents it: the upstream network's terms, normalised into one shape so you do not care which network it came from.

Fields
idinteger

Stable LinkApprove identifier. Mint tracking links against this.

merchantNamestring | null

The brand as the merchant wants it displayed.

merchantDomainstring | null

The merchant's site, without www. Deep links must stay on it or a subdomain of it.

categorystring | null

The upstream network's own category as a lowercase slug, e.g. apparel_footwear_accessories. Null when the network sends none.

payoutTypeenum

cps pays a share of the sale, cpc pays per click.

payoutstring | null

The most you can earn: the program's highest commission tier with LinkApprove's cut already taken off, so it is your 70% share of the network's rate. A two-decimal string such as "8.00", read together with payoutUnit. Null when the network publishes no rate.

payoutUnitenum | null

percent for a revenue share, fixed for a flat amount. Null when the network does not say which.

currencystring | null

Currency of the payout, when the network states one; null otherwise. ISO 4217, e.g. USD.

cookieDaysinteger | null

Attribution window in days. A conversion inside it credits your click. Null when the network does not say.

approvalTypeenum | null

auto approves the instant you apply; manual goes to the LinkApprove team for review. Null when the network does not say.

statusenum

Your application state for this program: not_applied, pending, approved, rejected, paused, suspended or expired. Scoped to channelId when you pass it.

supportsDeepLinksboolean

Whether a tracking link for this program accepts a destinationUrl.

descriptionstring | null

Retrieve only. The merchant's own pitch.

regionsstring[]

Retrieve only. ISO 3166-1 alpha-2 codes the merchant ships or converts in.

logoUrlstring | null

Retrieve only. The merchant's logo.

status is about you, not the merchant

status reflects your application state for the program on your channels, not whether the campaign itself is live. A program that is removed or deactivated stops appearing in the list, and retrieving it returns 404.
Program
{
  "id": 4821,
  "merchantName": "Northpeak Outdoors",
  "merchantDomain": "northpeak.com",
  "category": "sports_outdoor",
  "payoutType": "cps",
  "payout": "8.00",
  "payoutUnit": "percent",
  "currency": "USD",
  "cookieDays": 30,
  "approvalType": "manual",
  "status": "approved",
  "supportsDeepLinks": true,
  "description": "Technical outerwear and camping gear.",
  "regions": ["US", "CA"],
  "logoUrl": "https://cdn.linkapprove.com/merchants/4821.png"
}

List programs

GEThttps://api.linkapprove.com/v1/programsprograms:read

Returns a paginated list of every campaign available to your account. Filters combine with AND.

Query parameters
pageinteger

1-based page number. Defaults to 1.

sizeinteger

Results per page, 1–100. Defaults to 10.

searchstring

Matches merchant name or domain.

categorystring

The network's category as a slug: lowercased, & decoded, every run of other characters turned into _. An open set, e.g. apparel_footwear_accessories or sports_outdoor.

payoutTypeenum

cps or cpc.

approvalTypeenum

auto or manual. Useful for finding programs you can start on today.

channelIdinteger

Report status for this channel. Without it, status is the best state across all your channels.

statusenum

Only programs in this state: not_applied, pending, approved, rejected, paused, suspended or expired. Matches the status each program comes back with, so it follows channelId too.

Paginating the whole catalogue

  • Read pages from the first response and walk page up to it. Do not guess at an end.
  • Use size=100 for a full sync. A 13,700-campaign catalogue is 137 requests. At 120 a minute that takes just over a minute, so pace your requests or expect a 429 and honour its Retry-After.
  • Pagination is offset-based, newest first. Programs added or removed while you sync shift rows between pages, so a row can repeat or be skipped, so dedupe by id.
curl "https://api.linkapprove.com/v1/programs?payoutType=cps&page=1&size=10" \
  -H "Authorization: Bearer $LINKAPPROVE_API_KEY"
Try it
GEThttps://api.linkapprove.com/v1/programs?payoutType=cps&page=1&size=10

Held in this tab's session storage only, and reused by every runner on the site.

This panel replays the documented sample response and does not call the API. Copy a code sample to send a real request with your key.

Retrieve a program

GEThttps://api.linkapprove.com/v1/programs/{id}programs:read

Returns a single program with the same fields as a list entry, plus description, regions and logoUrl. Pass channelId to scope status to one channel.

An unknown or unavailable ID returns 404 with program_not_found. We do not distinguish "does not exist" from "not yours". Both are a 404.

curl "https://api.linkapprove.com/v1/programs/4821" \
  -H "Authorization: Bearer $LINKAPPROVE_API_KEY"
Try it
GEThttps://api.linkapprove.com/v1/programs/4821

Held in this tab's session storage only, and reused by every runner on the site.

This panel replays the documented sample response and does not call the API. Copy a code sample to send a real request with your key.

Apply to a program

POSThttps://api.linkapprove.com/v1/programs/applicationsprograms:write

Applications are made per channel. The same program can be approved on one of your sites and rejected on another, which is why channelId is required rather than inferred.

Body parameters
programIdintegerrequired

The program you want to run.

channelIdintegerrequired

An approved channel of yours that has completed verification. Applications are per channel, not per account.

notestring

Optional, up to 500 characters. Accepted for forward compatibility but not stored. Nobody reads it today.

What happens next

  • approvalType: "auto" comes back approved with decidedAt equal to appliedAt, and you can mint links in the same script run.
  • approvalType: "manual" comes back pending with decidedAt: null while the LinkApprove team reviews it. Poll GET /programs/{id}?channelId= until status changes.
  • rejectionReason is always null for now.
  • Applying again for the same program and channel returns 409 duplicate_application with the existing applicationId and its status, whatever that status is, rejected included.

When it fails

  • 404 program_not_found: no such program.
  • 404 channel_not_found: the channel does not exist or is not yours.
  • 403 channel_not_verified: the channel is not approved, or has a verification step it has not completed.

A rejection is final through the API

There is no way to apply again to a program on a channel that already has an application, rejected or not. Contact support if you think a rejection should be reconsidered.
curl -X POST "https://api.linkapprove.com/v1/programs/applications" \
  -H "Authorization: Bearer $LINKAPPROVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "programId": 4821,
    "channelId": 12,
    "note": "Outdoor gear reviews, 40k monthly readers, US and CA."
  }'
Try it
POSThttps://api.linkapprove.com/v1/programs/applications

Held in this tab's session storage only, and reused by every runner on the site.

This panel replays the documented sample response and does not call the API. Copy a code sample to send a real request with your key.

List applications

GEThttps://api.linkapprove.com/v1/programs/applicationsprograms:read

Returns every application you have made, newest first, across all your channels. Use it to pick up decisions on manual programs in one call instead of polling each program.

Query parameters
statusenum

pending, approved, rejected, paused, suspended or expired.

programIdinteger

Only applications to this program.

channelIdinteger

Only applications from this channel.

pageinteger

1-based page number. Defaults to 1.

sizeinteger

Results per page, 1–100. Defaults to 10.

Each row is the application object you got back when applying, plus merchantName. decidedAt is when the application left pending, or null while it is still waiting.

curl "https://api.linkapprove.com/v1/programs/applications?page=1&size=10" \
  -H "Authorization: Bearer $LINKAPPROVE_API_KEY"
Try it
GEThttps://api.linkapprove.com/v1/programs/applications?page=1&size=10

Held in this tab's session storage only, and reused by every runner on the site.

This panel replays the documented sample response and does not call the API. Copy a code sample to send a real request with your key.