The record store and conditional updates
Every site can keep its own structured data: sign-ups, stock, sermons, jobs. Records are JSON, grouped in collections, and are read and written by your flows, your pages and the studio.
Records
A record has a collection (e.g. people), an id unique in that collection (up to 256 characters), JSON data, and created/updated times. The store is created by the first record you save.
| Step | What it does |
|---|---|
store_record | Creates or replaces a record (merge: true merges into it instead). POST flows only. |
query_records | Finds records with up to 10 filters (eq, ne, gt, gte, lt, lte, starts_with, exists, in), up to 3 sort keys, 1–100 per page. Works in GET flows too, so a page can list records. |
delete_record | Deletes one record. POST flows only. |
update_record | A conditional change (below). |
{ "type": "store_record", "collection": "signups", "record_id": "{{input.email}}",
"data": { "name": "{{input.name}}", "event": "{{input.event}}" } }
Owners can add up to 10 indexes (add_record_index) for fields you filter or sort on often. In the studio and from your AI client: get_record_store, query_records, get_record, export_records, and an NDJSON download of everything.
Conditional updates
update_record changes a record only if its conditions hold, in one atomic step, so two visitors can never both take the last seat.
{ "id": "take", "type": "update_record", "collection": "stock", "record_id": "{{input.sku}}",
"if": [{ "path": "left", "op": "gte", "value": "{{input.qty}}" }],
"dec": { "left": "{{input.qty}}" } }
- Changes:
set,inc,dec,push(append to a list),unset. - Modes:
update(the record must exist),upsert(create it if missing),create(only if missing). batch: up to 25 writes (including deletes) that happen all or nothing, e.g. reserve every item of an order and create the order.- Every write bumps the record's
version; conditions can check_versionfor safe edits (“someone else saved first”). - A failed condition is not an error: nothing is written and
{{steps.take.status}}isconflict, with the current record in{{steps.take.record.*}}, so the flow can answer “sold out”.
Good uses: stock and seats, unique sign-ups, counters and rate limits, claiming queue items, optimistic edits.
Limits
64 KB per record, 9.5 GB per site (the site's billing owner is emailed once at 80%), 10 indexes, 100 records per query page. Records are kept until you delete them; delete_record_store (owner, always confirmed) erases the whole store.
Price
| What | Credits |
|---|---|
| Record operations (each step or tool call) | 0.94 per 1,000 |
| Rows written | 2 per 1,000 |
| Rows read | 0.002 per 1,000 |
| Storage | 400 per GB-month (0.4 per MB-month) |
No monthly minimum. Charged daily with your site's other usage.