Skip to content
Rigel docs
Open Rigel

Put a card on the dashboard

dashboard.card.post

POST/api/v1/households/{household_id}/commands/dashboard.card.post

  • Command
  • Rigel runs it
  • Applies offline

Puts a card at the top of the home dashboard, for proactive work that's worth seeing at a glance but doesn't need a chat message. Always give a reason (why Rigel posted it, shown on request) and a show_until (when it should disappear on its own). Posting again about the same record_id for the same person (or for everyone) while that card is still showing replaces its text instead of adding a second card, and says so with replaced: true. Fails with person_not_found if for_person_id isn't in the household. Returns the card's ID.

Parameters#

Put a card on the dashboard: 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.

Put a card on the dashboard: request body fields
FieldDescription
titlestringrequired

One line, 1–120 characters, such as "Next week is planned".

1 to 120 characters
bodystring or nulloptional

A sentence or two in Markdown, up to 2000 characters.

at most 2,000 characters
reasonstring or nulloptional

Why Rigel posted it, up to 500 characters, shown when someone asks "Why?", such as "You haven't tried a new recipe since Oct 15."

at most 500 characters
record_idstring or nulloptional

The record the card is about; the card links to it. Posting again for the same record replaces the card.

appone of: meals, recipes, shopping, inventory, calendar, email, tasks, documents, chat, maintenance, null or nulloptional

The app the card is from, for its icon and accent; null or left out for none.

for_person_idstring or nulloptional

Show the card only to this person; null or left out for everyone.

show_untilstring (date-time)optional

When the card disappears on its own. Left out, it stays until someone dismisses it.

Response#

200 The command was applied.

Put a card on the dashboard: response fields
FieldDescription
resultobjectrequired

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

result.card_idstringrequired

The card, new or the one that was replaced.

result.replacedbooleanrequired

True when an open card about the same record and person was updated instead.

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.

Put a card on the dashboard: errors
StatusCodeWhen
400validation_failedA field is missing, misspelled or out of range. details.fields lists each problem.
401unauthenticatedThe request has no valid session.
404person_not_foundRejects a card for someone who isn't in the household.
404not_foundThe household doesn't exist, or you aren't a member of it.
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.

Puts a card on the dashboard for everyone

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA' \
  -d '{
  "title": "Next week is planned",
  "body": "Five dinners, two need a shop.",
  "reason": "It'\''s Sunday and next week was empty.",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000AAAAAAAAAAAAAAAA",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Next week is planned",
    body: "Five dinners, two need a shop.",
    reason: "It's Sunday and next week was empty.",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000AAAAAAAAAAAAAAAA

{
  "title": "Next week is planned",
  "body": "Five dinners, two need a shop.",
  "reason": "It's Sunday and next week was empty.",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0V6ZQBEFBQ32CZRXC

{
  "result": {
    "card_id": "dcd_01JC4N0000MBGE5RJ6Q7V6V6T8",
    "replaced": false
  },
  "version": 1
}

Puts a card for one person, with only a title

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000BBBBBBBBBBBBBBBB' \
  -d '{
  "title": "Your dentist visit is tomorrow",
  "for_person_id": "per_01JC000000000000000000000B"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000BBBBBBBBBBBBBBBB",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Your dentist visit is tomorrow",
    for_person_id: "per_01JC000000000000000000000B",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000BBBBBBBBBBBBBBBB

{
  "title": "Your dentist visit is tomorrow",
  "for_person_id": "per_01JC000000000000000000000B"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0PBBYP2GD8V23CXAN

{
  "result": {
    "card_id": "dcd_01JC4N00004J057T2A2FXGZEXG",
    "replaced": false
  },
  "version": 1
}

Posting again about the same record replaces the open card

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000DDDDDDDDDDDDDDDD' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000DDDDDDDDDDDDDDDD",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000DDDDDDDDDDDDDDDD

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0V7FQ19G170D3ADCF

{
  "result": {
    "card_id": "dcd_01JC00000000000000000000A1",
    "replaced": true
  },
  "version": 1
}

Replaces a card that never expires, and clears fields left out

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000EEEEEEEEEEEEEEEE' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "record_id": "fnt_01JC0000000000000000000001"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000EEEEEEEEEEEEEEEE",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    record_id: "fnt_01JC0000000000000000000001",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000EEEEEEEEEEEEEEEE

{
  "title": "Week of Nov 9 is planned",
  "record_id": "fnt_01JC0000000000000000000001"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0VS021YXJ1YEBFWSB

{
  "result": {
    "card_id": "dcd_01JC00000000000000000000A1",
    "replaced": true
  },
  "version": 1
}

Replaces a card for the same person

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000FFFFFFFFFFFFFFFF' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z",
  "for_person_id": "per_01JC000000000000000000000B"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000FFFFFFFFFFFFFFFF",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
    for_person_id: "per_01JC000000000000000000000B",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000FFFFFFFFFFFFFFFF

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z",
  "for_person_id": "per_01JC000000000000000000000B"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R06TTP8D9E07GHKX7X

{
  "result": {
    "card_id": "dcd_01JC00000000000000000000A1",
    "replaced": true
  },
  "version": 1
}

A dismissed card is not replaced

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000GGGGGGGGGGGGGGGG' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000GGGGGGGGGGGGGGGG",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000GGGGGGGGGGGGGGGG

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0KHMHW6FEGFM05RMM

{
  "result": {
    "card_id": "dcd_01JC4N0000MZ4VE6Y11C68N64K",
    "replaced": false
  },
  "version": 1
}

An expired card is not replaced

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000HHHHHHHHHHHHHHHH' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000HHHHHHHHHHHHHHHH",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000HHHHHHHHHHHHHHHH

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R06WMERTE7G1JVT3CJ

{
  "result": {
    "card_id": "dcd_01JC4N000041YXHDRHEQC7ZYMZ",
    "replaced": false
  },
  "version": 1
}

A card that expires right now is not replaced

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000JJJJJJJJJJJJJJJJ' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000JJJJJJJJJJJJJJJJ",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000JJJJJJJJJJJJJJJJ

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0Q1ZVBQDBBY9VNYVM

{
  "result": {
    "card_id": "dcd_01JC4N00004YVTGW6ESGH9REKE",
    "replaced": false
  },
  "version": 1
}

A card for a different person is not replaced

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000KKKKKKKKKKKKKKKK' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000KKKKKKKKKKKKKKKK",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000KKKKKKKKKKKKKKKK

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0EF3YRP9R427EYCVP

{
  "result": {
    "card_id": "dcd_01JC4N0000M7JFYGK307T4Q6RS",
    "replaced": false
  },
  "version": 1
}

A card for everyone is not replaced by one for a person

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000MMMMMMMMMMMMMMMM' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z",
  "for_person_id": "per_01JC000000000000000000000A"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000MMMMMMMMMMMMMMMM",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
    for_person_id: "per_01JC000000000000000000000A",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000MMMMMMMMMMMMMMMM

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z",
  "for_person_id": "per_01JC000000000000000000000A"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0NJV4TXR2FRP2DHDW

{
  "result": {
    "card_id": "dcd_01JC4N0000M7ZD3WQM0C1YH680",
    "replaced": false
  },
  "version": 1
}

A card about another record is not replaced

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000NNNNNNNNNNNNNNNN' \
  -d '{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000NNNNNNNNNNNNNNNN",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
    body: "Three dinners need a shop.",
    reason: "Planned on Sunday.",
    record_id: "fnt_01JC0000000000000000000001",
    app: "meals",
    show_until: "2025-11-07T19:20:00.000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000NNNNNNNNNNNNNNNN

{
  "title": "Week of Nov 9 is planned",
  "body": "Three dinners need a shop.",
  "reason": "Planned on Sunday.",
  "record_id": "fnt_01JC0000000000000000000001",
  "app": "meals",
  "show_until": "2025-11-07T19:20:00.000Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0CBY8JJE4GACQPRXG

{
  "result": {
    "card_id": "dcd_01JC4N00004YYNWVH5RGJYKE30",
    "replaced": false
  },
  "version": 1
}

Without a record, a card is never replaced

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000PPPPPPPPPPPPPPPP' \
  -d '{
  "title": "Week of Nov 9 is planned"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000PPPPPPPPPPPPPPPP",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Week of Nov 9 is planned",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000PPPPPPPPPPPPPPPP

{
  "title": "Week of Nov 9 is planned"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0JWD0N6AG9YKP31RC

{
  "result": {
    "card_id": "dcd_01JC4N00004X15ZGNBX1Y1KYJH",
    "replaced": false
  },
  "version": 1
}

Rejects a card for someone who isn't in the household

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01JC4N0000CCCCCCCCCCCCCCCC' \
  -d '{
  "title": "Hello",
  "for_person_id": "per_01JC000000000000000000000Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01JC4N0000CCCCCCCCCCCCCCCC",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Hello",
    for_person_id: "per_01JC000000000000000000000Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01K9BKKP003AHRZ6DMV29GQY5C/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01JC4N0000CCCCCCCCCCCCCCCC

{
  "title": "Hello",
  "for_person_id": "per_01JC000000000000000000000Z"
}
Response, 404
HTTP/1.1 404 Not Found
Content-Type: application/json
X-Request-Id: req_01K9D9S2R0RNAZGDWRPTFPM80A

{
  "error": {
    "code": "person_not_found",
    "message": "That person isn't in the household. No changes were applied.",
    "details": {
      "person_id": "per_01JC000000000000000000000Z"
    },
    "recovery": "Read the current state, then send a command that fits it.",
    "request_id": "req_01K9D9S2R0RNAZGDWRPTFPM80A"
  }
}

Put a card on the dashboard

A reason is shown when someone asks why. show_until says when the card goes away on its own.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CSPNA84SJHQZ7CEMH08V' \
  -d '{
  "title": "Next week is planned",
  "body": "Monday is tomato and white bean orzo. You don'\''t have crushed tomatoes or spinach yet.",
  "reason": "Dinners for Nov 9 to Nov 15 are on the plan, and two things for Monday aren'\''t in the pantry.",
  "app": "meals",
  "record_id": "mel_01M6V9CSFSFH4859KG4NM47HF2",
  "show_until": "2026-11-10T15:17:52.469Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CSPNA84SJHQZ7CEMH08V",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Next week is planned",
    body: "Monday is tomato and white bean orzo. You don't have crushed tomatoes or spinach yet.",
    reason: "Dinners for Nov 9 to Nov 15 are on the plan, and two things for Monday aren't in the pantry.",
    app: "meals",
    record_id: "mel_01M6V9CSFSFH4859KG4NM47HF2",
    show_until: "2026-11-10T15:17:52.469Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CSPNA84SJHQZ7CEMH08V

{
  "title": "Next week is planned",
  "body": "Monday is tomato and white bean orzo. You don't have crushed tomatoes or spinach yet.",
  "reason": "Dinners for Nov 9 to Nov 15 are on the plan, and two things for Monday aren't in the pantry.",
  "app": "meals",
  "record_id": "mel_01M6V9CSFSFH4859KG4NM47HF2",
  "show_until": "2026-11-10T15:17:52.469Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CSPN5H5MSRFQJRW7P5DW

{
  "result": {
    "card_id": "dcd_01M6V9CSPNCSXZ7E2W3DCNP2HZ",
    "replaced": false
  },
  "version": 129
}

Put a card on one person's dashboard

for_person_id shows it to that person only.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CSPPZXRXVBR282VEM0MY' \
  -d '{
  "title": "Theo has soccer on Tuesday at 5:00 pm",
  "body": "Ben is picking him up.",
  "reason": "It'\''s on the calendar, and you asked Ben to go in chat.",
  "app": "calendar",
  "record_id": "evt_01M6V9CSHPG77MMGGKHAEJQ484",
  "for_person_id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
  "show_until": "2026-11-10T15:17:52.469Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CSPPZXRXVBR282VEM0MY",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Theo has soccer on Tuesday at 5:00 pm",
    body: "Ben is picking him up.",
    reason: "It's on the calendar, and you asked Ben to go in chat.",
    app: "calendar",
    record_id: "evt_01M6V9CSHPG77MMGGKHAEJQ484",
    for_person_id: "per_01M6V9CS6RX26JK5KVYGRN22D2",
    show_until: "2026-11-10T15:17:52.469Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CSPPZXRXVBR282VEM0MY

{
  "title": "Theo has soccer on Tuesday at 5:00 pm",
  "body": "Ben is picking him up.",
  "reason": "It's on the calendar, and you asked Ben to go in chat.",
  "app": "calendar",
  "record_id": "evt_01M6V9CSHPG77MMGGKHAEJQ484",
  "for_person_id": "per_01M6V9CS6RX26JK5KVYGRN22D2",
  "show_until": "2026-11-10T15:17:52.469Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CSPPKF8RDDZN1HH0B5WV

{
  "result": {
    "card_id": "dcd_01M6V9CSPP9K3SPZTSVXYSF85H",
    "replaced": false
  },
  "version": 130
}

Post again for the same record

A card about the same record and person is updated, not duplicated; replaced says so.

Request, curl
curl -X POST 'https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post' \
  -H "Cookie: rigel_session=$RIGEL_SESSION" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: cmd_01M6V9CSPS82VRHYYC7J7RE837' \
  -d '{
  "title": "Next week is planned",
  "body": "Monday is tomato and white bean orzo. You don'\''t have crushed tomatoes yet.",
  "app": "meals",
  "record_id": "mel_01M6V9CSFSFH4859KG4NM47HF2",
  "show_until": "2026-11-10T15:17:52.469Z"
}'
Request, TypeScript
const response = await fetch("https://rigel.house/api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": "cmd_01M6V9CSPS82VRHYYC7J7RE837",
    Cookie: `rigel_session=${process.env.RIGEL_SESSION}`,
  },
  body: JSON.stringify({
    title: "Next week is planned",
    body: "Monday is tomato and white bean orzo. You don't have crushed tomatoes yet.",
    app: "meals",
    record_id: "mel_01M6V9CSFSFH4859KG4NM47HF2",
    show_until: "2026-11-10T15:17:52.469Z",
  }),
});
const data = await response.json();
Request, HTTP
POST /api/v1/households/hh_01M6V9CS6GGVFCY7NAS8ZTQV95/commands/dashboard.card.post HTTP/1.1
Host: rigel.house
Cookie: rigel_session=<your session>
Content-Type: application/json
Idempotency-Key: cmd_01M6V9CSPS82VRHYYC7J7RE837

{
  "title": "Next week is planned",
  "body": "Monday is tomato and white bean orzo. You don't have crushed tomatoes yet.",
  "app": "meals",
  "record_id": "mel_01M6V9CSFSFH4859KG4NM47HF2",
  "show_until": "2026-11-10T15:17:52.469Z"
}
Response, 200
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: req_01M6V9CSPSWVX0DGZ85ZV0PTR2

{
  "result": {
    "card_id": "dcd_01M6V9CSPNCSXZ7E2W3DCNP2HZ",
    "replaced": true
  },
  "version": 131
}

For Rigel#

Rigel's tool for this command is dashboard_card_post. 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