Kalendere

Abonner på uken fra en kalenderapp.10 operasjoner

Hoder på hvert svar

Hvert svar på denne siden har disse hodene.
X-Trace-Id
— The W3C trace id of this request — the same id in the log and in the traceId of a problem. Quote it when reporting.
Server-Timing
— Where the time went: total, db;dur=…;desc="N queries", and every step the handler named (ADR-163).
X-Diagnostics
— Only when the request asked with X-Diagnostics: 1 or ?diagnostics=1: the same breakdown as one JSON object, with the trace id (ADR-163).

Operasjoner

GET/api/v1/households/{householdId}/calendar-events

List upcoming events from every feed, one slice per feed

Any member, a Junior included (#553). from defaults to today and to to from + 14 days; the window is clamped to 31 days. A feed that cannot be read comes back with a fixed error on its own slice — one broken calendar never hides the others (#979). busyEvenings names, per day, the event that touches that day's dinner hour — the planner's rule, so the week marks the day busy for the same reason (#3379).

Parametre

NavnHvorTypePåkrevdBeskrivelse
householdIdpathstring (uuid)Påkrevd—
fromquerystring (date)——
toquerystring (date)——

Svar

200OK
application/jsonUpcomingCalendarEventsResponse
400The request could not be read as the route needs it: a body that is not the documented shape (a required field left out, a null where none is allowed, a value too long for its field), a parameter that does not parse, or a NUL character anywhere (#3540, #3541, #3543). Code validation_failed or value_too_long.
application/problem+jsonProblemDetails
401No session, or the session is no longer valid.
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl -b "bryti_session=…" \
  "https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/calendar-events"

Eksempel på svar

200application/json
{
  "feeds": [
    {
      "feedId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "feedName": "string",
      "events": [
        {}
      ],
      "error": "string"
    }
  ],
  "from": "2026-09-07",
  "to": "2026-09-07",
  "busyEvenings": [
    {
      "date": "2026-09-07",
      "title": "string",
      "startTime": "string",
      "endTime": "string"
    }
  ]
}
GET/api/v1/calendar/{token}.icsTrenger ingen sesjon

Fetch the planned dinners as an iCalendar feed from a private link

Public: a calendar app fetches it with no account (#3394); the token in the path is the proof. Each dinner cooked at home from 14 days back to 42 ahead is one event from when to start cooking until it is served, titled with the dish, with a UID stable per household and date. A token Bryti did not mint, or one the household has replaced or turned off, answers 404 without saying which. Rate-limited per IP.

Parametre

NavnHvorTypePåkrevdBeskrivelse
tokenpathstringPåkrevd—

Svar

200OK
404Not Found
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl \
  "https://bryti.app/api/v1/calendar/string.ics"
GET/api/v1/households/{householdId}/calendar-feeds

List the household's calendar feeds

Both kinds: Ics (a shared address the server fetches) and Device (a phone's own calendar the app pushes, #222). Pass deviceKey to have the row this very phone pushed marked isThisDevice — only that phone can act on «Oppdater nå» (#1186); the web app sends none. An ICS address is masked to scheme and host (https://host/…/•••) for every caller — it is a bearer key to the whole calendar, and only the answer to the create request carries it whole (#3581). isMine marks the device feeds the caller's own login pushed (ADR-087).

Parametre

NavnHvorTypePåkrevdBeskrivelse
householdIdpathstring (uuid)Påkrevd—
deviceKeyquerystring——

Svar

200OK
application/jsonCalendarFeedResponse[]
400The request could not be read as the route needs it: a body that is not the documented shape (a required field left out, a null where none is allowed, a value too long for its field), a parameter that does not parse, or a NUL character anywhere (#3540, #3541, #3543). Code validation_failed or value_too_long.
application/problem+jsonProblemDetails
401No session, or the session is no longer valid.
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl -b "bryti_session=…" \
  "https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/calendar-feeds"

Eksempel på svar

200application/json
[
  {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "name": "string",
    "url": "string",
    "createdAt": "2026-09-07T16:30:00Z",
    "kind": "Ics",
    "isThisDevice": false,
    "isMine": false
  }
]
POST/api/v1/households/{householdId}/calendar-feeds

Subscribe the household to an ICS calendar address

Adults only; a Junior member gets 403. The server fetches the address later, so it passes the same guard as recipe-URL import — http(s), standard ports, no loopback/private/link-local — and is refused with 400 otherwise (#979).

Parametre

NavnHvorTypePåkrevdBeskrivelse
householdIdpathstring (uuid)Påkrevd—

Forespørselskropp

application/jsonPåkrevdCreateCalendarFeedRequest

Svar

201Created
application/jsonCalendarFeedResponse
400Bad Request
application/problem+jsonProblemDetails
401No session, or the session is no longer valid.
application/problem+jsonProblemDetails
404Not Found
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl -b "bryti_session=…" \
  -X POST \
  "https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/calendar-feeds" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","url":"string"}'

Eksempel på svar

201application/json
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "name": "string",
  "url": "string",
  "createdAt": "2026-09-07T16:30:00Z",
  "kind": "Ics",
  "isThisDevice": false,
  "isMine": false
}
DELETE/api/v1/households/{householdId}/calendar-feeds/{feedId}

Remove a calendar feed

Adults only; a Junior member gets 403. A device calendar is its owner's alone (ADR-087): another member removing it by id gets 403 (#3581).

Parametre

NavnHvorTypePåkrevdBeskrivelse
householdIdpathstring (uuid)Påkrevd—
feedIdpathstring (uuid)Påkrevd—

Svar

204No Content
401No session, or the session is no longer valid.
application/problem+jsonProblemDetails
403Forbidden
application/problem+jsonProblemDetails
404Not Found
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl -b "bryti_session=…" \
  -X DELETE \
  "https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/calendar-feeds/3fa85f64-5717-4562-b3fc-2c963f66afa6"
PUT/api/v1/households/{householdId}/calendar-feeds/device

Push this phone's own calendar events, replacing the last sync

Any member (US-510), but bound to the caller: the feed is keyed by the caller's login and deviceKey, created on the first sync and replaced whole on every one after — another member's key never matches, so nobody overwrites anyone else's (#1056, ADR-087). Only events from yesterday to 31 days ahead are kept, at most 500.

Parametre

NavnHvorTypePåkrevdBeskrivelse
householdIdpathstring (uuid)Påkrevd—

Forespørselskropp

application/jsonPåkrevdSyncDeviceCalendarRequest

Svar

200OK
application/jsonCalendarFeedResponse
400Bad Request
application/problem+jsonProblemDetails
401No session, or the session is no longer valid.
application/problem+jsonProblemDetails
404Not Found
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl -b "bryti_session=…" \
  -X PUT \
  "https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/calendar-feeds/device" \
  -H "Content-Type: application/json" \
  -d '{"deviceKey":"string","name":"string","events":[{"title":"string","date":"2026-09-07","startTime":"string","endTime":"string","isAllDay":false,"location":"string"}]}'

Eksempel på svar

200application/json
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "name": "string",
  "url": "string",
  "createdAt": "2026-09-07T16:30:00Z",
  "kind": "Ics",
  "isThisDevice": false,
  "isMine": false
}
DELETE/api/v1/households/{householdId}/calendar-feeds/device/{deviceKey}

Remove this phone's calendar feed

Only the caller's own: another member's device key answers 404 rather than deleting theirs (ADR-087).

Parametre

NavnHvorTypePåkrevdBeskrivelse
householdIdpathstring (uuid)Påkrevd—
deviceKeypathstringPåkrevd—

Svar

204No Content
401No session, or the session is no longer valid.
application/problem+jsonProblemDetails
404Not Found
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl -b "bryti_session=…" \
  -X DELETE \
  "https://bryti.app/api/v1/households/3fa85f64-5717-4562-b3fc-2c963f66afa6/calendar-feeds/device/string"

Skjema

BusyEveningResponse

FeltTypePåkrevd
datestring (date)Påkrevd
titlestringPåkrevd
startTimestring | nullPåkrevd
endTimestring | nullPåkrevd

CalendarEventResponse

FeltTypePåkrevd
titlestringPåkrevd
datestring (date)Påkrevd
startTimestring | nullPåkrevd
endTimestring | nullPåkrevd
isAllDaybooleanPåkrevd
locationstring | nullPåkrevd

CalendarFeedEventsResponse

FeltTypePåkrevd
feedIdstring (uuid)Påkrevd
feedNamestringPåkrevd
eventsCalendarEventResponse[]Påkrevd
errorstring | nullPåkrevd

CalendarFeedResponse

FeltTypePåkrevd
idstring (uuid)Påkrevd
namestringPåkrevd
urlstringPåkrevd
createdAtstring (date-time)Påkrevd
kindstring—
syncedAtstring (date-time) | null—
eventCountinteger (int32) | null—
isThisDeviceboolean—
isMineboolean—

CreateCalendarFeedRequest

FeltTypePåkrevd
namestringPåkrevd
urlstringPåkrevd

DeviceCalendarEvent

FeltTypePåkrevd
titlestringPåkrevd
datestring (date)Påkrevd
startTimestring | nullPåkrevd
endTimestring | nullPåkrevd
isAllDaybooleanPåkrevd
locationstring | nullPåkrevd

DinnerCalendarLinkResponse

FeltTypePåkrevd
urlstring | nullPåkrevd
webcalUrlstring | nullPåkrevd

ProblemDetails

FeltTypePåkrevd
typestring | null—
titlestring | null—
statusinteger (int32) | null—
detailstring | null—
instancestring | null—
codestring | null—

SyncDeviceCalendarRequest

FeltTypePåkrevd
deviceKeystringPåkrevd
namestringPåkrevd
eventsDeviceCalendarEvent[]Påkrevd

UpcomingCalendarEventsResponse

FeltTypePåkrevd
feedsCalendarFeedEventsResponse[]Påkrevd
fromstring (date)Påkrevd
tostring (date)Påkrevd
busyEveningsBusyEveningResponse[]Påkrevd