Manage your page from code, or from an AI assistant. The API reads your page, rows and cards, and with the write scope it adds, edits, schedules, reorders and deletes them. It is a beta, so details can change, and it is included with Premium and Studio.
Always use www.linklynx.bio. The bare domain redirects, and many clients drop the Authorization header when they follow a redirect.
New to the API? Follow the step-by-step guide, from your first token to changing a card.
Authentication and permissions
Every request carries a personal access token: Authorization: Bearer llk_.... Tokens start with llk_. Treat one like a password and keep it on your server. Never put it in a browser, a public repo or a client app. The API sends no CORS headers on purpose.
Each token has scopes. Pick only what the code needs.
Scope
What it allows
Status
read
See your page, rows and cards.
Live
write
Add, edit, schedule, reorder and delete cards and rows, and edit your name and bio.
Live
video
Generate cinematic videos.
Coming soon
Expiry: 30 days, 90 days, 1 year, never. The default is 90 days.
Revoke a token in the editor at any time. It stops working right away.
Up to 10 active tokens per page.
Premium or Studio is required. If your plan drops to Free, requests answer 403 plan_required until it is back. Your tokens are kept.
Rate limits and errors
60 requests per minute per token. Past that you get 429 with a Retry-After header. The count is kept per server instance, so treat it as approximate. Responses are never cached.
No Authorization header, or it is not a Bearer token.
invalid_token
401
The token is not recognized. Check for typos or a truncated copy.
token_revoked
401
The token was revoked in the editor.
token_expired
401
The token passed its expiry date. Create a new one.
plan_required
403
The page is no longer on Premium or Studio. Tokens are kept and work again when the plan is back.
insufficient_scope
403
The token does not have the scope this endpoint needs.
invalid_parameter
400
A query parameter is missing or malformed.
invalid_body
400
The JSON body is malformed, has an unknown field, or a value is out of range. The message names the field.
limit_reached
403
Your plan limit for rows, items per row or total items is reached. Upgrade or delete something first.
not_found
404
The thing you asked for does not exist on your page.
row_not_empty
409
The row still has cards. Move or delete them, or pass force=true to delete the row with its cards.
rate_limited
429
More than 60 requests in a minute for this token. Wait for Retry-After seconds.
internal_error
500
Something went wrong on our side. Try again.
Endpoints
Base URL https://www.linklynx.bio/api/v1. Responses are { "data": ... } with snake_case fields. This reference is generated from the OpenAPI spec, so it always matches what is live.
Other statuses: 400, 401, 403, 404, 429. See errors.
POST/api/v1/cards
Create a card from a link
Scope: write. Fetches the page at url for a title, description and image, the same autofill as the editor's quick add, so the call can take a few seconds. Fields you send win over what was found. If the page gives no title, the host name is used. The card goes last in row_id, or in your first row (a row called My Links is created if you have none). Plan item limits apply (403 limit_reached). The thumbnail is copied into LinkLynx storage right after the response.
Request body (JSON)
Field
Type
Required
Description
url
string
Yes
http or https link. A missing scheme becomes https.
Other statuses: 400, 401, 403, 404, 429. See errors.
DELETE/api/v1/rows/{id}
Delete a row
Scope: write. A row that still has cards is refused with 409 row_not_empty. Pass force=true to delete it together with its cards (this cannot be undone). The editor asks for confirmation before it does the same.
Scope: write. Send only the fields to change. thumbnail_url must be https and is copied into LinkLynx storage like an image pasted in the editor; null removes it. scheduled_at in the future hides the card from visitors, the sitemap, llms.txt, JSON-LD, social previews and Ask the lynx until then; null (or a past time) makes it live. row_id moves the card to the end of another row (plan row limits apply). Email signup cards only accept title, subtitle, pinned and row_id. A card on another page is a 404.
Query parameters
Name
Type
Required
Description
id
string (uuid)
Yes
The card id.
Request body (JSON)
Field
Type
Required
Description
title
string
No
subtitle
string
No
href
string
No
http or https link.
thumbnail_url
string (uri) | null
No
https image URL, copied into LinkLynx storage. null removes the image.
pinned
boolean
No
Pinned cards keep their place when Smart Layout reorders.
scheduled_at
string (date-time) | null
No
ISO 8601. A future time hides the card until then. null makes it live.
Scope: write. Send every card id of the row exactly once, in the new order. A missing, repeated or foreign id is a 400 invalid_body and nothing changes. With Smart Layout on, your order is kept as your manual order.
Request body (JSON)
Field
Type
Required
Description
row_id
string (uuid)
Yes
card_ids
array
Yes
Every card id of the row, once each, in the new order.
Other statuses: 400, 401, 403, 404, 429. See errors.
Use with your AI agent (MCP)
LinkLynx has a remote MCP server, so your AI agent can look after your page for you: review it, rewrite titles, add and schedule cards, reorder rows. It uses the same personal access token and the same rules as the REST API, so your plan limits and the token's scopes apply.
Endpoint: https://www.linklynx.bio/api/mcp. Create a token in the editor first. Use the read scope to let it look, add write to let it change things.
Works with any MCP-compatible agent. Claude Code, claude.ai and Claude Desktop are documented below, and other MCP clients that support remote HTTP servers with custom headers, such as Cursor and VS Code, connect with the endpoint above and your token as the Authorization header. ChatGPT is not supported yet, because it needs OAuth sign-in, which is coming later.
Open Settings, then Connectors, then add a custom connector.
Enter the URL https://www.linklynx.bio/api/mcp.
Add a request header named Authorization with the value Bearer llk_..., using your token.
Ask for something like “review my LinkLynx page and suggest a stronger first row”. The redesign_my_page prompt walks your agent through a review and a plan, and it waits for your yes before changing anything.
OpenAI Codex (CLI and IDE extension)
Codex works today with a token. Put your token in an environment variable named LINKLYNX_TOKEN, then add this to your Codex config.toml. ChatGPT, the chat app, is a different product that needs OAuth sign-in, which is coming later.
Any client that supports a remote HTTP MCP server with custom headers works the same way. Add a server with the URL https://www.linklynx.bio/api/mcp and an Authorization header with the value Bearer llk_..., using your token. In Cursor that is a url plus headers entry in your MCP config. In VS Code it is an http server with headers.
What your agent can do
Tool
Scope
What it does
get_page
read
Get page
list_cards
read
List cards
get_card
read
Get card
get_analytics
read
Get analytics
update_page
write
Update page text
add_card
write
Add card
update_card
write
Update card
delete_card
write
Delete carddeletes
reorder_cards
write
Reorder cards
create_row
write
Create row
rename_row
write
Rename row
reorder_rows
write
Reorder rows
delete_row
write
Delete rowdeletes
Your agent can also read linklynx://page, a plain outline of your rows and cards in order, so it knows the page before it edits. Video generation is not part of this yet.
Safety
The token is the control. A read token cannot change anything, and a write token can only touch your own page. Revoke it in the editor and your agent stops at once.
Your agent is told to show you a plan before editing and to ask before any delete. Tools that delete are marked as destructive, so clients ask for approval too.
Every change your agent makes is recorded in the same audit log as API writes. Your plan limits apply, and cards you schedule stay hidden until their time.
Only connect an assistant you trust. Anything it can read from the web can try to steer it, so skim what it plans to change.
ChatGPT: coming soon. It needs sign-in instead of a token, and so does adding LinkLynx from the claude.ai connector directory.
Versioning and API changelog
The major version is in the URL: /api/v1.
v1 only gets additive, non-breaking changes, such as new endpoints, new optional parameters and new response fields. Write your client to ignore fields it does not know.
A breaking change ships as /api/v2. v1 keeps working for at least 6 months after that, and its responses carry Deprecation and Sunset headers.
While this is a beta, fields can still change before 1.0. Every change is listed below. The product changelog lives on the What's new page.
API changelog
added
MCP server
There is now a remote MCP server at https://www.linklynx.bio/api/mcp (Streamable HTTP, stateless). It takes the same personal access token as the REST API, as a Bearer header, with the same scopes, plan check, expiry, revocation and rate limit. Read tools: get_page, list_cards, get_card, get_analytics. Write tools: update_page, add_card, update_card, delete_card, reorder_cards, create_row, rename_row, reorder_rows, delete_row. Writes are recorded in the audit log with the path /mcp:<tool>. Errors keep the same codes and messages. See the Use with your AI agent section.
added
Write endpoints for cards, rows and page text
With the write scope you can now create, change, schedule, pin, move, reorder and delete cards (POST /cards, PATCH and DELETE /cards/{id}, POST /cards/reorder), manage rows (POST /rows, PATCH and DELETE /rows/{id}, POST /rows/reorder) and change your display name and bio (PATCH /page). New error codes: invalid_body, limit_reached and row_not_empty. Cards and rows now include updated_at, which needs the new database migration.
added
v1 beta: personal access tokens, GET /page, /rows, /cards
Premium and Studio pages can create personal access tokens in the editor and read their page, rows and cards. Read scope only. Write and video scopes are listed but not live yet.
Code samples
Keep the token in an environment variable, never in source. Check the status and read error.code when it is not 200.
import os
import requests
res = requests.get(
"https://www.linklynx.bio/api/v1/rows",
headers={"Authorization": f"Bearer {os.environ['LINKLYNX_TOKEN']}"},
timeout=10,
)
res.raise_for_status()
for row in res.json()["data"]:
print(row["title"], row["card_count"])
Questions, or something you wish the API did? Tell me.