/capturesWrite scopeCreate a capture. Send the thought as text; if you leave category out, the server classifies it: files it as one of the thirteen kinds listed below (a to-do, a reminder, an event, a contact, an expense and so on) and extracts the useful parts (names, dates, places) into extractedData.
Body · application/json
| Field | Type | Description |
|---|---|---|
rawTextrequired | string | The thought, as text. Required unless transcription is present. |
transcription | string | Already-transcribed speech, if your device did the transcribing. Treated like rawText. |
category | string | One of contact event todo idea note link image reminder activity expense quote media health. Omit it and the server decides. |
capturedAt | ISO 8601 | When the thought happened. Defaults to arrival time. |
latitude, longitude | number | Where it happened. Send both or neither; captures with coordinates show up on the map. |
locationName | string | A human-readable place, e.g. “Grant Park”. |
Context is whatever you send. The API stores these fields as given, and for a capture sent with a key there is no geocoding or weather lookup on our side. One exception: a capture that arrives with no coordinates is given the place your phone last reported through the BrainCrumb app, when that was recent enough that the phone cannot have moved far, and its place name then starts with “Near”. The BrainCrumb app attaches place, weather and motion because it reads them from the phone at the moment of capture; a headless device has no sensors to read, so its captures arrive without them unless it sends some.
Headers
| Header | Type | Description |
|---|---|---|
Authorizationrequired | string | Bearer bc_sk_… |
Idempotency-Key | string | Any unique string (up to 128 chars) per capture attempt. Retrying with the same key returns the original capture instead of creating a duplicate. Built for devices on flaky connections that retry until they hear back. Use a new one for each capture. A new capture sent with a key already used is not saved: the answer is the first one. |
{
"id": "5b21c6a5-8f4e-4c9a-9d3e-2f7a1c0b8d44",
"rawText": "Idea: braincrumb sticker on the coffee machine",
"category": "idea",
"confidence": 1,
"isProcessed": true,
"extractedData": { "rawEntities": { "phones": [], "emails": [], "urls": [], "dates": [], "addresses": [] } },
"capturedAt": "2026-08-05T14:31:07.412Z",
"locationName": null,
"updatedAt": "2026-08-05T14:31:07.412Z"
}Responses
201Created. The full capture, classified and filed.
200Replayed. This
Idempotency-Keyalready landed; you got the original capture back (with anIdempotency-Replayed: trueheader).400Bad request. Nothing to capture (the server says: At least one of rawText, transcription, imageKey, or url is required), a body that is not a JSON object, or a category that is not one of the thirteen.
401Unauthorized. Missing, malformed, or revoked key.
403Forbidden. The key exists but lacks write scope.
429Daily cap reached. While BrainCrumb is in beta each key can send 2,000 captures a day. The day turns at midnight in your account’s time zone (UTC when it has none). The response carries a
Retry-Afterheader (seconds). Back off, don’t hammer.