Duplicate an offer
Copies an offer's composition (subject, intro, template, and its works) into a new draft, and returns the audience to carry forward: `template_only` (none), `recipients` (the full original audience), or `non_openers` (only those delivered who never opened). The copy is not sent — pair this with `POST …/send` using the returned `audience` to actually re-send.
Copies an offer's composition (subject, intro, template, and its works) into a new draft, and returns the audience to carry forward: template_only (none), recipients (the full original audience), or non_openers (only those delivered who never opened). The copy is not sent — pair this with POST …/send using the returned audience to actually re-send.
Authorization
bearerAuth offers:createA gallery API key, sent as Authorization: Bearer gpk_… (or the x-api-key header).
In: header
Scope: offers:create
Path Parameters
Header Parameters
Optional. Send a unique key per logical operation to make retries safe: a retry with the same key replays the stored success for 14 days instead of re-running the write. Reusing a key with a different body returns 400.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Duplicate an offer into a new draft (choose which audience carries over).
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
{ "offer": { "id": "string", "title": "string", "subject": "string", "intro": "string", "template_id": "string", "status": "draft", "track_engagement": true, "scheduled_at": "string", "sent_at": "string", "cc_emails": [ "string" ], "bcc_emails": [ "string" ], "created_by": "string", "metadata": { "property1": "string", "property2": "string" }, "created_at": "string", "updated_at": "string", "items": [ { "offer_id": "string", "artwork_id": "string", "position": -9007199254740991, "caption_override": "string", "price_shown_cents": -9007199254740991, "currency": "string", "price_visible": true, "created_at": "string" } ], "recipients": [ { "id": "string", "offer_id": "string", "contact_id": "string", "email": "string", "expires_at": "string", "delivery_status": "pending", "sent_at": "string", "first_opened_at": "string", "last_activity_at": "string", "open_count": -9007199254740991, "click_count": -9007199254740991, "created_at": "string" } ] }, "audience": { "contact_ids": [ "string" ], "emails": [ "string" ] }}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}{ "type": "../dictionary", "title": "string", "status": 0, "detail": "string", "code": "string", "retry": "permanent", "details": null}Delete an offer DELETE
Deletes an offer and its items/recipients (cascade).
Get an offer's engagement GET
The offer's engagement rollup: delivery/open/click totals across recipients, plus a per-artwork view/click/dwell breakdown (most-engaged work first) folded from the tracking event log. Answers 'which works is this offer landing on'.