{"openapi":"3.1.0","info":{"title":"ImgPanel Runtime API","version":"2026-07-04","description":"Cloudinary-style image management API for ImgPanel R2 assets. Use scoped ImgPanel API keys; Cloudflare account tokens always stay server-side.","contact":{"name":"ImgPanel","url":"https://www.imgpanel.com/docs"}},"servers":[{"url":"https://api.imgpanel.com/v1","description":"Production API"}],"tags":[{"name":"Assets"},{"name":"Delivery"},{"name":"Integrations"},{"name":"Search"},{"name":"Stats"},{"name":"Transforms"}],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Runtime API key created in dashboard Settings. Example: ik_live_..."},"BearerApiKey":{"type":"http","scheme":"bearer","description":"Alternative runtime authentication: Authorization: Bearer ik_live_..."}},"schemas":{"ErrorEnvelope":{"type":"object","additionalProperties":false,"properties":{"code":{"type":"string"},"error":{"type":"string"}},"required":["code","error"]},"RuntimeSuccess":{"type":"object","additionalProperties":true}}},"paths":{"/control/r2/assets":{"get":{"operationId":"listAssets","summary":"List assets","description":"Fetch indexed R2 assets with pagination, lifecycle counts, and Library facet counts for folders, tags, access, status, format, creators, and presets.\n\nRequired scopes: assets:read.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":20}],"x-imgpanel-workflow-id":"list-assets","x-required-scopes":["assets:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"operationId":"importUrl","summary":"Import URL","description":"Import an image URL into R2 with tags, metadata, and optional Cloudinary-like public_id conflict policy. Set overwrite=true to replace an existing public_id.\n\nRequired scopes: uploads:write.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"import-url","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"metadata":{"type":"object","additionalProperties":true,"properties":{"source":{"type":"string"}},"required":["source"]},"overwrite":{"type":"boolean"},"public_id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"url":{"type":"string"}},"required":["metadata","overwrite","public_id","tags","url"]},"example":{"metadata":{"source":"api-explorer"},"overwrite":false,"public_id":"imports/flower-demo","tags":["api"],"url":"https://www.imgpanel.com/images/transform-sample.png"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/search":{"post":{"operationId":"searchAssets","summary":"Search assets","description":"Cloudinary-style expression search over the R2 index, including AND, OR, NOT, parentheses, metadata fields, and numeric/date comparisons.\n\nRequired scopes: search:read or assets:read.","tags":["Search"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"search-assets","x-required-scopes":["search:read","assets:read"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"expression":{"type":"string"},"max_results":{"type":"integer"}},"required":["expression","max_results"]},"example":{"expression":"(tags=hero OR tags=product) AND NOT status=draft","max_results":20}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/grab/import":{"post":{"operationId":"importWebsiteGrabImages","summary":"Import website grab images","description":"Import selected website grab image candidates into R2. Grab imports derive stable public IDs from source paths, so overwrite and unique_filename control repeat-import conflicts.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"import-website-grab-images","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"images":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"source_page_url":{"type":"string"},"url":{"type":"string"}},"required":["source_page_url","url"]}},"overwrite":{"type":"boolean"},"presetId":{"type":"string"},"sourceSiteUrl":{"type":"string"},"unique_filename":{"type":"boolean"}},"required":["images","overwrite","presetId","sourceSiteUrl","unique_filename"]},"example":{"images":[{"source_page_url":"https://example.com/products","url":"https://example.com/images/hero.jpg"}],"overwrite":false,"presetId":"upr_example","sourceSiteUrl":"https://example.com","unique_filename":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/assets/bulk":{"patch":{"operationId":"bulkEditAssets","summary":"Bulk edit assets","description":"Bulk edit selected R2 assets: folder, access, status, tags, and metadata.\n\nRequired scopes: assets:write.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"bulk-edit-assets","x-required-scopes":["assets:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"folder":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"metadata":{"type":"object","additionalProperties":true,"properties":{"campaign":{"type":"string"}},"required":["campaign"]},"metadataMode":{"type":"string"},"status":{"type":"string"},"tagMode":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"required":["folder","keys","metadata","metadataMode","status","tagMode","tags"]},"example":{"folder":"campaigns/summer","keys":["uploads/tm_example/2026/07/04/image.jpg"],"metadata":{"campaign":"summer"},"metadataMode":"merge","status":"approved","tagMode":"add","tags":["hero","approved"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/assets/bulk-delete":{"post":{"operationId":"bulkDeleteAssets","summary":"Bulk delete assets","description":"Permanently delete selected R2 assets. Archive active assets first from the dashboard when you need a reversible delete.\n\nRequired scopes: assets:delete.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"bulk-delete-assets","x-required-scopes":["assets:delete"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"keys":{"type":"array","items":{"type":"string"}}},"required":["keys"]},"example":{"keys":["uploads/tm_example/2026/07/04/image.jpg"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/derived":{"post":{"operationId":"generateDerivedAsset","summary":"Generate derived asset","description":"Generate and store an eager/derived transformed asset from an existing R2 source.\n\nRequired scopes: transforms:write.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"generate-derived-asset","x-required-scopes":["transforms:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"options":{"type":"object","additionalProperties":true,"properties":{"format":{"type":"string"},"quality":{"type":"integer"},"width":{"type":"integer"}},"required":["format","quality","width"]},"source_key":{"type":"string"}},"required":["options","source_key"]},"example":{"options":{"format":"webp","quality":85,"width":1200},"source_key":"uploads/tm_example/2026/07/04/image.jpg"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/derived/jobs":{"post":{"operationId":"createDerivedJob","summary":"Create derived job","description":"Create an async derived-generation job for selected R2 sources. Run it with the job run endpoint until completed.\n\nRequired scopes: transforms:write.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"create-derived-job","x-required-scopes":["transforms:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"keys":{"type":"array","items":{"type":"string"}},"options":{"type":"object","additionalProperties":true,"properties":{"fit":{"type":"string"},"format":{"type":"string"},"quality":{"type":"integer"},"width":{"type":"integer"}},"required":["fit","format","quality","width"]}},"required":["keys","options"]},"example":{"keys":["uploads/tm_example/2026/07/04/hero.jpg","uploads/tm_example/2026/07/04/card.jpg"],"options":{"fit":"scale-down","format":"webp","quality":85,"width":1200}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/derived/jobs/djob_example/run":{"post":{"operationId":"runDerivedJob","summary":"Run derived job step","description":"Process the next parallel step for a derived-generation job and return progress, created count, failed count, and item statuses.\n\nRequired scopes: transforms:write.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"run-derived-job","x-required-scopes":["transforms:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/derived/jobs/djob_example/retry-failed":{"post":{"operationId":"retryFailedDerivedJob","summary":"Retry failed derived job items","description":"Requeue failed items from a derived-generation job, then run the same job again to retry only failed sources.\n\nRequired scopes: transforms:write.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"retry-failed-derived-job","x-required-scopes":["transforms:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/derived/jobs/djob_example/logs":{"get":{"operationId":"derivedJobLogs","summary":"Derived job logs","description":"Read recent logs for a derived-generation job, including run steps, completed items, failed items, retry events, and cancellation.\n\nRequired scopes: transforms:read.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":20}],"x-imgpanel-workflow-id":"derived-job-logs","x-required-scopes":["transforms:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/delivery/inspect":{"get":{"operationId":"inspectDeliveryUrl","summary":"Inspect delivery URL","description":"Check that a generated delivery or Open Graph image URL is reachable and image-like, including cache-control, CDN cache status, age, ETag, and redirect diagnostics.\n\nRequired scopes: assets:read.","tags":["Delivery"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string"},"example":"https://www.imgpanel.com/cdn-cgi/image/fit=cover,format=auto,width=1200/images/transform-sample.png"}],"x-imgpanel-workflow-id":"inspect-delivery-url","x-required-scopes":["assets:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/delivery/purge":{"post":{"operationId":"purgeDeliveryCache","summary":"Purge delivery cache","description":"Invalidate CDN cache for selected ImgPanel delivery URLs. Pass connection_id to use a client delivery connection, or omit it for the workspace default/platform fallback.\n\nRequired scopes: assets:write.","tags":["Delivery"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"purge-delivery-cache","x-required-scopes":["assets:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"urls":{"type":"array","items":{"type":"string"}}},"required":["urls"]},"example":{"urls":["https://api.imgpanel.com/r2/uploads/tm_example/2026/07/04/hero.jpg","https://www.imgpanel.com/cdn-cgi/image/fit=cover,format=auto,width=1200/images/transform-sample.png"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/delivery/profiles":{"get":{"operationId":"listDeliveryProfiles","summary":"List delivery profiles","description":"List reusable delivery profiles for responsive and social image snippets.\n\nRequired scopes: assets:read.","tags":["Delivery"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"list-delivery-profiles","x-required-scopes":["assets:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"operationId":"createDeliveryProfile","summary":"Create delivery profile","description":"Create a named delivery profile that can be reused from the asset details UI.\n\nRequired scopes: admin:write.","tags":["Delivery"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"create-delivery-profile","x-required-scopes":["admin:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"settings":{"type":"object","additionalProperties":true,"properties":{"quality":{"type":"string"},"sizes":{"type":"string"},"socialImageHeight":{"type":"string"},"socialImageWidth":{"type":"string"},"socialSiteName":{"type":"string"},"widths":{"type":"string"}},"required":["quality","sizes","socialImageHeight","socialImageWidth","socialSiteName","widths"]}},"required":["name","settings"]},"example":{"name":"Social hero","settings":{"quality":"85","sizes":"(max-width: 768px) 100vw, 768px","socialImageHeight":"630","socialImageWidth":"1200","socialSiteName":"ImgPanel","widths":"320, 640, 960, 1280, 1600"}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/upload-tokens":{"post":{"operationId":"directToken","summary":"Direct upload token","description":"Create a short-lived browser direct upload token. Call this from your server with an API key, then give only the returned token and upload_url to browser code.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"direct-token","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"clientUploadId":{"type":"string"},"expiresInSeconds":{"type":"integer"},"folder":{"type":"string"},"metadata":{"type":"object","additionalProperties":true,"properties":{"source":{"type":"string"}},"required":["source"]},"tags":{"type":"array","items":{"type":"string"}}},"required":["clientUploadId","expiresInSeconds","folder","metadata","tags"]},"example":{"clientUploadId":"cms-media-field-42","expiresInSeconds":900,"folder":"direct/inbox","metadata":{"source":"browser-direct-upload"},"tags":["direct-upload"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/asset-picker-tokens":{"post":{"operationId":"assetPickerToken","summary":"Asset picker token","description":"Create a short-lived public asset picker token for embedding ImgPanel media search into a CMS or admin UI without exposing a runtime API key.\n\nRequired scopes: assets:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"asset-picker-token","x-required-scopes":["assets:read"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"expiresInSeconds":{"type":"integer"},"requestId":{"type":"string"},"targetOrigin":{"type":"string"}},"required":["expiresInSeconds","requestId","targetOrigin"]},"example":{"expiresInSeconds":900,"requestId":"cms-media-field-42","targetOrigin":"https://cms.example.com"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/r2/asset-picker":{"get":{"operationId":"publicAssetPicker","summary":"Public asset picker","description":"List public R2 assets through a short-lived asset picker token. This endpoint is intended for iframe/embed picker flows and does not accept runtime API keys.\n\nAuthentication: short-lived picker token in the token query parameter.","tags":["Integrations"],"security":[],"parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string"},"example":"PASTE_PICKER_TOKEN"},{"name":"search","in":"query","required":false,"schema":{"type":"string"},"example":"hero"},{"name":"tag","in":"query","required":false,"schema":{"type":"string"},"example":"cms"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":20}],"x-imgpanel-workflow-id":"public-asset-picker","x-imgpanel-auth":"publicToken","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/stats":{"get":{"operationId":"usageStats","summary":"Usage stats","description":"Read storage, delivery, activity, asset health, and optional Cloudflare GraphQL cache attribution stats.\n\nRequired scopes: admin:read.","tags":["Stats"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"sinceDays","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":30}],"x-imgpanel-workflow-id":"usage-stats","x-required-scopes":["admin:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/settings":{"patch":{"operationId":"mediaSettings","summary":"Media settings","description":"Configure workspace media defaults: upload MIME/size limits, default access/status/folder, and the delivery base URL stored on newly uploaded R2 assets.\n\nRequired scopes: admin:write.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"media-settings","x-required-scopes":["admin:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"allowed_mime_types":{"type":"array","items":{"type":"string"}},"default_access":{"type":"string"},"default_folder":{"type":"string"},"default_status":{"type":"string"},"delivery_base_url":{"type":"string"},"max_upload_bytes":{"type":"integer"}},"required":["allowed_mime_types","default_access","default_folder","default_status","delivery_base_url","max_upload_bytes"]},"example":{"allowed_mime_types":["image/jpeg","image/png","image/webp"],"default_access":"private","default_folder":"incoming","default_status":"review","delivery_base_url":"https://cdn.example.com/media","max_upload_bytes":10485760}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/metadata-fields":{"get":{"operationId":"listMetadataFields","summary":"List metadata fields","description":"List structured metadata fields, including conditional field rules used by Library forms and upload validation.\n\nRequired scopes: admin:read.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"list-metadata-fields","x-required-scopes":["admin:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"operationId":"createMetadataField","summary":"Create metadata field","description":"Create a structured metadata field. Conditions make a field active only when other metadata values match.\n\nRequired scopes: admin:write.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"create-metadata-field","x-required-scopes":["admin:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"conditions":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"field":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}},"required":["field","operator","value"]}},"key":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"sortOrder":{"type":"integer"},"type":{"type":"string"}},"required":["conditions","key","label","required","sortOrder","type"]},"example":{"conditions":[{"field":"asset_kind","operator":"equals","value":"photo"}],"key":"model_release","label":"Model release","required":true,"sortOrder":20,"type":"url"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/metadata-fields/mf_example":{"patch":{"operationId":"updateMetadataField","summary":"Update metadata field","description":"Update a structured metadata field and its conditional visibility/validation rules.\n\nRequired scopes: admin:write.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"update-metadata-field","x-required-scopes":["admin:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"conditions":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"field":{"type":"string"},"operator":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"required":["field","operator","values"]}},"key":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"sortOrder":{"type":"integer"},"type":{"type":"string"}},"required":["conditions","key","label","required","sortOrder","type"]},"example":{"conditions":[{"field":"asset_kind","operator":"in","values":["photo","portrait"]}],"key":"model_release","label":"Model release","required":true,"sortOrder":20,"type":"url"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/presets":{"get":{"operationId":"listUploadPresets","summary":"List upload presets","description":"List upload presets used by browser uploads, URL imports, direct uploads, and website grab imports.\n\nRequired scopes: admin:read.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"list-upload-presets","x-required-scopes":["admin:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"operationId":"createUploadPreset","summary":"Create upload preset","description":"Create a reusable upload preset with folder/tags/metadata defaults, allowed formats, max size, moderation defaults, and optional eager transform JSON.\n\nRequired scopes: admin:write.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"create-upload-preset","x-required-scopes":["admin:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"access":{"type":"string"},"allowedFormats":{"type":"array","items":{"type":"string"}},"folder":{"type":"string"},"maxFileSize":{"type":"integer"},"metadata":{"type":"object","additionalProperties":true,"properties":{"source":{"type":"string"}},"required":["source"]},"name":{"type":"string"},"status":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"transform":{"type":"object","additionalProperties":true,"properties":{"format":{"type":"string"},"quality":{"type":"integer"},"width":{"type":"integer"}},"required":["format","quality","width"]}},"required":["access","allowedFormats","folder","maxFileSize","metadata","name","status","tags","transform"]},"example":{"access":"private","allowedFormats":["jpg","png","webp"],"folder":"products/incoming","maxFileSize":10485760,"metadata":{"source":"upload-preset"},"name":"Product uploads","status":"review","tags":["product","needs-review"],"transform":{"format":"webp","quality":85,"width":1600}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/presets/upr_example":{"patch":{"operationId":"updateUploadPreset","summary":"Update upload preset","description":"Update an upload preset. Future uploads using this preset receive the new defaults and constraints.\n\nRequired scopes: admin:write.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"update-upload-preset","x-required-scopes":["admin:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"access":{"type":"string"},"allowedFormats":{"type":"array","items":{"type":"string"}},"folder":{"type":"string"},"maxFileSize":{"type":"integer"},"metadata":{"type":"object","additionalProperties":true,"properties":{"source":{"type":"string"},"reviewed":{"type":"boolean"}},"required":["source","reviewed"]},"name":{"type":"string"},"status":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"transform":{"type":"object","additionalProperties":true,"properties":{"format":{"type":"string"},"quality":{"type":"integer"},"width":{"type":"integer"}},"required":["format","quality","width"]}},"required":["access","allowedFormats","folder","maxFileSize","metadata","name","status","tags","transform"]},"example":{"access":"public","allowedFormats":["jpg","png","webp","avif"],"folder":"products/approved","maxFileSize":15728640,"metadata":{"source":"upload-preset","reviewed":true},"name":"Product uploads approved","status":"approved","tags":["product","approved"],"transform":{"format":"webp","quality":82,"width":1800}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/activity":{"get":{"operationId":"auditActivity","summary":"Audit activity","description":"Filter and export audit activity for uploads, imports, metadata edits, jobs, and delivery operations.\n\nRequired scopes: admin:read.","tags":["Stats"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"resource_type","in":"query","required":false,"schema":{"type":"string"},"example":"asset"},{"name":"search","in":"query","required":false,"schema":{"type":"string"},"example":"uploaded"},{"name":"export","in":"query","required":false,"schema":{"type":"boolean"},"example":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":1000}],"x-imgpanel-workflow-id":"audit-activity","x-required-scopes":["admin:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/assets/export":{"post":{"operationId":"assetMetadataBackup","summary":"Asset metadata backup","description":"Export selected asset metadata as JSON and include backup context for folders, tags, collections, recent audit activity, migration jobs, duplicate checksum groups, metadata schema, and review-status counts.\n\nRequired scopes: assets:read.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"asset-metadata-backup","x-required-scopes":["assets:read"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"expires_in_seconds":{"type":"integer"},"include_backup":{"type":"boolean"},"keys":{"type":"array","items":{"type":"string"}},"signed_urls":{"type":"boolean"}},"required":["expires_in_seconds","include_backup","keys","signed_urls"]},"example":{"expires_in_seconds":3600,"include_backup":true,"keys":["uploads/tm_example/2026/07/hero.jpg"],"signed_urls":true}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/transformation-templates":{"get":{"operationId":"templates","summary":"Transformation templates","description":"List reusable transformation templates.\n\nRequired scopes: transforms:read.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"templates","x-required-scopes":["transforms:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/transformation-templates/trn_example/versions":{"get":{"operationId":"templateVersions","summary":"Template versions","description":"List saved versions for a transformation template so an integration can audit or roll back named transform changes.\n\nRequired scopes: transforms:read.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"template-versions","x-required-scopes":["transforms:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/transformation-templates/trn_example/versions/1/restore":{"post":{"operationId":"restoreTemplateVersion","summary":"Restore template version","description":"Restore a transformation template from a previous saved version. The restore itself becomes the newest version.\n\nRequired scopes: transforms:write.","tags":["Transforms"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"restore-template-version","x-required-scopes":["transforms:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/collections":{"get":{"operationId":"collections","summary":"Collections","description":"List team collections for asset picker/gallery flows.\n\nRequired scopes: collections:read.","tags":["Assets"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"collections","x-required-scopes":["collections:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/connections":{"post":{"operationId":"createCloudinaryConnection","summary":"Create Cloudinary connection","description":"Save encrypted Cloudinary Admin API credentials for repeatable migration pulls. Responses only return safe hints; api_secret is never returned.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"create-cloudinary-connection","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"api_key":{"type":"string"},"api_secret":{"type":"string"},"cloud_name":{"type":"string"},"default_prefix":{"type":"string"},"name":{"type":"string"}},"required":["api_key","api_secret","cloud_name","default_prefix","name"]},"example":{"api_key":"1234567890","api_secret":"encrypted-and-never-returned","cloud_name":"demo","default_prefix":"legacy/","name":"Production Cloudinary"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"operationId":"listCloudinaryConnections","summary":"List Cloudinary connections","description":"List saved Cloudinary connections for the workspace. Secrets are redacted.\n\nRequired scopes: uploads:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"list-cloudinary-connections","x-required-scopes":["uploads:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/resources":{"get":{"operationId":"listCloudinaryResources","summary":"List Cloudinary-style resources","description":"List ImgPanel R2 assets in a Cloudinary Resources API compatible shape. Supports max_results, next_cursor, prefix, tag, public_id, tags=false, context=false, and metadata=false.\n\nRequired scopes: uploads:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":50},{"name":"prefix","in":"query","required":false,"schema":{"type":"string"},"example":"legacy/"},{"name":"tags","in":"query","required":false,"schema":{"type":"boolean"},"example":true},{"name":"context","in":"query","required":false,"schema":{"type":"boolean"},"example":true},{"name":"metadata","in":"query","required":false,"schema":{"type":"boolean"},"example":true}],"x-imgpanel-workflow-id":"list-cloudinary-resources","x-required-scopes":["uploads:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/search":{"post":{"operationId":"searchCloudinaryResources","summary":"Search Cloudinary-style resources","description":"Search ImgPanel R2 assets and return Cloudinary-style resources. Supports Cloudinary-like expression, tag/folder/metadata filters, cursor pagination, facets, and archive lifecycle counts.\n\nRequired scopes: uploads:read or search:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"search-cloudinary-resources","x-required-scopes":["uploads:read","search:read"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"expression":{"type":"string"},"max_results":{"type":"integer"},"sort_by":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"uploaded_at":{"type":"string"}},"required":["uploaded_at"]}}},"required":["expression","max_results","sort_by"]},"example":{"expression":"tags=hero AND metadata.campaign=summer","max_results":20,"sort_by":[{"uploaded_at":"desc"}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/upload":{"post":{"operationId":"cloudinaryUploadAlias","summary":"Cloudinary-style upload","description":"Upload a remote image through a Cloudinary-like endpoint. Accepts multipart file uploads or JSON file/url remote uploads, maps upload_preset to ImgPanel presets, and returns a Cloudinary-style resource.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"cloudinary-upload-alias","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"context":{"type":"string"},"file":{"type":"string"},"overwrite":{"type":"boolean"},"public_id":{"type":"string"},"tags":{"type":"string"},"unique_filename":{"type":"boolean"},"upload_preset":{"type":"string"}},"required":["context","file","overwrite","public_id","tags","unique_filename","upload_preset"]},"example":{"context":"alt=Homepage hero|caption=Uploaded through Cloudinary-compatible API","file":"https://www.imgpanel.com/images/transform-sample.png","overwrite":false,"public_id":"legacy/home/hero","tags":"cloudinary,hero","unique_filename":false,"upload_preset":"upr_example"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/resources/detail":{"get":{"operationId":"cloudinaryResourceDetail","summary":"Cloudinary-style resource detail","description":"Read one Cloudinary-style resource by public_id, including metadata, derived assets, version snapshots, internal R2 key, and the current original/base source_url for download.\n\nRequired scopes: uploads:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"public_id","in":"query","required":false,"schema":{"type":"string"},"example":"legacy/home/hero"},{"name":"archived","in":"query","required":false,"schema":{"type":"string"},"example":"all"}],"x-imgpanel-workflow-id":"cloudinary-resource-detail","x-required-scopes":["uploads:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/resources/update":{"post":{"operationId":"updateCloudinaryResource","summary":"Update Cloudinary-style resource","description":"Update Cloudinary-style resource context and metadata by public_id. Use metadata_mode=merge or replace.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"update-cloudinary-resource","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"context":{"type":"object","additionalProperties":true,"properties":{"alt":{"type":"string"},"caption":{"type":"string"}},"required":["alt","caption"]},"metadata":{"type":"object","additionalProperties":true,"properties":{"campaign":{"type":"string"},"owner":{"type":"string"}},"required":["campaign","owner"]},"metadata_mode":{"type":"string"},"public_ids":{"type":"array","items":{"type":"string"}}},"required":["context","metadata","metadata_mode","public_ids"]},"example":{"context":{"alt":"Homepage hero","caption":"Imported from Cloudinary"},"metadata":{"campaign":"summer","owner":"marketing"},"metadata_mode":"merge","public_ids":["legacy/home/hero"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/resources/delete":{"post":{"operationId":"deleteCloudinaryResource","summary":"Delete Cloudinary-style resources","description":"Delete Cloudinary-style resources by public_id. mode=archive is the safe default; use mode=delete only for permanent R2 object deletion.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"delete-cloudinary-resource","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"mode":{"type":"string"},"public_ids":{"type":"array","items":{"type":"string"}}},"required":["mode","public_ids"]},"example":{"mode":"archive","public_ids":["legacy/home/hero"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/resources/restore":{"post":{"operationId":"restoreCloudinaryResource","summary":"Restore Cloudinary-style resources","description":"Restore previously archived Cloudinary-style resources by public_id. This is lifecycle recovery; use the dashboard asset Versions panel when you need to roll the current base file back to a snapshot.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"restore-cloudinary-resource","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"public_ids":{"type":"array","items":{"type":"string"}}},"required":["public_ids"]},"example":{"public_ids":["legacy/home/hero"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/resources/rename":{"post":{"operationId":"renameCloudinaryResource","summary":"Rename Cloudinary-style resource","description":"Rename or move one Cloudinary-style resource by public_id. Updates the R2 object key, folder/filename metadata, and cloudinary_public_id.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"rename-cloudinary-resource","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"overwrite":{"type":"boolean"},"public_id":{"type":"string"},"to_public_id":{"type":"string"}},"required":["overwrite","public_id","to_public_id"]},"example":{"overwrite":false,"public_id":"legacy/home/hero","to_public_id":"legacy/home/hero-renamed"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/resources/derived":{"get":{"operationId":"listCloudinaryDerived","summary":"List Cloudinary-style derived resources","description":"List derived/generated resources for one Cloudinary-style public_id.\n\nRequired scopes: uploads:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"public_id","in":"query","required":false,"schema":{"type":"string"},"example":"legacy/home/hero"}],"x-imgpanel-workflow-id":"list-cloudinary-derived","x-required-scopes":["uploads:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"post":{"operationId":"createCloudinaryDerived","summary":"Create Cloudinary-style derived resource","description":"Generate one derived/transformed resource for a Cloudinary-style public_id using ImgPanel transformation options or a transformation_template_id.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"create-cloudinary-derived","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"options":{"type":"object","additionalProperties":true,"properties":{"format":{"type":"string"},"quality":{"type":"integer"},"width":{"type":"integer"}},"required":["format","quality","width"]},"public_id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"required":["options","public_id","tags"]},"example":{"options":{"format":"webp","quality":80,"width":1200},"public_id":"legacy/home/hero","tags":["derived","webp"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"delete":{"operationId":"deleteCloudinaryDerived","summary":"Delete Cloudinary-style derived resource","description":"Delete one derived/generated resource by derived_id, scoped to a Cloudinary-style public_id.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"public_id","in":"query","required":false,"schema":{"type":"string"},"example":"legacy/home/hero"},{"name":"derived_id","in":"query","required":false,"schema":{"type":"string"},"example":"drv_example"}],"x-imgpanel-workflow-id":"delete-cloudinary-derived","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/tags":{"get":{"operationId":"listCloudinaryTags","summary":"List Cloudinary-style tags","description":"List Cloudinary-style tags from the R2 asset index with counts and cursor pagination.\n\nRequired scopes: uploads:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":100},{"name":"prefix","in":"query","required":false,"schema":{"type":"string"},"example":"hero"}],"x-imgpanel-workflow-id":"list-cloudinary-tags","x-required-scopes":["uploads:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/folders":{"get":{"operationId":"listCloudinaryFolders","summary":"List Cloudinary-style folders","description":"List Cloudinary-style folders from ImgPanel R2 folder metadata. Pass path to list direct subfolders under a folder.\n\nRequired scopes: uploads:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string"},"example":"legacy"},{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":100}],"x-imgpanel-workflow-id":"list-cloudinary-folders","x-required-scopes":["uploads:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/tags/add":{"post":{"operationId":"addCloudinaryTag","summary":"Add Cloudinary-style tag","description":"Add one or more tags to resources by Cloudinary public_id. Works for migrated Cloudinary assets and ImgPanel assets with folder/filename public IDs.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"add-cloudinary-tag","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"public_ids":{"type":"array","items":{"type":"string"}},"tag":{"type":"string"}},"required":["public_ids","tag"]},"example":{"public_ids":["legacy/home/hero"],"tag":"approved"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/tags/remove":{"post":{"operationId":"removeCloudinaryTags","summary":"Remove Cloudinary-style tags","description":"Remove one or more tags from resources by Cloudinary public_id.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"remove-cloudinary-tags","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"public_ids":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}}},"required":["public_ids","tags"]},"example":{"public_ids":["legacy/home/hero"],"tags":["legacy","needs-review"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/cloudinary/tags/remove-all":{"post":{"operationId":"removeAllCloudinaryTags","summary":"Remove all Cloudinary-style tags","description":"Remove all tags from resources by Cloudinary public_id.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"remove-all-cloudinary-tags","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"public_ids":{"type":"array","items":{"type":"string"}}},"required":["public_ids"]},"example":{"public_ids":["legacy/home/hero"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/migrations/cloudinary":{"post":{"operationId":"createCloudinaryMigration","summary":"Create Cloudinary migration","description":"Create a step-run migration job from a Cloudinary-style asset manifest. Supports secure_url/url, public_id, folder, tags, metadata/context, upload presets, overwrite/unique_filename conflict policy, and retryable item failures.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"create-cloudinary-migration","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"assets":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"context":{"type":"object","additionalProperties":true,"properties":{"alt":{"type":"string"}},"required":["alt"]},"folder":{"type":"string"},"public_id":{"type":"string"},"secure_url":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"required":["context","folder","public_id","secure_url","tags"]}},"folder":{"type":"string"},"metadata":{"type":"object","additionalProperties":true,"properties":{"migration_batch":{"type":"string"}},"required":["migration_batch"]},"overwrite":{"type":"boolean"},"preset_id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"unique_filename":{"type":"boolean"}},"required":["assets","folder","metadata","overwrite","preset_id","tags","unique_filename"]},"example":{"assets":[{"context":{"alt":"Hero image"},"folder":"legacy/home","public_id":"legacy/home/hero","secure_url":"https://res.cloudinary.com/demo/image/upload/sample.jpg","tags":["legacy","hero"]}],"folder":"cloudinary-import","metadata":{"migration_batch":"legacy-site"},"overwrite":false,"preset_id":"upr_example","tags":["cloudinary"],"unique_filename":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/migrations/cloudinary/pull":{"post":{"operationId":"pullCloudinaryMigrationConnection","summary":"Pull Cloudinary with connection","description":"Pull image resources from Cloudinary with a saved encrypted connection instead of sending api_key/api_secret every time. Uses the same overwrite and unique_filename conflict policy as manifest migrations.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"pull-cloudinary-migration-connection","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"connection_id":{"type":"string"},"folder":{"type":"string"},"max_assets":{"type":"integer"},"overwrite":{"type":"boolean"},"page_size":{"type":"integer"},"prefix":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"unique_filename":{"type":"boolean"}},"required":["connection_id","folder","max_assets","overwrite","page_size","prefix","tags","unique_filename"]},"example":{"connection_id":"cld_...","folder":"cloudinary-import","max_assets":500,"overwrite":false,"page_size":100,"prefix":"legacy/","tags":["cloudinary"],"unique_filename":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/migrations/jobs/mjob_example/run":{"post":{"operationId":"runCloudinaryMigration","summary":"Run migration step","description":"Process the next batch of a Cloudinary migration job and return progress, imported count, failed count, skipped count, and item statuses.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"run-cloudinary-migration","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/migrations/jobs/mjob_example":{"get":{"operationId":"cloudinaryMigrationJob","summary":"Migration job details","description":"Read migration job progress and the first page of item statuses.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"cloudinary-migration-job","x-required-scopes":["uploads:write"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/migrations/jobs/mjob_example/retry-failed":{"post":{"operationId":"retryCloudinaryMigration","summary":"Retry failed migration items","description":"Requeue failed Cloudinary migration items so the next run step retries only failed imports.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[],"x-imgpanel-workflow-id":"retry-cloudinary-migration","x-required-scopes":["uploads:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/r2/migrations/jobs/mjob_example/logs":{"get":{"operationId":"cloudinaryMigrationLogs","summary":"Migration job logs","description":"Read recent migration job logs, including run steps, imported items, failed items, retry events, and cancellation.\n\nRequired scopes: uploads:write.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":20}],"x-imgpanel-workflow-id":"cloudinary-migration-logs","x-required-scopes":["uploads:write"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/control/webhook-deliveries":{"get":{"operationId":"webhookDeliveries","summary":"Webhook deliveries","description":"Read recent signed webhook delivery attempts.\n\nRequired scopes: webhooks:read.","tags":["Integrations"],"security":[{"ApiKeyAuth":[]},{"BearerApiKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":0},"example":20}],"x-imgpanel-workflow-id":"webhook-deliveries","x-required-scopes":["webhooks:read"],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeSuccess"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"API key does not include a required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}}}}