Zum Hauptinhalt springen

Beispiele

Verfügbar inProResearch

Vier kleine Beispiele, die echte Routen nutzen. Sie verwenden curl und Node 18 oder neuer, das fetch eingebaut hat, und keine Pakete. Jedes sagt, welche Scopes der Schlüssel braucht, erstelle also einen Schlüssel nur mit diesen. Siehe Authentifizierung und API-Schlüssel.

Setze deinen Schlüssel einmal in der Shell:

export READSIRA_KEY="pk_..."

Scopes: read:collections, write:bookmarks.

Ein Lesezeichen braucht einen title und die collectionId der Sammlung, in die es kommt. Liste zuerst deine Sammlungen auf und wähle eine:

curl "https://api.readsira.com/api/v1/collections" \
-H "Authorization: Bearer $READSIRA_KEY"

Die Antwort enthält deine Sammlungen in data. Kopiere die id einer davon und speichere dann den Link:

curl -X POST "https://api.readsira.com/api/v1/bookmarks" \
-H "Authorization: Bearer $READSIRA_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/grid-lab",
"title": "Grid Lab: long-duration storage",
"collectionId": "PUT-A-COLLECTION-ID-HERE",
"tags": ["energy"]
}'

Die Antwort enthält das neue Lesezeichen in data, einschließlich seiner id. tags ist optional, mit bis zu 20 Tags. Das Speichern eines Links zählt als Anfrage auf dein Tageslimit.

Die Markierungen eines gespeicherten Eintrags lesen​

Scope: read:library.

Die Suche findet den Eintrag und liefert seine documentId. Das Lesen des Dokuments gibt deine highlights, tags und notes neben dem Text zurück.

const headers = { Authorization: `Bearer ${process.env.READSIRA_KEY}` };

const search = await fetch(
'https://api.readsira.com/rest/v2/search?' + new URLSearchParams({ q: 'long-duration storage', limit: '1' }),
{ headers },
).then((r) => r.json());

const hit = search.data.results[0];
if (!hit) throw new Error('Nothing found');

const doc = await fetch(
`https://api.readsira.com/rest/v2/documents/${hit.documentId}?maxChars=1`,
{ headers },
).then((r) => r.json());

console.log(doc.data.title);
for (const h of doc.data.highlights) console.log('-', h.text, h.note ? `(${h.note})` : '');

maxChars=1 fordert ein Zeichen Text an, weil du hier nur die Markierungen willst. Markierungen kommen mit jeder Antwort. Um den ganzen Text zu lesen, siehe Paginierung.

Eine Frage mit Quellenangaben stellen​

Scope: ask:library. Das verbraucht dein KI-Budget und zählt auf die Antworten, die du jeden Monat bekommst.

curl -X POST "https://api.readsira.com/rest/v2/ask" \
-H "Authorization: Bearer $READSIRA_KEY" \
-H "Content-Type: application/json" \
-d '{ "question": "What did I save about iron-air batteries?" }'

Die Antwort in data hat answer mit Markierungen wie [1] und citations. Die Markierung [n] verweist auf citations[n-1], das den title, die url und das quote hat, auf dem sie beruht. verified ist true, wenn das Zitat in der zitierten Passage gefunden wurde.

Deine Bibliothek in eine Datei synchronisieren​

Scope: read:bookmarks.

Dieses Skript liest jedes Lesezeichen, eine Seite nach der anderen, und schreibt sie nach readsira-library.json. Es wartet, wenn die API sagt, dass du langsamer machen sollst. Starte es mit node sync.mjs.

import { writeFile } from 'node:fs/promises';

const BASE = 'https://api.readsira.com';
const headers = { Authorization: `Bearer ${process.env.READSIRA_KEY}` };

async function get(path) {
for (;;) {
const res = await fetch(BASE + path, { headers });
if (res.status === 429) {
const wait = Number(res.headers.get('retry-after') ?? 60);
console.log(`Rate limited, waiting ${wait} seconds`);
await new Promise((resolve) => setTimeout(resolve, wait * 1000));
continue;
}
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
return (await res.json()).data;
}
}

const bookmarks = [];
for (let page = 1; ; page++) {
const data = await get(`/api/v1/bookmarks?page=${page}&limit=100`);
bookmarks.push(...data.bookmarks);
console.log(`Page ${page}: ${bookmarks.length} of ${data.total}`);
if (!data.hasMore) break;
}

await writeFile('readsira-library.json', JSON.stringify(bookmarks, null, 2));
console.log(`Wrote ${bookmarks.length} bookmarks`);

Jeder Lauf liest die ganze Bibliothek, starte es also so oft wie nötig und nicht öfter. Für eine Kopie von allem einschließlich Notizen und Markierungen in einer Datei nutze den Export unter Datenschutz und deine Daten.

Tipps​

  • Prüfe eine Route in der Referenz, bevor du darauf aufbaust.
  • Behandle 429 wie im Sync-Skript und brich bei anderen Fehlern ab. Siehe Ratenlimits und Fehler.
  • Halte Schlüssel aus Skripten heraus, die du teilst. Lies sie aus der Umgebung.