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.

01

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.

02

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"]}'
03

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"
04

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.

05

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.

Explore the full reference