{"info":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","description":"<html><head></head><body><p>Generate images, edit product photos, animate images, swap faces and lip-sync video. Start with a single image, then retrieve its result. Set api_key as a local secret in your environment; never publish it. Each generation request consumes credits. Send generation requests individually; do not run the entire collection. Source: <a href=\"https://docs.magichour.ai/api-reference/openapi.json\">https://docs.magichour.ai/api-reference/openapi.json</a> (retrieved 2026-09-07T09:47:30.379Z). Schema checked. The nine-request collection was exercised against production on 2026-09-07; five generation flows completed. Results depend on inputs and selected models. Start with one request rather than running the whole collection.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"58041837","collectionId":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","publishedId":"2sBYAxPp2b","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-09-07T22:29:23.000Z"},"item":[{"name":"01 — Generate one image","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }"],"id":"35a42290-5bc4-44be-8da1-db6aab8a3b36"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code >= 200 && pm.response.code < 300) {","  const result = pm.response.json();","  pm.test(\"Project ID returned\", () => pm.expect(result.id).to.be.a(\"string\").and.not.empty);","  if (result.id) pm.environment.set('image_project_id', result.id);","}"],"id":"0ba429c9-caa6-4df3-98af-86d95068ad49"}}],"id":"49bc5014-c6fd-4fce-ab4f-dc8429af895c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Postman first image\",\n  \"image_count\": 1,\n  \"model\": \"flux-schnell\",\n  \"resolution\": \"640px\",\n  \"style\": {\n    \"prompt\": \"A studio photograph of a plain ceramic coffee cup on a pale blue background, soft natural light, no text.\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://api.magichour.ai/v1/ai-image-generator","description":"<p>Send once, then run Get image result. This creates one image using a model available to free accounts; credits are still consumed.</p>\n<p>Create an AI image with advanced model selection and quality controls.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","ai-image-generator"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"49bc5014-c6fd-4fce-ab4f-dc8429af895c"},{"name":"02 — Get image result","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }","if (!pm.environment.get('image_project_id')) { console.error('Set image_project_id before sending this request.'); pm.execution.skipRequest(); }"],"id":"a5f27ad6-76a4-4a4e-bebb-ce2bd6be81c6"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code === 200) {","  const result = pm.response.json();","  pm.test(\"Known project state\", () => pm.expect([\"queued\", \"rendering\", \"complete\", \"error\", \"canceled\", \"draft\"]).to.include(result.status));","  pm.test(\"Project did not fail or cancel\", () => pm.expect([\"error\", \"canceled\"]).not.to.include(result.status));","  if (result.status === \"complete\") pm.test(\"Download available\", () => pm.expect(result.downloads).to.be.an(\"array\").and.not.empty);","}"],"id":"1eee2929-6788-43ab-84c4-0c831ba2fa34"}}],"id":"3b2d7e14-e521-4b5d-bc84-fb6c4eac0506","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.magichour.ai/v1/image-projects/{{image_project_id}}","description":"<p>Retrieves the image_project_id saved by the last image creation request. Repeat manually after several seconds while queued/rendering. Do not re-send the generation request.</p>\n<p>Check the progress of a image project. The <code>downloads</code> field is populated after a successful render.</p>\n<p><strong>Statuses</strong></p>\n<ul>\n<li><code>queued</code> — waiting to start</li>\n<li><code>rendering</code> — in progress</li>\n<li><code>complete</code> — ready; see <code>downloads</code></li>\n<li><code>error</code> — a failure occurred (see <code>error</code>)</li>\n<li><code>canceled</code> — user canceled</li>\n<li><code>draft</code> — not used</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","image-projects","{{image_project_id}}"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"3b2d7e14-e521-4b5d-bc84-fb6c4eac0506"},{"name":"03 — Animate a product image","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }","if (!pm.environment.get('image_url')) { console.error('Set image_url before sending this request.'); pm.execution.skipRequest(); }"],"id":"d69c1386-f4d4-40a7-a263-a23f2602c2dc"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code >= 200 && pm.response.code < 300) {","  const result = pm.response.json();","  pm.test(\"Project ID returned\", () => pm.expect(result.id).to.be.a(\"string\").and.not.empty);","  if (result.id) pm.environment.set('video_project_id', result.id);","}"],"id":"c809709d-38dc-4e16-aebb-cb5ca8274c53"}}],"id":"12c5a0fd-c974-4e8b-bc65-673c8a2dce59","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Postman product clip\",\n  \"end_seconds\": 5,\n  \"model\": \"default\",\n  \"audio\": false,\n  \"assets\": {\n    \"image_file_path\": \"{{image_url}}\"\n  },\n  \"style\": {\n    \"prompt\": \"Slow smooth camera orbit around the product. Keep the product shape and colors consistent.\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://api.magichour.ai/v1/image-to-video","description":"<p>Set image_url to a direct image URL you own or a completed Magic Hour upload file_path. Default model and credit cost depend on plan.</p>\n<p><strong>What this API does</strong></p>\n<p>Create the same Image To Video you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.</p>\n<p><strong>Good for</strong></p>\n<ul>\n<li>Automation and batch processing  </li>\n<li>Adding image to video into apps, pipelines, or tools</li>\n</ul>\n<p><strong>How it works (3 steps)</strong></p>\n<ol>\n<li>Upload your inputs (video, image, or audio) with <a href=\"https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls\">Generate Upload URLs</a> and copy the <code>file_path</code>.  </li>\n<li>Send a request to create a image to video job with the basic fields.  </li>\n<li>Check the job status until it's <code>complete</code>, then download the result from <code>downloads</code>.</li>\n</ol>\n<p><strong>Key options</strong></p>\n<ul>\n<li>Inputs: usually a file, sometimes a YouTube link, depending on project type  </li>\n<li>Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  </li>\n<li>Extra fields: e.g. <code>face_swap_mode</code>, <code>start_seconds</code>/<code>end_seconds</code>, or a text prompt</li>\n</ul>\n<p><strong>Cost</strong><br />Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.</p>\n<p>For detailed examples, see the <a href=\"https://magichour.ai/products/image-to-video\">product page</a>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","image-to-video"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"12c5a0fd-c974-4e8b-bc65-673c8a2dce59"},{"name":"04 — Get video result","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }","if (!pm.environment.get('video_project_id')) { console.error('Set video_project_id before sending this request.'); pm.execution.skipRequest(); }"],"id":"d58bab2c-21c8-4765-ac8c-3327d703529d"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code === 200) {","  const result = pm.response.json();","  pm.test(\"Known project state\", () => pm.expect([\"queued\", \"rendering\", \"complete\", \"error\", \"canceled\", \"draft\"]).to.include(result.status));","  pm.test(\"Project did not fail or cancel\", () => pm.expect([\"error\", \"canceled\"]).not.to.include(result.status));","  if (result.status === \"complete\") pm.test(\"Download available\", () => pm.expect(result.downloads).to.be.an(\"array\").and.not.empty);","}"],"id":"de7565a8-548c-42c4-9a6e-d76519910c2f"}}],"id":"3d9b84b5-2e09-4e83-b643-2282576af9bd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"https://api.magichour.ai/v1/video-projects/{{video_project_id}}","description":"<p>Retrieves video_project_id saved by the last video request. Repeat manually while queued/rendering. Download from the returned downloads array after complete.</p>\n<p>Check the progress of a video project. The <code>downloads</code> field is populated after a successful render.</p>\n<p><strong>Statuses</strong></p>\n<ul>\n<li><code>queued</code> — waiting to start</li>\n<li><code>rendering</code> — in progress</li>\n<li><code>complete</code> — ready; see <code>downloads</code></li>\n<li><code>error</code> — a failure occurred (see <code>error</code>)</li>\n<li><code>canceled</code> — user canceled</li>\n<li><code>draft</code> — not used</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","video-projects","{{video_project_id}}"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"3d9b84b5-2e09-4e83-b643-2282576af9bd"},{"name":"05 — Edit an image","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }","if (!pm.environment.get('image_url')) { console.error('Set image_url before sending this request.'); pm.execution.skipRequest(); }"],"id":"f81f36e4-843d-455d-964e-3d4c3f46035a"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code >= 200 && pm.response.code < 300) {","  const result = pm.response.json();","  pm.test(\"Project ID returned\", () => pm.expect(result.id).to.be.a(\"string\").and.not.empty);","  if (result.id) pm.environment.set('image_project_id', result.id);","}"],"id":"4702a3b9-0007-495a-b8e3-404d24779ae5"}}],"id":"9deb6308-c2e3-44b6-bf49-7d4cc1e15ff8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Postman product background\",\n  \"model\": \"flux-2-klein\",\n  \"resolution\": \"640px\",\n  \"image_count\": 1,\n  \"assets\": {\n    \"image_file_paths\": [\n      \"{{image_url}}\"\n    ]\n  },\n  \"style\": {\n    \"prompt\": \"Replace the background with a clean cream studio backdrop while preserving the product.\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://api.magichour.ai/v1/ai-image-editor","description":"<p>Set image_url; send once, then Get image result.</p>\n<p>Edit images with AI.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","ai-image-editor"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"9deb6308-c2e3-44b6-bf49-7d4cc1e15ff8"},{"name":"06 — Face swap a photo","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }","if (!pm.environment.get('source_face_url')) { console.error('Set source_face_url before sending this request.'); pm.execution.skipRequest(); }","if (!pm.environment.get('target_image_url')) { console.error('Set target_image_url before sending this request.'); pm.execution.skipRequest(); }"],"id":"22be0528-a409-41a1-876d-140780885be3"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code >= 200 && pm.response.code < 300) {","  const result = pm.response.json();","  pm.test(\"Project ID returned\", () => pm.expect(result.id).to.be.a(\"string\").and.not.empty);","  if (result.id) pm.environment.set('image_project_id', result.id);","}"],"id":"5710e3a6-18aa-42cb-86e0-e15a925c57d9"}}],"id":"5aaade88-7eb6-46b2-871a-8cc5930b2a08","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Postman consented face swap\",\n  \"assets\": {\n    \"face_swap_mode\": \"all-faces\",\n    \"source_file_path\": \"{{source_face_url}}\",\n    \"target_file_path\": \"{{target_image_url}}\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://api.magichour.ai/v1/face-swap-photo","description":"<p>Use source and target images you have permission to use. Send once, then Get image result.</p>\n<p>Create a face swap photo. Each photo costs 10 credits. The height/width of the output image depends on your subscription. Please refer to our <a href=\"https://magichour.ai/pricing\">pricing</a> page for more details</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","face-swap-photo"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"5aaade88-7eb6-46b2-871a-8cc5930b2a08"},{"name":"07 — Lip-sync five seconds","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }","if (!pm.environment.get('video_url')) { console.error('Set video_url before sending this request.'); pm.execution.skipRequest(); }","if (!pm.environment.get('audio_url')) { console.error('Set audio_url before sending this request.'); pm.execution.skipRequest(); }"],"id":"482779f8-a7ac-4afa-a8c6-af6091efe155"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code >= 200 && pm.response.code < 300) {","  const result = pm.response.json();","  pm.test(\"Project ID returned\", () => pm.expect(result.id).to.be.a(\"string\").and.not.empty);","  if (result.id) pm.environment.set('video_project_id', result.id);","}"],"id":"e8713b0d-0e41-4445-950b-c66aba911f8b"}}],"id":"a84e439f-165a-4c5c-b9b0-5c012ebb1f90","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Postman lip sync\",\n  \"start_seconds\": 0,\n  \"end_seconds\": 5,\n  \"max_fps_limit\": 12,\n  \"assets\": {\n    \"video_source\": \"file\",\n    \"video_file_path\": \"{{video_url}}\",\n    \"audio_file_path\": \"{{audio_url}}\"\n  },\n  \"style\": {\n    \"generation_mode\": \"lite\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://api.magichour.ai/v1/lip-sync","description":"<p>Set direct URLs or uploaded file paths for a consented video and audio at least five seconds long. Send once, then Get video result.</p>\n<p><strong>What this API does</strong></p>\n<p>Create the same Lip Sync you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.</p>\n<p><strong>Good for</strong></p>\n<ul>\n<li>Automation and batch processing  </li>\n<li>Adding lip sync into apps, pipelines, or tools</li>\n</ul>\n<p><strong>How it works (3 steps)</strong></p>\n<ol>\n<li>Upload your inputs (video, image, or audio) with <a href=\"https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls\">Generate Upload URLs</a> and copy the <code>file_path</code>.  </li>\n<li>Send a request to create a lip sync job with the basic fields.  </li>\n<li>Check the job status until it's <code>complete</code>, then download the result from <code>downloads</code>.</li>\n</ol>\n<p><strong>Key options</strong></p>\n<ul>\n<li>Inputs: usually a file, sometimes a YouTube link, depending on project type  </li>\n<li>Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  </li>\n<li>Extra fields: e.g. <code>face_swap_mode</code>, <code>start_seconds</code>/<code>end_seconds</code>, or a text prompt</li>\n</ul>\n<p><strong>Cost</strong><br />Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.</p>\n<p>For detailed examples, see the <a href=\"https://magichour.ai/products/lip-sync\">product page</a>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","lip-sync"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"a84e439f-165a-4c5c-b9b0-5c012ebb1f90"},{"name":"08 — Create image upload URL","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"api_key\")) { console.error(\"Set api_key locally in the selected environment.\"); pm.execution.skipRequest(); }"],"id":"82dd5568-07b7-4f81-85bf-b62e79d16e7a"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));","if (pm.response.code === 200) { const item = pm.response.json().items[0]; pm.environment.set(\"upload_url\", item.upload_url); pm.environment.set(\"image_url\", item.file_path); }"],"id":"b5b42a28-ed50-4de9-ad2c-2194c0fb8a99"}}],"id":"24d03760-351f-4d11-afd9-f166dcf14f9e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"items\": [\n    {\n      \"type\": \"image\",\n      \"extension\": \"png\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://api.magichour.ai/v1/files/upload-urls","description":"<p>Optional alternative to a public input URL. Generate a signed URL, then choose a PNG in Upload PNG bytes. Signed URLs expire.</p>\n<p>Generates a list of pre-signed upload URLs for the assets required. This API is only necessary if you want to upload to Magic Hour's storage. Refer to the <a href=\"https://docs.magichour.ai/integration/inputs-and-outputs\">Input Files Guide</a> for more details.</p>\n<p>The response array will match the order of items in the request body.</p>\n<p><strong>Valid file extensions per asset type</strong>:</p>\n<ul>\n<li>video: mp4, m4v, mov, webm</li>\n<li>audio: mp3, wav, aac, flac, webm, weba, m4a, opus, ogg, oga, aiff, amr</li>\n<li>image: png, jpg, jpeg, jfif, heic, heif, webp, avif, jp2, tiff, tif, bmp</li>\n<li>gif: gif, webp, webm</li>\n</ul>\n<blockquote>\n<p>Note: <code>gif</code> is only supported for face swap API <code>video_file_path</code> field.</p>\n</blockquote>\n<p>Once you receive an upload URL, send a <code>PUT</code> request to upload the file directly.</p>\n<p>Example:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>curl -X PUT --data '@/path/to/file/video.mp4' \\\n  https://videos.magichour.ai/api-assets/id/video.mp4?&lt;auth params from the API response&gt;\n</code></pre>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","id":"e17029a6-d3fe-4d99-94c9-f29c9f73077c","name":"Magic Hour — Generate and retrieve AI media","type":"collection"}},"urlObject":{"path":["v1","files","upload-urls"],"host":["https://api.magichour.ai"],"query":[],"variable":[]}},"response":[],"_postman_id":"24d03760-351f-4d11-afd9-f166dcf14f9e"},{"name":"09 — Upload PNG bytes","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["if (!pm.environment.get(\"upload_url\")) { console.error(\"Run request 08 before uploading.\"); pm.execution.skipRequest(); }","if (!pm.request.body || !pm.request.body.file || !pm.request.body.file.src) { console.error(\"Choose a PNG in Body → binary before uploading.\"); pm.execution.skipRequest(); }"],"id":"a002abd5-4d1e-4728-a85d-8223bca82285"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Request succeeded\", () => pm.expect(pm.response.code).to.be.within(200, 299));"],"id":"fb51b200-d4dc-4f9c-9b0d-7766d5f47e8b"}}],"id":"4f23740f-05df-40a6-947e-bd81371f35a1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"PUT","header":[{"key":"Content-Type","value":"image/png"}],"body":{"mode":"file","file":{}},"url":"{{upload_url}}","description":"<p>Choose the local PNG in Body → binary before sending. No Magic Hour Authorization header is sent to storage. Only use the signed URL from request 08. After success, image_url contains the file_path used by requests 03 and 05.</p>\n","urlObject":{"host":["{{upload_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"4f23740f-05df-40a6-947e-bd81371f35a1"}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]}},"variable":[{"key":"base_url","value":"https://api.magichour.ai"}]}