Developer documentation
GetLinkFast API and MCP server
Search sites, fill your cart and order with credits without opening the dashboard: from a script, a Make or n8n scenario, or an AI agent such as Claude or Cursor. The API and the MCP server use the same key and return the same JSON.
What it is for
- Agencies and SEO teams: connect your internal tools and tracking dashboards to your account. Catalog, cart, orders and statuses are all readable as JSON.
- AI agents: ask Claude Code or Cursor “find me 5 finance sites with DR 40+ and order them”. The agent searches, shows you the summary and only orders once you approve.
- Make, n8n, Zapier: an HTTP module and a key are all you need.
The API sells guest posts (guest_post), link insertions (link_insertion) and SEO/GEO packs, with credits only. Buying credits and the other offers stay in the dashboard.
Create a key
- Open Dashboard → API access.
- Name the key (for example “Claude agent” or “Make reporting”) and choose its scopes. On a key that can order, you can set a per-order cap and a 24-hour cap.
- Copy the key. It starts with
glf_live_and is shown only once: we keep only a hash of it. - Send it in the header of every request:
Authorization: Bearer glf_live_…
At most 10 active keys per organization. A revoked key stops working immediately, as do the keys of a member who leaves the organization. Keep the key out of your code repositories: whoever holds it acts on behalf of your organization.
Key scopes
Each key carries one or more scopes. A request without the required scope receives 403 insufficient_scope, and an AI agent only sees the tools it is allowed to use.
| Scope | Gives access to | Who can grant it |
|---|---|---|
read | Catalog, categories, account and balance, credit history, orders, pack quotes. | Always included. |
cart | Add, edit and remove cart lines. | Any member of the organization. |
purchase | Order the cart or a pack, with credits. Includes the cart. | The organization owner only. |
Quick start
Every route starts with https://www.getlinkfast.com/api/v1. Keep the www: the address without www redirects, and an HTTP client no longer sends the Authorization header after a redirect.
Amounts are in euros excluding VAT. Responses are JSON, with snake_case fields.
curl https://www.getlinkfast.com/api/v1/account \
-H "Authorization: Bearer glf_live_…"curl "https://www.getlinkfast.com/api/v1/sites?dr_min=40&language=fr&product=guest_post&sort=dr&dir=desc&page_size=10" \
-H "Authorization: Bearer glf_live_…"curl -X POST https://www.getlinkfast.com/api/v1/cart/items \
-H "Authorization: Bearer glf_live_…" \
-H "Content-Type: application/json" \
-d '{"site_id":"8a1f0c3e-5b7d-4e2a-9c61-0f3b2d4e6a17","product_type":"guest_post","target_url":"https://www.example.com/invoicing","anchor":"invoicing software","topic":"How to choose invoicing software for a small business"}'Replace site_id with the id of a site from step 2. Never send a price: the server calculates it.
curl -X POST https://www.getlinkfast.com/api/v1/checkout \
-H "Authorization: Bearer glf_live_…" \
-H "Idempotency-Key: order-2026-10-14-001"The response gives the order id, the amount debited and your remaining balance. Then track its progress with GET /orders/{id}.
Ordering with credits
The API orders with credits only and never triggers a card payment. Credits are topped up in the dashboard.
An order takes the guest_post and link_insertion lines of the cart. Other lines, added from the dashboard, stay in the cart and are listed in skipped_items.
No cap by default: your balance is the only limit. On a key that can order, set a per-order cap and a cap over a rolling 24 hours. An order that exceeds them is refused (403 spending_limit_exceeded, with the remaining amount), with no debit.
Insufficient balance: 402 insufficient_credits, with the missing amount and the link to the Credits page, to pass on to someone on your team. Nothing is debited.
After that, everything works as from the dashboard: confirmation email and tracking in the Orders screen, where the order carries the name of the key that placed it.
The Idempotency-Key header
- Required on
POST /checkoutandPOST /packs/orders: 8 to 128 printable ASCII characters, no spaces. Without it:400 idempotency_key_required. - One value equals one purchase intent. Sending the same value again returns the original order (
200,"replayed": true) with no second debit, even if the cart has changed since. - After a timeout or a network failure, retry with the same value: you will not pay twice.
- For a new purchase, generate a new value, a UUID for example.
- On
POST /checkoutas onPOST /packs/orders, a value already used for another purchase is refused:409 idempotency_conflict, with no debit. For a pack, the same value sent with different content is refused too. - On the MCP side, the confirmation token plays this role: you have nothing to generate.
Limits
- 120 requests per minute per key for reading, and as many again, separately, for the cart: one does not eat into the other.
- 10 calls per minute per key to the purchase routes or tools — replays, refusals and the MCP summary step included.
- 300 HTTP requests per minute per key on the MCP server. Each tool called also counts toward the limit of its scope.
- Beyond that:
429 rate_limited. The wait, in seconds, is given by theRetry-Afterheader over HTTP, and bydetails.retry_after_secondsin an MCP tool result. - At most 100 results per page (
page_size). - Request body: 1 MB at most.
Error codes
Every error has the same shape. Test code: it is stable. message is in English and meant for the developer; details names the faulty field or the amounts.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this order. Nothing was debited. Ask a human to top up at credits_url, then retry with the same Idempotency-Key.",
"details": {
"missing_amount": 42,
"credits_url": "https://www.getlinkfast.com/dashboard/credits"
}
}
}| Code | HTTP | What it means |
|---|---|---|
invalid_json | 400 | The request body is not readable JSON. Check the syntax and the Content-Type: application/json header. |
idempotency_key_required | 400 | Idempotency-Key header missing or malformed on a purchase route. Send a value of 8 to 128 characters. |
invalid_api_key | 401 | Key missing, malformed, unknown or revoked, or created by a member who has left the organization. Check the Authorization: Bearer glf_live_… header. |
insufficient_credits | 402 | Insufficient balance. details.missing_amount gives the missing amount, details.credits_url the page to top up. Nothing was debited. |
insufficient_scope | 403 | The key does not have the scope this route or tool requires. Create a key with that scope. |
spending_limit_exceeded | 403 | The order exceeds a cap on the key: per order (window: order) or over 24 hours (window: 24h). details.remaining gives what is left. Nothing was debited. |
not_found | 404 | Resource not found, or not owned by your organization. |
method_not_allowed | 405 | MCP server: GET and DELETE are not accepted. Send each JSON-RPC message as POST. |
organization_financial_hold | 409 | Purchases are blocked on your organization. Contact us. Nothing was debited. |
page_already_sold | 409 | A page in the cart (link insertion) has just been sold. Remove the line, then order again with a new Idempotency-Key. |
cart_already_ordered | 409 | A cart line has already been ordered by another purchase (dashboard or another Idempotency-Key). Read the cart again before ordering with a new value. |
idempotency_conflict | 409 | This Idempotency-Key has already been used for another purchase. Use a new value for a new purchase. |
not_ready | 409 | The audit is not ready yet. Wait for the ready status with get_audit, then add the page. |
full_pass_running | 409 | The full audit report is still being prepared. Try again in a few minutes. Nothing was started. |
limit_reached | 409 | The audit already has 8 pages added by you, analyses in progress included. Nothing was started. |
already_present | 409 | This page is already in the audit, or its analysis is in progress. Nothing was started. |
already_ordered | 409 | This planned link is already ordered: it can no longer be cancelled here. |
not_cancellable | 409 | This link cannot be cancelled right now. Read it again with get_plan. |
team_planned | 409 | This link was scheduled by our team, not through the API: it cannot be cancelled here. To change it, the account owner contacts support. |
payload_too_large | 413 | Request body larger than 1 MB. |
invalid_parameter | 422 | Invalid, repeated or unknown query parameter. details.fields names each faulty parameter and the reason. |
invalid_arguments | 422 | Invalid combination of arguments, for example neither domain nor audit_id, or both. details.field names the field. Nothing was done. |
invalid_domain | 422 | Unreadable domain or URL. Send a domain name, for example example.com. |
own_network_domain | 422 | This domain is part of our publishing network: it cannot be audited. Nothing was started. |
invalid_body | 422 | Invalid or unknown field in the body. details.fields names each faulty field and the reason. |
product_not_available_via_api | 422 | The API sells guest posts and link insertions. Other products are ordered from the dashboard. |
image_not_uploaded | 422 | The featured image must have been uploaded to GetLinkFast from the dashboard. |
cart_empty | 422 | No cart line can be ordered through the API. Nothing was debited. |
cart_invalid | 422 | Some lines are incomplete or no longer available. details.items lists each line and its problems. Nothing was debited. |
invalid_pack_input | 422 | The pack does not follow its rules (details.reason). Nothing was debited. |
site_unavailable | 422 | This site does not exist or is no longer for sale. |
target_page_required | 422 | A link insertion requires page_id: take it from the site's list of pages. |
target_page_not_found | 422 | This page does not belong to this site. |
target_page_sold | 422 | This page has already been sold. |
target_page_withdrawn | 422 | This page is no longer offered. |
target_page_already_in_cart | 422 | This page is already in your cart. |
product_unavailable | 422 | This site does not sell this product. |
invalid_url | 422 | Unreadable address. Send a full http(s) address, without credentials or port. |
other_site | 422 | This page is not on the audited domain. Send a page of the same site. |
invalid_keyword | 422 | Target search too long: 120 characters at most. |
rate_limited | 429 | Too many requests for this key. Wait the number of seconds given by the Retry-After header over HTTP, or by details.retry_after_seconds in an MCP tool result. |
audit_quota_exceeded | 429 | This key has already started 10 audits in the last 24 hours. Nothing was started: retry later. |
internal_error | 500 | An error on our side, already reported to the team. Try again later: a purchase retried with the same Idempotency-Key is never debited twice. |
engine_unavailable | 502 | The audit engine is temporarily unreachable. Nothing was started: retry later. |
packs_unavailable | 503 | SEO/GEO packs are not available yet. |
confirmation_expired | MCP tool | Confirmation token expired, or cart, prices or key changed since the summary. Nothing was debited: call the tool again without a token to get a new summary. |
purchase_unavailable | MCP tool | Purchases through the MCP server are temporarily unavailable. Nothing was debited. Try again later. |
unknown_tool | MCP tool | Unknown tool, or not allowed by the key's scopes. tools/list gives the available tools. |
audit_failed | MCP tool | This audit failed, so no plan is possible. Start a new one with run_audit. Nothing was done. |
audit_not_ready | MCP tool | This audit is not finished. Wait for the ready status with get_audit, then call plan_links again. Nothing was done. |
budget_too_low | MCP tool | The monthly budget is below the minimum of €100 per month. Nothing was done. |
start_date_too_far | MCP tool | The start date is too far away. The message gives the latest allowed date. Nothing was done. |
too_many_pages | MCP tool | A project follows a limited number of pages. Send fewer new pages in target_urls. Nothing was done. |
plan_exists | MCP tool | This domain already has planned links that are not yet ordered. Plans are never merged: remove them with cancel_planned_link, then start again. Nothing was done. |
pending_proposals | MCP tool | Our team is reviewing proposed links for this domain, so no plan can be added for now. details.count gives their number and details.retry_after the date after which to try again (if not scheduled by then, they expire). Otherwise, ask the account owner to contact support. Nothing was done. |
no_links_found | MCP tool | No site in the catalog fits these pages with this monthly budget. Try other pages or a higher budget. Nothing was done. |
plan_in_progress | MCP tool | This plan is being saved right now. Call plan_links again with the same token in a few seconds to read the result. |
plan_outcome_unknown | MCP tool | Saving was interrupted and its outcome is unknown. Do not confirm again: read the plan with get_plan. |
plan_conflict | MCP tool | The plan no longer holds as it is: the project of the domain changed, its dates no longer fall within the budget months (which start at confirmation), or one of its sites is no longer available for this domain. details.reason says which. Nothing was written: call plan_links again without a token for a new summary. |
plan_retry | MCP tool | Another call with this token ended without saving the plan. Call plan_links again with the same token to read the result. |
MCP server
The MCP server gives your AI agent the same functions as the API, with the same key. Its address: https://www.getlinkfast.com/api/mcp.
Claude Code
One command in your terminal:
claude mcp add --transport http getlinkfast https://www.getlinkfast.com/api/mcp --header "Authorization: Bearer glf_live_…"Cursor
In ~/.cursor/mcp.json. Avoid a project's .cursor/mcp.json file: it often ends up in the repository, along with the key.
{
"mcpServers": {
"getlinkfast": {
"url": "https://www.getlinkfast.com/api/mcp",
"headers": {
"Authorization": "Bearer glf_live_…"
}
}
}
}Claude Desktop
Claude Desktop does not send custom headers to a remote server, so it cannot pass on your key. It will connect natively through the OAuth connection planned for an upcoming release. For now, use Claude Code or Cursor: they send the key in the Authorization header.
The tools
The agent only sees the tools allowed by the key's scopes: a key without the right to order has no purchase tool.
readsearch_sitesget_sitelist_site_pageslist_categoriesget_accountlist_ordersget_orderget_auditquote_packlist_auditsget_plancartget_cartadd_to_cartupdate_cart_itemremove_cart_itemadd_audit_pagerun_auditcancel_planned_linkpurchasecheckoutorder_packplan_links
Two-step purchase
- The agent calls
checkoutororder_packwithoutconfirmation_token: nothing is debited. It receives the summary (lines, total, balance after debit, remaining cap) and aconfirmation_token. - It shows you this summary. If you accept, it calls the tool again with the
confirmation_token: the order is placed and debited. - The token is valid for 10 minutes. If the cart, a price or the key changes in the meantime, it is refused (
confirmation_expired) and the agent repeats step 1. Calling again with the same token after a network failure returns the same order, with no second debit.
Hand-written client
The server is sessionless: each JSON-RPC message is sent as POST and the response comes back as JSON. Send Accept: application/json, text/event-stream and Content-Type: application/json, otherwise the server responds 406. GET and DELETE respond 405.
curl -X POST https://www.getlinkfast.com/api/mcp \
-H "Authorization: Bearer glf_live_…" \
-H "Accept: application/json, text/event-stream" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Audit and plan
An agent can audit a site, then spread links over several months from the report. Four steps, with the MCP server tools.
run_auditstarts the full audit of a domain: technical checks, ChatGPT visibility and the sites where a link would help. Allow a few minutes. Nothing is debited, and the report is unlocked with the organization's audit quota when it has one. Limit: 10 audits per key per 24 hours; asking again for the same domain within the hour returns the existing audit.get_auditreturns the status and the current step, then the report insummaryonce the status isready. Call it every 30 to 60 seconds.list_auditslists the organization's audits, newest first.plan_linksbuilds a calendar from a ready audit: a monthly budget in euros excluding VAT (at least €100), 2 to 12 months, and optionally a start date and the pages to target. Like a purchase, it takes two steps. Without a token nothing is saved: the agent receives the calendar (links, send dates, total) and aconfirmation_tokenvalid for 10 minutes. After your approval it calls the tool again with the same fields and the token, and the plan is saved.get_planfollows each link: target page, anchor, price and state (scheduled, ordered, published, cancelled or failed, with the cause of a failure such asinsufficient_credits).cancel_planned_linkcancels a link planned through the API, or all those of a domain not yet ordered. Links scheduled by our team stay in place:team_plannedfor one link,skipped_team_plannedfor their number.
Nothing is debited when the plan is saved. Each link is debited in credits on its send day, at the price re-read that day, during the daily morning pass (around 06:20 UTC). If the balance is short that day, the link is not ordered and shows as failed in get_plan. A link that is already ordered can no longer be cancelled.
Scopes: run_audit and cancel_planned_link need the cart scope, plan_links needs purchase, and get_audit, list_audits and get_plan need read. The key's spending limits apply to planned links.
In the dashboard, the Delegation page shows these links in the “Scheduled links” block. The organization owner can remove the links planned through the API there. Those planned by our team are read-only.
Reference
Each route with its scope and its matching MCP tool. Parameters, response schemas and errors route by route: the OpenAPI 3.1 description.
| Route | Scope | MCP tool | Purpose |
|---|---|---|---|
GET /sites | read | search_sites | Search the catalog: metrics, price, category, language, product; sorting and pagination. |
GET /sites/{id} | read | get_site | One site: metrics, prices and publishing rules. |
GET /sites/{id}/pages | read | list_site_pages | A site's pages open to link insertion, with their price and Google traffic. |
GET /categories | read | list_categories | Categories and their ids, for the category filter. |
GET /account | read | get_account | Organization, credit balance, key scopes and caps, 24-hour spending. |
GET /credits/transactions | read | none | Credit history. |
GET /orders | read | list_orders | Your orders, filterable by status and date. |
GET /orders/{id} | read | get_order | One order and its lines, with their status. |
GET /cart/items | cart | get_cart | The cart: lines, up-to-date prices and blocking problems. |
POST /cart/items | cart | add_to_cart | Add a guest post or a link insertion. |
PATCH /cart/items/{id} | cart | update_cart_item | Complete or edit a line's brief. |
DELETE /cart/items/{id} | cart | remove_cart_item | Remove a line. |
GET /audits/{id} | read | get_audit | Read an audit: status, current step, then the report. |
POST /audits/{id}/pages | cart | add_audit_page | Add a page to push to a ready audit (8 at most). The analysis runs 1 to 4 minutes: follow it with get_audit. Nothing is debited. |
POST /checkout | purchase | checkout | Order the cart with credits. |
POST /packs/quote | read | quote_pack | Price an SEO/GEO pack, with no debit. |
POST /packs/orders | purchase | order_pack | Order an SEO/GEO pack with credits. |
| MCP server only | cart | run_audit | Start the full audit of a domain. Nothing is debited. |
| MCP server only | read | list_audits | List the organization's audits, newest first. |
| MCP server only | purchase | plan_links | Plan links over 2 to 12 months from an audit, in two steps. Nothing is debited when the plan is saved. |
| MCP server only | read | get_plan | Read the planned links of a domain: send date and state of each. |
| MCP server only | cart | cancel_planned_link | Cancel one planned link, or all those of a domain not yet ordered. |
A question about the API? Write to us and someone on the team will answer.
