Generate cover / A+ / concept / mock-up artwork
/ai/generate-artworkRuns the internal two-stage artwork pipeline for a resource: a concept model writes master prompts from the book metadata and cover, then the image model renders the first concept. Direct REST equivalent of the in-app artwork generator.
Synchronous. Both stages block, so this call can take a while (tens
of seconds to minutes) — it is genuinely synchronous, not job-queued.
The rendered image is returned in the {path, url} shape; artwork lives
outside the chat image tree, so its url points at GET /ai/artwork/images
and is fetched with the X-Api-Key header (not a signed URL).
Requires the ai key scope, a linked service user, and edit access to
the resource. asset_type and aspect_ratio are required; all other
artwork options (style, provider, A+ / mock-up settings) are accepted and
forwarded verbatim to the internal generator.
Authorization
apiKey Issued to you when your integration is provisioned. Determines which catalogue resources are visible and which AI tools are available.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/ai/generate-artwork" \ -H "Content-Type: application/json" \ -d '{ "resourceRef": 0, "asset_type": "cover", "aspect_ratio": "us_trade" }'{ "data": { "images": [ { "path": "/chat_images/1024/gpt_307_stream_xxx.png", "url": "https://example.veristage.com/api/external/ai/images?path=%2Fchat_images%2F1024%2Fgpt_307_stream_xxx.png&exp=1777565000&sig=<signature>" } ], "prompt": "string", "historyRef": 0, "batchId": "string", "imageName": "string" }}{ "success": false, "status": "fail", "message": "string", "error": { "message": "API key is required", "code": "NO_API_KEY" }}{ "success": false, "status": "fail", "message": "API key is required", "error": { "code": "NO_API_KEY", "message": "API key is required" }}{ "success": false, "status": "fail", "message": "This API key does not have the 'write' scope", "error": { "code": "INSUFFICIENT_SCOPE", "message": "This API key does not have the 'write' scope" }}{ "success": false, "status": "fail", "message": "string", "error": { "message": "API key is required", "code": "NO_API_KEY" }}{ "success": false, "status": "fail", "message": "string", "error": { "message": "API key is required", "code": "NO_API_KEY" }}Today's trending search topics GET
Returns today's trending Google searches with the news headlines behind them, for a region. Direct REST equivalent of the chat `trending_topics` tool — useful for "what's trending that we could promote against?". Requires the `ai` key scope and a linked service user. A GET under `/ai/` still requires the `ai` scope.
Generate one metadata field's value POST
Generates a single AI-enabled field's value for a resource — the same path as the in-app "regenerate" button (description, keywords, BISAC/ Thema classification, and the other configured AI field types). The generated value is **returned but not saved**. Persist it with `PATCH /resources/{ref}/fields` if you want to keep it. Address the field by `fieldRef` or by `fieldName` (matched against the resource's AI-enabled fields; ambiguous names return `400 AMBIGUOUS_FIELD`). Requires the `ai` key scope, a linked service user, and edit access to the resource. Text fields run to completion synchronously and the finished value comes back in `data.value`; classification fields return the resolved `nodeIds`/`nodeNames` (their names joined into `data.value`).