One operation ID
Repeat the same idempotency key to retrieve the same operation. Reusing it with different input is a conflict.
Work with file metadata and bytes across user-controlled devices and connected storage.
/v1 interface. Existing Atom services use different internal contracts; no public credentials are issued yet.Choose a workflow to see the request and response shape. Examples use sample IDs.
GET /folders/{id}/children
Find a fileSearch authorized metadata.GET /search
Open a fileRead a pinned version or byte range.GET /files/{id}/content
Use file intelligenceCheck outputs, then read an artifact or embedding.GET /files/{id}/processing
Save a fileRequest a transfer, then await the receipt.POST /uploads
React to changesReceive a hint, then catch up from a cursor.POST /webhooks
Understand usageSee what was transferred and what was billed.GET /usage/summary
The public API is not available yet. Atom has internal components, but third-party authentication, destination-bound writes, and a documented public contract are not shipped.
Authenticated Atom services; a B2-backed Finder drive with upload sessions; Mac-side staging and recovery; a local operation outbox; peer-to-peer file reads; internal semantic-search tables.
Folder-scoped third-party authorization; Mac inbound write receiver; durable destination receipts; a unified operation ledger; change feed; version-pinned processing and artifact access; stable endpoints and SDKs.
Based on a workspace code review, not a live production audit. Backend and synchronization guarantees must be verified before this public contract is released.
Integrations address an Atom folder and file. They do not choose a Google Drive API, a Backblaze bucket, or a Mac filesystem path. Atom keeps that routing behind the API boundary.
“Request accepted” and “file saved at its destination” are separate facts. A destination may be offline or temporarily unavailable.
Choose an endpoint to open its own reference page and shareable URL. File delivery, usage metering, and billing are separate concerns. Atom’s provider-specific queues, credentials, and internal routing stay private.
GET/v1/folders/{folder_id}/childrenList one folder’s immediate files and subfolders; use the same sort and cursor contract as roots.PATCH/v1/files/{file_id}/processing-policyEnable or disable processors with an expected policy revision.GET/v1/files/{file_id}/artifactsList thumbnails, OCR, transcripts, summaries, and other derived outputs.POST/v1/uploads/{operation_id}/transfer-planRefresh an expired transfer plan without duplicating the file.POST/v1/uploads/{operation_id}/finishSender reports byte transfer complete; destination verification still follows.These paths are not yet served by a public Atom API. The existing Atom Drive API has different routes.
The OpenAPI 3.1 JSON covers all 38 operations, request fields, response examples, status codes, and scoped bearer assumptions. Its server uses a non-working .invalid host until public API access is available.
Before freezing this contract, implement and test a resumable upload data plane, consistent snapshot-to-change handoff, explicit user consent for grants, and safe one-time webhook-secret handoff. The existing internal routes do not prove these public API semantics.
Atom identifies a file’s media type from content and metadata, then applies only enabled processors that fit that version. Ask for processing status before requesting an artifact. There is no single “file processing complete” flag: OCR may be ready while a summary is still running.
Each output is tied to the immutable version_id and records its processor or model. States are not_applicable, disabled, queued, running, partial, ready, failed, or stale. New bytes create new processing state; old outputs must never appear current. Processing may occur asynchronously, and available outputs depend on policy, cost, and source availability.
Read status and policy revision → optionally update enabled outputs → start a version-pinned run with an idempotency key → check its progress and list outputs. To stop unfinished work, request cancellation. To remove an already-published derivative, delete that artifact separately. Neither action deletes or rewrites the original file.
A policy update uses expected_policy_revision to avoid lost edits. Cancellation may race with completion and keeps already-published outputs. Artifact deletion denies new reads and search results immediately, then confirms byte/vector purge through an operation; it suppresses automatic regeneration for that source version until an explicitly authorized rerun.
Artifacts inherit the source file’s grant and are checked again when read. Raw vectors require an additional embeddings.read capability. Search results are authorization-filtered and report index freshness. Revocation and trashing must remove affected results, including cached projections, on the next synchronization.
These processing and search routes describe the intended public scope; they are not available as a live API today. Processor catalog, output formats, retention, cost policy, and model version guarantees require implementation decisions.
GET /v1/folders/{folder_id}/childrenList one visible folder’s immediate files and subfolders. Like GET /v1/roots, this accepts limit, sort, and an opaque cursor, and returns items plus next_cursor. Default sorting is name_asc; modified_desc is also available. Each page is a live view, not a frozen inventory.
200 OK
{
"items": [
{ "id": "file_789", "type": "file", "name": "invoice.pdf",
"modified_at": "2026-10-20T18:00:00Z", "version_id": "ver_012", "availability": "available" },
{ "id": "folder_124", "type": "folder", "name": "Receipts", "modified_at": "2026-10-19T18:00:00Z" }
],
"next_cursor": null
}
GET /v1/searchSearch names and selected metadata across authorized folders. This is not a promise of full-text content indexing. Filter by parent_id, paginate with cursor, and expose index freshness rather than silently implying real-time results.
GET /v1/search?q=invoice&parent_id=folder_123
200 OK
{
"items": [{ "id": "file_789", "name": "invoice.pdf",
"parent_id": "folder_123", "version_id": "ver_012" }],
"next_cursor": null,
"indexed_through": "2026-10-20T18:00:00Z"
}
GET /v1/files/{file_id}Read stable file identity, current version, size, media type, and availability. Provider credentials and Mac filesystem paths stay private.
200 OK
{
"id": "file_789", "parent_id": "folder_123",
"name": "invoice.pdf", "media_type": "application/pdf",
"size_bytes": 4194304, "current_version_id": "ver_012",
"availability": "available"
}
GET /v1/files/{file_id}/contentThis is the streaming API: read only the bytes needed for playback, preview, seek, or resume. Pin version_id so the content cannot change halfway through a stream. A normal request streams a full version; Range requests a slice. The API may use a Mac, peer, or permitted cloud copy internally, but this endpoint does not guarantee a direct P2P route.
GET /v1/files/file_789/content?version_id=ver_012
Range: bytes=0-65535
206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 0-65535/4194304
Content-Type: application/pdf
ETag: "ver_012"
<binary bytes>
Range and a version-pinned ETag; If-Range can prevent combining bytes from different versions.HTTP 206, 416, range validation, cache policy, and media-player behavior require contract and integration tests before release. A separate stream-session endpoint is unnecessary unless native or P2P transport negotiation proves it useful.
POST /v1/uploadsCreate an upload intent for a folder. Requires a future folder-scoped write credential. Returns an operation and a destination-specific transfer plan; it does not mean file bytes have been committed.
An app declares the destination, size, content hash, and retry identity. Atom decides whether the bytes can go directly to the destination or need an explicitly permitted staging route.
POST /v1/uploads
Authorization: Bearer <scoped token>
Idempotency-Key: invoice-8427
Content-Type: application/json
{
"parent_id": "folder_123",
"name": "invoice.pdf",
"size_bytes": 4194304,
"sha256": "<whole-file digest>",
"replace_version_id": null
}
202 Accepted
{
"operation_id": "op_456",
"file_id": "file_789",
"status": "ready_to_transfer",
"transfer": {
"method": "direct",
"capability": "<short-lived, destination-scoped capability>"
}
}
The transfer plan would be short-lived and destination-scoped. A client would refresh an expired plan using the same operation ID; it must not create another file to resume. A future SDK could hide transport details.
A local-only folder returns waiting_for_device. The sender retains the bytes. Temporary cloud staging is a separate, owner-approved folder policy—not a silent fallback.
POST /v1/uploads/{operation_id}/finishThe sender says it has finished the assigned transfer. Atom moves the operation into destination verification; this call alone never asserts that the file is available.
operation_idThe ID returned by POST /v1/uploads.finish for the same operation must be safe. Inspect operation status after an ambiguous response.Request shape, HTTP status codes, and receipt format remain unspecified.
GET /v1/operations/{operation_id}Read the durable state of an accepted file operation. This is the recovery point after a timeout, lost acknowledgement, or offline destination.
operation_idStable operation identifier.available for a committed file, completed for policy or purge work, or failed, cancelled, or conflict.Polling interval, retention, and exact response schema remain unspecified.
GET /v1/files/{file_id}/versionsList versions visible to the caller so an app can present history or resolve an expected-version conflict without silently overwriting another edit.
file_idStable Atom file identifier.GET /v1/changesResume authorized metadata changes from a cursor. Webhooks provide prompt notification; the feed is the recovery path if an event is missed.
cursorAn opaque checkpoint returned by an earlier page.Cursor retention, ordering, event schema, and snapshot bootstrap are not specified yet.
POST /v1/webhooksSubscribe a verified HTTPS receiver to events within the caller’s authorized grant. Deliveries are signed and may be repeated, so consumers deduplicate by event ID. A webhook is a prompt to read the change feed, not a replacement for it.
POST /v1/webhooks
Authorization: Bearer <scoped token>
Content-Type: application/json
{
"url": "https://example.app/atom/events",
"event_types": ["file.available", "file.version_created",
"operation.failed", "access.revoked"]
}
201 Created
{
"id": "wh_123",
"status": "pending_verification"
}
Endpoint verification, safe one-time signing-secret delivery, retry window, secret rotation, and list/delete management are required before this design can ship.
GET /v1/usage/summarySee observed activity for a bounded time window. Separate the route that delivered bytes from the units that may be billed. An integration can see its own usage; account-wide totals require an owner or billing-admin grant.
GET /v1/usage/summary?from=2026-10-01&to=2026-11-01
200 OK
{
"period": { "from": "2026-10-01", "to": "2026-11-01" },
"status": "estimated",
"observed_through": "2026-10-20T18:00:00Z",
"transfer_bytes": {
"direct_peer": 104857600,
"relay": 16777216,
"cloud_egress": 0
},
"api_requests": 42,
"billable": [
{ "meter": "relay_egress_bytes", "quantity": 16777216, "unit": "byte" }
]
}
Logical file bytes and physical transfer bytes are different. Internal retries, duplicate events, and a relay hop must not silently create duplicate billable usage. Meter definitions and prices must be published before charging customers.
GET /v1/usage/eventsPage through metering records for reconciliation. Each event has a stable ID, timestamp, meter, quantity, and related transfer or operation ID. Do not expose private peer addresses, Mac paths, or provider credentials.
from, to, meter, and opaque cursor.observed_through because aggregates may lag activity.Retention, exact event schema, and meter IDs remain design decisions.
GET /v1/billing/summaryShow the account owner what is owed, what is merely estimated, and how usage maps to charges. Billing scope is separate from file-read scope: access to a folder must not reveal an account’s invoices.
No price, free allowance, or charging rule is committed by this reference.
GET /v1/billing/invoicesList finalized invoices for an account owner or billing administrator. Each result should include its period, currency, total, status, and a short-lived hosted invoice URL. Support cursor pagination without exposing another customer’s billing data.
Invoice creation and payment-method changes belong to the billing system, not this read-only API surface.
A user would authorize an integration for selected folders and capabilities. Example grants are files.metadata.read, files.content.read, files.analysis.read, files.analysis.manage, embeddings.read, files.write, events.read, and usage.read. Managing analysis is separate from reading its results; sensitive processing still needs explicit owner consent. Billing reads require a separate account-level administrator grant. A token must not confer access to the whole Mac, underlying provider credentials, or unrelated folders.
If a grant is revoked, subsequent metadata and byte reads must fail even if an integration still knows a file ID. The change feed must signal removal so an offline client can discard the affected local projection on reconnect.
These scope names and the consent flow are not yet available as issued credentials.
Non-file operations such as policy changes and artifact purges finish as completed with a completion receipt. Operations can instead end as failed, cancelled, or conflict. A sender’s finish call does not by itself produce available.
Repeat the same idempotency key to retrieve the same operation. Reusing it with different input is a conflict.
Replace a file only against the version you read. An intervening edit yields a conflict, not last-write-wins.
The Mac or provider confirms committed bytes. Queue delivery and optimistic UI are not proof of completion.
After a lost response, ask for operation status. Never blindly issue another create, rename, or upload.
Subscribe to file.available, operation.failed, file.version_created, artifact.ready, artifact.purged, processing.failed, processing.cancelled, and access.revoked webhooks for fast reactions. Use the cursor-based change feed to recover missed notifications. Authorization is checked again when an app reads the file or a derived output.
{
"id": "evt_234",
"type": "file.available",
"operation_id": "op_456",
"file_id": "file_789",
"version_id": "ver_012",
"occurred_at": "2026-10-20T18:00:00Z"
}
The event names and shape above are examples. Webhook signatures, replay retention, and cursor expiry are not specified yet.
A caller needs to distinguish a rejected request from an accepted operation that later fails. The error envelope will be finalized alongside the implementation.
unauthorizedMissing or expired credential. Re-authenticate; do not retry unchanged.forbiddenCredential lacks access to the destination folder.version_conflictThe expected file version changed. Fetch the current version and ask the user to resolve it.waiting_for_deviceOperation accepted, but the destination is offline. Poll the same operation ID.integrity_failedDestination rejected bytes or digest. Retain source bytes; inspect status before retrying.Retry with the same idempotency key, then inspect the returned operation. A timeout is not proof that the write did not commit.
This sequence is not a launch date. Each stage depends on the correctness checks in the stage before it.
Define folder grants, version identity, error bodies, status codes, idempotency, and a versioned OpenAPI contract. Prove authorization and retry behavior against running services.
Ship scoped folder listing, metadata search, version-pinned reads, and byte ranges. Measure startup, seek, and fallback behavior without exposing device paths or provider credentials.
Add upload intents, destination-bound byte transfer, durable operation IDs, and destination receipts. Test offline devices, lost acknowledgements, concurrent edits, and checksum failure.
Report per-output progress, version-pinned artifacts, embeddings, and authorized semantic results. Prove policy updates, reruns, cancellation, purging, stale-version handling, partial failures, revocation, and processor cost controls.
Provide a replayable change feed and signed webhooks, including artifact readiness. Verify catch-up after downtime and immediate denial after a grant is revoked.
Publish onboarding, measured usage, billing visibility where needed, and generated language examples. Expand SDK support only after the HTTP contract stabilizes.
Developer reference · API access not yet available