Paginering + idempotens
Cursor-paginering på hvert liste-endepunkt; Idempotency-Key på hvert tilstandsendrende endepunkt. To mønstre å internalisere én gang; hvert endepunkt følger dem.
Cursor-paginering
Alle liste-endepunkter (GET /api/v1/public/sessions, /evidence, /whiteboards, osv.) returnerer en konvolutt:
{
"data": [
{ /* resource */ },
{ /* resource */ }
],
"has_more": true,
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wNS0yMVQxNDoyMSswMDowMCJ9"
} Slik paginerer du
- Send den første forespørselen uten en
cursor-parameter. - Hvis
has_moreertrue, sendnext_cursorordrett somcursor-spørringsparameter på neste forespørsel. - Gjenta til
has_moreerfalse.
curl "https://app.nexbasira.com/api/v1/public/sessions?limit=25" \
-H "Authorization: Bearer nb_sec_..."
# response includes next_cursor: "eyJjcmVhdGVkX2F0Ijo..."
curl "https://app.nexbasira.com/api/v1/public/sessions?limit=25&cursor=eyJjcmVhdGVkX2F0Ijo..." \
-H "Authorization: Bearer nb_sec_..." Grenser
| Parameter | Standard | Maks |
|---|---|---|
limit | 25 | 100 |
Høyere limit-verdier reduserer antall rundturer, men øker payload-størrelsen per respons + serialiseringstiden. Standard 25 passer for UI-bruk; nattlige batchjobber sender typisk 100.
Cursor-form
Cursoren er ugjennomsiktig for klienter — den er en base64-kodet JSON-blob som koder posisjonen i det underliggende queryset-et. Ikke parse eller konstruer cursors; bare send dem ordrett. Formen er ikke stabil på tvers av API-versjoner.
Rekkefølge
Standard rekkefølge er created_at DESC (nyeste først) for hvert liste-endepunkt. Dette er også rekkefølgen cursoren beveger seg i — du vil gå fra nyeste til eldste etter hvert som du paginerer.
SDK-hjelpere
Begge SDK-ene leverer en transparent async-iterator som paginerer for deg:
// @nexbasira/node
for await (const session of nb.sessions.list({ limit: 100 })) {
// ...
}
// nexbasira (Python)
for session in nb.sessions.iter(limit=100):
... Idempotens
Hvert tilstandsendrende endepunkt godtar en Idempotency-Key-header. Send en unik nøkkel (typisk en UUID) per logiske operasjon; et nytt forsøk med samme nøkkel returnerer den cachede responsen uten å opprette ressursen på nytt.
curl -X POST https://app.nexbasira.com/api/v1/public/sessions \
-H "Authorization: Bearer nb_sec_..." \
-H "Idempotency-Key: 01HGAB7T8X3PVT3HKEXAMPLE" \
-H "Content-Type: application/json" \
-d '{"notes": "Vehicle damage CL-2026-0042"}' Cache-vindu
Cachede responser lever i 24 timer. Å spille av på nytt etter 24t med samme nøkkel oppretter en ny ressurs — behandle nøkkelen som gyldig bare for varigheten av retry-loopen din.
Scope-avgrensning
Nøkler er avgrenset til (credential, endpoint, method):
- Et nytt forsøk fra samme legitimasjon til samme endepunkt med samme nøkkel returnerer den cachede responsen.
- En annen legitimasjon som bruker samme nøkkel oppretter en ny ressurs (behandler det som et nytt kall).
- Samme nøkkel på et annet endepunkt oppretter en ny ressurs (egen cache-plass).
Hva som caches
Bare vellykkede responser (2xx). En mislykket forespørsel forgifter ikke cachen — det neste forsøket ditt med samme nøkkel får et nytt forsøk.
Header-ekko
Vellykkede idempotente svar sender nøkkelen tilbake i Idempotency-Key-svarhodet — nyttig for logging / korrelasjon.
Generere nøkler
Bruk hva som helst som er globalt unikt per logisk operasjon:
crypto.randomUUID()i Node 19+uuid.uuid4()i Python- Din forretningsprosess-id (f.eks. skadenummer + tidsstempel) hvis du vil ha lesbare spor i loggene
SDK-hjelpere
// @nexbasira/node — pass via second arg
await nb.sessions.create(
{ notes: "..." },
{ idempotencyKey: crypto.randomUUID() },
);
// nexbasira (Python)
nb.sessions.create(notes="...", idempotency_key=str(uuid.uuid4())) Hva er neste steg
- Feil + hastighetsgrenser — hva som skjer når paginering eller retry-løkker går galt
- Sessions API — første endepunkt som anvender begge mønstre