The archive¶
What an export's OS part holds and how it is laid out, for whoever reads it with a program. What an export is is in Exports; how to take one is in Exports through the API.
Layout¶
An OS part is a zip. Every file but manifest.json, organisation.json and the photos under files/
holds one JSON object per line.
| File | Holds | In |
|---|---|---|
organisation.json |
the organisation: its id, name, the organisation above it, status, labels, audit retention, created and status changed | an organisation's export |
control/membership.jsonl |
memberships: id, organisation, person, status, created and status changed | every export |
control/person.jsonl |
the people of the memberships: id, address, name, status and photo (its address with every size, and file where the archive holds the photo itself); in your own, also whether your address is verified |
every export |
files/photo/<id> |
a person's photo, the fullest image kept, without an extension: its type is in the manifest; their row in control/person.jsonl names it in photo.file, and only what the manifest lists is in the zip |
every export, for the people the requester may see |
control/invitation.jsonl |
invitations: id, membership, address, purpose, who invited, status, expiry | every export; in your own, those you accepted |
control/coresubject.jsonl |
the id the AI features know each person by in each organisation: how to join this archive to the AI features' part | every export |
control/personpreference.jsonl |
your language, landing page, navigation, notification choices and what you have already seen (such as the tour) | your own account part |
control/controlevent.jsonl, control/organisationplan.jsonl, control/serviceexception.jsonl |
the organisation's lifecycle, its plans and exceptions | an organisation's export |
tables/member.jsonl, tables/groupmember.jsonl, tables/memberattribute.jsonl, tables/roleassignment.jsonl |
members, their groups, values and roles | every export but your account part |
tables/group.jsonl, tables/role.jsonl, tables/policy.jsonl, tables/attributedefinition.jsonl, tables/groupattribute.jsonl, tables/invitationgrant.jsonl |
groups, custom roles, the rules document, attributes and what invitations give | an organisation's export |
tables/auditevent.jsonl |
the audit trail; in a member's or your own export, what that person did | every export but your account part |
tables/notification.jsonl, tables/notificationitem.jsonl, tables/notificationdefault.jsonl |
notifications, the items members saw, the organisation's defaults; a member's and your own export hold their items | as said |
tables/event.jsonl, tables/webhooksubscription.jsonl, tables/webhookdelivery.jsonl |
events, webhooks without their secrets, deliveries | an organisation's export |
tables/slackwebhook.jsonl |
Slack channels the organisation connected, without their addresses | an organisation's export |
tables/handover.jsonl, tables/handoverstep.jsonl |
the Direct Chat desk: every request for an employee with its state, how it started and its moments, and every step of it; never a word of the conversation | an organisation's export |
manifest.json |
what the archive is, last in the zip | every export |
Times are ISO 8601 in UTC (2026-10-17T09:14:03Z), and ids are the ones the API answers, so a row
in the archive and the same thing from the API name the same things.
The manifest¶
{"format": "artific-os/export", "format_version": 1, "export_id": "xpt_...",
"scope": "organisation", "organisation_id": "org_...", "membership_id": null,
"created_at": "2026-10-17T09:14:03Z", "completed_at": "2026-10-17T09:21:40Z",
"requested_by": "mem_...", "consistency": "per_table_batch",
"files": {"tables/auditevent.jsonl": {"rows": 48211, "sha256": "...", "withheld": 0},
"files/photo/per_...": {"bytes": 48113, "sha256": "...", "media_type": "image/webp"}},
"not_contained": {"corekey": "a key OS holds at Core, a secret"},
"core": {"export_id": "exp_...", "status": "running"}}
filesgives each file's rows, the SHA-256 of its content and how many rows were left out because the requester may not see them. A photo is listed with its size in bytes (bytes), its SHA-256 and its type (media_type, such asimage/webp).not_containednames what is left out on purpose, and why.consistency: per_table_batch: OS reads a file a batch at a time, so a row changed while the export ran can be in its old or its new state.corenames the AI features' part when it was asked for; its size and digest are on the export itself (corein the API's answer).- The SHA-256 of the whole zip is on the export (
sha256) and in the download'sDigest, never in the zip.
Versions¶
format_version is 1. Fields and files are added, never removed or renamed; a change that would
break your reader raises format_version.