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#
| Field | Description |
|---|---|
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.
| Field | Description |
|---|---|
titlestringrequired | One line, 1–120 characters, such as "Next week is planned". |
bodystring or nulloptional | A sentence or two in Markdown, up to 2000 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." |
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.
| Field | Description |
|---|---|
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.
| Status | Code | When |
|---|---|---|
400 | validation_failed | A field is missing, misspelled or out of range. details.fields lists each problem. |
401 | unauthenticated | The request has no valid session. |
404 | person_not_found | Rejects a card for someone who isn't in the household. |
404 | not_found | The household doesn't exist, or you aren't a member of it. |
409 | idempotency_key_reused | The 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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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
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"
}'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();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"
}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.
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"
}'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();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"
}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.
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"
}'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();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"
}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.
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"
}'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();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"
}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.