API Documentation
Automate directory submissions programmatically. API access is available on Pro ($199) and Agency ($399) tiers.
Authentication
All authenticated endpoints require a Bearer token or API key in the request header:
# Using JWT token
Authorization: Bearer <access_token>
# Using API key (all paid plans)
x-api-key: bk_live_xxxxxxxxxxxxxAccess tokens expire after 15 minutes. Use the refresh token endpoint to get a new one.
Rate Limits
Per-plan usage limits apply to submission quota, not request rate. See your dashboard for your plan's capacity.
Endpoints
Directory inventory and placement targets are available only to authenticated customers. Public pages show aggregate coverage, quality tiers, and delivery examples without exposing the operational directory list.
/api/v1/auth/loginAuthenticate and get JWT access + refresh tokens
/api/v1/sitesList all your registered sites
/api/v1/sitesRegister a new site for directory submission
/api/v1/directoriesBrowse available directories (filtered by your tier DR cap)
/api/v1/jobsCreate a submission job for a site + directory list
/api/v1/jobs/:idGet job status and progress details
/api/v1/backlinksList all discovered backlinks for your sites
/api/v1/directories/check-backlinksVerify known backlink URLs for status, redirects, rel, canonical, robots, and CSV-ready evidence
/api/v1/api-keysCreate an API key for programmatic access
/api/v1/users/meGet current user profile and subscription details
Public Backlink Check Response
The public backlink check endpoint accepts one target domain and up to 25 known linking-page URLs. Each result includes page-level evidence that can be exported from the web tool or consumed directly.
{
"domain": "example.com",
"checked": 1,
"summary": {
"alive": 1,
"dead": 0,
"withLink": 1,
"dofollow": 1,
"indexable": 1,
"redirected": 0
},
"results": [
{
"url": "https://directory.example/listing",
"finalUrl": "https://directory.example/listing",
"redirectChain": [],
"httpStatus": 200,
"domainFound": true,
"hasLink": true,
"linkType": "dofollow",
"targetUrl": "https://example.com/",
"anchorText": "Example",
"relAttributes": [],
"canonicalUrl": "https://directory.example/listing",
"robotsDirectives": [],
"indexable": true
}
]
}Quick Start
Submit your site to directories in 3 API calls:
# 1. Login
curl -X POST https://backlynk.io/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"..."}'
# 2. Add your site
curl -X POST https://backlynk.io/api/v1/sites \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"url":"https://yoursite.com","name":"Your Site","description":"..."}'
# 3. Start submissions
curl -X POST https://backlynk.io/api/v1/jobs \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"site_id":"<site_id>","directory_ids":[1,2,3,4,5]}'Store the returned job id and poll the job endpoint until the status becomes completed, canceled, or failed.
Response & Error Patterns
API responses use JSON envelopes with stable ids, timestamps, status fields, and pagination metadata where a list is returned. Validation and authentication failures use the same error shape across endpoints.
{
"message": "Validation failed",
"error": {
"code": "invalid_site_url",
"field": "url",
"details": "Use an indexable https URL with a public landing page."
}
}Input, quota, or validation issue that can be corrected and retried.
Missing token, expired session, or a plan permission that does not include the endpoint.
Rate limit reached. Back off before retrying and keep long-running jobs asynchronous.
Client Examples
Teams can use any HTTP client. For no-code checks, start with the public backlink verification tool. For automated campaigns, use authenticated API calls from your backend.
const res = await fetch('https://backlynk.io/api/v1/jobs/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': process.env.BACKLYNK_API_KEY
},
body: JSON.stringify({ site_id: 'site_123' })
});
if (!res.ok) throw new Error(await res.text());
const job = await res.json();