Post a draft now
- Credentials
- OAuth access token
- Scopes
marketing:write- Subscription
- Needs an active plan. Otherwise
403 subscription_locked. - Idempotency
- Send an
Idempotency-Keyheader. A retry with the same key does the work once.
Publishes a draft (or retries a failed one) to the shop's Facebook Page and/or Instagram right now, publicly, in the shop's name. A channel that already went out is never posted twice, and a post that already went out is returned as it is. Needs a connected Facebook Page. Owner or admin.
Access: OAuth scope marketing:write; write-gated by the subscription.
merchantOAuth marketing:writeAuthorizationBearer <token>OAuth 2.1 (authorization code + PKCE S256, public clients, dynamic registration) for connected AI apps. Effective power is scopes granted AND the person's role today AND the plan. orders:refund, billing:write and team:write are opt-in on the consent screen. Write implies read for marketing:read and messages:read, so a grant holding marketing:write passes a marketing:read check, and messages:send passes messages:read.
Scope: marketing:write
storeId*stringA store the person can reach. Any other id answers 404, never 403.
postId*stringIdempotency-Key*stringRequired on every write. Minted on the device when the person taps, reused on every retry. A write without one, or with one that does not match the pattern, is refused with 422 validation_error. Scoped to the token's subject, remembered 24 hours. A replay returns the first 2xx response with Idempotent-Replay: true; a request still running answers 409 in_flight; the same key with a different method, path or body answers 409 idempotency_key_reused; non-2xx results are not remembered. If the key store cannot be read nothing is processed and the answer is 503 idempotency_unavailable: retry with the same key.
^[A-Za-z0-9_-]{8,128}$OK
application/json- response
data*curl -X POST 'https://api.shopeazy.co/v1/merchant/stores/<storeId>/social/posts/<postId>/publish' \ -H 'Authorization: Bearer <access_token>' \ -H 'Idempotency-Key: <unique_key>'{ "data": { "id": "string", "status": "draft", "channels": [ "facebook" ], "message": { "facebook": "string", "instagram": "string" }, "imageUrls": [ "string" ], "videoUrl": "string", "linkUrl": "string", "scheduledAt": 0, "publishedAt": 0, "results": { "property1": { "status": "pending", "error": "string", "permalink": "string" }, "property2": { "status": "pending", "error": "string", "permalink": "string" } }, "createdAt": 0 }}Make a social draft from a Library photo or video POST
Saves a draft post (`source: manual`) with the picture or video and the caption, for Facebook and Instagram; a video goes out as a Reel and a Facebook video. Nothing is posted: approve it with `publishSocialPost` or `scheduleSocialPost`. A sound is 422 `validation_error` ("Promote takes photos and videos, not sounds."). Linked to the listing the asset was made for, when it has one. Unlike the other social writes it does not need a connected Page to be saved. The `Idempotency-Key` keeps a retry from saving two drafts. Access: OAuth scope `marketing:write`; write-gated by the subscription.
Who an email would reach GET
How many customers each audience would reach by email (only those who said yes to marketing), what one campaign to it costs in credits (1 per 10 people), the credits left and the recent campaigns. With `audience`, also how many of that audience have not opted in. Plan: Marketing Plus (included with Growth and Scale), else 403 `plan_limit`. Access: OAuth scope `messages:send`; not write-gated. Comes with Growth.