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 withvector_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.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).Storage class
Pass an optionalstorage_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):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):
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: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 adetails.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:
sha256:<hex>.
A malformed Twelve
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: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.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.
Object API → · Upload API →
Process with Batches
Batches group objects for extraction. Create a batch, then submit it:Batch Lifecycle
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 →
