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.
idintegerThe channel ID.
namestringWhat you call the channel.
urlstringThe site, newsletter archive or profile URL.
categoryenumwebsite, content, coupons_deals, email, social or other.
dailyPageViewsinteger | nullThe traffic estimate you submitted.
statusenumpending until the LinkApprove team reviews it, then active or rejected. An active channel can later be paused or suspended.
verification.requiredbooleanTrue for website, content and coupons_deals. Other categories are reviewed by hand instead.
verification.verifiedbooleanWhether we have found the meta tag on the channel URL.
verification.metaTagstring | nullThe exact tag to place in the page's <head>. Null when no verification is required.
createdAtstringWhen 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
https://api.linkapprove.com/v1/channelschannels:readReturns your channels, newest first.
statusenumpending, active, rejected, paused or suspended.
pageinteger1-based page number. Defaults to 1.
sizeintegerResults per page, 1–100. Defaults to 10.
curl "https://api.linkapprove.com/v1/channels?page=1&size=10" \
-H "Authorization: Bearer $LINKAPPROVE_API_KEY"https://api.linkapprove.com/v1/channels?page=1&size=10Held 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
https://api.linkapprove.com/v1/channels/{id}channels:readReturns 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"https://api.linkapprove.com/v1/channels/12Held 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
https://api.linkapprove.com/v1/channelschannels:writeSubmits 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.
namestringrequired1–255 characters.
urlstringrequiredAn http(s) URL, up to 255 characters.
categoryenumrequiredwebsite, content, coupons_deals, email, social or other.
dailyPageViewsintegerrequiredYour daily traffic estimate, 0 or more.
When it fails
400Validation failed: a missing field, a URL that is not http(s), an unknown category or a negativedailyPageViews.409duplicate_channel: a website, content or coupon channel for this hostname is already pending or active on LinkApprove. A leadingwww.is ignored.403insufficient_scope: the key does not holdchannels: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
}'https://api.linkapprove.com/v1/channelsHeld 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
https://api.linkapprove.com/v1/channels/{id}/verifychannels:writeProves 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>
<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.
statusstill waits for the LinkApprove team.
When it fails
422verification_failed: the page could not be fetched or the tag was not in it. The error carries the exactmetaTagto compare against.409verification_not_required: email, social and other channels have no verification step.404channel_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"https://api.linkapprove.com/v1/channels/12/verifyHeld 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\">"
}
}