triivl/ utviklere
API v1OpenAPI
TRIIVL DOKUMENTASJON v1.0

Reiseplanen din.
Også i verktøyene dine.

Les turer, legg til reisepunkter og koble en AI-chat til Triivl. Du velger hvilke turer den får tilgang til, og hva den kan gjøre.

REST · BASE URLhttps://api.triivl.app/v1
MCP · STREAMABLE HTTPhttps://api.triivl.app/mcp
Appen beholder reiseplanen.

iCloud er hovedlageret. API-et leser en privat, synkronisert kopi av turene du har valgt. Endringer sendes til appen, som kontrollerer og lagrer dem. Appen må være åpen for å behandle nye endringer.

01

Fra innstillinger til første kall

  1. Aktiver API i Triivl

    Åpne Innstillinger → API og MCP. Slå på API, velg dine egne turer og aktiver rettighetene du ønsker. Lagre innstillingene.

  2. Opprett en API-nøkkel

    Gi tilkoblingen et navn og kopier nøkkelen når den vises. Nøkkelen vises bare én gang og varer i opptil 90 dager. Den nye innstillingssiden må være installert i appen.

  3. La appen synkronisere, og les turene

    Hold appen åpen mens de valgte turene synkroniseres. Bruk nøkkelen som Bearer-token i forespørselen.

Terminal · ditt første API-kall
# Sett nøkkelen lokalt. Ikke legg den i kode eller Git.
export TRIIVL_API_KEY='DIN_API_NOKKEL'

curl 'https://api.triivl.app/v1/trips' \
  --header "Authorization: Bearer $TRIIVL_API_KEY"
200 OK · eksempelrespons
{
  "trips": [
    {
      "id": "e27a8846-c0c9-42e5-a308-d35c060e336e",
      "title": "Helg i Ålesund",
      "kind": "personal",
      "startDay": "2026-11-06",
      "endDay": "2026-11-08",
      "deletedAt": null,
      "revision": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
      "syncedAt": "2026-10-14T19:10:00.000Z"
    }
  ]
}

Alle ID-er, datoer og revisjoner på denne siden er eksempeldata. Bruk ID og revision fra din egen respons.

02

Du velger tilgangen

API og MCP har hvert sitt oppsett. Begge er av som standard. En API-nøkkel gir tilgang til REST, mens en godkjent MCP-tilkobling gir tilgang til MCP. Appens innloggingstoken kan ikke brukes som integrasjonsnøkkel.

Tilgjengelige rettigheter
RettighetScopeGir tilgang til
Lesetrips:readValgte turer og reisepunkter.
Opprettetrips:createNye turer og reisepunkter.
Endretrips:updateEndringer i valgte turer og punkter.
Slette og gjenopprettetrips:deleteMyk sletting og gjenoppretting innen 30 dager.
Lese bookingreferansertrips:bookingsBookingkoder og bekreftelseskoder. Krever også lesetilgang.
Bookingreferanser har et eget valg.

Dette valget er av som standard. Uten tillatelsen utelates bookingReference og confirmationCode fra leseresponsen. En tilkobling med opprette-/endrerettighet kan likevel skrive inn en referanse uten å få lese eksisterende koder.

Utvidede innstillinger utvider ikke automatisk en eksisterende nøkkel eller tilkobling. Opprett en ny nøkkel eller godkjenn MCP-tilkoblingen på nytt for å gi flere rettigheter. Tilgang kontrolleres ved hvert kall, og kan trekkes tilbake i appen.

Dokumenter, bilder, kvitteringer, private notater, seter, nøyaktige adresser, koordinater og pakkelister er utelatt fra dette API-et.

03

Turer

Alle REST-kall under krever Authorization: Bearer DIN_API_NOKKEL. {tripId} er ID-en fra turresponsen.

GET/v1/tripstrips:read

List aktive turer du har valgt for API-tilgang. Bruk ?deleted=true for nylig slettede turer. Svaret er { "trips": [...] }, med ID, tittel, datoer, revisjon og siste synkronisering.

GET/v1/trips/{tripId}trips:read

Les hele turen, inkludert ideer og slettede punkter. Svaret inneholder trip, revision, syncedAt og bookingReferencesIncluded. Punktene ligger i trip.items.

Les en valgt tur
export TRIP_ID='ID_FRA_TURLISTEN'

curl "https://api.triivl.app/v1/trips/$TRIP_ID" \
  --header "Authorization: Bearer $TRIIVL_API_KEY"
POST/v1/tripstrips:create

Opprett en tur. requestId blir også turens ID. Tittelen er obligatorisk. kind er personal eller work, og er personal som standard. Datoer er valgfrie.

Opprett en tur · 202 Accepted
REQUEST_ID="$(uuidgen)"

curl --request POST 'https://api.triivl.app/v1/trips' \
  --header "Authorization: Bearer $TRIIVL_API_KEY" \
  --header 'Content-Type: application/json' \
  --data "{
    \"requestId\": \"$REQUEST_ID\",
    \"trip\": {
      \"title\": \"Helg i Ålesund\",
      \"kind\": \"personal\",
      \"startDay\": \"2026-11-06\",
      \"endDay\": \"2026-11-08\"
    }
  }"
PATCH/v1/trips/{tripId}trips:update

Send bare feltene du vil endre i trip. Les turen først og kopier den siste revision til expectedRevision.

Endre tittel
export REVISION='REVISJON_FRA_GET_TRIP'

REQUEST_ID="$(uuidgen)"

curl --request PATCH "https://api.triivl.app/v1/trips/$TRIP_ID" \
  --header "Authorization: Bearer $TRIIVL_API_KEY" \
  --header 'Content-Type: application/json' \
  --data "{
    \"requestId\": \"$REQUEST_ID\",
    \"expectedRevision\": \"$REVISION\",
    \"trip\": { \"title\": \"Langhelg i Ålesund\" }
  }"
DELETE/v1/trips/{tripId}trips:delete

Flytt turen til Nylig slettet. Send JSON med requestId og expectedRevision, uten trip eller item.

Slett en tur · krever siste revisjon
REQUEST_ID="$(uuidgen)"

curl --request DELETE "https://api.triivl.app/v1/trips/$TRIP_ID" \
  --header "Authorization: Bearer $TRIIVL_API_KEY" \
  --header 'Content-Type: application/json' \
  --data "{
    \"requestId\": \"$REQUEST_ID\",
    \"expectedRevision\": \"$REVISION\"
  }"
POST/v1/trips/{tripId}/restoretrips:delete

Gjenopprett en slettet tur innen 30 dager. Bruk samme JSON-felter som ved sletting, med en ny requestId og revisjonen fra den slettede turen.

04

Reisepunkter

Reisepunkter er fly, hotell, leiebil og andre aktiviteter i en tur. Nye punkter blir ideer som standard. Sett planningState: "confirmed" for å legge punktet i planen. API-et bestiller eller kjøper ingenting.

POST/v1/trips/{tripId}/itemstrips:create

Legg til et punkt. type og title er obligatoriske. requestId blir punktets ID. expectedRevision er turens siste revisjon.

Legg til en hotellidé
REQUEST_ID="$(uuidgen)"

curl --request POST "https://api.triivl.app/v1/trips/$TRIP_ID/items" \
  --header "Authorization: Bearer $TRIIVL_API_KEY" \
  --header 'Content-Type: application/json' \
  --data "{
    \"requestId\": \"$REQUEST_ID\",
    \"expectedRevision\": \"$REVISION\",
    \"item\": {
      \"type\": \"lodging\",
      \"title\": \"Hotell i Ålesund\",
      \"city\": \"Ålesund\",
      \"planningState\": \"idea\",
      \"startDate\": \"2026-11-06T15:00:00+01:00\",
      \"endDate\": \"2026-11-08T11:00:00+01:00\",
      \"startTimeZoneID\": \"Europe/Oslo\",
      \"endTimeZoneID\": \"Europe/Oslo\"
    }
  }"
PATCH/v1/trips/{tripId}/items/{itemId}trips:update

Endre et eksisterende punkt med requestId, expectedRevision og en item med de endrede feltene. Type kan ikke endres på et eksisterende punkt. Valgfrie tekst-/datofelter som tillater null, kan tømmes med null.

Eksempel på JSON-body · bruk egne ID-er og siste revisjon
{
  "requestId": "c90d02d6-dcd4-479a-8cd3-d02c8df1dcf1",
  "expectedRevision": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "item": { "title": "Hotel Brosundet", "planningState": "confirmed" }
}
DELETE/v1/trips/{tripId}/items/{itemId}trips:delete

Slett punktet, med requestId og turens expectedRevision i JSON-body. Punktet kan gjenopprettes innen 30 dager.

POST/v1/trips/{tripId}/items/{itemId}/restoretrips:delete

Gjenopprett punktet med en ny requestId og turens siste expectedRevision. Den overordnede turen må være aktiv.

05

Følg endringen helt fram

En skriverespons med 202 Accepted betyr at forespørselen er lagt i kø. Den er først lagret i appen når status er applied. Appen kontrollerer gjeldende rettigheter og revisjon før lagring.

1Send endringen202 · pending
2Appen kontrollererapplying
3Lagret i appenapplied
GET/v1/trip-commands/{requestId}

Les status med den samme nøkkelen som sendte endringen. Tilkoblingen må fortsatt ha rettigheten og tilgang til turen. id i skriveresponsen er forespørselens requestId.

Sjekk en endring
export REQUEST_ID='ID_FRA_SKRIVERESPONSEN'

curl "https://api.triivl.app/v1/trip-commands/$REQUEST_ID" \
  --header "Authorization: Bearer $TRIIVL_API_KEY"
Mulige endringsstatuser
StatusBetydning
pendingVenter på appen. Hold appen åpen.
applyingEn installasjon har tatt ansvar for endringen. Vent på resultatet.
appliedAppen har lagret endringen.
rejectedEndringen ble ikke lagret. Les resultCode og oppdater tur/revisjon ved behov.
cancelledEn ventende forespørsel er trukket tilbake.
unconfirmedEn påbegynt endring fikk ikke et bekreftet resultat. Les gjeldende tur før du forsøker på nytt.

Trygg gjentakelse

Lag en ny UUID for hver ny endring, for eksempel med uuidgen. Ved nettverksfeil gjentar du samme forespørsel med samme requestId, samme body og samme nøkkel. Ikke generer en ny ID ved et slikt nytt forsøk: behold REQUEST_ID og gjenta bare curl-kallet, ikke linjen med uuidgen. Ulik body eller tilkobling med samme ID avvises.

Det kan bare være én ventende/påbegynt endring per tur. Vent på resultatet og les turens nye revisjon før neste endring. Ventende forespørsler utløper etter 24 timer. Statusoppføringer beholdes i opptil 90 dager.

Les siste revisjon før endring.

Alle endringer unntatt oppretting av en ny tur krever expectedRevision. Den må være lik den siste 64-tegns revisjonen fra API-et. Dersom turen er endret i mellomtiden, avvises forespørselen med revision_conflict.

06

Felter og formater

Tur · trip

Skrivbare turfelter
FeltFormatDetaljer
titleTekstObligatorisk ved oppretting, 1–500 tegn.
kindpersonal / workStandard: personal.
startDay, endDayYYYY-MM-DD eller nullValgfrie, gyldige kalenderdatoer. Slutt må være etter eller lik start.

Reisepunkt · item

Skrivbare reisepunktfelter
FeltFormat / tillatte verdier
typeObligatorisk ved oppretting: flight, train, bus, transit, ferry, privateCar, taxi, carRental, lodging, restaurant, attraction, stop, generic.
titleObligatorisk ved oppretting, 1–500 tegn.
subtitle, city, origin, destination, flightNumberValgfrie tekster, opptil 500 tegn, eller null.
planningStateidea (standard) eller confirmed.
startDate, endDateValgfrie ISO 8601-tidspunkter med tidssone, f.eks. 2026-11-06T15:00:00+01:00, eller null. Slutt må være etter eller lik start.
startTimeZoneID, endTimeZoneIDValgfrie, gyldige IANA-tidssoner, f.eks. Europe/Oslo.
allDayValgfri boolean: true eller false.
bookingReference, confirmationCodeValgfrie tekster, opptil 200 tegn, eller null. Krever eget scope for lesing.

Ukjente felter avvises. ID-er er UUID-er. revision er 64 heksadesimale tegn. syncedAt viser når backend sist mottok kopien, og er ikke en garanti for at en lukket app har sendt sine siste endringer.

07

Snakk med Triivl fra en AI-chat

Bruk en klient som støtter MCP med Streamable HTTP og OAuth. Legg til Triivls serveradresse, og godkjenn tilgangen i appen.

MCP-serveradresse
https://api.triivl.app/mcp
  1. Aktiver MCP i appen

    Slå på MCP og velg rettighetene under Innstillinger → API og MCP. «Alle egne turer» er standard og inkluderer nye turer. Velg «Velg enkelte turer» for å begrense tilgangen. API trenger ikke å være aktivert. Bookingreferanser er et eget tilvalg.

  2. Legg til serveren i AI-klienten

    Velg en ekstern MCP-server, bruk adressen over og start klientens OAuth-innlogging.

  3. Godkjenn tilkoblingen i Triivl

    Godkjenningssiden åpner appen. Kontroller klientens navn og rettighetene før du godkjenner. Hvis lenken ikke åpner appen, kan forespørselskoden fra siden legges inn manuelt i innstillingene. Forespørselen varer i fem minutter.

Pågående tur og enkeltpunkter

Bruk get_agenda for «hva er neste?» og «i morgen». Ett kall gir pågående tur, neste aktivitet og bekreftede punkter for datoen, også punkter uten tur. Tider kommer ferdig i lokale tidssoner. Et fly som lander kl. 11:00 kan gi et forslag om taxi kl. 11:30; dette er minst 30 minutters planleggingsmargin, avrundet opp til nærmeste kvarter, ikke en bestilling.

create_item kan brukes uten tripId. Punktet opprettes som idé uten å lage en kunstig tur. assign_item knytter punktet til en tur senere, eller fjerner tilknytningen med destinationTripId: null. Begge sider krever endringsrettighet og gjeldende revisjon. «Alle egne turer» inkluderer egne punkter uten tur. Ved enkeltutvalg har «Punkter uten tur» sitt eget tilvalg.

Smartere lesing og skriving

Verktøyene regner ut svarene deterministisk fra de synkroniserte kopiene. Det brukes ingen KI-modell, ingen nye data lastes opp, og alle verktøy følger rettighetene og turutvalget du har valgt. Bookingreferanser vises bare med eget tilvalg; seter, adresser og notater er aldri med.

  • get_agenda gir nå også derived per aktivitet: minutter til start (startsInMinutes), turdag («Dag 2 av 3»), departsInMinutes og arrivesInMinutes for fly, og innsjekk/utsjekk for overnatting. conflicts varsler om overlapp og trange omstigninger. Eksisterende felt er uendret. Live flystatus er ikke med.
  • search_items søker i tittel, undertittel, by, fra, til og flynummer, med valgfritt datointervall, type og tur. Resultatet er rangert og begrenset med limit.
  • check_plan kontrollerer én tur: netter uten overnatting, overlappende punkter, trange omstigninger, transport som ender et annet sted enn neste punkt starter (bare når begge steder er kjent og kan sammenlignes), punkter uten tid og antall ubekreftede idéer. summarize_trip gir en kort oversikt med dager, byer i rekkefølge og antall per type.
  • create_item og assign_item returnerer hints ved siden av den køede endringen: possibleDuplicates og, uten tur, suggestedTrips der datoen ligger i eller en dag fra turen. Dette er forslag. Ingenting tildeles eller endres automatisk. Uten lesetilgang gir hints bare checked: false.
  • parse_booking_text leser innlimt bekreftelsestekst med Triivls eksisterende regelbaserte importleser og foreslår punkter i samme form som create_item. Verktøyet lagrer og køer ingenting; chatten viser forslagene og kaller create_item etter at du har sagt ja. Fly bruker flyplassenes tidssoner; for andre steder sendes timeZone med.
PRØV I CHATEN

«Vis turene mine, og legg inn en idé om hotell i Ålesund på novemberturen.»

Krever lesetilgang og opprettetilgang til den valgte turen.
MCP-verktøy og rettigheter
VerktøyScope
get_agenda, list_items, get_item, list_trips, get_trip, search_items, check_plan, summarize_triptrips:read
create_trip, create_item, parse_booking_texttrips:create
update_trip, update_item, assign_itemtrips:update
delete_trip, delete_item, restore_trip, restore_itemtrips:delete
get_change_statusSamme rettighet og tilkobling som endringen.

Klienten får bare tilbud om verktøyene den har lov til å bruke. Skriveverktøyene bruker den samme køen og revisjonskontrollen som REST. Chatklienten må bruke get_change_status for å kontrollere at endringen er lagret.

Tilgang til en ekstern AI-klient betyr at denne klienten mottar dataene du tillater. Du kan koble den fra i appen når som helst.

08

OAuth for MCP-klienter

Triivl støtter offentlige klienter uten klienthemmelighet, eksakte redirect-URI-er og Authorization Code med PKCE S256. Klienter bør lese discovery-metadata framfor å hardkode oppsettet.

OAuth-endepunkter
MetodeAdresseBruk
GET/.well-known/oauth-protected-resource/mcpMCP-ressurs og autorisasjonsserver.
GET/.well-known/oauth-authorization-serverDiscovery: scopes, PKCE og endepunkter.
POST/oauth/registerRegistrer klientnavn og redirect-URI-er.
GET/oauth/authorizeStart godkjenning i appen.
POST/oauth/tokenBytt engangskode eller roter refresh-token.
POST/oauth/revokeTrekk tilbake en tilkobling.
Parametere og tokenlevetid

Registrering krever client_name og redirect_uris. Redirects må være HTTPS eller HTTP på loopback 127.0.0.1 / [::1], uten fragment eller brukerinformasjon.

Autorisasjon krever response_type=code, client_id, redirect_uri, state, code_challenge, code_challenge_method=S256 og resource=https://api.triivl.app/mcp. scope er en mellomromseparert liste, standard trips:read.

Metadata annonserer alle støttede scopes. Appen viser og godkjenner bare den delen klienten har bedt om som brukeren har aktivert. Klienten får ikke flere rettigheter enn den viste godkjenningen.

Engangskoden varer i 60 sekunder. Access-token varer i 15 minutter. Refresh-token roteres ved bruk og har en absolutt levetid på 30 dager. Tokenendepunktet godtar JSON eller URL-encoded form. Se OpenAPI for alle request-/response-felter.

MCP bruker stateless HTTP POST med JSON-respons. GET og DELETE på /mcp gir 405; serveren bruker ikke SSE eller vedvarende MCP-sesjoner. Uautorisert POST gir 401 med en WWW-Authenticate-header som peker til ressursmetadata.

09

Feil og grenser

HTTP-feil og anbefalt håndtering
HTTPVanlig årsakGjør dette
400Ugyldig body, dato, UUID eller ukjent felt (invalid_request).Meldingen navngir hvert felt og hva som ble forventet; error.details har det samme per felt. Verdiene du sendte gjentas aldri.
401Manglende, utløpt, ugyldig eller frakoblet token.Bruk en gyldig integrasjonsnøkkel eller fullfør OAuth.
403Manglende rettighet eller turtilgang.Kontroller innstillingene og tilkoblingens scopes.
404Turen er ikke synkronisert, eller forespørselen finnes ikke for denne tilkoblingen.Hold appen åpen og kontroller ID-en.
409revision_conflict, eller gjenbrukt ID med andre data.Les siste tur/status. Ikke overskriv med en gammel revisjon. Flere endringer kan vente på én tur; appen utfører dem i rekkefølge, hver på revisjonen den forrige ga.
429For mange forespørsler: 300 i minuttet per nøkkel eller tilkobling (rate_limited).Vent før du prøver igjen. Bruk Retry-After når den er oppgitt.
500Serverfeil.Prøv igjen med samme requestId/body ved en skriveforespørsel.
Eksempel på REST-feil · 409 Conflict
{
  "error": {
    "code": "revision_conflict",
    "message": "Trip has changed. Read its current revision."
  }
}

Ved valg av enkelte turer: opptil 1 000 valgte turer per kanal. MCP med «Alle egne turer» har ingen slik utvalgsgrense. Maksimalt 1 000 punkter per tur. Nøkkel-/klientnavn er opptil 100 tegn. Private integrasjonsresponser har Cache-Control: no-store. Leseresponser er synkroniserte kopier; kontroller syncedAt.

Lister er sidedelt: GET /v1/items og list_items svarer med høyst 100 elementer (limit, maks 500) fra offset, ordnet etter start, med total, truncated og nextOffset; en turs elementer sidedeles likt med itemLimit og itemOffset. Alt MCP kan lese finnes også som REST: GET /v1/items/search, GET /v1/trips/{id}/plan, GET /v1/trips/{id}/summary og POST /v1/booking-text, med samme rettigheter som verktøyene.

10

Hele kontrakten, i OpenAPI

Last ned OpenAPI 3.1-spesifikasjonen for komplette skjemaer, sikkerhetsoppsett og endepunkter. Den inkluderer også appens egne backend-endepunkter; disse bruker appinnlogging og er ikke tilgjengelige med en integrasjonsnøkkel.

Last ned OpenAPI YAML