Push links from scripts, bots, and automations. Pull your reading list into any tool.
Use cases
Slack automation
Script that watches a Slack channel and archives every link your team drops - automatically saved to your dashboard.
GitHub repo archiving
Pipe starred repos or trending repositories straight into send/links so you never lose an interesting project.
RSS & newsletters
Connect an RSS feed or email digest and push articles you want to read later without opening the browser.
Zapier / Make
Trigger a save from any app in your stack - new Notion page, Airtable row, or calendar event with a link.
Authentication
All requests require an Authorization header with your API key.
Authorization: Bearer sml_your_key_hereAPI keys start with sml_. Generate yours in Settings - Developer.
Base URL
https://sendlinks.app/api/v1Rate limits
No rate limits are enforced during the beta.
Limits will be introduced before general availability. Be a good citizen - avoid hammering the API in tight loops.
Errors
All error responses follow the same shape. Check ok first, then read error for a human-readable message and code for programmatic handling.
{ "ok": false, "error": "Link already saved", "code": "DUPLICATE" }
| 401 | Unauthorized | Missing or invalid API key. |
| 400 | INVALID_URL | The URL is malformed or could not be fetched. |
| 400 | — | Missing required field, e.g. "url" is required. |
| 409 | DUPLICATE | Link is already saved in your account. |
| 500 | — | Server error - safe to retry with backoff. |
Endpoints
Save a link to your dashboard.
Body parameters
| urlrequired | string | The URL to save. |
| note | string | Optional note to attach to the link. |
| folderId | string | Save into a specific folder by its ID. Folder IDs are not yet exposed via API - coming soon. |
Example request
curl -X POST https://sendlinks.app/api/v1/push -H "Authorization: Bearer sml_your_key" -H "Content-Type: application/json" -d '{"url":"https://medium.com/p/cool-article-example","note":"read this weekend"}'
Response 201 Created
{ "ok": true, "link": { "id": "64f1a2b3c4d5e6f7a8b9c0d1", "url": "https://medium.com/p/cool-article-example", "title": "Cool Article Example", "category": "Tech", "createdAt": "2026-04-16T10:00:00.000Z" } }
Error example 400 bad URL
{ "ok": false, "error": "Invalid or unreachable URL", "code": "INVALID_URL" }
Fetch your saved links with optional filters and pagination.
Query parameters
| limit | number | Results per page. Default 20, max 100. |
| page | number | Page number. Default 1. |
| category | string | Filter by category e.g. Tech, Entertainment, Science. |
| unread | boolean | Pass true to return only unread links. |
Example request
curl "https://sendlinks.app/api/v1/links?limit=5&unread=true" -H "Authorization: Bearer sml_your_key"
Response
{ "ok": true, "links": [ { "id": "64f1a2b3c4d5e6f7a8b9c0d1", "url": "https://medium.com/p/cool-article-example", "title": "Cool Article Example", "description": "A short description...", "image": "https://cdn.example.com/og.png", "category": "Tech", "domain": "medium.com", "note": "read this weekend", "isPinned": false, "isFavourite": false, "isRead": false, "createdAt": "2026-04-16T10:00:00.000Z" } ], "pagination": { "page": 1, "limit": 5, "total": 42, "totalPages": 9 } }
Playground
Get your API key in SettingsQuick start
Node.js
Save a link with the native fetch API - no dependencies needed.
const API_KEY = process.env.SENDLINKS_API_KEY async function saveLink(url, note) { const res = await fetch("https://sendlinks.app/api/v1/push", { method: "POST", headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ url, note }), }) const data = await res.json() if (!data.ok) throw new Error(data.error) return data.link } // usage saveLink("https://medium.com/p/cool-article-example", "read later") .then(link => console.log("Saved:", link.id)) .catch(err => console.error(err.message))
Python - Slack bot
Save every link your team posts in a Slack channel.
import os, re, requests from slack_bolt import App API_KEY = os.environ["SENDLINKS_API_KEY"] app = App(token=os.environ["SLACK_BOT_TOKEN"]) URL_RE = re.compile(r"https?://[^\s>]+") @app.event("message") def on_message(event, say): for url in URL_RE.findall(event.get("text", "")): requests.post( "https://sendlinks.app/api/v1/push", headers={"Authorization": f"Bearer {API_KEY}"}, json={"url": url, "note": f"from #{event['channel']}"}, ) if __name__ == "__main__": app.start(3000)
Ready to build?
Generate your API key in settings.