Skip to main content

The export file format

This describes the file Export everything produces, so another application can read it without guessing.

It is not a LifeWell format. JSON is JSON, and the archive is an ordinary zip of ordinary CSV files.

The three files

FormatFile nameMedia typeComplete
JSONlifewell-export-<YYYY-MM-DD>.jsonapplication/jsonYes
CSVlifewell-export-<YYYY-MM-DD>.zipapplication/zipYes
PDFlifewell-export-<YYYY-MM-DD>.pdfapplication/pdfNo — see below

The date is your own local day, not a server day. The name stays ASCII and the same shape in every language, because it is something you will search a downloads folder for.

The JSON document

One object. A small header, then one key per table, each holding an array of rows.

{
"exportedAt": "2026-09-08T11:04:22.417Z",
"schema": 1,
"range": { "from": "2026-01-01", "to": "2026-09-08" },
"rowCap": 5000,
"truncated": ["metric_entries"],
"profile": { "id": "…", "display_name": "…" },
"conditions": [],
"medications": [ { "…": "…" } ]
}
Header fieldTypeMeaning
exportedAtISO 8601 string, UTCWhen the file was made
schemanumberThe format version. Currently 1
range.from / range.toISO date or nullThe window you chose. null means open-ended
rowCapnumberThe per-table ceiling that was applied — 5000
truncatedarray of table namesTables that hit the ceiling. Empty means nothing was cut
profileobject or nullYour profile row, carried whole rather than as a one-row array

Three things worth knowing before you write a reader:

  • A table with no rows is an empty array, not an absent key. "meals": [] is a statement; a missing meals key would be a question.
  • truncated is the only signal that a file is partial. Read it before you conclude somebody has no history.
  • The JSON is pretty-printed, two spaces. It is a file you are meant to open and search, and a single eight-megabyte line is not something a text editor opens gracefully.

The CSV archive

A zip holding one .csv per table, named <table>.csv. The columns are the table's own columns.

DetailValue
Line endingsCRLF, per RFC 4180
EncodingUTF-8 with a byte-order mark
QuotingRFC 4180 — doubled quotes, fields containing ", ,, CR or LF are quoted
Empty cellnull and undefined both become an empty cell
Nested valuesKept whole as JSON in the cell, rather than flattened across rows

Two deliberate choices that will otherwise look like bugs:

  • A table with no rows still gets a file, carrying only its header row. A missing file is indistinguishable from a failed export; a header alone proves the table was considered.
  • A cell whose text begins =, +, -, @, a tab or a carriage return is prefixed with an apostrophe. Spreadsheets treat those characters as the start of a formula. Your data is your own, so this is not protection from a stranger — it is protection for whoever you hand the file to, who on this page is often a doctor. Strip the leading apostrophe if you are parsing rather than opening.

The byte-order mark is there because Excel on Windows reads an unmarked UTF-8 file as the local code page, which mangles any name with an accent in exactly the tool this format exists for.

Every table in the file

Sixty-five tables, grouped by the area they belong to.

  • RangeDated rows honour the date window you chose. Standing rows are always included, because a dose with no medicine attached reads as data loss.
  • In the PDFListed in full prints the rows. Counted, not listed prints the count and the span but not the rows. Not in the PDF means exactly that.

Health

TableWhat it holdsRangeIn the PDF
conditionsConditionsStandingListed in full
condition_episodesEpisodesDatedListed in full
medicationsMedicationsStandingListed in full
medication_dosesMedication dosesDatedCounted, not listed
metric_entriesTracker readingsDatedCounted, not listed
user_metric_settingsTracker settingsStandingListed in full
metric_definitionsTracker typesStandingListed in full
mealsMealsDatedCounted, not listed
saved_mealsSaved mealsStandingNot in the PDF
saved_meal_itemsSaved meal itemsStandingNot in the PDF
eating_windowsFasting windowStandingListed in full
shopping_listsShopping listsStandingNot in the PDF
shopping_list_itemsShopping list itemsStandingNot in the PDF
movement_sessionsWorkoutsDatedCounted, not listed
wellness_breaksWellness breaksDatedNot in the PDF
wellness_nudgesWellness nudgesStandingNot in the PDF

Mind

TableWhat it holdsRangeIn the PDF
journal_entriesJournal entriesDatedNot in the PDF
mind_sessionsGuided sessionsDatedCounted, not listed

Life stages

TableWhat it holdsRangeIn the PDF
cycle_daysCycle daysDatedCounted, not listed
babiesChildrenStandingListed in full
baby_growthGrowth measurementsStandingListed in full
baby_logsBaby logsDatedCounted, not listed
baby_milestonesMilestonesStandingListed in full

People

TableWhat it holdsRangeIn the PDF
peoplePeopleStandingListed in full
person_edgesRelationshipsStandingNot in the PDF
connectionsConnectionsStandingListed in full
connection_prefsConnection settingsStandingNot in the PDF
share_linksSharesStandingListed in full
share_submissionsSent through a share linkStandingNot in the PDF
community_membersGroups you joinedStandingNot in the PDF
postsCommunity postsStandingListed in full
post_repliesCommunity repliesStandingNot in the PDF
blocksPeople you blockedStandingNot in the PDF
chatsConversationsStandingNot in the PDF
chat_membersWho is in each conversationStandingNot in the PDF
messagesMessages you sentStandingNot in the PDF
message_hidesMessages you hidStandingNot in the PDF
professionalsYour professional listingStandingListed in full
professional_claimsWhat you told us about yourselfStandingNot in the PDF
professional_slotsTimes you offeredStandingNot in the PDF
professional_verificationsRegister checksStandingNot in the PDF
blood_donor_profilesYour blood donor listingStandingListed in full
blood_requestsBlood requests you sentStandingListed in full

Memories

TableWhat it holdsRangeIn the PDF
memoriesMemoriesStandingNot in the PDF
scrapbook_itemsScrapbook itemsStandingNot in the PDF
media_filesMedia itemsStandingCounted, not listed
media_albumsAlbumsStandingListed in full
media_peopleWho is in a photoStandingNot in the PDF
tagsTagsStandingListed in full
taggablesTagged itemsStandingNot in the PDF

Everyday

TableWhat it holdsRangeIn the PDF
notesNotesStandingNot in the PDF
note_foldersNote foldersStandingNot in the PDF
location_pointsSaved placesStandingCounted, not listed
location_settingsLocation settingsStandingListed in full
eventsCalendarDatedListed in full
event_checklist_itemsAppointment notesStandingNot in the PDF
reminder_schedulesRemindersStandingListed in full

Your account

TableWhat it holdsRangeIn the PDF
profilesYour profileStandingListed in full
notificationsMessages sent to youDatedNot in the PDF
export_runsEarlier exportsStandingNot in the PDF
export_schedulesScheduled exportsStandingNot in the PDF
plan_grant_requestsPlan requestsStandingNot in the PDF
referralsPeople you invitedStandingNot in the PDF
referral_rewardsWhat your invitations earnedStandingNot in the PDF
account_auditChanges to your accountDatedNot in the PDF

What each format leaves out

JSON and CSV are complete. Every one of the sixty-five tables above is in both.

The PDF is not, and that is the point of it. A PDF is a document people print, hand to a receptionist and leave on a desk. So it carries what a clinician actually reads and nothing else:

  • Listed in full — the standing records: conditions, medications, tracker types and targets, children, growth measurements, milestones, people, connections, shares, calendar, reminders, your profile.
  • Counted, not listed — the high-volume dated ones: tracker readings, medication doses, meals, workouts, cycle days, baby logs, guided sessions, media items, saved places. Forty rows out of four thousand is a sample, and a sample in a document labelled your record misleads the one reader it exists for. A listed table prints at most 60 rows.
  • Not in the PDF at all — the journal, memories, notes, scrapbook items, messages, community replies, and everything else somebody wrote for themselves.
The journal is never in the PDF, and that one is not a preference

Everything else on this page is a choice about what is useful. The journal is the one surface in LifeWell that must not leave on a sheet of paper somebody sets down on a desk. It is in the JSON and the CSV, which are files you open yourself.

What no format ever contains

Seven things are absent from every export, including the complete ones.

AbsentWhy
Media files themselvesThe images live in your own Google Drive. The export carries the reference, the caption and the date — the bytes were never ours to hand over
Anything shared with youSomebody else's record, lent to you. It leaves when they revoke it, which a copy in your file would not
Deleted rowsDeletion is deletion. There is no recycle bin behind the export
Operational logsRate-limit counters, dismissed notices and similar. Interface state, not your record
Your passwordThere is not one. Sign-in is Google, and we never see or store a password
Your AI provider keyHeld encrypted, and it is a live credential. Writing it into a plain file you are about to email yourself would be a leak wearing the costume of completeness
AI usage meteringThe meter a limit is counted from, not something you wrote

Five further tables are held back for the same class of reason, each of them a credential or somebody else's record:

Held backWhy
Reports you made about a postNobody can read that table back, including you. A moderation queue that leaks through a download is the same leak with an extra step
A blood donor's released contact detailsGiven once, to one person, and withdrawable. A row in a file is neither
Your Google Drive connectionIt holds a live refresh token
A Play purchase recordIt holds a purchase token Google will honour. Your entitlement is already in the file, on your profile
Dismissed announcementsWhich notices you closed. Interface state

And four tables are shared reference data rather than yours: the plan list, the community catalogue, the food database, and one internal table used by a keep-alive check.

Reading it back

There is no import. Nothing in LifeWell reads one of these files back in.

The format is documented so that something else can — a script, a spreadsheet, another application, or you in five years with a text editor. Two properties make that practical, and both are deliberate:

  1. Every identifier in the file is the database's own column name, so a column means the same thing in the JSON, the CSV and this page.
  2. The header names its own limits. A partial file says it is partial in its first ten lines.

When this page changes

Every wave that adds a table adds its row above, and a test asserts the list here matches the schema in both directions — a table in one and not the other fails the build rather than shipping a silent gap.

If you are writing a reader, key off schema. It is 1 today, and it will increase before anything in the shape above changes meaning.