Private means browser-session only
API-key requests never receive privateNotes, even if includePrivate=1 is sent. Search also excludes private notes for API keys. Agents should never claim that they searched or verified private notes.
A personal API key lets a trusted assistant work with cloud-synced daily notes, people, 1:1 meetings, talking points, decisions, and action items. Keys are revocable, meeting and note writes support conflict-safe patterns, and private meeting notes are never exposed to API keys.
GET /api/me.curl https://dailysync.apercallc.com/api/me \ -H "Authorization: Bearer ds_live_YOUR_KEY"
API-key requests never receive privateNotes, even if includePrivate=1 is sent. Search also excludes private notes for API keys. Agents should never claim that they searched or verified private notes.
Read a meeting first, then PATCH only changed fields with baseRevision. Never PUT a whole meeting. On 409, compare the returned server record and merge deliberately.
Daily notes use PUT /notes/:date because each date is one resource. Read first and send the note's current revision as baseRevision. Item updates also use partial PATCH requests.
Import the schema as an action or tool, then store your key as a bearer-auth secret.
Give a connected assistant the prepared privacy, confirmation, identifier lookup, and conflict-handling rules.
Find my open actions with Jordan that are due this week. Then summarize unresolved topics from our previous 1:1. Ask before completing, carrying, or changing anything.
The AI product must support authenticated HTTP actions, tools, or connectors. Never paste the key into a normal chat unless the product explicitly treats that field as a protected secret.
| Method | Path | Purpose |
|---|---|---|
| GET | /api/me | Verify the key and account. |
| GET | /api/notes | List daily notes with pagination or changed-since filtering. |
| PUT / DELETE | /api/notes/:date | Create, update, or soft-delete a daily note. |
| GET / POST | /api/people | List or create people. |
| PATCH / DELETE | /api/people/:id | Update, restore, or archive a person. |
| GET / POST | /api/series | List or create 1:1 series. Creating one materializes its next two occurrences. |
| PATCH / DELETE | /api/series/:id | Update or archive a series. |
| GET / POST | /api/meetings | List or create meeting occurrences. |
| GET / PATCH / DELETE | /api/meetings/:id | Read with previous-meeting context, partially update, or soft-delete. |
| POST | /api/meetings/:id/items | Add a talking point, action, or decision. |
| PATCH / DELETE | /api/items/:id | Partially update or permanently delete an item. |
| POST | /api/items/:id/carry | Atomically carry one open talking point to the next occurrence or its series parking lot. |
| POST | /api/items/reorder | Set the exact order of every top-level item in a meeting. |
| POST | /api/meetings/:id/carry | Carry all open talking points from a completed or skipped meeting. |
| GET | /api/actions | List action items across meetings with person, completion, and due-date filters. |
| GET | /api/search | Search standups, meetings, or action items across the workspace. |
GET /api/actions is the direct way to retrieve structured action items. Filter by personId, set openOnly=1 for actions whose completedAt is null, and use inclusive dueAfter or dueBefore filters with local YYYY-MM-DD dates. limit defaults to 100 and allows up to 200.
curl "https://dailysync.apercallc.com/api/actions?personId=PERSON_ID&openOnly=1&dueBefore=2026-08-31" \ -H "Authorization: Bearer ds_live_YOUR_KEY"
The response is {"actions":[...],"hasMore":false}. Resolve a person's ID with GET /api/people. Each action includes its meeting and person context so an assistant can name the source before proposing a change.
GET /api/search performs case-insensitive content search. q is required and allows 1–200 characters. Choose scope=notes for daily notes, meetings for meeting records and non-action items, actions for action items, or all for their union. Narrow with personId and inclusive local-date from/to filters. With scope=actions, openOnly=1 returns only actions whose completedAt is null. limit defaults to 50 and allows up to 100 results.
curl "https://dailysync.apercallc.com/api/search?q=onboarding&scope=all&from=2026-07-01&limit=25" \ -H "Authorization: Bearer ds_live_YOUR_KEY"
{
"results": [{
"type": "item",
"id": "ITEM_ID",
"date": "2026-08-12",
"personName": "Jordan Lee",
"title": "Review onboarding handoff",
"snippet": "Confirm owners before the onboarding launch",
"matchField": "notes",
"meetingId": "MEETING_ID",
"kind": "ACTION",
"status": "OPEN",
"completedAt": null,
"personId": "PERSON_ID"
}],
"hasMore": false
}Results are grouped as meetings, items, then notes, and are reverse chronological within each group. Item results include meetingId, kind, status, completedAt, and personId; those fields are null for meeting and note results. A personId filter omits daily notes because they have no person association. API-key searches never inspect or return meeting private notes—even if includePrivate=1 is sent, because that option is honored only for an authenticated browser session.
Create the person first, then use that ID in participantIds. Weekdays use 0 for Sunday through 6 for Saturday, and recurrence is calculated in the series' IANA timezone.
curl -X POST https://dailysync.apercallc.com/api/series \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"title":"Jordan Lee 1:1",
"cadence":"WEEKLY",
"weekday":2,
"startTime":"10:00",
"durationMinutes":30,
"timezone":"America/Chicago",
"startDate":"2026-08-18",
"participantIds":["PERSON_ID"]
}'The response includes the new series and its next two materialized meeting occurrences. Monthly schedules accept monthDay from 1–31; shorter months clamp to their final day.
# Add a talking point
curl -X POST https://dailysync.apercallc.com/api/meetings/MEETING_ID/items \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"TALKING_POINT","text":"Review onboarding handoff","starred":true}'
# Promote it to an action
curl -X PATCH https://dailysync.apercallc.com/api/items/ITEM_ID \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"ACTION","owner":"ME","dueDate":"2026-08-21"}'Item kinds are TALKING_POINT, ACTION, and DECISION. To complete an action, set completedAt to an ISO 8601 timestamp; set it to null to reopen.
curl -X PATCH https://dailysync.apercallc.com/api/meetings/MEETING_ID \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"sharedNotes":"Reviewed the handoff plan.","baseRevision":3}'GET /api/meetings/:id returns a previous block containing the prior completed meeting's shared notes, discussed points, decisions, and still-open actions. This is the best continuity context for prep.
POST /api/meetings/:id/carry carries every open talking point after the source meeting is COMPLETED or SKIPPED. With an empty body, DailySync chooses the next scheduled meeting or the series parking lot. To select a valid later occurrence explicitly, send {"targetMeetingId":"..."}.
curl -X POST https://dailysync.apercallc.com/api/meetings/MEETING_ID/carry \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{}'POST /api/items/:id/carry atomically marks one top-level OPEN TALKING_POINT as CARRIED and creates one copy with its provenance and incremented carryCount. The source must belong to an active series. Send {} to choose or materialize the next recurring occurrence, {"targetMeetingId":"..."} for a later SCHEDULED or IN_PROGRESS occurrence in the same series, or {"parkingLot":true} to create or reuse that series' undated DRAFT meeting. Do not combine targetMeetingId and parkingLot.
curl -X POST https://dailysync.apercallc.com/api/items/ITEM_ID/carry \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"parkingLot":true}'The response is {"meeting":{...},"item":{...}}. Every lookup and write is scoped to the authenticated account, and API-key responses never contain the target meeting's privateNotes. Reordering is exact: POST /api/items/reorder must include every top-level item ID from that meeting exactly once. Fetch the meeting first, preserve all IDs, and confirm before changing their order.
curl -X PUT https://dailysync.apercallc.com/api/notes/2026-08-13 \
-H "Authorization: Bearer ds_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"yesterday":"Shipped onboarding","today":"Finish API docs","impediments":[],"todayPriority":"normal"}'For an update, read the note first and send its revision as baseRevision. HTTP 409 means another client changed it; merge deliberately instead of retrying blindly.
200/201/204 success · 400 invalid input · 401 invalid or revoked key · 404 missing account-scoped record · 409 revision, state, uniqueness, reorder, or account-limit conflict · 413 body over 128 KB · 429 rate limited.
5,000 daily notes · 100 people · 50 series · 5,000 meetings · 200 items per meeting · 20 participants per series. Authenticated reads and writes are each limited to 120 requests per account per minute; a network-level cap of 180 API requests per minute also applies.
Daily note and shared meeting-note fields allow 50,000 characters. Item text allows 2,000 characters and item notes allow 20,000. Note and meeting list pages contain at most 500 records; actions allow up to 200 and search up to 100.