Skip to main content

Ingest your own files

Create a namespace, connect a bucket, and run your first batch in minutes — no API key setup required.

Set Up a Namespace

Every project starts with a namespace — the isolation boundary for all your resources. Use one per environment (dev, staging, prod) or per tenant.
That’s the whole managed create — namespace_name is the only required field. You don’t register extractors up front: creating a collection with features: [...] auto-provisions the pipelines the namespace needs (see Features). The old feature_extractors field is deprecated.

Standalone (bring your own vectors)

To upsert your own vectors instead of Mixpeek-managed extraction, declare the index shapes with vector_configs:
vector_configs is a list of { name, dimension, metric } objects (not a single object). name and dimension are required; metric defaults to cosine (also euclidean, dot_product). Passing vector_configs with no features/feature_extractors infers standalone mode — no mode field needed. Omit vector_configs entirely and indexes auto-create on first upsert.
Every subsequent request needs two headers: Authorization: Bearer mxp_sk_... and X-Namespace: ns_.... Namespace API →

Create a Bucket

Buckets are schema-validated containers for raw files. Define what blob types you accept (text, image, audio, video, json, binary).
Bucket API →

Storage class

Pass an optional storage_class on create/update to pick a cost tier for a bucket’s objects. It’s provider-agnostic — mapped to your object store:
Applied on write for sync-based ingestion; broader rollout in progress. For buckets fed by a storage sync (S3, GCS, Drive, RSS, and other sources — the primary media path), the tier is set on each object at write time. Tiering for direct uploads (POST /objects) and presigned client uploads, plus retroactive re-tiering of existing objects, are a separate backend follow-up (in progress). Keep hot, retriever-source buckets on standard; reserve cheaper tiers for large write-once/read-occasionally media.

Connect External Storage

Sync files directly from your existing cloud storage instead of uploading manually. Mixpeek reads from your provider — no migration needed. This is a two-step flow: create a reusable connection (holds the credentials, lives at the organization level), then attach a sync to a bucket that references it. Step 1 — Create the connection (once per provider account):
The response includes a connection_id (conn_...). Credentials are encrypted at rest and reusable across buckets. Step 2 — Attach a sync to your bucket (flat body — no wrapper objects):
Then trigger the first sync:
After the initial sync, new files are picked up automatically at the configured polling interval. Use continuous mode (vs initial_only) to keep picking up new and changed files — only new or modified files since the last sync are processed, so existing files aren’t reprocessed. See Object Storage providers for provider-specific setup guides. Sync API →

Register Objects

Objects are raw multimodal assets within a bucket. Two paths: URL references — point to files in your existing storage:
Direct uploads — upload to Mixpeek-managed storage via presigned URLs:
Then PUT the file to the returned presigned_url and confirm with POST /uploads/{id}/confirm. For bulk imports, use batch uploads or connect your object storage via sync configurations.

Content addressing

Every blob carries a details.hash in sha256:<hex> form. You can supply it, or let the platform compute it. Send checksum on a blob to pin the value yourself. It propagates verbatim to the stored blob’s details.hash:
A bare 64-character hex string is accepted and normalized to sha256:<hex>.
A malformed checksum is rejected with a 422 that tells you how to fix it, so a typo cannot leave you with a blob you believe is pinned and is not.That guardrail arrived with the field itself. A deployment that predates it ignores checksum instead of rejecting it, and you get details.hash: null with no error — which is the failure the 422 exists to prevent. Confirm your deployment has it before relying on it:
Twelve True means the guardrail is live everywhere. Any False means part of the fleet still drops checksum silently, so verify details.hash on a written blob rather than assuming it took.Sample rather than call once, and keep Connection: close. A single request answers which server replied, not whether every server agrees, and keepalive pins you to one of them — both give a clean unanimous answer from a mid-rollout fleet. Measured on Mixpeek Cloud during one rollout: 9 of 12 fetches carried the field and 3 did not.Point it at your own host. A dedicated tenant deployment rolls on its own schedule, so it can be several releases behind the shared API or ahead of it. Measured the same minute: the shared API was mid-rollout on a newer build while a tenant host was converged on an older one, and the two gave opposite answers about the same field.
Omit checksum and the platform fills details.hash itself wherever it touches the bytes: inline-text blobs on write, and every object arriving through storage sync. Inline text works in both dialects, "data": "some text" and "data": {"text": "some text"}, and both now persist. The dict form previously skipped persistence entirely; blobs written that way also gain a properties.url they did not have before.
Objects synced before 2026-08-23 still carry details.hash: null. Content addressing applies to blobs the platform touches from that point on, and there are roughly 4.15 million historical objects without it.So a null hash means “not yet computed”, not “no content”. Backfilling those is a separate program. Do not write code that treats details.hash as reliably present on older objects.
Object API → · Upload API →

Process with Batches

Batches group objects for extraction. Create a batch, then submit it:

Batch Lifecycle

Poll GET /v1/buckets/{id}/batches/{id} until the status is terminal — COMPLETED, COMPLETED_WITH_ERRORS, FAILED, or CANCELED (a poller that waits only for COMPLETED hangs on partial success) — or use webhooks to get notified on batch.completed. Batch API →