BacklinkBase is a cloud-native link-building platform that turns the tedious, manual process of securing backlinks into a push-button workflow. Instead of negotiating with dozens of site owners or juggling spreadsheets, you purchase flexible “credits,” choose your target pages, and let BacklinkBase handle outreach, placement, and reporting behind the scenes. The system continuously monitors placement health, so every link you generate stays live and compliant with search-engine guidelines.
Built for agencies and solo SEO practitioners alike, BacklinkBase emphasizes transparency and control. You see exactly which sites are available, what each backlink costs in credits, and how every task is progressing—no hidden networks, no mystery metrics. Because the service is delivered entirely through a lightweight REST API and a simple web dashboard, you can integrate link-building seamlessly into existing SEO pipelines, internal tooling, or even client portals.
To get started with the Backlink Base API, you'll need an API key. Simply create a free account at backlinkbase.com to obtain your API key. Once you have it, you can easily start creating backlink campaigns from your own softwares or integration.
API Endpoint
https://backlinkbase.com/api/v1/
The Backlink Base API exposes the same automation layer that powers our dashboard, giving developers programmatic access to every step of the backlink lifecycle. With just a handful of endpoints you can (1) verify service availability with Health-Check, (2) query your remaining Credits, and (3) manage backlink “Tasks” end-to-end—listing eligible target sites, creating new tasks, polling task status, and retrieving completed task details. A dedicated Sandbox Mode lets you test integrations without consuming real credits or triggering live placements, making CI/CD deployment safe and cost-free.
Whether you're building an internal SEO command-line tool, integrating link generation into a campaign-management SaaS, or simply automating weekly backlink purchases, the API provides concise JSON responses, clear rate limits, and predictable task states. The result: reliable, scriptable link-building that scales with your growth instead of slowing it down.
Every BacklinkBase endpoint requires your personal api_token (sometimes called api_key). Because the service doesn't accept authentication headers, the key must be supplied as a query-string parameter (recommended) or a JSON body field for POST calls. Requests that omit or misspell this parameter return 401 Unauthorized.
This is just an example to demonstrate how to use other BacklinkBase API endpoints. Make sure to replace {endpoint} with the desired API function and {YOUR_API_TOKEN} with your actual API token.
PARAMS | DESCRIPTION |
---|---|
success | If your request is success you will get true else false with http code other than 200 depending on error. |
response | This array will give you all necessary details about your request. |
HttpURLConnection conn = (HttpURLConnection) new URL(
"https://backlinkbase.com/api/v1/{endpoint}?api_token=" + accessKey
).openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String response = new BufferedReader(
new InputStreamReader(conn.getInputStream())
).lines().reduce("", String::concat);
return new JSONObject(response).getJSONObject("response");
}
$ composer require guzzlehttp/guzzle
require_once("vendor/autoload.php");
$client = new \GuzzleHttp\Client();
$response = $client->get("https://backlinkbase.com/api/v1/{endpoint}", [
"query" => ["api_token" => $accessKey]
]);
echo json_decode($response->getBody(), true);
$ npm install axios
const axios = require('axios');
const response = await axios.get('https://backlinkbase.com/api/v1/{endpoint}', {
params: { api_token: accessKey }
});
return response.data.response;
$ pip install requests
url = 'https://backlinkbase.com/api/v1/{endpoint}'
response = requests.get(url, params={'api_token': api_token})
data = response.json()
return data['response']
Code | Meaning | Typical cause |
---|---|---|
200 | OK | GET/POST success |
201 | Created | Task created |
401 | Bad token | missing/invalid/inactive/out of credits |
404 | Not found | Task UUID not owned by caller |
409 | Conflict | Selected targets > remaining credits |
422 | Validation | Body failed field rules |
429 | Rate limit | >60 req/min or >3 bad tokens |
500 | Server | Unexpected exception |
Indicates that the request has succeeded.
Indicates that the request has succeeded and a new resource has been created as a result.
HTTP/1.1 201 Created
{
"success": true,
"message": "Task created successfully.",
"task_id": "**********"
}
Returned when the token is missing, invalid, inactive, or the user is out of credits.
HTTP/1.1 401 Unauthorized
{
"success": false,
"message": "API Token Verification Error",
"errors": {
"api_token": "API Token is not a valid"
}
}
Returned when the requested Task UUID is not owned by the caller.
Returned when the selected targets exceed the remaining credits.
HTTP/1.1 409 Conflict
{
"success": false,
"message": "Out of credits.",
"errors": {
"target_website_ids": "You don't have enough credits to choose this many targets. Please lower the number of targets to match your credit limit"
}
}
Indicates that the request body failed one or more field validation rules.
HTTP/1.1 422 Unprocessable Entity
{
"success": false,
"message": "Input Fields Validation Error",
"errors": {
"target_website_ids": [
"The target_website_ids must be a JSON array."
]
}
}
Indicates the client sent too many requests in a given time frame (rate limiting).
HTTP/1.1 429 Too Many Requests
{
"success": false,
"message": "Rate limit exceeded. Please try again later.",
"errors": {
"api_token": "Rate limit exceeded. Please try again later."
}
}
Indicates an unexpected exception or server-side error occurred.
Field | Type | Description |
---|---|---|
id | uuid | Primary identifier |
name | string | Campaign label |
status | enum | queued, running, completed, failed, cancelled |
created_at | datetime | ISO-8601 UTC |
updated_at | datetime | — |
last_run_at | datetime? | Last attempt |
completed_at | datetime? | When finished/cancelled |
article | object | See Article |
sites | array | One row per target website |
Field | Type | Description |
---|---|---|
id | int | Internal row id |
backlink_website_id | int | Catalogue id |
status | enum | Queued Publishing, Publishing, Published, Cancelled, Failed |
result_url | string? | Final backlink URL |
schedule_at | datetime | Planned execution time |
last_run_at | datetime? | Last processing attempt time |
completed_at | datetime? | Success/failure time |
Field | Type | Description |
---|---|---|
title | string | 4-50 words |
body | string | ≤400 words (HTML allowed) |
urls | array | 1-5 absolute URLs |
The HTTP/1.1 200 Task Details response is returned when the task is successfully fetched. The response contains a JSON object with the following fields:
HTTP/1.1 200 Task Details
{
"success": true,
"message": {
"id": "6825c868ac395",
"name": "API - Task Name",
"status": "Queued Publishing",
"created_at": "2025-05-15T10:56:40.000000Z",
"updated_at": "2025-05-15T10:56:40.000000Z",
"last_run_at": "2025-05-15T10:56:40.000000Z",
"completed_at": "2025-05-15T10:56:40.000000Z",
"article": {
"title": "Article Title",
"body": "Article Body",
"urls": [
"https://example.com",
"https://example.org"
]
},
"sites": [
{
"backlink_website_id": 1,
"status": "Published",
"result_url": "https://example.com/backlink",
"last_run_at": "2025-05-15T10:56:40.000000Z",
"schedule_at": "2025-05-15T10:56:40.000000Z",
"completed_at": "2025-05-15T10:56:40.000000Z"
},
{
"backlink_website_id": 2,
"status": "Queued Publishing",
"result_url": null,
"last_run_at": null,
"schedule_at": "2025-05-15T11:26:40.000000Z",
"completed_at": null
}
]
}
}
The /health-check endpoint allows you to retrieve the health status of the API. Server sends current timestamp and success status. This endpoint is useful for checking if the API is up and running.
PARAMS | DESCRIPTION |
---|---|
success | If your request is success you will get true else false with http code other than 200 depending on error. |
timestamp | Returns servers current timestamp. |
HttpURLConnection conn = (HttpURLConnection) new URL(
"https://backlinkbase.com/api/v1/health-check?api_token=" + accessKey
).openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String response = new BufferedReader(
new InputStreamReader(conn.getInputStream())
).lines().reduce("", String::concat);
return new JSONObject(response).getJSONObject("response");
}
$ composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->get('https://backlinkbase.com/api/v1/health-check', [
'query' => ['api_token' => $accessKey]
]);
echo json_decode($response->getBody(), true);
$ npm install axios
const axios = require('axios');
const response = await axios.get('https://backlinkbase.com/api/v1/health-check', {
params: { api_token: accessKey }
});
return response.data.response;
$ pip install requests
url = 'https://backlinkbase.com/api/v1/health-check'
response = requests.get(url, params={'api_token': api_token})
data = response.json()
return data['response']
The /credits endpoint allows you to check the current available balance of your account.
PARAMS | DESCRIPTION |
---|---|
success | If your request is success you will get true else false with http code other than 200 depending on error. |
message | This array will give you all necessary details about your request. |
credits | This id will return your current available Credits. |
HttpURLConnection conn = (HttpURLConnection) new URL(
"https://backlinkbase.com/api/v1/credits?api_token=" + accessKey
).openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String response = new BufferedReader(
new InputStreamReader(conn.getInputStream())
).lines().reduce("", String::concat);
return new JSONObject(response).getJSONObject("response");
}
$ composer require guzzlehttp/guzzle
use GuzzleHttp\Client;
$apiToken = '***********************'; // ← replace with your real API token
$client = new Client();
$response = $client->get('https://backlinkbase.com/api/v1/credits', [
'headers' => [
'Accept' => 'application/json',
],
'query' => [
'api_token' => $apiToken,
],
]);
$body = (string) $response->getBody();
$data = json_decode($body, true);
var_dump($data);
$ npm install axios
const axios = require('axios');
const response = await axios.get('https://backlinkbase.com/api/v1/credits', {
params: { api_token: accessKey }
});
return response.data.response;
$ pip install requests
url = 'https://backlinkbase.com/api/v1/credits'
response = requests.get(url, params={'api_token': api_token})
data = response.json()
return data['response']
Retrieve the full list of target sites available to your account.
The /task/sites
endpoint returns the entire list of target
websites available for your API account.
There is no pagination — all entries are returned in a single response.
This is useful for managing or displaying linked sites from the dashboard or
API clients.
Ensure you pass a valid API token with every request. Unauthorized or expired tokens will result in a 401 error.
PARAMS | DESCRIPTION |
---|---|
success |
Indicates whether the request was successful. Returns true on
success.
|
message | An array of site data including: |
id | Unique identifier for the site. |
url | URL of the site. |
da | Domain Authority (DA) score of the site. |
pa | Page Authority (PA) score of the site. |
spam_score | Spam score of the site. |
status | Status of the site if its enabled or disabled. |
limited | If its limited because you have low credits or not. |
HttpURLConnection conn = (HttpURLConnection) new URL(
"https://backlinkbase.com/api/v1/task/sites?api_token=" + accessKey
).openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String response = new BufferedReader(
new InputStreamReader(conn.getInputStream())
).lines().reduce("", String::concat);
return new JSONObject(response).getJSONObject("response");
}
$ composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
use GuzzleHttp\Client;
$apiToken = '***********************'; // ← replace with your real API token
$client = new Client();
$response = $client->get('https://backlinkbase.com/api/v1/task/sites', [
'headers' => [
'Accept' => 'application/json',
],
'query' => [
'api_token' => $apiToken,
],
]);
$body = (string) $response->getBody();
$data = json_decode($body, true);
var_dump($data);
$ npm install axios
const axios = require('axios');
const response = await axios.post('https://backlinkbase.com/api/v1/task/sites', {
api_token: 'your-api-token-here'
}, {
headers: {
'Content-Type': 'application/json'
}
});
console.log(response.data); // contains: success, message[]
$ pip install requests
import requests
url = 'https://backlinkbase.com/api/v1/task/sites'
payload = {
'api_token': 'your-api-token-here'
}
response = requests.post(url, json=payload)
data = response.json()
print(data) # contains: success, message[]
HTTP/1.1 200 Success
{
"success": true,
"message": [
{
"id": 388,
"url": "example.com",
"da": 24,
"pa": 31,
"spam_score": 1,
"status": 1,
"limited": false
},
{
"id": 389,
"url": "example2.com",
"da": 30,
"pa": 35,
"spam_score": 2,
"status": 1,
"limited": false
}
]
}
This endpoint allows you to create a new task by submitting the required article and target site information. Tasks can optionally be scheduled and run in sandbox mode.
The /v1/task/store
endpoint accepts parameters for task metadata and
article content. You must provide a valid API token and sufficient credit to
submit the request.
Ensure your article content is well-formatted and URLs are correctly
included. Credits will be deducted per target site unless using
sandbox
mode.
schedule_from
and ≤ today +
1 month. Default 1 Day.
HTTP | MESSAGE |
---|---|
401 | Invalid API Token |
422 | Validation error — e.g., “The name must be between 2 and 10 words.” |
409 | Insufficient credits for the number of target sites selected. |
URL url = new URL("https://backlinkbase.com/api/v1/task/store");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
String jsonInput = """
{
"api_token": "your-api-token",
"name": "Press release batch",
"article_title": "Fintech startup Acme raises series A funding",
"article_body": "Acme, a Pune based fintech company…
",
"article_urls": "https://acme.com, https://acme.com/product",
"target_website_ids": "388, 372, 401",
"schedule_from": "2025-05-18",
"schedule_till": "2025-05-25"
}
"""
try (OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInput.getBytes("utf-8");
os.write(input, 0, input.length);
}
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String responseLine;
while ((responseLine = br.readLine()) != null) {
System.out.println(responseLine.trim());
}
$ composer require guzzlehttp/guzzle
$apiToken = 'your-api-token'; // ← replace with your real API token
$client = new Client();
$data = [
'api_token' => $apiToken,
'name' => 'Test From Developers',
'article_title' => 'Fintech startup Acme raises series A funding',
'article_body' => 'Acme, a Pune based fintech company, Acme, a Pune based fintech company. Lipsum leoram ipsum.',
'article_urls' => 'https://acme.com, https://acme.com/product',
'target_website_ids' => "388, 372, 401",
'schedule_from' => date('Y-m-d'),
// 'schedule_till' => date('Y-m-d'),
'sandbox' => true, // ← remove in production use
];
$response = $client->post('https://backlinkbase.com/api/v1/task/store', [
'json' => $data,
'headers' => [
'Accept' => 'application/json',
],
]);
$body = (string) $response->getBody();
$data = json_decode($body, true);
var_dump($data);
$ npm install axios
const axios = require('axios');
const data = {
api_token: "your-api-token",
name: "Press release batch",
article_title: "Fintech startup Acme raises series A funding",
article_body: "Acme, a Pune based fintech company…
",
article_urls: "https://acme.com, https://acme.com/product",
target_website_ids: "388, 372, 401",
schedule_from: "2025-05-18",
schedule_till: "2025-05-25"
};
axios.post('https://backlinkbase.com/api/v1/task/store', data, {
headers: { 'Content-Type': 'application/json' }
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error.response?.data || error.message);
});
$ pip install requests
import requests
url = "https://backlinkbase.com/api/v1/task/store"
payload = {
"api_token": "your-api-token",
"name": "Press release batch",
"article_title": "Fintech startup Acme raises series A funding",
"article_body": "Acme, a Pune based fintech company…
",
"article_urls": "https://acme.com, https://acme.com/product",
"target_website_ids": "388, 372, 401",
"schedule_from": "2025-05-18",
"schedule_till": "2025-05-25"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
HTTP/1.1 200 Success
{
"success": true,
"message": "Task created successfully.",
"task_id": "6825f0ba291e7"
}
HTTP/1.1 422 Validation Error
{
"success": false,
"message": "Validation failed",
"errors": {
"article_title": [
"The article_title must be between 4 and 50 words. You have 2 words."
],
"target_website_ids": [
"The target_website_ids must be a comma-separated list of integers."
]
}
}
Retrieve a specific task and its associated data.
The /v1/task/show
endpoint allows you to fetch the full
details of a task by providing the task ID.
You must supply a valid API token and the task ID that belongs to the
caller.
PARAMS | DESCRIPTION |
---|---|
success | Indicates if the request was successful. Returns
true on success.
|
message | An object containing task details such as ID, name, status, associated article data, and linked site information. |
other | Check Data Models tab for more details at #data-models |
HTTP | MESSAGE |
---|---|
404 | Task not found |
422 | id field missing/invalid |
HttpURLConnection conn = (HttpURLConnection) new URL(
"https://backlinkbase.com/api/v1/task/show?api_token=" + accessKey + "&id=" + id
).openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String response = new BufferedReader(
new InputStreamReader(conn.getInputStream())
).lines().reduce("", String::concat);
return new JSONObject(response).getJSONObject("message");
}
$ composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
use GuzzleHttp\Client;
$apiToken = '***************'; // ← replace with your real API token
$taskId = '123abc'; // ← replace with your task id
$client = new Client();
$response = $client->get('https://backlinkbase.com/api/v1/task/show', [
'headers' => [
'Accept' => 'application/json',
],
'query' => [
'api_token' => $apiToken,
'id' => $taskId,
],
]);
$body = (string) $response->getBody();
$data = json_decode($body, true);
var_dump($data);
$ npm install axios
const axios = require('axios');
const response = await axios.post('https://backlinkbase.com/api/v1/task/show', {
api_token: 'your-api-token',
id: 'your-task-id'
}, {
headers: { 'Content-Type': 'application/json' }
});
console.log(response.data.message);
$ pip install requests
import requests
url = 'https://backlinkbase.com/api/v1/task/show'
headers = {'Content-Type': 'application/json'}
payload = {
'api_token': 'your-api-token',
'id': 'your-task-id'
}
response = requests.post(url, json=payload, headers=headers)
data = response.json()
print(data['message'])
HTTP/1.1 200 Success
{
"success": true,
"message": {
"id": "6825c868ac395",
"name": "API - Task Name",
"status": "Queued Publishing",
"created_at": "2025-05-15T10:56:40.000000Z",
"updated_at": "2025-05-15T10:56:40.000000Z",
"last_run_at": "2025-05-15T10:56:40.000000Z",
"completed_at": "2025-05-15T10:56:40.000000Z",
"article": {
"title": "Article Title",
"body": "Article Body",
"urls": [
"https://example.com",
"https://example.org"
]
},
"sites": [
{
"backlink_website_id": 1,
"status": "Published",
"result_url": "https://example.com/backlink",
"last_run_at": "2025-05-15T10:56:40.000000Z",
"schedule_at": "2025-05-15T10:56:40.000000Z",
"completed_at": "2025-05-15T10:56:40.000000Z"
},
{
"backlink_website_id": 2,
"status": "Queued Publishing",
"result_url": null,
"last_run_at": null,
"schedule_at": "2025-05-15T11:26:40.000000Z",
"completed_at": null
}
]
}
}
Retrieves all tasks created under the API token provided.
This endpoint returns a full list of your created tasks. It uses the same
request body as the /v1/tasks
endpoint. There is no pagination
— all tasks will be included in the response.
PARAMS | DESCRIPTION |
---|---|
success |
Indicates whether the request was successful. Returns true on
success.
|
message | An array of site data including: |
id | Unique identifier for the task. Use Retrieve Task API to get the task details. |
name | Name of the task. |
status | Status of the task. (Queued Publishing, Publishing, Published, Cancelled, Failed) |
updated_at | Timestamp when the task was last updated. |
created_at | Timestamp when the task was created. |
last_run_at | Timestamp when the task was last run. |
completed_at | Timestamp when the task was completed. |
HttpURLConnection conn = (HttpURLConnection) new URL(
"https://backlinkbase.com/api/v1/tasks?api_token=" + accessKey
).openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String response = new BufferedReader(
new InputStreamReader(conn.getInputStream())
).lines().reduce("", String::concat);
return new JSONObject(response).getJSONObject("message");
}
$ composer require guzzlehttp/guzzle
require_once('vendor/autoload.php');
use GuzzleHttp\Client;
$apiToken = '***********************'; // ← replace with your real API token
$client = new Client();
$response = $client->get('https://backlinkbase.com/api/v1/tasks', [
'headers' => [
'Accept' => 'application/json',
],
'query' => [
'api_token' => $apiToken,
],
]);
$body = (string) $response->getBody();
$data = json_decode($body, true);
var_dump($data);
$ npm install axios
const axios = require('axios');
const response = await axios.post('https://backlinkbase.com/api/v1/tasks?api_token=your-api-token-here', {}, {
headers: { 'Content-Type': 'application/json' }
});
return response.data.message;
$ pip install requests
import requests
url = 'https://backlinkbase.com/api/v1/tasks?api_token=your-api-token-here'
headers = {'Content-Type': 'application/json'}
response = requests.post(url, json={}, headers=headers)
data = response.json()
return data['message']
HTTP/1.1 200 Success
{
"success": true,
"message": [
{
"id": "6825f0ba291e7",
"name": "API - Task Name 2",
"status": "Queued Publishing",
"updated_at": "2025-05-15T13:48:42.000000Z",
"created_at": "2025-05-15T13:48:42.000000Z",
"last_run_at": null,
"completed_at": null
},
{
"id": "4825f0ad291e1",
"name": "API - Task Name 1",
"status": "Cancelled",
"created_at": "2025-05-12T09:18:24Z",
"updated_at": "2025-05-14T06:20:11Z",
"last_run_at": "2025-05-14T06:20:05Z",
"completed_at": "2025-05-14T06:20:05Z"
}
]
}