DAILYSYNC API · V1

Connect your standups and 1:1s to AI.

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.

Quick start

  1. Sign in and open Settings → API keys.
  2. Create a named key and copy it immediately. It is shown only once.
  3. Store it in your AI tool's protected secret or authorization setting.
  4. Test the connection with GET /api/me.
Keep the key private. Anyone holding it can read, write, archive, and delete cloud-synced data, except private meeting notes. Revoke it immediately if exposed.

Verify your key

curl https://dailysync.apercallc.com/api/me \
  -H "Authorization: Bearer ds_live_YOUR_KEY"

Privacy and safe writes

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.

Patch, don't replace

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.

Use it with your AI

OpenAPI assistants

Import the schema as an action or tool, then store your key as a bearer-auth secret.

Open the OpenAPI schema

Prompt-based setup

Give a connected assistant the prepared privacy, confirmation, identifier lookup, and conflict-handling rules.

Open AI instructions

Example request

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.

Endpoint map

MethodPathPurpose
GET/api/meVerify the key and account.
GET/api/notesList daily notes with pagination or changed-since filtering.
PUT / DELETE/api/notes/:dateCreate, update, or soft-delete a daily note.
GET / POST/api/peopleList or create people.
PATCH / DELETE/api/people/:idUpdate, restore, or archive a person.
GET / POST/api/seriesList or create 1:1 series. Creating one materializes its next two occurrences.
PATCH / DELETE/api/series/:idUpdate or archive a series.
GET / POST/api/meetingsList or create meeting occurrences.
GET / PATCH / DELETE/api/meetings/:idRead with previous-meeting context, partially update, or soft-delete.
POST/api/meetings/:id/itemsAdd a talking point, action, or decision.
PATCH / DELETE/api/items/:idPartially update or permanently delete an item.
POST/api/items/:id/carryAtomically carry one open talking point to the next occurrence or its series parking lot.
POST/api/items/reorderSet the exact order of every top-level item in a meeting.
POST/api/meetings/:id/carryCarry all open talking points from a completed or skipped meeting.
GET/api/actionsList action items across meetings with person, completion, and due-date filters.
GET/api/searchSearch standups, meetings, or action items across the workspace.

Find actions

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.

Search the workspace

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 a weekly 1:1

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.

Prepare and update a meeting

# 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.

Patch shared meeting notes safely

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.

Carry and reorder

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 '{}'

Carry one talking point

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.

Daily note example

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.

Responses and limits

Status codes

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.

Account limits

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.