Import links with Claude or the API
If you have a long list of links, for example an export from another app, you can send them all to Lazy Reader at once. Every link is saved like any other save and gets its own summary. There are two ways in: ask Claude, or, if you are a developer, call the API.
No import screen exists in the app. This page is the whole method.
Every link sent without a summary is summarized with your OpenRouter key, so a long list costs more than a few saves. Without a key saved in Lazy Reader the links are still saved, and wait as Needs a key until you add one. A link sent with its own summary needs no key.
Ask Claude
Claude can import for you with the import_items tool on the Lazy Reader connector.
- Connect Claude to Lazy Reader first, if you have not already. See Connect Claude.
- In a chat with the Lazy Reader connector on, give Claude your links, up to 50 at a time. Paste the list into the chat, or attach the file that holds it.
- Ask, for example:
- "Import these links into Lazy Reader."
- "Here is my export from another app. Send every link in it to Lazy Reader."
- Claude sends them with one call and gets back how many were new, how many were already in your library, and which ones failed. For a longer list, ask Claude to send it in parts of 50.
Items Claude imports read "Saved through the MCP connector" on their page.
Use the API (for developers)
The API takes the same list from your own code. The key is your capture token.
- Get your capture token. In Lazy Reader open Settings, then Capture. Under Capture token for scripts, press the copy button next to Capture token.
- Send
POST https://lazyreader.app/api/customImportwith the token in thex-reader-tokenheader and a JSON body.
The body is { "items": [ { "url": "..." } ] }. Each item can also carry title, text (the full text, if you have it) and summary. An item with a summary is ready at once and no model runs for it.
curl -X POST https://lazyreader.app/api/customImport \
-H "x-reader-token: $LAZYREADER_TOKEN" \
-H "content-type: application/json" \
-d '{"items":[{"url":"https://example.com/a"}]}'The answer counts the batch and lists each link:
{
"created": 1,
"duplicates": 0,
"errors": 0,
"skipped": 0,
"results": [{ "url": "https://example.com/a", "status": "created", "id": "..." }]
}Each result has a status: created (new), duplicate (already in your library), error (with the reason in error) or skipped (over the daily limit, see below).
| Status code | What it means |
|---|---|
200 | The batch went through. The counts say what happened to each link. |
400 | The call was refused, for example "Too many items: 73. Send at most 50 items per call." |
401 | The token is wrong or missing. Copy it again from Settings. |
A link that is not a valid http or https address gets "Not a valid link". One longer than 2,048 characters gets "Link is too long". One bad link never stops the rest of the batch.
Items you import through the API read "Sent by your own automation" on their page.
WARNING
Your capture token lets anyone save to your library. Do not share it. If it leaks, press Regenerate token in Settings, Capture. The old token stops working at once, and so does the Chrome clipper until you connect it again.
Limits
These limits are the same for Claude and the API.
| Limit | Value |
|---|---|
| Links per call | 50. A call with more is refused. |
| Text per call | 4,000,000 characters of text and summaries together. |
| New items per day | 500, from the API and Claude together, over a rolling 24 hours. Links past the limit are not saved and come back with "Daily limit of 500 new items reached. Send the rest tomorrow." Duplicates do not count. Calls sent at the same moment can let a few more through. |
Lazy Reader sets no wait between calls, but leaving about a minute between batches of 50 keeps your model from hitting its own rate limit.
Sending the same links again adds nothing. A link already in your library, saved any other way, is left as it is.
