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.
https://api.triivl.app/v1https://api.triivl.app/mcpiCloud 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.
Fra innstillinger til første kall
- Aktiver API i Triivl
Åpne Innstillinger → API og MCP. Slå på API, velg dine egne turer og aktiver rettighetene du ønsker. Lagre innstillingene.
- 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.
- La appen synkronisere, og les turene
Hold appen åpen mens de valgte turene synkroniseres. Bruk nøkkelen som Bearer-token i forespørselen.
# 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"{
"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.
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.
| Rettighet | Scope | Gir tilgang til |
|---|---|---|
| Lese | trips:read | Valgte turer og reisepunkter. |
| Opprette | trips:create | Nye turer og reisepunkter. |
| Endre | trips:update | Endringer i valgte turer og punkter. |
| Slette og gjenopprette | trips:delete | Myk sletting og gjenoppretting innen 30 dager. |
| Lese bookingreferanser | trips:bookings | Bookingkoder og bekreftelseskoder. Krever også lesetilgang. |
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.
Turer
Alle REST-kall under krever Authorization: Bearer DIN_API_NOKKEL. {tripId} er ID-en fra turresponsen.
/v1/tripstrips:readList 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.
/v1/trips/{tripId}trips:readLes hele turen, inkludert ideer og slettede punkter. Svaret inneholder trip, revision, syncedAt og bookingReferencesIncluded. Punktene ligger i trip.items.
export TRIP_ID='ID_FRA_TURLISTEN'
curl "https://api.triivl.app/v1/trips/$TRIP_ID" \
--header "Authorization: Bearer $TRIIVL_API_KEY"/v1/tripstrips:createOpprett en tur. requestId blir også turens ID. Tittelen er obligatorisk. kind er personal eller work, og er personal som standard. Datoer er valgfrie.
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\"
}
}"/v1/trips/{tripId}trips:updateSend bare feltene du vil endre i trip. Les turen først og kopier den siste revision til expectedRevision.
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\" }
}"/v1/trips/{tripId}trips:deleteFlytt turen til Nylig slettet. Send JSON med requestId og expectedRevision, uten trip eller item.
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\"
}"/v1/trips/{tripId}/restoretrips:deleteGjenopprett en slettet tur innen 30 dager. Bruk samme JSON-felter som ved sletting, med en ny requestId og revisjonen fra den slettede turen.
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.
/v1/trips/{tripId}/itemstrips:createLegg til et punkt. type og title er obligatoriske. requestId blir punktets ID. expectedRevision er turens siste revisjon.
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\"
}
}"/v1/trips/{tripId}/items/{itemId}trips:updateEndre 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.
{
"requestId": "c90d02d6-dcd4-479a-8cd3-d02c8df1dcf1",
"expectedRevision": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"item": { "title": "Hotel Brosundet", "planningState": "confirmed" }
}/v1/trips/{tripId}/items/{itemId}trips:deleteSlett punktet, med requestId og turens expectedRevision i JSON-body. Punktet kan gjenopprettes innen 30 dager.
/v1/trips/{tripId}/items/{itemId}/restoretrips:deleteGjenopprett punktet med en ny requestId og turens siste expectedRevision. Den overordnede turen må være aktiv.
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.
/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.
export REQUEST_ID='ID_FRA_SKRIVERESPONSEN'
curl "https://api.triivl.app/v1/trip-commands/$REQUEST_ID" \
--header "Authorization: Bearer $TRIIVL_API_KEY"| Status | Betydning |
|---|---|
pending | Venter på appen. Hold appen åpen. |
applying | En installasjon har tatt ansvar for endringen. Vent på resultatet. |
applied | Appen har lagret endringen. |
rejected | Endringen ble ikke lagret. Les resultCode og oppdater tur/revisjon ved behov. |
cancelled | En ventende forespørsel er trukket tilbake. |
unconfirmed | En 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.
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.
Felter og formater
Tur · trip
| Felt | Format | Detaljer |
|---|---|---|
title | Tekst | Obligatorisk ved oppretting, 1–500 tegn. |
kind | personal / work | Standard: personal. |
startDay, endDay | YYYY-MM-DD eller null | Valgfrie, gyldige kalenderdatoer. Slutt må være etter eller lik start. |
Reisepunkt · item
| Felt | Format / tillatte verdier |
|---|---|
type | Obligatorisk ved oppretting: flight, train, bus, transit, ferry, privateCar, taxi, carRental, lodging, restaurant, attraction, stop, generic. |
title | Obligatorisk ved oppretting, 1–500 tegn. |
subtitle, city, origin, destination, flightNumber | Valgfrie tekster, opptil 500 tegn, eller null. |
planningState | idea (standard) eller confirmed. |
startDate, endDate | Valgfrie 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, endTimeZoneID | Valgfrie, gyldige IANA-tidssoner, f.eks. Europe/Oslo. |
allDay | Valgfri boolean: true eller false. |
bookingReference, confirmationCode | Valgfrie 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.
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.
https://api.triivl.app/mcp- 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.
- Legg til serveren i AI-klienten
Velg en ekstern MCP-server, bruk adressen over og start klientens OAuth-innlogging.
- 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_agendagir nå ogsåderivedper aktivitet: minutter til start (startsInMinutes), turdag («Dag 2 av 3»),departsInMinutesogarrivesInMinutesfor fly, og innsjekk/utsjekk for overnatting.conflictsvarsler om overlapp og trange omstigninger. Eksisterende felt er uendret. Live flystatus er ikke med.search_itemssøker i tittel, undertittel, by, fra, til og flynummer, med valgfritt datointervall, type og tur. Resultatet er rangert og begrenset medlimit.check_plankontrollerer é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_tripgir en kort oversikt med dager, byer i rekkefølge og antall per type.create_itemogassign_itemreturnererhintsved siden av den køede endringen:possibleDuplicatesog, uten tur,suggestedTripsder datoen ligger i eller en dag fra turen. Dette er forslag. Ingenting tildeles eller endres automatisk. Uten lesetilgang girhintsbarechecked: false.parse_booking_textleser innlimt bekreftelsestekst med Triivls eksisterende regelbaserte importleser og foreslår punkter i samme form somcreate_item. Verktøyet lagrer og køer ingenting; chatten viser forslagene og kallercreate_itemetter at du har sagt ja. Fly bruker flyplassenes tidssoner; for andre steder sendestimeZonemed.
«Vis turene mine, og legg inn en idé om hotell i Ålesund på novemberturen.»
Krever lesetilgang og opprettetilgang til den valgte turen.| Verktøy | Scope |
|---|---|
get_agenda, list_items, get_item, list_trips, get_trip, search_items, check_plan, summarize_trip | trips:read |
create_trip, create_item, parse_booking_text | trips:create |
update_trip, update_item, assign_item | trips:update |
delete_trip, delete_item, restore_trip, restore_item | trips:delete |
get_change_status | Samme 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.
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.
| Metode | Adresse | Bruk |
|---|---|---|
| GET | /.well-known/oauth-protected-resource/mcp | MCP-ressurs og autorisasjonsserver. |
| GET | /.well-known/oauth-authorization-server | Discovery: scopes, PKCE og endepunkter. |
| POST | /oauth/register | Registrer klientnavn og redirect-URI-er. |
| GET | /oauth/authorize | Start godkjenning i appen. |
| POST | /oauth/token | Bytt engangskode eller roter refresh-token. |
| POST | /oauth/revoke | Trekk 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.
Feil og grenser
| HTTP | Vanlig årsak | Gjør dette |
|---|---|---|
400 | Ugyldig 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. |
401 | Manglende, utløpt, ugyldig eller frakoblet token. | Bruk en gyldig integrasjonsnøkkel eller fullfør OAuth. |
403 | Manglende rettighet eller turtilgang. | Kontroller innstillingene og tilkoblingens scopes. |
404 | Turen er ikke synkronisert, eller forespørselen finnes ikke for denne tilkoblingen. | Hold appen åpen og kontroller ID-en. |
409 | revision_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. |
429 | For 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. |
500 | Serverfeil. | Prøv igjen med samme requestId/body ved en skriveforespørsel. |
{
"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.
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