API-oversikt
Alle RolChat REST-endepunkter følger én kontrakt: samme basis-URL, samme svarkonvolutt, samme paginering, samme feilformat. Lær den én gang, så leses alle endepunktfamilier i endepunktreferansen på samme måte.
Basis-URL og versjonering
Section titled “Basis-URL og versjonering”https://api.rolchat.com/api/v1/Versjonen står i stien. Å legge til valgfrie felt, nye endepunkter eller nye spørringsparametere med standardverdier er ikke en bakoverinkompatibel endring og øker ikke versjonen. Bakoverinkompatible endringer leveres som v2, og avviklede v1-endepunkter fortsetter å virke i minst seks måneder etter at de er kunngjort (se Avvikling).
Autentisering
Section titled “Autentisering”| Metode | Header | Brukes til |
|---|---|---|
| JWT bearer | Authorization: Bearer <access_token> |
Interaktive økter (nettappen, mobilappene) |
| API-nøkkel | Authorization: Bearer rcp_<secret> |
Kall mellom maskiner, plugin-API-nøkler |
| HMAC-signatur | X-RolChat-Signature: sha256=… |
Innkommende webhooks fra systemene dine, se Webhooks |
| Ingen | - | Offentlige widgetendepunkter (/widget/…, /forms/…), avgrenset av nettsted og opprinnelse |
For integrasjoner bruker du en API-nøkkel (et personlig tilgangstoken). Nøkler opprettes i Innstillinger → Plugins → RolChat API-nøkler, vises én gang og lagres bare som en hash. En nøkkel kan aldri gjøre mer enn medlemmet som opprettet den: tilgangsomfanget kontrolleres mot medlemmets gjeldende tillatelser ved hvert kall. Se Autentisering for JWT-levetider, headeren X-Account-Id og økter i flere selskaper.
Svarkonvolutt
Section titled “Svarkonvolutt”En enkelt ressurs:
{ "data": { "id": "cnt_01HK…", "email": "ada@example.com" }, "meta": { "request_id": "req_01HK…" }}En liste:
{ "data": [ { … }, { … } ], "meta": { "request_id": "req_01HK…", "count": 50, "next_cursor": "cur_01HK…", "prev_cursor": "cur_01HK…", "has_more": true }}Svar uten body (204 No Content etter en sletting) har likevel headeren X-Request-Id.
En feil:
{ "errors": [ { "code": "validation_failed", "message": "Email must be valid.", "field": "email", "details": { "received": "not-an-email" } } ], "meta": { "request_id": "req_01HK…" }}code er maskinlesbar snake_case og er verdien du forgrener på; message er på engelsk og beregnet på logger. field og details er med når de er til hjelp, og inneholder aldri personopplysninger. API-et svarer aldri 200 med en errors-liste: hvis det finnes feil, er statusen 400 eller høyere. Den fullstendige kodelisten finner du på siden Feil.
Paginering
Section titled “Paginering”Listeendepunkter som kan vokse, bruker markørbasert paginering. Be om den første siden uten markør, og send deretter tilbake next_cursor du fikk, uendret:
GET /api/v1/contacts?limit=50GET /api/v1/contacts?limit=50&cursor=eyJrIjoi…limiter 50 som standard og maksimalt 200; større verdier avvises med400 validation_failed.- Markører er ugjennomsiktige og utløper etter 24 timer (
400 validation_failedmedcode: cursor_expired). - Resultatene er konsistente med øyeblikksbildet fra den første siden: poster som slettes mellom sidene, forsvinner, og nye poster vises først når du starter på nytt uten markør.
- En
Link-header medrel="next"ogrel="prev"sendes også for klienter som foretrekker det.
Idempotens
Section titled “Idempotens”Send en Idempotency-Key-header (en UUID eller ULID, opptil 255 tegn) med alle POST, PATCH eller DELETE:
- Den første forespørselen med en nøkkel kjøres, og statusen og bodyen lagres i 24 timer.
- En gjentakelse med samme nøkkel og samme body returnerer det lagrede svaret uten å utløse sideeffekter på nytt.
- En gjentakelse med samme nøkkel, men en annen body, avvises med
409 idempotency_key_conflict.
Bruk den for alle kall som oppretter noe med sideeffekter: sending av en melding, en e-post eller en SMS, oppringing, alt som faktureres. GET-forespørsler er alltid idempotente og ignorerer headeren.
Hastighetsgrenser
Section titled “Hastighetsgrenser”Grensene telles per minutt og er knyttet til kontoen, API-nøkkelen eller brukeren (til IP-adressen på ruter som ikke krever innlogging). Standardgrensene:
| Gruppe | Standardgrense | Per minutt |
|---|---|---|
| Forespørsler uten innlogging (per IP) | 60 | per IP |
| Innlogget bruker (dashbordet) | 1 000 | per bruker |
| API-nøkkel | 1 000 | per nøkkel |
| Offentlige widgetendepunkter | 60 per besøkende og 600 per nettverksadresse | per minutt |
Innlogging (/auth/login) |
5 | per IP |
| Innkommende webhooks | 300 | per minutt |
| MCP-server | 600 | per minutt |
| OAuth-endepunkter | 600 | per minutt |
Grensene er plattformens standardverdier og kan endres av operatøren; abonnementet ditt multipliserer dem ikke, og Enterprise-grenser avtales i kontrakten. Endepunkter med hastighetsgrense returnerer:
X-RateLimit-Limit: 1000X-RateLimit-Remaining: 543Når du overskrider en grense, er svaret 429 med code: rate_limited i errors-matrisen og en Retry-After-header i sekunder. Vent så lenge før neste kall. Ti mislykkede innlogginger låser kontoen i 30 minutter.
Størrelser og tidsavbrudd
Section titled “Størrelser og tidsavbrudd”| Kategori | Maks. størrelse på forespørselsbody | Tidsavbrudd på serveren |
|---|---|---|
| Standard | 1 MB | 30 s |
| Melding med vedlegg | 25 MB | 30 s |
| CSV-import | 50 MB | returnerer 202 og kjører i bakgrunnen |
| Bilder i kunnskapsbasen | 10 MB | 30 s |
| Masse-API | 10 MB | 30 s |
| Søk | 1 MB | 10 s |
| AI-forespørsler | 1 MB | 60 s |
| Widgetendepunkter | 100 KB | 30 s |
For store bodyer får 413 payload_too_large. En oppstrømstjeneste som får tidsavbrudd, svarer 504 med code: upstream_timeout og et retry_after-hint når et nytt forsøk kan hjelpe.
Innholdstyper, datoer og ID-er
Section titled “Innholdstyper, datoer og ID-er”- Forespørsler og svar er
application/json; charset=utf-8. Filopplastinger brukermultipart/form-data; CSV-eksporter returnerertext/csv. Ugyldig UTF-8 avvises med400 validation_failed. - Tidsstempler er ISO-8601 i UTC med millisekundpresisjon:
2026-04-20T14:23:45.123Z. Alle ISO-8601-forskyvninger godtas i inndata og normaliseres til UTC. - Identifikatorer er ugjennomsiktige ULID-er eller UUID-er. Det finnes ingen numeriske ID-er, og e-postadresser eller telefonnumre vises aldri i en URL.
Kundeisolering og tillatelser
Section titled “Kundeisolering og tillatelser”Hver autentisert forespørsel kjører innenfor én konto. En ressurs som tilhører en annen konto, eller et nettsted anroperens rolle ikke dekker, svarer 404 not_found i stedet for 403, slik at det aldri lekker ut at poster finnes. Et gyldig token uten den nødvendige tillatelsen (for eksempel contacts.delete) svarer 403 forbidden. Noen tillatelser har et omfangssuffiks (conversations.read:own, :team, :all) som begrenser hva en liste returnerer.
PATCH godtar bare skrivbare felt. id, account_id, created_at, updated_at og tilstandsfelt som resolved_at er skrivebeskyttet; sender du ett av dem, returneres 400 validation_failed med details.forbidden_fields. Tilstandsendringer går gjennom egne handlinger, som POST /tickets/:id/resolve.
Hver skriveoperasjon registreres i kontoens revisjonslogg.
Headere for observerbarhet
Section titled “Headere for observerbarhet”Hvert svar inneholder:
X-Request-Id: req_01HK…Logg X-Request-Id. Det er det første kundestøtte spør etter.
Opprinnelsen til dashbordet i nettleseren er https://app.rolchat.com. Offentlige widgetendepunkter tillater alle opprinnelser, eller bare opprinnelsene du verifiserer for et nettsted. Kall mellom servere med en API-nøkkel er ikke underlagt CORS.
Avvikling
Section titled “Avvikling”- Endringen kunngjøres i endringsloggen, og det berørte endepunktet begynner å sende
Deprecation: trueog enSunset-header med fjerningsdatoen. - Offentlige endepunkter fortsetter å virke i minst seks måneder etter kunngjøringen.
- Fjerning skjer bare i en ny hovedversjon. Innenfor
v1er endringene kun tillegg.
Hver tjeneste eksponerer /healthz (liveness) og /readyz (readiness).