Core resources

Channels

The sites, newsletters and social accounts your traffic comes from, and how to verify them.

The channel object

A channel is a property your traffic comes from: a website, a newsletter or a social account. Applications and tracking links always belong to one.

A channel can carry links once it is active and, when verification.required is true, verified. Until then, applying or minting a link with it returns 403 channel_not_verified.

Fields
idinteger

The channel ID.

namestring

What you call the channel.

urlstring

The site, newsletter archive or profile URL.

categoryenum

website, content, coupons_deals, email, social or other.

dailyPageViewsinteger | null

The traffic estimate you submitted.

statusenum

pending until the LinkApprove team reviews it, then active or rejected. An active channel can later be paused or suspended.

verification.requiredboolean

True for website, content and coupons_deals. Other categories are reviewed by hand instead.

verification.verifiedboolean

Whether we have found the meta tag on the channel URL.

verification.metaTagstring | null

The exact tag to place in the page's <head>. Null when no verification is required.

createdAtstring

When the channel was submitted.

{
  "id": 12,
  "name": "Trail Notes",
  "url": "https://trailnotes.example",
  "category": "content",
  "dailyPageViews": 1400,
  "status": "active",
  "verification": {
    "required": true,
    "verified": true,
    "metaTag": "<meta name=\"linkapprove-verification\" content=\"5b0f2c9e-8a41-4d7e-9c3b-2f6e1d7a4c10\">"
  },
  "createdAt": "2026-07-02T11:30:00Z"
}

List channels

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

Returns your channels, newest first.

Query parameters
statusenum

pending, active, rejected, paused or suspended.

pageinteger

1-based page number. Defaults to 1.

sizeinteger

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

curl "https://api.linkapprove.com/v1/channels?page=1&size=10" \
  -H "Authorization: Bearer $LINKAPPROVE_API_KEY"
Try it
GEThttps://api.linkapprove.com/v1/channels?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 channel

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

Returns one channel. A channel that does not exist or is not yours returns 404 channel_not_found.

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

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.

Create a channel

POSThttps://api.linkapprove.com/v1/channelschannels:write

Submits a channel for review. It comes back pending, and the LinkApprove team approves or rejects it. Website, content and coupon channels also come back with the metaTag you need for verification.

Body parameters
namestringrequired

1–255 characters.

urlstringrequired

An http(s) URL, up to 255 characters.

categoryenumrequired

website, content, coupons_deals, email, social or other.

dailyPageViewsintegerrequired

Your daily traffic estimate, 0 or more.

When it fails

  • 400 Validation failed: a missing field, a URL that is not http(s), an unknown category or a negative dailyPageViews.
  • 409 duplicate_channel: a website, content or coupon channel for this hostname is already pending or active on LinkApprove. A leading www. is ignored.
  • 403 insufficient_scope: the key does not hold channels:write.
curl -X POST "https://api.linkapprove.com/v1/channels" \
  -H "Authorization: Bearer $LINKAPPROVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Trail Notes",
    "url": "https://trailnotes.example",
    "category": "content",
    "dailyPageViews": 1400
  }'
Try it
POSThttps://api.linkapprove.com/v1/channels

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.

Verify a channel

POSThttps://api.linkapprove.com/v1/channels/{id}/verifychannels:write

Proves you control the site. Put the channel's verification.metaTag in the <head> of the page at its url, deploy, then call this endpoint. We fetch the page and look for the tag.

<head>
<head>
  <meta charset="utf-8">
  <title>Trail Notes</title>
  <meta name="linkapprove-verification" content="5b0f2c9e-8a41-4d7e-9c3b-2f6e1d7a4c10">
</head>

How the check runs

  • We request the channel URL over http or https on the default port, follow up to three redirects, wait up to five seconds and read the first megabyte.
  • Pages on private or internal addresses are never fetched and always fail.
  • Calling it on a channel that is already verified returns the channel without fetching again.
  • Verifying does not approve the channel. status still waits for the LinkApprove team.

When it fails

  • 422 verification_failed: the page could not be fetched or the tag was not in it. The error carries the exact metaTag to compare against.
  • 409 verification_not_required: email, social and other channels have no verification step.
  • 404 channel_not_found: no such channel on your account.
curl -X POST "https://api.linkapprove.com/v1/channels/12/verify" \
  -H "Authorization: Bearer $LINKAPPROVE_API_KEY"
Try it
POSThttps://api.linkapprove.com/v1/channels/12/verify

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.

{
  "success": false,
  "message": "The verification meta tag was not found on the channel URL",
  "error": {
    "code": "verification_failed",
    "metaTag": "<meta name=\"linkapprove-verification\" content=\"5b0f2c9e-8a41-4d7e-9c3b-2f6e1d7a4c10\">"
  }
}