Build with your media library.
Create people and brands, upload assets, search the library and follow every processing step through a versioned REST API. An MCP server sits on top of the same surface.
Authentication
An owner or admin creates a key in team Settings → API & agent access. Keys start read-only, expire after 30 days and can be revoked there. The team's Public API add-on must be active.
curl -H 'Authorization: Bearer $MVT_API_KEY' \ 'https://api-production-4b3c.up.railway.app/v1/media?limit=20'
Keep the key on your server. Use separate keys for separate integrations.
Create people and brands
Unique lowercase slugs within your team. Identities need identities:write; brands need brands:write.
curl -X POST 'https://api-production-4b3c.up.railway.app/v1/identities' \
-H 'Authorization: Bearer $MVT_API_KEY' -H 'Content-Type: application/json' \
-d '{"name":"Iñaki Duarte","slug":"inaki-duarte","kind":"athlete","shirt_number":4}'
curl -X POST 'https://api-production-4b3c.up.railway.app/v1/brands' \
-H 'Authorization: Bearer $MVT_API_KEY' -H 'Content-Type: application/json' \
-d '{"name":"Cerveza Albor","slug":"cerveza-albor","aliases":["Albor"]}'Upload media
Register the file with uploads:write, PUT the bytes to the returned upload_url with the same content type, then POST complete_url. Processing starts after completion.
curl -X POST 'https://api-production-4b3c.up.railway.app/v1/uploads' \
-H 'Authorization: Bearer $MVT_API_KEY' -H 'Content-Type: application/json' \
-d '{"file_name":"match.jpg","mime_type":"image/jpeg","byte_size":123456}'
# No API key is sent to storage.
curl -X PUT "$UPLOAD_URL" -H 'Content-Type: image/jpeg' --data-binary @match.jpg
curl -X POST "$COMPLETE_URL" -H "Authorization: Bearer $MVT_API_KEY"Retrieve and track
GET /v1/media supports search and cursor pagination. Poll /v1/media/:id/processing for step states: pending, running, succeeded, failed, skipped.
curl -H 'Authorization: Bearer $MVT_API_KEY' 'https://api-production-4b3c.up.railway.app/v1/media/$MEDIA_ID' curl -H 'Authorization: Bearer $MVT_API_KEY' 'https://api-production-4b3c.up.railway.app/v1/media/$MEDIA_ID/processing'
A step only appears once a worker has recorded it; an empty steps array means nothing has started yet.
Errors and limits
Errors use application/problem+json. Validation returns 422, duplicate slugs 409, missing resources 404. Lists return data and next_cursor; pass the cursor for the next page, up to 100 items.