Authentication
Every request is authenticated with your workspace API key as a Bearer token. Generate and rotate the key under Settings → API in the app. Keep it secret — it can spend your credits.
# header on every request
Authorization: Bearer csl_xxxxxxxxxxxxxxxxxxxxxxxx
Base URL
All endpoints live under the app host and take an e (endpoint) query parameter.
https://app.cloudstacklinks.com/api.php?e=<endpoint>
GET · products
GET?e=productslist link types & credit costs
# request
curl https://app.cloudstacklinks.com/api.php?e=products \
-H "Authorization: Bearer $CSL_KEY"
# response
{
"products": {
"editorial": { "name": "Editorial contextual link", "credits": 1 },
"platform": { "name": "Platform / Web-2.0 link", "credits": 1 },
"cloud": { "name": "Cloud Stack (10 platforms)", "credits": 10 },
"guestpost": { "name": "Guest post / niche edit", "credits": 8 }
}
}
GET · credits
GET?e=creditscurrent balance
# response
{ "credits": 148 }
POST · campaigns
POST?e=campaignscreate & queue a campaign
Send a JSON body. product is one of editorial · platform · cloud · guestpost. targets and anchors are newline-separated; qty multiplies the credit cost; client_id is optional. Credits are deducted immediately and the campaign is queued for automatic fulfilment.
# request
curl -X POST https://app.cloudstacklinks.com/api.php?e=campaigns \
-H "Authorization: Bearer $CSL_KEY" \
-H "Content-Type: application/json" \
-d '{
"product": "cloud",
"targets": "https://client.com/pricing\nhttps://client.com/features",
"anchors": "client pricing\nbest widget tool",
"qty": 1,
"client_id": 12
}'
# response
{ "ok": true, "id": 481, "status": "queued", "report_url": null }
GET · campaigns
GET?e=campaignsyour last 200 campaigns
# response
{ "campaigns": [
{ "id": 481, "product": "cloud", "qty": 1, "credits": 10,
"status": "delivered", "created": "2026-09-14T…", "delivered": "2026-09-14T…" }
] }
GET · campaign
GET?e=campaign&id=481one campaign, with links & report URL
# response
{
"id": 481, "product": "cloud", "status": "delivered",
"targets": "https://client.com/pricing",
"links": [
{ "platform": "Cloudflare R2", "url": "https://pub-….r2.dev/…", "anchor": "client pricing" }
],
"report_url": "https://app.cloudstacklinks.com/report.php?t=…"
}
Errors
Errors return a non-200 status with a JSON error message.
401 { "error": "Invalid or missing API key…" } # bad/absent Bearer
400 { "error": "Not enough credits — this needs 10, you have 4." }
404 { "error": "unknown endpoint", "endpoints": [ … ] }
Rate & scope. The API acts on your workspace only and spends your credit balance. Rotate your key any time in Settings → API; the old key stops working immediately.