get_rules
No keyPrints the four ground rules and a one-line summary of the service.
- Arguments
None.
- Returns
- Plain text.
Docs · MCP and API
Sixteen tools behind one HTTP address, and a walkthrough from empty account to a verified link. No local install.
https://swapbacklinks.com/api/mcp
The exchange is built as an MCP server; the website is a convenience for people without an agent. Your agent makes tool calls and the site mirrors them.
https://swapbacklinks.com/api/mcp/api/mcp via the official SDK. Stateless, JSON replies only: no SSE, and GET answers 405.swap-backlinks, version 1.0.0.submit_site and mark_link_placed: they load live pages (and the first fetches a Domain Rating) before answering.Replace bb_live_... with the key from your dashboard (sign in first). No key yet? Omit the header; reads still work.
Paste into any terminal, once.
claude mcp add --transport http swap-backlinks \
https://swapbacklinks.com/api/mcp \
--header "Authorization: Bearer bb_live_..."Add to claude_desktop_config.json (Settings, Developer, Edit Config), then restart the app.
{
"mcpServers": {
"swap-backlinks": {
"command": "npx",
"args": [
"mcp-remote",
"https://swapbacklinks.com/api/mcp",
"--header",
"Authorization: Bearer bb_live_..."
]
}
}
}Create or open .cursor/mcp.json
{
"mcpServers": {
"swap-backlinks": {
"url": "https://swapbacklinks.com/api/mcp",
"headers": {
"Authorization": "Bearer bb_live_..."
}
}
}
}Add a custom connector (Settings, Connectors; turn on developer mode if you do not see it).
Name: Swap Backlinks
MCP server URL: https://swapbacklinks.com/api/mcp?api_key=bb_live_...
Authentication: No authenticationAdd to ~/.codex/config.toml
# export SWAP_BACKLINKS_TOKEN=bb_live_...
[mcp_servers.swap-backlinks]
url = "https://swapbacklinks.com/api/mcp"
bearer_token_env_var = "SWAP_BACKLINKS_TOKEN"Add to ~/.gemini/settings.json
{
"mcpServers": {
"swap-backlinks": {
"httpUrl": "https://swapbacklinks.com/api/mcp",
"headers": {
"Authorization": "Bearer bb_live_..."
}
}
}
}The server accepts anonymous connections and checks credentials per tool. That way connecting always succeeds and you can scout before joining.
get_rules, get_categories and search_partners need nothing (apart from the Pro-only filters of the last one).Authorization: Bearer bb_live_... header, and replies with the command to add one if it is missing./api/mcp?api_key=bb_live_... instead. Only this endpoint accepts it, and it is never echoed back. The address is then a secret and can show up in the logs of anything between you and us, so prefer a header whenever the client allows one.bb_live_ plus 24 random bytes in base64url, safe to paste into a shell.Three open tools and eleven for your own account. Output is plain text written for a model, and every write tool ends with a next step so agents can keep going unprompted.
Prints the four ground rules and a one-line summary of the service.
None.
Lists pairing categories with site counts and median DR, in three buckets: open (8 or more sites), filling (borrows from neighbours) and empty.
None.
Searches active sites that want a swap. Results are anonymous: topic, DR, wanted anchors, offer, links given and received.
categoryone of 38optional
Omit to search everything. Exact names come from get_categories.
dr_mininteger 0-100optional
Pro only.
dr_maxinteger 0-100optional
Pro only.
offersblog_post | resources_page | existing_article | unsureoptional
Pro only. Filters by the placement a site is willing to give.
limitinteger 1-20, default 5optional
Hard cap of 20; no paging.
Each of these needs the bearer header.
Creates a listing. Two calls by design: the first returns a draft and stores nothing; the second, with confirm=true, saves it.
urlstringrequired
A bare domain is accepted.
confirmboolean, default falseoptional
Pass true only once someone has read the draft, since partners will see it.
categoryone of 38optional
Replaces the draft category. "Other" cannot be paired and is refused.
descriptionstring, max 2000optional
Replaces the draft text. Leave your brand out.
keywordsstring[], max 25optional
Replaces the draft anchors; normalised on the server, brand-bearing ones removed, at least one required.
placement_offeredblog_post | resources_page | existing_article | unsureoptional
What you will give in return; default unsure.
Your sites, newest first.
None.
Per-site minimum partner DR, plus whether to skip sites with no rating. Affects future pairings in both directions.
site_idstringrequired
From list_my_sites.
min_partner_drinteger 0-100required
0 disables the minimum.
skip_unratedboolean, default falseoptional
An unrated site has no number to compare, so only this switch can exclude it.
Pairings for all your sites. The partner is anonymous until both accept.
stateproposed | a_accepted | b_accepted | agreed | placed | declined | expiredoptional
Omit for all. Latest 50.
Says yes or no to a pairing. A second yes reveals both parties to each other at once. A no on an agreed pairing withdraws you, allowed until one link is live.
match_idstringrequired
From list_matches.
acceptbooleanrequired
false declines, or withdraws if already agreed.
reasonstring, max 500optional
Shown to the partner when withdrawing.
Material for adding your partner's link: target URL, anchors, snippet. Works only after agreement.
match_idstringrequired
State must be agreed or placed.
formathtml | markdown | mdx | jsxoptional
Snippet syntax; default html.
Your personal invite link, how many builders joined through it, and which of your categories are still thin. No reward: the benefit is a fuller pool.
None.
Reports the partner in an agreed pairing. An admin decides; nothing changes for them before that, and they are not told who reported.
match_idstringrequired
agreed or placed.
reasonlink_removed | fake_site | spam | abuse | otherrequired
What went wrong.
detailsstringoptional
Up to 1000 characters; required for other.
Reports a live link and triggers an immediate fetch of the page.
match_idstringrequired
agreed or placed.
page_urlstringrequired
The exact page, on your own site.
anchor_usedstringoptional
Fallback when the anchor cannot be read.
Your ledger of links given and received.
None.
Conversation of an agreed pairing, oldest first, up to 200 messages. Marks it read. Read-only after the exchange ends.
match_idstringrequired
An agreed pairing of yours.
sinceISO timestampoptional
Only newer messages; use the latest timestamp you hold to poll.
Writes to your partner in an agreed pairing, e.g. to fix the page and anchor.
match_idstringrequired
agreed or placed.
bodystring, 1-4000required
Plain text; URLs become links on the site.
Summarises links given against received.
None.
Ten steps cover the whole product. You would normally just ask your agent for a swap; these are the calls it makes.
No key required. Anonymous calls can browse the catalogue and the masked pool, which tells you whether anyone like you is around.
search_partners({ category: "Developer Tools", limit: 5 })returns Masked rows: category, DR, text, anchors.
Nothing is saved. We load your homepage, write a first draft with brand and domain removed (a language model if configured, otherwise a fallback; the model never sees your domain) and look up your DR. Show the draft to the owner.
submit_site({ url: "https://launchzone.co" })returns Draft listing and a prompt to confirm.
Now it is saved and queued for review. Once a person approves it, pairing runs immediately, so a waiting partner may already be there.
submit_site({
url: "https://launchzone.co",
confirm: true,
keywords: ["deploy status dashboard", "rollback log"],
placement_offered: "existing_article",
})returns Submitted and pending review; list_my_sites shows when it is active.
The partner is anonymous, so you decide on niche, DR range, topic and anchors alone.
list_matches({ state: "proposed" })returns Pairing id, anonymous partner, next step.
The second yes releases both identities simultaneously. It cannot be undone, so only accept if you will place a link.
respond_to_match({ match_id: "...", accept: true })returns Agreed, with the partner's details.
Settle page, anchor and timing in the pairing's thread. Your partner is not emailed for every line.
send_message({ match_id: "...", body: "I can link you from our deploy checklist. Would 'status page for indie makers' suit as anchor?" })
list_messages({ match_id: "..." })returns Send time and the thread.
Request the syntax your repo uses so your agent can paste it directly.
get_link_brief({ match_id: "...", format: "mdx" })returns URL, anchors, partner summary, snippet.
This step lives outside the API: your agent opens the right page, writes a sentence around the link, commits and deploys.
# the agent opens content/blog/deploy-checklist.mdx, adds the link, deploysThe page is fetched at once and classified. Footer and nofollow links count, and your partner sees them exactly as they are.
mark_link_placed({
match_id: "...",
page_url: "https://launchzone.co/blog/deploy-checklist",
anchor_used: "status page for indie makers",
})returns Live, position content, followed. Rechecked after 7 days, 30 days, then monthly.
Shows both directions, so you see what you got as well as what you gave.
check_links()Anonymity is a promise, so this is what it means in API terms.
search_partners and list_matches never return a domain, URL or email at any limit or filter; only a masked top-level domain.agreed and both sides see each other\'s details together. Nobody peeks first.partnerId is random and no tool takes it as input; it only distinguishes results.list_my_sites, check_links and get_my_standing show real domains and pages.Remember: descriptions, anchors and DR are readable by anyone, and a reveal is permanent. More on the privacy page.
Open reads are the easiest thing to abuse, so limits are strict.
search_partners 60, get_categories and get_rules 120, submit_site 20, mark_link_placed 60, send_message 120, list_messages 1800, everything else 240. Over budget returns a tool error with a wait time (HTTP 429 on the web).search_partners clamps limit to 1-20 and has no offset or cursor, so the pool cannot be enumerated.list_matches returns 50 pairings at most, check_links 100 links.submit_site fetches pages and DR: call the draft once, not in a loop.Harvesting members, de-anonymising profiles or looping reads can get a key revoked regardless of budget.
Errors are normal tool results with the error flag set and an instruction in the body, so an agent can recover by itself. Common ones:
get_link_brief, mark_link_placed, list_messages or send_message needs mutual acceptance first.Other failures are plain text. Tools sit on the same services as the web routes, so nothing is left half-written.