Skip to content
Rigel docs
Open Rigel

Change one occurrence of a repeating event

calendar.event.update_occurrence

POST/api/v1/households/{household_id}/commands/calendar.event.update_occurrence

  • Command
  • Rigel runs it
  • Applies offline

Changes the title, notes, place or time of a single occurrence, named by occurrence_start (its original start from calendar.occurrence.list). Giving only starts_at (or start_date) moves it and keeps its length. Changing a cancelled occurrence brings it back. Errors: event_not_found, event_owned_by_app, occurrence_not_found (the event doesn't repeat, or doesn't happen then), invalid_time_range.

Parameters#

Change one occurrence of a repeating event: parameters
FieldDescription
household_idpathstringrequired

The household's ID.

Idempotency-Keyheaderstringoptional

The command's ID. Reuse it when retrying the same command.

Request body#

JSON, as application/json.

Change one occurrence of a repeating event: request body fields
FieldDescription
event_idstringrequired

A calendar event ID, such as evt_01JC0000000000000000000000.

occurrence_startstringrequired

Which occurrence, by its original start in the event's zone: 2026-11-14T09:00 for a timed event, 2026-11-14 for an all-day one. Use the occurrence_start that calendar.occurrence.list gave.

titlestringoptional

The event's title, as written, 1–200 characters.

1 to 200 characters
descriptionstringoptional

Notes about the event, as written, up to 8,000 characters.

at most 8,000 characters
locationstringoptional

Where it is, as written, up to 500 characters.

at most 500 characters
starts_atstringoptional

When a timed event starts. ISO 8601: with an offset it's that instant, without one it's wall-clock time in time_zone, so 2026-11-11T15:30 means 3:30pm there.

ends_atstringoptional

When a timed event ends, in the same form as starts_at.

start_datestringoptional

The first day of an all-day event, YYYY-MM-DD.

end_datestringoptional

The last day of an all-day event, YYYY-MM-DD, inclusive. The same as start_date for a one-day event.

Response#

200 The command was applied.

Change one occurrence of a repeating event: response fields
FieldDescription
resultobjectrequired

What the command returned, such as the IDs it created.

versionintegerrequired

The household version after the command.

Errors#

Every error has the same envelope: error.code, error.message, error.details, error.recovery and error.request_id.

Change one occurrence of a repeating event: errors
StatusCodeWhen
400validation_failedA field is missing, misspelled or out of range. details.fields lists each problem.
401unauthenticatedThe request has no valid session.
404event_not_found
  • The event doesn't exist in this household.
  • The event must exist.
404occurrence_not_found
  • The event doesn't repeat, or doesn't happen then.
  • A day the rule doesn't reach isn't an occurrence.
  • An event that doesn't repeat has no separate occurrences.
  • The key must have the event's form.
404not_foundThe household doesn't exist, or you aren't a member of it.
409event_owned_by_appAn event another app owns is refused.
409invalid_time_range
  • An all-day occurrence can't be given a start time.
  • A timed occurrence can't be given dates.
  • An occurrence can't end before it starts.
409idempotency_key_reusedThe Idempotency-Key was already used for a different command.

Examples#

These are real. Each scenario is one of the command's test cases, run on a household when this site was built, and the response is what the API returned.

Retitling one Saturday adds an exception

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "title": "Swim meet",
  "location": "County pool"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15T09:00:00",
    title: "Swim meet",
    location: "County pool",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "title": "Swim meet",
  "location": "County pool"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R00CSVYCQ1REVW3JAE

{
  "result": {},
  "version": 1
}

Moving one Saturday's start keeps its length

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00",
  "starts_at": "2025-11-15T11:00"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15T09:00",
    starts_at: "2025-11-15T11:00",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00",
  "starts_at": "2025-11-15T11:00"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0TXNGWWATEZSEFQ62

{
  "result": {},
  "version": 1
}

Giving only ends_at changes that occurrence's length

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "ends_at": "2025-11-15T11:30"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15T09:00:00",
    ends_at: "2025-11-15T11:30",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "ends_at": "2025-11-15T11:30"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R092SJFSTZJVAK588Z

{
  "result": {},
  "version": 1
}

Changing an occurrence again updates its exception, and brings a cancelled one back

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "description": "Bring goggles"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15T09:00:00",
    description: "Bring goggles",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "description": "Bring goggles"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R046MT6BDZ4MZYSZPA

{
  "result": {},
  "version": 1
}

An extra date can be changed too

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-12-23T09:00:00",
  "title": "Holiday swim"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-12-23T09:00:00",
    title: "Holiday swim",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-12-23T09:00:00",
  "title": "Holiday swim"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0X95GZC5KDHKYV2PD

{
  "result": {},
  "version": 1
}

An all-day occurrence takes dates

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000C",
  "occurrence_start": "2026-11-14",
  "start_date": "2026-11-21"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000C",
    occurrence_start: "2026-11-14",
    start_date: "2026-11-21",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000C",
  "occurrence_start": "2026-11-14",
  "start_date": "2026-11-21"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R04PA5KTZ0EP0810Y7

{
  "result": {},
  "version": 1
}

A moved occurrence shows up on a busy-only calendar without its details

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "title": "Secret",
  "starts_at": "2025-11-15T13:00"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15T09:00:00",
    title: "Secret",
    starts_at: "2025-11-15T13:00",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "title": "Secret",
  "starts_at": "2025-11-15T13:00"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0VYR2ED5CYZX3W7ZT

{
  "result": {},
  "version": 1
}

A day the rule doesn't reach isn't an occurrence

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-16T09:00",
  "title": "x"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-16T09:00",
    title: "x",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-16T09:00",
  "title": "x"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0NG4YSCQHVZ6HDZBF

{
  "error": {
    "code": "occurrence_not_found",
    "message": "The event doesn't happen at 2025-11-16T09:00:00. No changes were applied.",
    "details": {
      "occurrence_start": "2025-11-16T09:00:00"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0NG4YSCQHVZ6HDZBF"
  }
}

An event that doesn't repeat has no separate occurrences

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000B",
  "occurrence_start": "2025-11-11T15:30",
  "title": "x"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000B",
    occurrence_start: "2025-11-11T15:30",
    title: "x",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000B",
  "occurrence_start": "2025-11-11T15:30",
  "title": "x"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R02J2BCXW82F3B11JN

{
  "error": {
    "code": "occurrence_not_found",
    "message": "That event doesn't repeat, so it has no separate occurrences. Change the event itself. No changes were applied.",
    "details": {
      "occurrence_start": "2025-11-11T15:30:00"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R02J2BCXW82F3B11JN"
  }
}

The key must have the event's form

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15",
  "title": "x"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15",
    title: "x",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15",
  "title": "x"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0WRNV37NES1DQEMJ6

{
  "error": {
    "code": "occurrence_not_found",
    "message": "This event has a start time, so name the occurrence by its date and time, such as 2026-11-14T09:00. No changes were applied.",
    "details": {
      "occurrence_start": "2025-11-15"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0WRNV37NES1DQEMJ6"
  }
}

An all-day occurrence can't be given a start time

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000C",
  "occurrence_start": "2026-11-14",
  "starts_at": "2026-11-14T10:00"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000C",
    occurrence_start: "2026-11-14",
    starts_at: "2026-11-14T10:00",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000C",
  "occurrence_start": "2026-11-14",
  "starts_at": "2026-11-14T10:00"
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0745TDBBGZHXFT5Z1

{
  "error": {
    "code": "invalid_time_range",
    "message": "This is an all-day event, so give start_date and end_date. No changes were applied.",
    "details": {},
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0745TDBBGZHXFT5Z1"
  }
}

A timed occurrence can't be given dates

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "start_date": "2025-11-15"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15T09:00:00",
    start_date: "2025-11-15",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "start_date": "2025-11-15"
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0DWDDJP8J70EP2H0S

{
  "error": {
    "code": "invalid_time_range",
    "message": "This event has a start time, so give starts_at and ends_at. No changes were applied.",
    "details": {},
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0DWDDJP8J70EP2H0S"
  }
}

An occurrence can't end before it starts

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "starts_at": "2025-11-15T09:00",
  "ends_at": "2025-11-15T08:00"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000A",
    occurrence_start: "2025-11-15T09:00:00",
    starts_at: "2025-11-15T09:00",
    ends_at: "2025-11-15T08:00",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000A",
  "occurrence_start": "2025-11-15T09:00:00",
  "starts_at": "2025-11-15T09:00",
  "ends_at": "2025-11-15T08:00"
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0TNACQ1BVWNP7CYXM

{
  "error": {
    "code": "invalid_time_range",
    "message": "An event can't end before it starts. No changes were applied.",
    "details": {},
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0TNACQ1BVWNP7CYXM"
  }
}

An event another app owns is refused

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000D",
  "occurrence_start": "2025-11-20T09:00",
  "title": "x"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000D",
    occurrence_start: "2025-11-20T09:00",
    title: "x",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000D",
  "occurrence_start": "2025-11-20T09:00",
  "title": "x"
}
Response, 409
HTTP/1.1 409 Conflict
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0EG3FN4X6K0BP24CE

{
  "error": {
    "code": "event_owned_by_app",
    "message": "Maintenance manages this event. Change it there. No changes were applied.",
    "details": {
      "app": "maintenance"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0EG3FN4X6K0BP24CE"
  }
}

The event must exist

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "event_id": "evt_01JC000000000000000000000Z",
  "occurrence_start": "2025-11-15T09:00:00",
  "title": "x"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01JC000000000000000000000Z",
    occurrence_start: "2025-11-15T09:00:00",
    title: "x",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "event_id": "evt_01JC000000000000000000000Z",
  "occurrence_start": "2025-11-15T09:00:00",
  "title": "x"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0D5VV94J0AA8V1T6X

{
  "error": {
    "code": "event_not_found",
    "message": "That event isn't on the calendar any more. No changes were applied.",
    "details": {
      "event_id": "evt_01JC000000000000000000000Z"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0D5VV94J0AA8V1T6X"
  }
}

Move one occurrence

occurrence_start is the occurrence's original start. Only starts_at moves it and keeps its length.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/calendar.event.update_occurrence' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CSJVQYDH0EK00FEW6BMJ' \
  -d '{
  "event_id": "evt_01M6V9CSHPG77MMGGKHAEJQ484",
  "occurrence_start": "2026-11-17T17:00",
  "starts_at": "2026-11-17T17:30"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/calendar.event.update_occurrence", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CSJVQYDH0EK00FEW6BMJ",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    event_id: "evt_01M6V9CSHPG77MMGGKHAEJQ484",
    occurrence_start: "2026-11-17T17:00",
    starts_at: "2026-11-17T17:30",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/calendar.event.update_occurrence HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CSJVQYDH0EK00FEW6BMJ

{
  "event_id": "evt_01M6V9CSHPG77MMGGKHAEJQ484",
  "occurrence_start": "2026-11-17T17:00",
  "starts_at": "2026-11-17T17:30"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CSJV8VWMY2RNWCK6FM2Q

{
  "result": {},
  "version": 94
}

For Rigel#

Rigel's tool for this command is calendar_event_update_occurrence. Rigel runs this on its own, then says what it did. The agent guide has the rest.

Rigel is in early access, and sign-up is by invitation. Open Rigel