How it works
- A Nexio-hosted application’s server holds the organization’s live key. It sends the signed-in person as
X-Nexio-Acting-Principalon every call. A call without it answers 401unauthorized. - The application is one of a fixed list of six Nexio-hosted applications, set in code; no organization adds one. An unknown application answers 404
not_found. - Inside an application, records live in named collections. A collection needs no setup: its name must match
^[a-z0-9][a-z0-9_-]{0,62}$. - Every write is owned by the acting principal. A read returns the caller’s own record, or a shared record with the same id. A person never reads another person’s owned records.
- Files are not stored inside records. They go through a separate blob flow with short-lived upload and download grants.
Records
A record (a row) has:id: the caller’s identifier, 1 to 200 bytes, no/and no control characters.subjectKeys: up to 16 promoted string fields the application filters on, for example{"account": "acct-4471"}. Key pattern^[a-z][a-z0-9_]{0,63}$, each value 1 to 500 bytes.payload: any JSON value except null, up to 256 KiB. A payload that embeds file bytes (adata:URL, or a key such asbase64orcontentBase64) is refused. Files use blobs.version: a counter the server owns. Create withversion: 0. Each change, including a delete, increments it.ownerPrincipal: the owner, or null for a shared record. Shared records are created only by Nexio’s import path.
A record
- Optimistic concurrency. A write names the version it expects. A stale version answers 409
version_conflict. Retrying the same write with the same content returns the stored record without incrementing, so a retry after a timeout is safe. - Batch writes. One request writes 1 to 100 records in a single transaction. All succeed or none do.
- Soft delete. A delete names the expected version and marks the record deleted.
recreate: truewithversion: 0revives a deleted id. - Paging. Lists sort newest first by
updatedAt. The cursor is signed, carries a read pin, and expires after one hour. Filters aresubject.<key>=<value>(at most 100 values in total),updated_since(RFC 3339) andlimit.
Files (blobs)
Blob states arepending, ready and rejected, plus soft delete.
- Reserve. The application sends
id,name,contentTypeandsizeBytes. The store answers 201 with an upload URL valid for 15 minutes. - Upload. The application uploads the bytes directly to that URL, without the Nexio key.
- Finalize. The store checks the uploaded object. A size mismatch answers 409
upload_mismatch. A file over 10 MiB answers 413object_too_large. A type that does not match its declared media type answers 415unsupported_media. On success the blob isready. - Read. Metadata is served for
readyblobs only. The content route returns a download URL valid for 5 minutes. PNG and JPEG open inline; every other type downloads as an attachment. - Delete. Soft-deletes the metadata.
application/json, application/pdf, image/png, image/jpeg, image/webp, image/svg+xml, text/csv, and Excel workbooks (.xlsx). When the deployment has no object store configured, every blob route answers 503 storage_unavailable.
Limits
Errors
Next
Records overview
The read and write layer these applications build on.
Authority and scope
How the acting principal works.