Deliver your customers' videos and exports from your own site: list what a customer owns and mint short-lived download links from your server with a standard API key.
First published version: server-to-server endpoints to list a customer's videos and exports and to get one-hour download links, authenticated with a standard API key.
Your customers use the embed, but you may want them to find and download their videos from your own account pages. This server-to-server API lets your backend list what a customer owns and exported, and fetch a short-lived download link for any file. Your customers never see our site, and your API key never reaches a browser.
Base URL: https://musicvideomarketplace.com/api/public/partner/v1.
Create a standard API key in your partner dashboard (Credentials → API keys). Send it as a bearer token from your server:
Authorization: Bearer mvm_live_xxxxxxxxxxxxxxxxxxxxxxxx
fulfilment:read scope to list and fulfilment:download to get links. Keys created from 14 October 2026 have both. Older standard keys do not: create a new one.403 wrong_key_type. A revoked key returns 401 revoked_api_key.429 rate_limited with Retry-After.Customers are identified by the same partner_external_user_id you send in the signed embed payload. A customer exists here from the moment they first open your embed. Before that, calls return 404 user_not_found.
GET https://musicvideomarketplace.com/api/public/partner/v1/users/{external_user_id}/videos?limit=50&offset=0URL-encode the user ID. limit is 1 to 100 (default 50); results are newest first.
{
"external_user_id": "your-user-123",
"total": 2,
"limit": 50,
"offset": 0,
"videos": [
{
"video_id": "0b6f2c1e-6c1a-4a53-9a4f-3f0f0f0f0f0f",
"title": "Sunset Vibes",
"artist": "Example Artist",
"thumbnail_url": "https://…",
"duration_seconds": 240,
"acquired_at": "2026-10-02T14:21:07Z",
"source": "partner",
"downloads": { "original": true, "reel": true, "bts": false },
"exports": [
{
"export_id": "6d3a5b1c-2b7e-4c0a-8f55-9a1d3c7e2b10",
"name": "My edit",
"created_at": "2026-10-03T09:12:44Z",
"files": ["main", "lyric"]
}
]
}
]
}| Field | Meaning |
|---|---|
source | Always partner: the video was bought or claimed through your integration. Videos a customer bought elsewhere on musicvideomarketplace.com are not part of this API. |
downloads | Which original files this customer can download: the music video, the vertical reel, and behind-the-scenes. false means not owned or no file exists. |
exports[].files | Which files exist for that export: main (music video), reel, lyric. |
POST https://musicvideomarketplace.com/api/public/partner/v1/downloads
Content-Type: application/json
{
"external_user_id": "your-user-123",
"video_id": "0b6f2c1e-6c1a-4a53-9a4f-3f0f0f0f0f0f",
"kind": "original"
}| Field | Required | Description |
|---|---|---|
external_user_id | Yes | The customer. |
video_id | Yes | From the list response. |
kind | No (default original) | original, reel, bts or export. |
export_id | When kind is export | From exports[].export_id. |
file | No (default main) | For exports: main, reel or lyric. |
{
"download_url": "https://…",
"filename": "Sunset_Vibes.mp4",
"expires_in": 3600,
"kind": "original"
}const BASE = 'https://musicvideomarketplace.com/api/public/partner/v1';
const headers = { Authorization: `Bearer ${process.env.MVM_API_KEY}`, 'Content-Type': 'application/json' };
// Your "My videos" page
async function myVideos(userId) {
const res = await fetch(`${BASE}/users/${encodeURIComponent(userId)}/videos`, { headers });
if (res.status === 404) return []; // the customer has not used the embed yet
if (!res.ok) throw new Error((await res.json()).error.message);
return (await res.json()).videos;
}
// Your "Download" button handler: send the customer straight to a fresh link
async function downloadUrl(userId, videoId) {
const res = await fetch(`${BASE}/downloads`, {
method: 'POST',
headers,
body: JSON.stringify({ external_user_id: userId, video_id: videoId, kind: 'original' }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
return (await res.json()).download_url;
}Errors use one shape: { "error": { "code": "...", "message": "..." } }.
| Status | code | Cause |
|---|---|---|
| 400 | invalid_request, invalid_json | Missing or malformed fields. |
| 401 | missing_api_key, invalid_api_key, revoked_api_key | Key missing, unknown or revoked. |
| 403 | wrong_key_type, missing_scope, partner_inactive | Not a standard key, no fulfilment scope, or your partner account is not active. |
| 403 | not_owned | The customer does not own that video or file. |
| 403 | not_available_in_test | A test key asked for an original, reel or behind-the-scenes file. Only test exports are available in test mode. |
| 404 | user_not_found | No customer with that ID has opened your embed. |
| 404 | export_not_found, file_not_available, video_unavailable | The export, file or video does not exist. |
| 429 | rate_limited | Too many requests. Retry after the Retry-After header. |
| 500 | internal_error | Retry shortly. |
An API key labelled test works against your test customers only: the customers who signed in to the embed with your test client ID (see the partner embed guide, section 14). Pass the same partner_external_user_id you signed with. Responses include "test": true.
downloads is always false for original, reel and behind-the-scenes: full-quality files are never available in test mode.kind: "export". Asking for an original returns 403 not_available_in_test.Questions: info@musicvideomarketplace.com. Support is staffed Monday–Friday, 9–5 UK time.