Authentication
Every request uses the x-api-key header. Each key belongs to one family, so thefamilySlug in the path must match that key.
x-api-key: $MAVO_API_KEY
Developers
Read and write household collections with a family-scoped API key. New to Mavo? Start with the product guide.
Every request uses the x-api-key header. Each key belongs to one family, so thefamilySlug in the path must match that key.
x-api-key: $MAVO_API_KEY
Mavo supports direct API calls and connected assistants. Pick the surface based on where the work is running.
Use the REST API for apps, scripts, and automations that can make normal HTTP requests with an API key. Use MCP when you are connecting Mavo to an assistant, so Mavo can appear inside that assistant as a set of available household actions.
Use these when your app needs to see or manage the family’s collection list: meals, chores, routines, and any custom collections. These endpoints are about the containers themselves.
Use these when your app already knows which collection it is working with and needs the rows inside it. Each entry has a `title` display label plus `data` for the fields defined by that collection.
Use these for calendar events, linked external calendars, and calendar share links.
Use these for household people, notifications, webhook destinations, and other household settings that an integration may need to manage directly.
Use these when an integration needs Mavo’s household context search, weather lookup, or public web lookup without running a full agent conversation.
Create and manage household collections.
/api/v1/families/{familySlug}/trackersList collectionsReturns every collection in the family, built-in and custom.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/trackers \ -H "x-api-key: $MAVO_API_KEY"
{
"trackers": [
{
"key": "meals",
"name": "Meals",
"description": "What’s for dinner.",
"fields": []
}
]
}/api/v1/families/{familySlug}/trackersCreate a collectionCreates a custom collection with the given fields.DetailsfamilySlugSlug of the family (household) to act on.category"calendar"optionalSet to calendar only when creating another household calendar; omit for ordinary collections.
color"sage" | "blue" | "clay" | "plum" | "gold"optionalOptional display color for a calendar collection.
descriptionstringoptionalOptional short explanation of what the collection tracks.
fieldsobject[]optionaldefault []Structured fields shared by items in this collection.
keystringrequiredStable camelCase or snake_case field key used in collection item data.
labelstringrequiredShort family-facing label shown for this field.
optionsstring[]optionalAllowed values when type is select; omit for other field types.
type"date" | "number" | "person" | "select" | "text" | "textarea"optionaldefault "text"How values in this field should be entered and displayed.
namestringrequiredFamily-facing collection or calendar name.
curl -X POST https://mavolife.com/api/v1/families/your-family/trackers \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"name":"string"}'{
"tracker": {
"key": "chores",
"name": "Chores",
"fields": []
}
}/api/v1/families/{familySlug}/trackers/{collectionKey}Update a collectionUpdates a custom collection. Send only the fields you want to change.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".color"sage" | "blue" | "clay" | "plum" | "gold"optionalReplacement display color for a calendar collection.
descriptionstring | nulloptionalReplacement description; null removes the current description.
fieldsobject[]optionalComplete replacement list of structured fields.
keystringrequiredStable camelCase or snake_case field key used in collection item data.
labelstringrequiredShort family-facing label shown for this field.
optionsstring[]optionalAllowed values when type is select; omit for other field types.
type"date" | "number" | "person" | "select" | "text" | "textarea"optionaldefault "text"How values in this field should be entered and displayed.
namestringoptionalReplacement family-facing name.
curl -X PATCH https://mavolife.com/api/v1/families/your-family/trackers/meals \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"color":"sage","description":"string","fields":[{"key":"string","label":"string"}],"name":"string"}'{
"tracker": {
"key": "chores",
"name": "Weekly chores"
}
}/api/v1/families/{familySlug}/trackers/{collectionKey}Delete a collectionDeletes a custom collection and its entries. Built-in collections cannot be deleted.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".curl -X DELETE https://mavolife.com/api/v1/families/your-family/trackers/meals \ -H "x-api-key: $MAVO_API_KEY"
{
"tracker": {
"key": "chores",
"name": "Weekly chores"
}
}Add and edit entries inside a collection.
/api/v1/families/{familySlug}/trackers/{collectionKey}/entriesList entriesReturns entries in a collection, optionally narrowed by text, status, or result count.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".queryCase-insensitive text to match against entry titles and data.statusOnly return entries with this status.limitMaximum number of matching entries to return.curl -X GET https://mavolife.com/api/v1/families/your-family/trackers/meals/entries \ -H "x-api-key: $MAVO_API_KEY"
{
"entries": [
{
"id": "ent_123",
"title": "Taco night",
"data": {
"day": "2026-06-09",
"status": "Planned"
}
}
]
}/api/v1/families/{familySlug}/trackers/{collectionKey}/entriesCreate an entryAdds an entry to a collection. `title` is the entry’s display label; collection-specific fields go in `data`.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".dataobjectoptionaldefault {}Collection-specific fields for this entry. Only fields defined by the collection are saved.
titlestringrequiredHuman-readable entry label. This is stored separately from collection-specific data fields and is returned in entry responses.
curl -X POST https://mavolife.com/api/v1/families/your-family/trackers/meals/entries \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"title":"string"}'{
"entry": {
"id": "ent_123",
"title": "Taco night",
"data": {
"day": "2026-06-09",
"status": "Planned"
}
}
}/api/v1/families/{familySlug}/trackers/{collectionKey}/entries/{entryId}Update an entryUpdates an entry. Send only the fields you want to change. `title` renames the entry; collection-specific fields go in `data`.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".entryIdIdentifier of the entry within the collection.dataobjectoptionalCollection-specific fields for this entry. Only fields defined by the collection are saved.
status"active" | "archived" | "done"optionaltitlestringoptionalHuman-readable entry label. This is stored separately from collection-specific data fields and is returned in entry responses.
curl -X PATCH https://mavolife.com/api/v1/families/your-family/trackers/meals/entries/ent_123 \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"data":{},"status":"active","title":"string"}'{
"entry": {
"id": "ent_123",
"title": "Taco night",
"status": "done"
}
}/api/v1/families/{familySlug}/trackers/{collectionKey}/entries/{entryId}Delete an entryRemoves an entry from a collection by id. No request body is needed; the deleted entry is returned for confirmation.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".entryIdIdentifier of the entry within the collection.curl -X DELETE https://mavolife.com/api/v1/families/your-family/trackers/meals/entries/ent_123 \ -H "x-api-key: $MAVO_API_KEY"
{
"entry": {
"id": "ent_123",
"title": "Taco night"
}
}/api/v1/families/{familySlug}/trackers/{collectionKey}/entries/batchCreate entriesAdds multiple entries to a collection in one request.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".itemsobject[]requireddataobjectoptionaldefault {}titlestringrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/trackers/meals/entries/batch \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"items":[{"title":"string"}]}'{
"count": 2,
"entries": [
{
"id": "ent_123",
"title": "Taco night"
}
],
"ok": true
}/api/v1/families/{familySlug}/trackers/{collectionKey}/entries/batchUpdate entriesUpdates multiple entries in a collection in one request.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".itemsobject[]requireddataobjectoptionalentryIdstringrequiredstatus"active" | "done" | "archived"optionaltitlestringoptionalcurl -X PATCH https://mavolife.com/api/v1/families/your-family/trackers/meals/entries/batch \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"items":[{"entryId":"string"}]}'{
"count": 2,
"entries": [
{
"id": "ent_123",
"title": "Taco night",
"status": "done"
}
],
"ok": true
}/api/v1/families/{familySlug}/trackers/{collectionKey}/entries/batchDelete entriesDeletes multiple entries from a collection in one request. Pass entry ids only; titles are returned in the response for confirmation.DetailsfamilySlugSlug of the family (household) to act on.collectionKeyKey of the collection, e.g. "meals".entryIdsstring[]requiredcurl -X DELETE https://mavolife.com/api/v1/families/your-family/trackers/meals/entries/batch \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"entryIds":["string"]}'{
"count": 2,
"entries": [
{
"id": "ent_123",
"title": "Taco night"
}
],
"ok": true
}Manage family calendar events, external feeds, and share links.
/api/v1/families/{familySlug}/calendar/eventsList calendar eventsReturns family calendar events, optionally narrowed by date window, text, status, or result count. When both date boundaries are supplied, repeating series are expanded into concrete occurrences inside the window.DetailsfamilySlugSlug of the family (household) to act on.fromOnly include events on or after this date (YYYY-MM-DD). With `to`, repeating series expand into dated occurrences inside the window.toOnly include events on or before this date (YYYY-MM-DD).queryCase-insensitive text to match against event titles and data.statusOnly return events with this status.excludeEndedSet true to leave out events that already finished in the household's time zone. Expanded repeating occurrences are evaluated independently.limitMaximum number of matching events to return.curl -X GET https://mavolife.com/api/v1/families/your-family/calendar/events \ -H "x-api-key: $MAVO_API_KEY"
{
"events": [
{
"id": "ent_123",
"title": "Soccer practice",
"data": {
"date": "2026-07-01",
"time": "17:00"
}
}
],
"ok": true
}/api/v1/families/{familySlug}/calendar/eventsCreate calendar eventAdds an event to the family calendar.DetailsfamilySlugSlug of the family (household) to act on.allDaybooleanoptionalassigneestringoptionalattendanceobjectoptionalcalendarKeystringoptionaldataobjectoptionaldatestringrequiredRequired event date in YYYY-MM-DD format.
durationMinutesintegeroptionalendDatestringoptionalInclusive ISO end date for multi-day events.
endTimestringoptionalLocal event end time when known.
everyoneAttendance"going" | "maybe" | "out"optionalnotestringoptionalownerPersonIdstringoptionalresponsibilityRequiredbooleanoptionalFalse means the household explicitly decided this event needs no responsible person. Omit it when responsibility is still undecided.
responsiblePersonIdsstring[]optionalremindersobject[]optionalaudience"household" | "responsible" | "going" | "people"optionaldefault "household"Who should receive the reminder: the whole household, responsible people, people marked going, or the explicit people list.
channels"in_app" | "email" | "push" | "sms"[]optionaldefault ["in_app"]Delivery channels for this reminder.
mode"plain" | "mavo"optionaldefault "plain"plain sends the saved reminder; mavo allows a contextual reminder generated at send time.
offsetMinutesintegerrequiredHow many minutes before the event start to send the reminder; 0 means at the start.
recipientPersonIdsstring[]optionaldefault []Household person ids to notify when audience is people; otherwise leave empty.
repeatDaysinteger[]optionalrepeatFrequency"none" | "daily" | "weekdays" | "weekends" | "weekly" | "monthly" | "yearly" | "custom"optionalrepeatIntervalintegeroptionaltimestringoptionaltitlestringrequiredtravelPlanobject | nulloptionalwherestringoptionalcurl -X POST https://mavolife.com/api/v1/families/your-family/calendar/events \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"date":"string","title":"string"}'{
"entryId": "ent_123",
"ok": true,
"title": "Soccer practice"
}/api/v1/families/{familySlug}/calendar/events/{eventId}Update calendar eventUpdates one family calendar event.DetailsfamilySlugSlug of the family (household) to act on.eventIdIdentifier of the calendar event.allDaybooleanoptionalassigneestringoptionalattendanceobjectoptionalcalendarKeystringoptionaldataobjectoptionaldatestringoptionalRequired event date in YYYY-MM-DD format.
durationMinutesintegeroptionalendDatestringoptionalInclusive ISO end date for multi-day events.
endTimestringoptionalLocal event end time when known.
everyoneAttendance"going" | "maybe" | "out"optionalnotestringoptionalownerPersonIdstringoptionalresponsibilityRequiredbooleanoptionalFalse means the household explicitly decided this event needs no responsible person. Omit it when responsibility is still undecided.
responsiblePersonIdsstring[]optionalremindersobject[]optionalaudience"household" | "responsible" | "going" | "people"optionaldefault "household"Who should receive the reminder: the whole household, responsible people, people marked going, or the explicit people list.
channels"in_app" | "email" | "push" | "sms"[]optionaldefault ["in_app"]Delivery channels for this reminder.
mode"plain" | "mavo"optionaldefault "plain"plain sends the saved reminder; mavo allows a contextual reminder generated at send time.
offsetMinutesintegerrequiredHow many minutes before the event start to send the reminder; 0 means at the start.
recipientPersonIdsstring[]optionaldefault []Household person ids to notify when audience is people; otherwise leave empty.
repeatDaysinteger[]optionalrepeatFrequency"none" | "daily" | "weekdays" | "weekends" | "weekly" | "monthly" | "yearly" | "custom"optionalrepeatIntervalintegeroptionaltimestringoptionaltitlestringoptionaltravelPlanobject | nulloptionalwherestringoptionalclearAttendancebooleanoptionalclearTravelPlanbooleanoptionaleditScope"occurrence" | "series"optionaloccurrenceDatestringoptionalstatus"active" | "done" | "archived"optionalcurl -X PATCH https://mavolife.com/api/v1/families/your-family/calendar/events/eventId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"allDay":true,"assignee":"string","attendance":{},"calendarKey":"string","data":{},"date":"string","durationMinutes":0,"endDate":"string","endTime":"string","everyoneAttendance":"going","note":"string","ownerPersonId":"string","responsibilityRequired":true,"responsiblePersonIds":["string"],"reminders":[{"offsetMinutes":0}],"repeatDays":[0],"repeatFrequency":"none","repeatInterval":0,"time":"string","title":"string","travelPlan":{"baseTravelMinutes":0,"origin":"string"},"where":"string","clearAttendance":true,"clearTravelPlan":true,"editScope":"occurrence","occurrenceDate":"string","status":"active"}'{
"event": {
"id": "ent_123",
"title": "Soccer practice",
"data": {
"date": "2026-07-01"
}
},
"ok": true
}/api/v1/families/{familySlug}/calendar/events/{eventId}Delete calendar eventDeletes a calendar event series by default, or one occurrence when both occurrence query parameters are provided.DetailsfamilySlugSlug of the family (household) to act on.eventIdIdentifier of the calendar event.editScopeUse `occurrence` to delete one date in a repeating series. Defaults to the entire series.occurrenceDateOriginal occurrence date (YYYY-MM-DD). Required when `editScope=occurrence`.curl -X DELETE https://mavolife.com/api/v1/families/your-family/calendar/events/eventId \ -H "x-api-key: $MAVO_API_KEY"
{
"event": {
"id": "ent_123",
"title": "Soccer practice"
},
"ok": true
}/api/v1/families/{familySlug}/calendar/externalList external calendarsReturns linked external calendar feeds.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/calendar/external \ -H "x-api-key: $MAVO_API_KEY"
{
"feeds": [],
"ok": true
}/api/v1/families/{familySlug}/calendar/externalCreate external calendarLinks an external ICS calendar feed and syncs its events.DetailsfamilySlugSlug of the family (household) to act on.colorstringoptionalhintstringoptionalnamestringrequiredurlstringrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/calendar/external \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"name":"string","url":"string"}'{
"eventCount": 12,
"ok": true
}/api/v1/families/{familySlug}/calendar/external/probeProbe external calendarChecks whether an external ICS calendar URL can be read.DetailsfamilySlugSlug of the family (household) to act on.urlstringrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/calendar/external/probe \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"url":"string"}'{
"ok": true
}/api/v1/families/{familySlug}/calendar/external/{sourceId}Update external calendarUpdates notes about a linked external calendar feed.DetailsfamilySlugSlug of the family (household) to act on.sourceIdIdentifier of the external calendar feed.hintstringoptionalcurl -X PATCH https://mavolife.com/api/v1/families/your-family/calendar/external/sourceId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"hint":"string"}'{
"ok": true
}/api/v1/families/{familySlug}/calendar/external/{sourceId}Delete external calendarRemoves a linked external calendar feed and its synced calendar.DetailsfamilySlugSlug of the family (household) to act on.sourceIdIdentifier of the external calendar feed.curl -X DELETE https://mavolife.com/api/v1/families/your-family/calendar/external/sourceId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}/api/v1/families/{familySlug}/calendar/external/{sourceId}/refreshRefresh external calendarRequests a refresh for a linked external calendar feed.DetailsfamilySlugSlug of the family (household) to act on.sourceIdIdentifier of the external calendar feed.curl -X POST https://mavolife.com/api/v1/families/your-family/calendar/external/sourceId/refresh \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}/api/v1/families/{familySlug}/calendar/sharesList calendar sharesReturns household calendar share links.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/calendar/shares \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"shares": []
}/api/v1/families/{familySlug}/calendar/sharesCreate calendar shareCreates a calendar share link. The plaintext share token is returned once.DetailsfamilySlugSlug of the family (household) to act on.categoriesstring[]optionaldefault []eventIdsstring[]optionaldefault []namestringrequiredpersonIdsstring[]optionaldefault []sourceIdsstring[]optionaldefault []curl -X POST https://mavolife.com/api/v1/families/your-family/calendar/shares \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"name":"string"}'{
"ok": true,
"share": {
"id": "share_123",
"name": "Soccer calendar"
},
"token": "share-token"
}/api/v1/families/{familySlug}/calendar/shares/{shareId}Revoke calendar shareRevokes a calendar share link.DetailsfamilySlugSlug of the family (household) to act on.shareIdIdentifier of the calendar share link.curl -X DELETE https://mavolife.com/api/v1/families/your-family/calendar/shares/shareId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}Manage family plans: linked calendar events, notes, date polls, and the public share page.
/api/v1/families/{familySlug}/plansList plansReturns the household plans with each plan's derived date range, phase, event count, and share state.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/plans \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"plans": [
{
"archived": false,
"eventCount": 3,
"phase": "upcoming",
"planId": "plan_123",
"shareEnabled": false,
"shareUrl": null,
"title": "Spring break in Tahoe",
"when": "Mar 21–28"
}
]
}/api/v1/families/{familySlug}/plansCreate planCreates a plan: a named thing the family is planning that gathers calendar events, notes, and date polls in one place.DetailsfamilySlugSlug of the family (household) to act on.prosestringoptionalA few plain sentences about what the plan covers.
titlestringrequiredName of the specific thing being planned, e.g. "Spring break in Tahoe".
curl -X POST https://mavolife.com/api/v1/families/your-family/plans \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"title":"string"}'{
"ok": true,
"planId": "plan_123",
"title": "Spring break in Tahoe"
}/api/v1/families/{familySlug}/plans/{planId}Get planReturns one plan in full: description, linked calendar events, notes, and polls with vote counts.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.curl -X GET https://mavolife.com/api/v1/families/your-family/plans/planId \ -H "x-api-key: $MAVO_API_KEY"
{
"archived": false,
"events": [
{
"eventId": "event_123",
"location": "Tahoe City",
"showDetailsOnShare": true,
"showLocationOnShare": true,
"timing": {
"date": "2026-03-21",
"endDate": "2026-03-28",
"kind": "all-day"
},
"title": "Cabin week"
}
],
"notes": [
{
"author": "Dana",
"body": "Cabin gate code is 4415.",
"noteId": "note_123",
"onSharedPage": false
}
],
"ok": true,
"phase": "upcoming",
"planId": "plan_123",
"polls": [
{
"options": [
{
"date": "2026-03-21",
"endDate": null,
"endTime": null,
"label": "Mar 21 weekend",
"optionId": "option_123",
"time": "3:30 PM",
"votes": 3
}
],
"pollId": "poll_123",
"question": "Which weekend works?",
"settledOptionId": null,
"status": "open"
}
],
"prose": "A week at the cabin with the cousins.",
"shareUrl": null,
"title": "Spring break in Tahoe",
"when": "Mar 21–28"
}/api/v1/families/{familySlug}/plans/{planId}Update planRenames a plan, rewrites its description, or archives it. Pass at least one of title, prose, or archived.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.archivedbooleanoptionalTrue archives the plan once it has run its course; false brings it back. Linked calendar events stay either way.
prosestring | nulloptionalReplacement description. Null clears it. Omit to leave unchanged.
titlestringoptionalReplacement name. Omit to leave unchanged.
curl -X PATCH https://mavolife.com/api/v1/families/your-family/plans/planId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"archived":true,"prose":"string","title":"string"}'{
"archived": false,
"ok": true,
"planId": "plan_123",
"title": "Spring break in Tahoe"
}/api/v1/families/{familySlug}/plans/{planId}Delete planDeletes a plan along with its notes, polls, and share link. Linked calendar events stay on the calendar.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.curl -X DELETE https://mavolife.com/api/v1/families/your-family/plans/planId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}/api/v1/families/{familySlug}/plans/{planId}/eventsLink plan eventPoints the plan at an existing calendar event. Nothing is copied; the plan derives its dates from the events it points at.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.eventIdstringrequiredIdentifier of the calendar event to link. Nothing is copied; the plan points at the event.
curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/events \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"eventId":"string"}'{
"eventId": "event_123",
"ok": true,
"planId": "plan_123"
}/api/v1/families/{familySlug}/plans/{planId}/events/{eventId}Unlink plan eventRemoves the plan's pointer to a calendar event. The event stays on the calendar.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.eventIdIdentifier of the calendar event.curl -X DELETE https://mavolife.com/api/v1/families/your-family/plans/planId/events/eventId \ -H "x-api-key: $MAVO_API_KEY"
{
"eventId": "event_123",
"ok": true,
"planId": "plan_123"
}/api/v1/families/{familySlug}/plans/{planId}/notesAdd plan noteAdds a note to the plan. Notes stay family-only unless showOnSharedPage is true.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.bodystringrequiredThe note itself: context that is not an event, like a gate code or pack list.
showOnSharedPagebooleanoptionalTrue shows this note on the public share page. Notes stay family-only by default.
curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/notes \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"body":"string"}'{
"noteId": "note_123",
"ok": true
}/api/v1/families/{familySlug}/plans/{planId}/notes/{noteId}Update plan noteRewrites a note, or changes whether it shows on the plan's share link. The note keeps its author and its place in the plan.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.noteIdIdentifier of the plan note.bodystringoptionalReplacement text for the note. Omit to leave the wording alone.
showOnSharedPagebooleanoptionalTrue puts this note on the plan's share link, false keeps it family-only. Omit to leave it as it is.
curl -X PATCH https://mavolife.com/api/v1/families/your-family/plans/planId/notes/noteId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"body":"string","showOnSharedPage":true}'{
"noteId": "note_123",
"ok": true,
"onSharedPage": false
}/api/v1/families/{familySlug}/plans/{planId}/notes/{noteId}Delete plan noteDeletes a plan note.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.noteIdIdentifier of the plan note.curl -X DELETE https://mavolife.com/api/v1/families/your-family/plans/planId/notes/noteId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}/api/v1/families/{familySlug}/plans/{planId}/pollsCreate plan pollOpens a poll on the plan, like which weekend works. Options can be dated, label-only, or both.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.optionsobject[]requiredTwo to twelve choices. Each option needs a label or a date.
datestringoptionalProposed date when this option is a date choice. The winning dated option can land on the calendar at settle time.
endDatestringoptionalInclusive proposed end date for multi-day options.
endTimestringoptionalProposed local end time, like "4:30 PM".
labelstringoptionalWhat the option says. Optional when a date is given.
timestringoptionalProposed local start time, like "3:30 PM".
questionstringrequiredThe question being decided, e.g. "Which weekend works for the trip?".
curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/polls \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"options":[{"date":"string","endDate":"string","endTime":"string","label":"string","time":"string"}],"question":"string"}'{
"ok": true,
"pollId": "poll_123"
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}Update plan pollRewords the question a poll is asking. The options and every vote already cast stay as they are. Only works while the poll is open.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.questionstringrequiredReplacement wording for the question.
curl -X PATCH https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"question":"string"}'{
"ok": true,
"pollId": "poll_123"
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}Delete plan pollDeletes a plan poll and its votes.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.curl -X DELETE https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}/optionsAdd plan poll optionAdds one more choice to an open poll, for when a possibility turns up after the question went out. Votes already cast are untouched. Twelve options is the ceiling.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.datestringoptionalProposed date when this option is a date choice. The winning dated option can land on the calendar at settle time.
endDatestringoptionalInclusive proposed end date for multi-day options.
endTimestringoptionalProposed local end time, like "4:30 PM".
labelstringoptionalWhat the option says. Optional when a date is given.
timestringoptionalProposed local start time, like "3:30 PM".
curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId/options \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"date":"string","endDate":"string","endTime":"string","label":"string","time":"string"}'{
"ok": true,
"optionId": "option_456"
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}/options/{optionId}Update plan poll optionRewrites an option on an open poll: its wording, its day, its time. The option keeps its identity, so the votes cast for it stay attached. Fields left out are cleared, so send the option as it should end up.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.optionIdIdentifier of the option within the poll.datestringoptionalProposed date when this option is a date choice. The winning dated option can land on the calendar at settle time.
endDatestringoptionalInclusive proposed end date for multi-day options.
endTimestringoptionalProposed local end time, like "4:30 PM".
labelstringoptionalWhat the option says. Optional when a date is given.
timestringoptionalProposed local start time, like "3:30 PM".
curl -X PATCH https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId/options/optionId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"date":"string","endDate":"string","endTime":"string","label":"string","time":"string"}'{
"ok": true,
"optionId": "option_123"
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}/options/{optionId}Delete plan poll optionRemoves one choice from an open poll. Any votes cast for that option go with it, so reword it instead when the choice is still on the table in some form.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.optionIdIdentifier of the option within the poll.curl -X DELETE https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId/options/optionId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"optionId": "option_123"
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}/voteVote on plan pollCasts the calling person's vote on an open poll. One vote per person: voting again moves it to the new option. There is no way to vote on someone else's behalf.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.optionIdstringrequiredIdentifier of the option to vote for.
curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId/vote \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"optionId":"string"}'{
"ok": true,
"optionId": "option_123",
"pollId": "poll_123"
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}/voteClear plan poll voteTakes the calling person's own vote back off an open poll, leaving them with no answer. Other people's votes are untouched.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.curl -X DELETE https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId/vote \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"pollId": "poll_123"
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}/settleSettle plan pollCloses a poll on the chosen option. A dated option is written to the family calendar as a real event and linked onto the plan.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.optionIdstringrequiredIdentifier of the option the family is going with.
curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId/settle \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"optionId":"string"}'{
"addedToCalendar": true,
"eventId": "event_456",
"ok": true
}/api/v1/families/{familySlug}/plans/{planId}/polls/{pollId}/reopenReopen plan pollPuts a settled poll back to open. Anything settling created goes with it: a calendar event written from the winning option is removed and unlinked from the plan. Votes already cast stay.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.pollIdIdentifier of the plan poll.curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/polls/pollId/reopen \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"removedEventId": "event_456",
"removedFromCalendar": true
}/api/v1/families/{familySlug}/plans/{planId}/shareSet plan sharingTurns the plan's public share link on or off. The link shows the live plan to whoever has it, no account needed.DetailsfamilySlugSlug of the family (household) to act on.planIdIdentifier of the plan.enabledbooleanrequiredTrue turns the public share link on; false turns it off. The same address comes back when re-enabled.
curl -X POST https://mavolife.com/api/v1/families/your-family/plans/planId/share \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"enabled":true}'{
"enabled": true,
"ok": true,
"shareUrl": "https://mavolife.com/share/plan/abc123"
}Manage household people.
/api/v1/families/{familySlug}/peopleList peopleReturns household people.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/people \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"people": [
{
"id": "person_123",
"name": "Maya",
"role": "child"
}
]
}/api/v1/families/{familySlug}/peopleCreate personAdds a household person profile.DetailsfamilySlugSlug of the family (household) to act on.familiarNamestringoptionalkind"adult" | "child" | "helper" | "caregiver" | "other"optionaldefault "adult"namestringrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/people \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"name":"string"}'{
"ok": true,
"person": {
"id": "person_123",
"displayName": "Maya"
}
}/api/v1/families/{familySlug}/people/{personId}Update personUpdates a household person profile.DetailsfamilySlugSlug of the family (household) to act on.personIdIdentifier of the household person.familiarNamestring | nulloptionalkind"adult" | "child" | "helper" | "caregiver" | "other"optionalnamestringoptionalcurl -X PATCH https://mavolife.com/api/v1/families/your-family/people/personId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"familiarName":"string","kind":"adult","name":"string"}'{
"ok": true,
"person": {
"id": "person_123",
"displayName": "Maya"
}
}/api/v1/families/{familySlug}/people/{personId}Delete personRemoves a household person profile from active household views.DetailsfamilySlugSlug of the family (household) to act on.personIdIdentifier of the household person.curl -X DELETE https://mavolife.com/api/v1/families/your-family/people/personId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"personId": "person_123"
}Send notifications and manage notification routines.
/api/v1/families/{familySlug}/notificationsList recent notificationsReturns recent household notifications. Supports an optional `sinceMinutes` query parameter.DetailsfamilySlugSlug of the family (household) to act on.sinceMinutesOnly include notifications newer than this many minutes.curl -X GET https://mavolife.com/api/v1/families/your-family/notifications \ -H "x-api-key: $MAVO_API_KEY"
{
"notifications": [
{
"title": "Practice moved",
"body": "Field changed."
}
]
}/api/v1/families/{familySlug}/notificationsSend notificationSends a household notification.DetailsfamilySlugSlug of the family (household) to act on.bodystringoptionaldefault ""channels"in_app" | "email" | "push" | "sms"[]optionaltitlestringrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/notifications \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"title":"string"}'{
"delivered": 1,
"ok": true,
"suppressed": 0
}/api/v1/families/{familySlug}/checksSchedule event checkSchedules a background check ahead of a calendar event.DetailsfamilySlugSlug of the family (household) to act on.channels"in_app" | "email" | "push" | "sms"[]optionaleventIdstringrequiredleadHoursnumberrequiredtaskstringrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/checks \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"eventId":"string","leadHours":0,"task":"string"}'{
"eventId": "ent_123",
"leadHours": 14,
"ok": true
}/api/v1/families/{familySlug}/notification-preferencesGet notification preferencesReturns household notification preferences.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/notification-preferences \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"preferences": {}
}/api/v1/families/{familySlug}/notification-preferencesSet notification preferenceUpdates one household notification preference.DetailsfamilySlugSlug of the family (household) to act on.channel"email" | "push"requiredeventKind"reminder" | "coverage_alert" | "follow_up_nudge" | "digest" | "intake_update"requiredisEnabledbooleanrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/notification-preferences \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"channel":"email","eventKind":"reminder","isEnabled":true}'{
"ok": true,
"preferences": {}
}/api/v1/families/{familySlug}/notification-routinesList notification routinesReturns household notification routines.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/notification-routines \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"routines": []
}/api/v1/families/{familySlug}/notification-routinesCreate notification routineCreates a household notification routine.DetailsfamilySlugSlug of the family (household) to act on.channels"in_app" | "email" | "push" | "sms"[]optionalcronstringoptionalintent"briefing" | "reminder" | "digest"optionalisEnabledbooleanoptionalmode"plain" | "mavo"optionaltimezonestringoptionalcurl -X POST https://mavolife.com/api/v1/families/your-family/notification-routines \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"channels":["in_app"],"cron":"string","intent":"briefing","isEnabled":true,"mode":"plain","timezone":"string"}'{
"ok": true,
"routine": {
"id": "trg_123"
}
}/api/v1/families/{familySlug}/notification-routines/{triggerId}Update notification routineUpdates a household notification routine.DetailsfamilySlugSlug of the family (household) to act on.triggerIdIdentifier of the notification routine.channels"in_app" | "email" | "push" | "sms"[]optionalcronstringoptionalintent"briefing" | "reminder" | "digest"optionalisEnabledbooleanoptionalmode"plain" | "mavo"optionaltimezonestringoptionalcurl -X PATCH https://mavolife.com/api/v1/families/your-family/notification-routines/triggerId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"channels":["in_app"],"cron":"string","intent":"briefing","isEnabled":true,"mode":"plain","timezone":"string"}'{
"ok": true,
"routine": {
"id": "trg_123"
}
}/api/v1/families/{familySlug}/notification-routines/{triggerId}Delete notification routineDeletes a household notification routine.DetailsfamilySlugSlug of the family (household) to act on.triggerIdIdentifier of the notification routine.curl -X DELETE https://mavolife.com/api/v1/families/your-family/notification-routines/triggerId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}Manage outbound webhook destinations.
/api/v1/families/{familySlug}/webhook-destinationsList webhook destinationsReturns outbound webhook destinations, delivery history, available events, and usage.DetailsfamilySlugSlug of the family (household) to act on.curl -X GET https://mavolife.com/api/v1/families/your-family/webhook-destinations \ -H "x-api-key: $MAVO_API_KEY"
{
"destinations": [],
"events": [
"tracker.entry.created"
],
"ok": true
}/api/v1/families/{familySlug}/webhook-destinationsCreate webhook destinationCreates an outbound webhook destination. The signing secret is returned once.DetailsfamilySlugSlug of the family (household) to act on.enabledbooleanoptionaleventTypes"collection.created" | "collection.updated" | "collection.deleted" | "tracker.entry.created" | "tracker.entry.updated" | "tracker.entry.deleted" | "calendar.event.created" | "calendar.event.updated" | "calendar.event.deleted" | "calendar.check.created" | "external_calendar.created" | "external_calendar.updated" | "external_calendar.refresh_requested" | "external_calendar.deleted" | "calendar_share.created" | "calendar_share.deleted" | "plan.created" | "plan.updated" | "plan.deleted" | "plan.event.linked" | "plan.event.unlinked" | "plan.note.created" | "plan.note.updated" | "plan.note.deleted" | "plan.poll.created" | "plan.poll.deleted" | "plan.poll.settled" | "plan.poll.reopened" | "plan.poll.vote.cast" | "plan.share.enabled" | "plan.share.disabled" | "person.created" | "person.updated" | "person.deleted" | "notification.sent" | "notification_preference.updated" | "notification_routine.created" | "notification_routine.updated" | "notification_routine.deleted" | "webhook_destination.created" | "webhook_destination.updated" | "webhook_destination.deleted"[]requirednamestringrequiredurlstringrequiredcurl -X POST https://mavolife.com/api/v1/families/your-family/webhook-destinations \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"eventTypes":["collection.created"],"name":"string","url":"string"}'{
"destination": {
"id": "whd_123",
"name": "Zapier",
"url": "https://example.com/webhook"
},
"ok": true,
"signingSecret": "whsec_..."
}/api/v1/families/{familySlug}/webhook-destinations/{destinationId}Update webhook destinationUpdates an outbound webhook destination or rotates its signing secret.DetailsfamilySlugSlug of the family (household) to act on.destinationIdIdentifier of the webhook destination.enabledbooleanoptionaleventTypes"collection.created" | "collection.updated" | "collection.deleted" | "tracker.entry.created" | "tracker.entry.updated" | "tracker.entry.deleted" | "calendar.event.created" | "calendar.event.updated" | "calendar.event.deleted" | "calendar.check.created" | "external_calendar.created" | "external_calendar.updated" | "external_calendar.refresh_requested" | "external_calendar.deleted" | "calendar_share.created" | "calendar_share.deleted" | "plan.created" | "plan.updated" | "plan.deleted" | "plan.event.linked" | "plan.event.unlinked" | "plan.note.created" | "plan.note.updated" | "plan.note.deleted" | "plan.poll.created" | "plan.poll.deleted" | "plan.poll.settled" | "plan.poll.reopened" | "plan.poll.vote.cast" | "plan.share.enabled" | "plan.share.disabled" | "person.created" | "person.updated" | "person.deleted" | "notification.sent" | "notification_preference.updated" | "notification_routine.created" | "notification_routine.updated" | "notification_routine.deleted" | "webhook_destination.created" | "webhook_destination.updated" | "webhook_destination.deleted"[]optionalnamestringoptionalurlstringoptionalrotateSecretbooleanoptionalcurl -X PATCH https://mavolife.com/api/v1/families/your-family/webhook-destinations/destinationId \
-H "x-api-key: $MAVO_API_KEY" \
-H "content-type: application/json" \
-d '{"enabled":true,"eventTypes":["collection.created"],"name":"string","url":"string","rotateSecret":true}'{
"destination": {
"id": "whd_123",
"name": "Zapier"
},
"ok": true
}/api/v1/families/{familySlug}/webhook-destinations/{destinationId}Delete webhook destinationDeletes an outbound webhook destination.DetailsfamilySlugSlug of the family (household) to act on.destinationIdIdentifier of the webhook destination.curl -X DELETE https://mavolife.com/api/v1/families/your-family/webhook-destinations/destinationId \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}/api/v1/families/{familySlug}/webhook-destinations/{destinationId}/testTest webhook destinationSends a test delivery to a webhook destination.DetailsfamilySlugSlug of the family (household) to act on.destinationIdIdentifier of the webhook destination.curl -X POST https://mavolife.com/api/v1/families/your-family/webhook-destinations/destinationId/test \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}Search household context.
/api/v1/families/{familySlug}/contextSearch household contextSearches household collections, members, and upcoming calendar items. Use the optional `query` query parameter to narrow results.DetailsfamilySlugSlug of the family (household) to act on.queryText to match across household collections, people, and calendar items.curl -X GET https://mavolife.com/api/v1/families/your-family/context \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"query": "soccer",
"results": []
}Look up weather and public web content.
/api/v1/families/{familySlug}/weatherCheck weatherLooks up weather for a location. Send `location`, and optionally `date` and `time`, as query parameters.DetailsfamilySlugSlug of the family (household) to act on.locationPlace to look up, such as a venue, city, or postal code.dateDate to focus on (YYYY-MM-DD). Defaults to the soonest available day.timeLocal time to focus on (HH:mm).curl -X GET https://mavolife.com/api/v1/families/your-family/weather \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true
}/api/v1/families/{familySlug}/web/searchSearch webSearches the public web. Send `query`, and optionally `numResults`, as query parameters.DetailsfamilySlugSlug of the family (household) to act on.queryWhat to search the public web for.numResultsNumber of search results to return.curl -X GET https://mavolife.com/api/v1/families/your-family/web/search \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"results": [
{
"title": "Example",
"url": "https://example.com"
}
]
}/api/v1/families/{familySlug}/web/pageRead web pageReads the main text of a public web page. Send `url` as a query parameter.DetailsfamilySlugSlug of the family (household) to act on.urlPublic HTTP or HTTPS URL to read.curl -X GET https://mavolife.com/api/v1/families/your-family/web/page \ -H "x-api-key: $MAVO_API_KEY"
{
"ok": true,
"text": "Readable page content...",
"url": "https://example.com"
}