0+ MUSIC VIDEOS
    Partner fulfilment API · v1

    Deliver your customers' videos from your own site

    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.

    1. Authentication

    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
    • Keys need the 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.
    • Catalog keys are rejected with 403 wrong_key_type. A revoked key returns 401 revoked_api_key.
    • You can only reach customers linked to your own partner account. Your partner is taken from the key, never from the request.
    • Keep the key on your server. If it leaks, revoke it in the dashboard and create another.
    • Rate limit: 100 requests per minute per key. Over it returns 429 rate_limited with Retry-After.

    2. Who the customer is

    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.

    3. List a customer's videos and exports

    GET https://musicvideomarketplace.com/api/public/partner/v1/users/{external_user_id}/videos?limit=50&offset=0

    URL-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"]
            }
          ]
        }
      ]
    }
    FieldMeaning
    sourceAlways partner: the video was bought or claimed through your integration. Videos a customer bought elsewhere on musicvideomarketplace.com are not part of this API.
    downloadsWhich 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[].filesWhich files exist for that export: main (music video), reel, lyric.

    4. Get a download link

    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"
    }
    FieldRequiredDescription
    external_user_idYesThe customer.
    video_idYesFrom the list response.
    kindNo (default original)original, reel, bts or export.
    export_idWhen kind is exportFrom exports[].export_id.
    fileNo (default main)For exports: main, reel or lyric.
    {
      "download_url": "https://…",
      "filename": "Sunset_Vibes.mp4",
      "expires_in": 3600,
      "kind": "original"
    }
    • The link is valid for one hour and downloads the file with the right file name. Do not store links: ask for a new one each time a customer clicks Download, or redirect them to the link straight away.
    • Ownership is checked on every request. Revoked licences stop working immediately.
    • Reel files need a licence that covers the reel (partner purchases do) or the reel add-on. Behind-the-scenes needs that add-on. An export must belong to the same customer and video.
    • Each link request is counted as a download in your usage statistics.

    5. Example (Node)

    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;
    }

    6. Errors

    Errors use one shape: { "error": { "code": "...", "message": "..." } }.

    StatuscodeCause
    400invalid_request, invalid_jsonMissing or malformed fields.
    401missing_api_key, invalid_api_key, revoked_api_keyKey missing, unknown or revoked.
    403wrong_key_type, missing_scope, partner_inactiveNot a standard key, no fulfilment scope, or your partner account is not active.
    403not_ownedThe customer does not own that video or file.
    403not_available_in_testA test key asked for an original, reel or behind-the-scenes file. Only test exports are available in test mode.
    404user_not_foundNo customer with that ID has opened your embed.
    404export_not_found, file_not_available, video_unavailableThe export, file or video does not exist.
    429rate_limitedToo many requests. Retry after the Retry-After header.
    500internal_errorRetry shortly.

    7. Test mode

    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.

    • The list shows the videos the test customer “bought” with the test card. downloads is always false for original, reel and behind-the-scenes: full-quality files are never available in test mode.
    • Test exports (watermarked, 540p) can be listed and downloaded with kind: "export". Asking for an original returns 403 not_available_in_test.
    • A live key never sees test customers, and a test key never sees live customers.

    8. Good practice

    • Check that the person asking is signed in to your site and is that customer, before you call us. We trust your server's word on who the customer is.
    • Never put the API key in a browser, app or repository. Use an environment variable.
    • Cache the list for a short time if you like, but never cache download links.
    • Watch your error rate and per-key calls on the Usage tab of your dashboard.

    Questions: info@musicvideomarketplace.com. Support is staffed Monday–Friday, 9–5 UK time.

    What's changed

    v1 · 2026-10-14

    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.

    • GET /v1/users/{external_user_id}/videos lists the videos a customer bought or claimed through your integration, with which files can be downloaded and the exports they have made.
    • POST /v1/downloads returns a one-hour link for the original video, reel, behind-the-scenes or an exported file, after checking ownership.
    • Standard keys with the fulfilment:read and fulfilment:download scopes, 100 requests per minute, uniform error format.
    Download this version (HTML, print to PDF)