Objects
Multimodal data units with blob storage, schema validation, and lineage tracking for downstream processing
Why do anything?
Raw files (videos, images, documents) need metadata and validation before ML processing. Without objects, data is unstructured and untraceable.
Why now?
AI applications ingest diverse formats. Manual file handling doesn't scale or maintain lineage.
Why this feature?
Objects combine blob storage with metadata, schema validation, and complete lineage tracking from source to processed documents.
How It Works
Objects are the fundamental data unit in Mixpeek. They contain blobs (actual content) plus metadata, with full lineage tracking.
Upload
Blob content uploaded via API or SDK
Validation
Content validated against parent bucket schema
Storage
Blob stored in S3/MinIO/LocalStack, metadata in MongoDB
Lineage
object_id assigned, root tracking established
Why This Approach
Separating blobs from metadata enables efficient storage while maintaining queryability. Lineage tracking ensures provenance through entire processing pipeline.
Where This Is Used
Integration
client.buckets.objects.create(bucket_id=bucket_id, blobs=[{"property": "content", "type": "text", "data": "..."}])Recent updates
Full changelog- Aug 23, 2026Every blob the platform touches now carries a sha256 you can reproduce yourselfA blob's details.hash was declared in the schema and empty everywhere, so there was no way to ask whether two objects held the same bytes. It now carries a whole-object sha256 in sha256:<hex> form, the digest format OCI uses, computed by Mixpeek wherever it touches the bytes. Run shasum -a 256 on the file you uploaded and the string matches, which is the property that makes the value worth storing: identical bytes hash identically on your machine and ours, today and next year. Three paths produce it. Send checksum on blob create to pin the value yourself, and a bare 64-character hex string gets normalized for you. Inline text is hashed on write in both dialects, "data": "some text" and "data": {"text": "some text"}; the second used to skip persistence altogether and now also gains the properties.url it never had. Objects arriving through storage sync are hashed from the stream the sync already reads, so it costs no extra IO. A malformed checksum returns a 422 explaining how to fix it, so a typo cannot leave you holding a blob you believe is pinned. The payoff is retry-safe ingestion: the same bytes keep the same identity while the metadata around them churns, integrity is checkable against your own copy, and lineage has something stable to reference. Deduplication stays a downstream choice, configured on a collection against the hash field, so nothing is collapsed at ingest without you asking. One limit to read before building on it: roughly 4.15 million objects synced before 2026-08-23 still carry details.hash: null, and backfilling them is a separate program. A null there records that no hash was ever computed. Treat the field as absent on older objects.
- Jul 1, 2026Document list now honors filters, search, and sortGET /documents now applies the `filters`, `search`, and `sort` query params that were previously accepted but silently ignored: so listing documents returns exactly the slice you asked for.