- Renders are queued.
images.create,pdfs.create,videos.createandpdfs.mergereply withstatus: 'queued'almost every time. Poll the matchinggetwith the reply’sid(for exampleimages.get({ id })), or passwebhook_successand let Placid call you. The file URL is null untilstatusisfinished. - Failures are reported after the fact. A render that fails still returns a 200 from the create call. Read the
status: 'error'reply forerror_code,error_messageanderror_details. Branch onerror_code, which does not change;error_messagecan be reworded. - Deleting a generated file keeps its record.
images.delete,pdfs.deleteandvideos.deleteanswer 204 and rewrite the URL field to the bare directory prefix, dropping the filename but keeping scheme and host. A latergetstill returns 200 rather than a 404. The field isimage_urlfor images,pdf_urlfor PDFs andvideo_urlfor videos. Do not poll for a 404 to confirm a delete. collectionsreturnstemplates. Placid’s docs name the member listtemplate_uuids, but the API answerstemplates, a plain array of UUID strings. Both are read, so either spelling works.- Credits. One image is one credit, one PDF page is two, and a video is ten credits per ten seconds.
create_now: truerenders immediately instead of queueing, and Placid allows 10 simultaneous calls that way. - Rate limit. 60 requests per minute. A 429 is retried up to three times with backoff. A 5xx is only retried on reads, because repeating a create would render and bill a second file.
- Layers.
layersis keyed by the layer name set in the template editor, and every property a layer type supports is accepted. Omitted properties keep the template default.templates.listandtemplates.getreturn each dynamic layer’s name and type, which is how to discover the keys. - Uploads take URLs.
media.uploadandfonts.createaccept a publicfile_url; the plugin downloads it and forwards the bytes as multipart. The bytes cannot come from a local path. - Fonts. A font upload requires
terms_accepted: true. The returneduuidis the value to set as thefontproperty on a text layer. - Uploads are checked.
media.uploadandfonts.createfetch a public HTTP(S)file_url. Private, loopback and cloud-metadata addresses are rejected, the connection is pinned to a checked address so a changing DNS answer cannot swap in a private one, each redirect hop is checked, and the download has a 30 second deadline and a 25 MB cap. - Webhooks. The plugin does not receive webhooks. Placid calls the
webhook_successURL you supply on a create.
- 26 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
List templates by tagWhat’s next
API reference
Every
placid.api.* operation with input and output types.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.