{"openapi":"3.1.0","info":{"title":"Imejis API","version":"1.0.0","summary":"The REST API for Imejis image generation.","description":"The endpoints an agent or integration calls directly. Render a design to a finished image (the image API), read and list designs, fetch a design's render config, check usage, and manage render keys. One endpoint renders: pass a design id, get an image back. Design authoring (the v2 component document) runs over MCP, so connect the MCP server at https://api.imejis.io/api/mcp and call get_design_guide for the full component schema.","contact":{"name":"Imejis","email":"support@imejis.io","url":"https://www.imejis.io/apis"}},"servers":[{"url":"https://api.imejis.io","description":"Imejis API"},{"url":"https://render.imejis.io/v1","description":"Imejis render service"}],"externalDocs":{"url":"https://www.imejis.io/apis","description":"Imejis API and agent docs"},"tags":[{"name":"Render","description":"Turn a design into a finished image."},{"name":"Designs","description":"Read and list designs."},{"name":"Analytics","description":"Render usage."},{"name":"Keys","description":"Render API keys."}],"security":[{"bearerAuth":[]}],"paths":{"/{design_id}":{"servers":[{"url":"https://render.imejis.io/v1","description":"Imejis render service"}],"parameters":[{"name":"design_id","in":"path","required":true,"description":"The design's render code (the id in the render config's `render` URL), not the internal `_id`.","schema":{"type":"string"}}],"get":{"tags":["Render"],"operationId":"renderDesignGet","summary":"Render a design to an image (GET)","description":"Render a design to a finished image. Authenticate with a render key (`dma-api-key`) as a header, a `?dma-api-key=` query param, or the `key` / `api-key` query alias. Override any field marked dynamic with query params; dot-paths reach nested properties (`?title=Hello&price.value=42`). Get the field list from GET /designs/v2/{id}/config. Choose the output with `?format=` (png, jpeg, webp, pdf; default jpeg) and `?quality=` for JPEG (1-100). A typical render finishes in under 2 seconds. Output is up to 4096x4096. Every render counts as one API call, including a GET URL in an `<img>` tag.","security":[{"renderKeyHeader":[]},{"renderKeyQuery":[]}],"parameters":[{"name":"dma-api-key","in":"query","required":false,"description":"Render key. Use this or the header.","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"Output format. Defaults to jpeg. A component keyed literally \"format\" cannot be overridden via query (this param wins).","schema":{"type":"string","enum":["png","jpeg","webp","pdf"],"default":"jpeg"}},{"name":"quality","in":"query","required":false,"description":"JPEG quality, 1-100. Only affects jpeg output.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"variation","in":"query","required":false,"description":"The design SIZE to render — a variation id from GET /designs/v2/{id}/config (`variations`). Omit, or pass 'master', for the base size. Can also be sent in the JSON body on the export endpoints and the render POST.","schema":{"type":"string"}},{"name":"delivery","in":"query","required":false,"description":"stream (image bytes, default) | hosted (public URL) | signed (expiring signed URL). hosted/signed store the render and return a JSON body.","schema":{"type":"string","enum":["stream","hosted","signed"],"default":"stream"}},{"name":"expiresIn","in":"query","required":false,"description":"signed delivery only — link lifetime in minutes (default 60, max 7 days).","schema":{"type":"integer","minimum":1,"maximum":10080}}],"responses":{"200":{"description":"The render. For delivery=stream, the image bytes; for delivery=hosted/signed, a JSON body with the stored URL.","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"application/pdf":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"},"delivery":{"type":"string","enum":["hosted","signed"]},"url":{"type":"string","description":"Public URL (hosted) or expiring signed URL (signed)."},"expiresAt":{"type":"string","format":"date-time","description":"Signed delivery only — when the URL expires."},"format":{"type":"string","enum":["png","jpeg","webp","pdf"]},"file":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}},"post":{"tags":["Render"],"operationId":"renderDesignPost","summary":"Render a design to an image (POST)","description":"The same render as GET. Send the `dma-api-key` as a header and the dynamic-field overrides as a JSON body. Prefer POST for long text or many fields. Choose the output with `?format=`/`?quality=` and the delivery with `?delivery=stream|hosted|signed` on the URL (same as GET); hosted/signed return a JSON body with the stored URL.","security":[{"renderKeyHeader":[]}],"parameters":[{"name":"format","in":"query","required":false,"description":"Output format. Defaults to jpeg. A component keyed literally \"format\" cannot be overridden via query (this param wins).","schema":{"type":"string","enum":["png","jpeg","webp","pdf"],"default":"jpeg"}},{"name":"quality","in":"query","required":false,"description":"JPEG quality, 1-100. Only affects jpeg output.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"variation","in":"query","required":false,"description":"The design SIZE to render — a variation id from GET /designs/v2/{id}/config (`variations`). Omit, or pass 'master', for the base size. Can also be sent in the JSON body on the export endpoints and the render POST.","schema":{"type":"string"}},{"name":"delivery","in":"query","required":false,"description":"stream (image bytes, default) | hosted (public URL) | signed (expiring signed URL). hosted/signed store the render and return a JSON body.","schema":{"type":"string","enum":["stream","hosted","signed"],"default":"stream"}},{"name":"expiresIn","in":"query","required":false,"description":"signed delivery only — link lifetime in minutes (default 60, max 7 days).","schema":{"type":"integer","minimum":1,"maximum":10080}}],"requestBody":{"required":false,"description":"Dynamic-field overrides for this render (keys from the render config). Nothing is stored unless delivery=hosted/signed.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"example":{"title.text":"Hello world","price":{"value":42}}}}},"responses":{"200":{"description":"The render. For delivery=stream, the image bytes; for delivery=hosted/signed, a JSON body with the stored URL.","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"application/pdf":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"},"delivery":{"type":"string","enum":["hosted","signed"]},"url":{"type":"string","description":"Public URL (hosted) or expiring signed URL (signed)."},"expiresAt":{"type":"string","format":"date-time","description":"Signed delivery only — when the URL expires."},"format":{"type":"string","enum":["png","jpeg","webp","pdf"]},"file":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/bulk":{"servers":[{"url":"https://render.imejis.io","description":"Imejis render service"}],"post":{"tags":["Render"],"operationId":"bulkExport","summary":"Bulk render many items to stored URLs","description":"Render MANY images in one call — the same design in several sizes, the same design with different data, a mix of designs, or the ordered slides of a CAROUSEL. Authenticate with a render key (`dma-api-key`) as a header or `?dma-api-key=` query param. Send `{ \"items\": [ ... ] }` (1-25); each item is rendered and stored, returning a URL. `results` preserves input order (result[i] ↔ items[i]), so for a carousel the array IS the slide sequence. Request-level `delivery`/`format`/`quality`/`expiresIn` are defaults; any item may override `format`/`quality`/`variation`/`overrides`. Each item is one metered render (N items = N renders); a failed item does not abort the rest.","security":[{"renderKeyHeader":[]},{"renderKeyQuery":[]}],"parameters":[{"name":"dma-api-key","in":"query","required":false,"description":"Render key. Use this or the header.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"The items to render plus request-level delivery/format defaults.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","minItems":1,"maxItems":25,"items":{"type":"object","required":["designId"],"properties":{"designId":{"type":"string","description":"The design's render code (as in the render URL)."},"variation":{"type":"string","description":"Size id (from GET /designs/v2/{id}/config `variations`); omit or 'master' for the base size."},"overrides":{"type":"object","additionalProperties":true,"description":"Dynamic-field overrides for this item (`key.field` form; a bare key is ignored)."},"format":{"type":"string","enum":["png","jpeg","webp","pdf"]},"quality":{"type":"integer","minimum":1,"maximum":100},"filename":{"type":"string","description":"Optional label echoed back on this item’s result row."}}},"description":"The renders to produce, in order. Same design + varying `variation` = several sizes; same design + varying `overrides` = data variants; different `designId` = multiple designs; one item per slide = a carousel."},"delivery":{"type":"string","enum":["hosted","signed"],"description":"URL type for every item (default hosted)."},"format":{"type":"string","enum":["png","jpeg","webp","pdf"],"description":"Default output format for items that omit their own."},"quality":{"type":"integer","minimum":1,"maximum":100},"expiresIn":{"type":"integer","description":"signed only — link lifetime in minutes (default 60, max 7 days = 10080)."}}},"example":{"delivery":"hosted","format":"png","items":[{"designId":"etpd-V1CzPXpw","variation":"master"},{"designId":"etpd-V1CzPXpw","variation":"instagram-story"},{"designId":"etpd-V1CzPXpw","overrides":{"title.text":"Variant B"}}]}}}},"responses":{"200":{"description":"Per-item results in input order — each carries a stored `url` on success or an `error` on failure — plus a `summary`.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"results":{"type":"array","description":"One entry per input item, in the same order (result[i] ↔ items[i]).","items":{"type":"object","properties":{"index":{"type":"integer"},"designId":{"type":"string"},"filename":{"type":"string"},"variation":{"type":"string"},"success":{"type":"boolean"},"url":{"type":"string","description":"Stored URL (on success)."},"delivery":{"type":"string","enum":["hosted","signed"]},"format":{"type":"string","enum":["png","jpeg","webp","pdf"]},"expiresAt":{"type":"string","format":"date-time","description":"Signed delivery only."},"warnings":{"type":"array","items":{"type":"string"}},"error":{"type":"string","description":"Failure reason (on failure)."}}}},"summary":{"type":"object","properties":{"total":{"type":"integer"},"succeeded":{"type":"integer"},"failed":{"type":"integer"}}}}}}}},"400":{"description":"Invalid request (e.g. no items, too many items, or an item missing designId).","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/designs/v2":{"get":{"tags":["Designs"],"operationId":"listDesigns","summary":"List designs","description":"List the authenticated user's designs, most recently updated first. Paginate with `$page` and `$limit`.","parameters":[{"name":"$page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"$limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"A page of designs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDesigns"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/designs/v2/{id}":{"get":{"tags":["Designs"],"operationId":"getDesign","summary":"Get a design document","description":"The full v2 design document, the same shape the MCP `get_design` tool returns.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The design document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Design"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/designs/v2/{id}/config":{"get":{"tags":["Designs","Render"],"operationId":"getDesignRenderConfig","summary":"Get a design's render endpoint and dynamic fields","description":"Returns the render endpoint for the design plus its overridable dynamic fields (`data.pure` nested, `data.flatten` dot-path keys).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The render config.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderConfig"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/designs/v2/{id}/export":{"post":{"tags":["Render"],"operationId":"exportDesign","summary":"Render a design and stream the image (app session)","description":"Render a v2 design with the signed-in session (Bearer), returning the image bytes. Like the render-key endpoint but authenticated as the user; each call consumes one render from quota and is refunded on failure.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"Output format (default png). Can also be sent in the JSON body.","schema":{"type":"string","enum":["png","jpeg","webp","pdf"],"default":"png"}},{"name":"quality","in":"query","required":false,"description":"JPEG quality, 1-100. Only affects jpeg output.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"variation","in":"query","required":false,"description":"The design SIZE to render — a variation id from GET /designs/v2/{id}/config (`variations`). Omit, or pass 'master', for the base size. Can also be sent in the JSON body on the export endpoints and the render POST.","schema":{"type":"string"}},{"name":"draft","in":"query","required":false,"description":"Render the unpublished DRAFT instead of the published design — preview in-progress edits without publishing. Owner-only (these routes are authenticated as the design owner); ignored when the design has no draft. Can also be sent as `draft: true` in the JSON body.","schema":{"type":"boolean"}}],"requestBody":{"required":false,"description":"Dynamic-field overrides for this render. Each key addresses a FIELD of a dynamic component — dot-path (\"title.text\") or nested ({ title: { text } }); a bare \"title\" names no field and is ignored. Keys come from GET /designs/v2/{id}/config (`data.flatten`). Reserved keys (format, quality, variation, draft, delivery, expiresIn, webhookUrl, dma-api-key) are stripped first.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"example":{"title.text":"Hello world","price":{"value":42}}}}},"responses":{"200":{"description":"The image bytes.","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/designs/v2/{id}/export/driver-upload":{"post":{"tags":["Render"],"operationId":"exportDesignHosted","summary":"Render a design and store it (hosted public URL)","description":"Render and upload to storage, returning a public URL instead of bytes. Dynamic-field overrides may be supplied in the body, same as /export.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"Output format (default png). Can also be sent in the JSON body.","schema":{"type":"string","enum":["png","jpeg","webp","pdf"],"default":"png"}},{"name":"quality","in":"query","required":false,"description":"JPEG quality, 1-100. Only affects jpeg output.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"variation","in":"query","required":false,"description":"The design SIZE to render — a variation id from GET /designs/v2/{id}/config (`variations`). Omit, or pass 'master', for the base size. Can also be sent in the JSON body on the export endpoints and the render POST.","schema":{"type":"string"}},{"name":"draft","in":"query","required":false,"description":"Render the unpublished DRAFT instead of the published design — preview in-progress edits without publishing. Owner-only (these routes are authenticated as the design owner); ignored when the design has no draft. Can also be sent as `draft: true` in the JSON body.","schema":{"type":"boolean"}}],"requestBody":{"required":false,"description":"Dynamic-field overrides for this render. Each key addresses a FIELD of a dynamic component — dot-path (\"title.text\") or nested ({ title: { text } }); a bare \"title\" names no field and is ignored. Keys come from GET /designs/v2/{id}/config (`data.flatten`). Reserved keys (format, quality, variation, draft, delivery, expiresIn, webhookUrl, dma-api-key) are stripped first.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"example":{"title.text":"Hello world","price":{"value":42}}}}},"responses":{"200":{"description":"The stored file and its public URL.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"},"url":{"type":"string","description":"The stored image URL."},"expiresAt":{"type":"string","format":"date-time","description":"Signed delivery only — when the URL expires."},"format":{"type":"string","enum":["png","jpeg","webp","pdf"]},"file":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/designs/v2/{id}/export/signed-url":{"post":{"tags":["Render"],"operationId":"exportDesignSigned","summary":"Render a design and return a time-limited signed URL","description":"Render, store privately, and return an expiring signed URL. Set the lifetime with `expiresIn` (minutes, default 60, max 7 days).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"Output format (default png). Can also be sent in the JSON body.","schema":{"type":"string","enum":["png","jpeg","webp","pdf"],"default":"png"}},{"name":"quality","in":"query","required":false,"description":"JPEG quality, 1-100. Only affects jpeg output.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"variation","in":"query","required":false,"description":"The design SIZE to render — a variation id from GET /designs/v2/{id}/config (`variations`). Omit, or pass 'master', for the base size. Can also be sent in the JSON body on the export endpoints and the render POST.","schema":{"type":"string"}},{"name":"draft","in":"query","required":false,"description":"Render the unpublished DRAFT instead of the published design — preview in-progress edits without publishing. Owner-only (these routes are authenticated as the design owner); ignored when the design has no draft. Can also be sent as `draft: true` in the JSON body.","schema":{"type":"boolean"}},{"name":"expiresIn","in":"query","required":false,"description":"Signed-URL lifetime in minutes (default 60, max 7 days).","schema":{"type":"integer","minimum":1,"maximum":10080}}],"requestBody":{"required":false,"description":"Dynamic-field overrides for this render. Each key addresses a FIELD of a dynamic component — dot-path (\"title.text\") or nested ({ title: { text } }); a bare \"title\" names no field and is ignored. Keys come from GET /designs/v2/{id}/config (`data.flatten`). Reserved keys (format, quality, variation, draft, delivery, expiresIn, webhookUrl, dma-api-key) are stripped first.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"example":{"title.text":"Hello world","price":{"value":42}}}}},"responses":{"200":{"description":"The signed URL and its expiry.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"},"url":{"type":"string","description":"The stored image URL."},"expiresAt":{"type":"string","format":"date-time","description":"Signed delivery only — when the URL expires."},"format":{"type":"string","enum":["png","jpeg","webp","pdf"]},"file":{"type":"object","additionalProperties":true}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/designs/v2/{id}/export/jobs":{"post":{"tags":["Render"],"operationId":"exportDesignAsync","summary":"Queue an async stored export (optional webhook)","description":"Enqueue a background render that stores the image, returning 202 with an `exportId` and a `pollUrl` (GET /analytics/exports/{exportId}). Provide `webhookUrl` in the body to be notified on completion.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"delivery","in":"query","required":true,"description":"hosted (public URL) or signed (expiring URL).","schema":{"type":"string","enum":["hosted","signed"]}},{"name":"format","in":"query","required":false,"description":"Output format (default png). Can also be sent in the JSON body.","schema":{"type":"string","enum":["png","jpeg","webp","pdf"],"default":"png"}},{"name":"quality","in":"query","required":false,"description":"JPEG quality, 1-100. Only affects jpeg output.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"variation","in":"query","required":false,"description":"The design SIZE to render — a variation id from GET /designs/v2/{id}/config (`variations`). Omit, or pass 'master', for the base size. Can also be sent in the JSON body on the export endpoints and the render POST.","schema":{"type":"string"}},{"name":"draft","in":"query","required":false,"description":"Render the unpublished DRAFT instead of the published design — preview in-progress edits without publishing. Owner-only (these routes are authenticated as the design owner); ignored when the design has no draft. Can also be sent as `draft: true` in the JSON body.","schema":{"type":"boolean"}},{"name":"expiresIn","in":"query","required":false,"description":"Signed delivery only — lifetime in minutes (default 60, max 7 days).","schema":{"type":"integer","minimum":1,"maximum":10080}}],"requestBody":{"required":false,"description":"Dynamic-field overrides, plus an optional `webhookUrl` called on completion. Reserved keys (format/quality/variation/draft/delivery/expiresIn/webhookUrl) are stripped before overrides are applied.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"webhookUrl":{"type":"string","format":"uri","description":"Called with the result when the job finishes."}}},"example":{"webhookUrl":"https://example.com/hook","title":"Hi"}}}},"responses":{"202":{"description":"The export was queued.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"success":{"type":"boolean"},"exportId":{"type":"string"},"status":{"type":"string"},"pollUrl":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/QuotaExceeded"}}}},"/analytics/exports/{exportId}":{"get":{"tags":["Analytics"],"operationId":"getExportJob","summary":"Poll an async export job","description":"Fetch the status and (when ready) the stored URL of an export queued via POST /designs/v2/{id}/export/jobs.","parameters":[{"name":"exportId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The export job record.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/analytics/api":{"get":{"tags":["Analytics"],"operationId":"getApiUsage","summary":"Render usage over time","description":"Time-bucketed render counts (every metered render is counted). This is historical usage, not remaining quota.","parameters":[{"name":"start","in":"query","description":"ISO-8601 lower bound (defaults to the last 7 days).","schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","description":"ISO-8601 upper bound.","schema":{"type":"string","format":"date-time"}},{"name":"groupBy","in":"query","schema":{"type":"string","enum":["hour","day","week","month","year"],"default":"day"}}],"responses":{"200":{"description":"Usage buckets.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/settings/api-keys":{"get":{"tags":["Keys"],"operationId":"listApiKeys","summary":"List render API keys","parameters":[{"name":"$limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}],"responses":{"200":{"description":"A page of render keys.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"docs":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"OAuth 2.0 Bearer access token issued by Imejis. See https://api.imejis.io/auth.md and /.well-known/oauth-protected-resource."},"renderKeyHeader":{"type":"apiKey","in":"header","name":"dma-api-key","description":"A render API key. Manage keys under /settings/api-keys."},"renderKeyQuery":{"type":"apiKey","in":"query","name":"dma-api-key","description":"A render API key passed as a query param (GET only)."}},"responses":{"Unauthorized":{"description":"Missing or invalid credentials."},"NotFound":{"description":"No such resource."},"QuotaExceeded":{"description":"Render quota is used up. Check remaining quota, then retry after the plan window resets (`data.resetAt`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotaError"}}}}},"schemas":{"Design":{"type":"object","additionalProperties":true,"description":"A v2 design document. See MCP get_design_guide for the full component schema.","properties":{"_id":{"type":"string"},"name":{"type":"string"},"design":{"type":"object","additionalProperties":true}}},"DesignSummary":{"type":"object","additionalProperties":true,"properties":{"_id":{"type":"string"},"name":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}}},"PaginatedDesigns":{"type":"object","additionalProperties":true,"properties":{"docs":{"type":"array","items":{"$ref":"#/components/schemas/DesignSummary"}},"page":{"type":"integer"},"totalPages":{"type":"integer"},"hasNextPage":{"type":"boolean"}}},"RenderConfig":{"type":"object","additionalProperties":true,"properties":{"render":{"type":"string","format":"uri","description":"The render endpoint for this design."},"data":{"type":"object","additionalProperties":true,"properties":{"pure":{"type":"object","additionalProperties":true},"flatten":{"type":"object","additionalProperties":true}}},"variations":{"type":"array","description":"The sizes this design offers (the base/master plus each variation). Use a size's `id` as the `?variation=` value on the render URL; omit it (or use \"master\") for the base size.","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"name":{"type":"string"},"dimensions":{"type":"object","properties":{"width":{"type":"number"},"height":{"type":"number"}}}}}}}},"QuotaError":{"type":"object","properties":{"success":{"type":"boolean","const":false},"message":{"type":"string"},"data":{"type":"object","properties":{"usage":{"type":"number"},"limit":{"type":"number"},"remaining":{"type":"number"},"resetAt":{"type":"string","format":"date-time"}}}}},"ApiKey":{"type":"object","additionalProperties":true,"properties":{"_id":{"type":"string"},"name":{"type":"string"},"active":{"type":"boolean"}}}}}}