Data model

Everything you can build on.

Your memos aren't locked inside an app. Here is every kind of record in an account, how they connect, and how to read each one, whether you're pointing an agent at it or building your own page. Select a node, or drag one around.

Always Sometimes Arrows read as sentences: an entry is filed in a project.

Reference

Every record, field by field.

Everything here belongs to one account and only that account. Routes are relative to the app's address and use your signed-in session; agents reach the same data through their tools.

Entry

One capture: a voice memo, a typed note or a file. Its body is the one text that search, chat and agents read.

Fields

id string
The capture time plus a short random suffix.
type enum
audio, text or file.
status enum
uploading, processing, ready or failed.
captured_at date-time
When it was spoken, typed or saved, in your own time zone.
local_date date
The day it belongs to, in your time.
title string
Written by Cordial unless you set it.
gist string
One line on what it's about.
summary string
For entries over about 150 words.
body string
The cleaned transcript, the note as typed, or a file's text.
body_version number
Counts edits. Every earlier version is kept.
word_count, duration_sec number
How long it is.
locked list
Fields you set by hand (project, title, body). Never overwritten.
project_id string
Where it's filed.
file object
For a file: its name, type, kind and size.

Read and change it

  • GET/api/entries by date, project, type, status
  • GET/api/entries/{id}
  • GET/api/search?q=
  • POST/api/entries
  • PATCH/api/entries/{id}
  • POST/api/entries/{id}/retry
  • DELETE/api/entries/{id}

Agent tools

search list_entries get_entry create_note create_file set_title replace_in_body set_body move_entries

Project

Your own buckets. Cordial files every entry into one of them, or the Inbox, and never invents one.

Fields

id string
Stable, so a rename is one change. inbox and empty are built in.
name string
1 to 60 characters.
description string
What belongs here, in plain words. Filing reads this.
entry_count number
How many entries it holds.
builtin bool
Inbox and Empty Recordings can't be renamed or deleted.

Read and change it

  • GET/api/projects
  • POST/api/projects
  • PATCH/api/projects/{id}
  • POST/api/projects/{id}/merge
  • DELETE/api/projects/{id}

Agent tools

list_projects create_project update_project merge_projects

Account

You. Every other record hangs off your account, and no other account can reach any of it.

Fields

email string
Your sign-in address.
status enum
Active or not. An inactive account is locked out everywhere at once.
plan string
Your plan.
entry_count number
How many entries you have.
upload_url string
Where the iPhone share sheet sends captures.
mcp_url string
Your MCP server address, for agents.
has_key, key_created_at bool, number
Whether a capture key exists, and when it was made.

Read and change it

  • GET/api/account
  • POST/api/account/key
  • POST/api/account/signout-all

Original file

The files behind an entry. Each is handed out as a download link that expires after five minutes.

Kinds

audio file
The recording, as captured.
file file
An uploaded photo, PDF or anything else, up to 100 MB.
transcript_raw json
The speech engine's own output, word by word with confidence. Never rewritten.
text json
The transcript in a provider-neutral shape.

Read it

  • GET/api/entries/{id}/artifacts/{name}
  • GET/api/entries/{id}/audio

Mention

People, places and projects an entry names, picked out when it's processed. They come with every entry.

Fields

text string
The name as said.
type string
A person, a place, a project and so on.

Read it

  • GET/api/entries/{id} as entities

Agent tools

get_entry

File reading

How a file's text was read: a PDF's text layer for free, or a photo or scanned page read by a model when you ask.

Fields

mode enum
text, describe (photos) or scan (PDF pages).
outcome enum
ok, no_text, too_large or unreadable.
engine enum
plain, pdf-text or vision.
pages, chars number
How much was read.
truncated bool
Text past 200,000 characters is cut.

Ask for one

  • POST/api/entries/{id}/extract

Agent tools

extract_file

Chat

A conversation with your memos: over everything, one project, or a handful of entries.

Fields

session_id string
Its id.
title string
Named after its first question, a project or an entry.
project_id string
Set when it's limited to one project.
memo_ids list
Up to five entries it's about, always in view.
message_count, updated_at number
How long, and how recent.

Read and change it

  • GET/api/chats
  • POST/api/chats
  • GET/api/chats/{id}
  • DELETE/api/chats/{id}

Message

One turn in a chat. Answers link every memo they name.

Fields

role enum
user or assistant.
content string
Markdown. A memo it names is a link to that memo.
created_at number
When it was sent.

Send one

  • POST/api/chats/{id}/messages

Agent connection

A key an outside agent uses over MCP: which projects it sees, and whether it may change anything. The key itself is shown once and never listed.

Fields

id, label string
Its name, 1 to 60 characters.
all_projects, projects bool, list
Everything, or the projects listed.
write bool
Whether it may make changes.
source enum
pasted (a key you made) or oauth (an app you connected).
client string
For a connected app, where it lives.
created_at number
When it was made.

Read and change it

  • GET/api/account/agent-keys
  • POST/api/account/agent-keys
  • DELETE/api/account/agent-keys/{id}

Usage day

What your account used and cost, per day, task and kind of entry, at list price.

Fields

date, task, type string
Which day, which step (like enrich or chat), which kind of entry.
llm_calls, llm_in_tokens, llm_out_tokens number
AI calls and their size.
transcribe_sec, vector_queries number
Speech transcribed, searches by meaning.
usd object
Cost by kind (llm, transcribe, vectors, compute) and in total.

Read it

  • GET/api/usage?from=&to= with totals by task, type, project, agent and Overhead

App copy

Your own copy of the web app, served only to you and kept as it is through updates.

Fields

app enum
standard or custom.
build string
The version your copy serves.
forked_from, forked_at string, date-time
Which standard version it was copied from, and when.
standard_build string
The standard app's current version.

Read and change it

  • GET/api/app
  • POST/api/app/fork
  • DELETE/api/app
  • GET/my/… your copy's pages

Point an agent at it.

Everything above is reachable from the assistant you already use, inside the scope you choose.

Connect an agent