save_sales_page_draft
Save the sales page draft (never publishes).
/v1/guides/{productId}/sales-page/draftFull-replacement draftConfig with the fixed sections: hero (carousel of listing/product media ids, title, 2-6 bullets), pitch boxes, reviews (custom testimonials only with the creator's real quotes), gallery, aboutCreator, buyForm, faq. Media ids must be product- or listing-owned. Copy must never promise updates. The creator publishes the sales page in the dashboard; publish_changes does not touch it.
curl -X PUT "https://sceniq.earth/api/v1/guides/j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2/sales-page/draft" \
-H "Authorization: Bearer $SCENIQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"draftConfig": {
"hero": {
"carousel": [
{
"mediaId": "kg7q8w6e4r2t0y8v6j4p2p0a8s6d4f2g",
"order": 1024
},
{
"mediaId": "kg7t5y7v9j1p3p5a7s9d1f3g5h7j9k1k",
"caption": "Tunnel View, Yosemite, at first light",
"order": 2048
},
{
"mediaId": "kg7b4n6m8q0w2e4r6t8y0v2j4p6p8a0s",
"order": 3072
}
],
"title": "American West: Parks at First Light",
"headline": "Twelve viewpoints across Yellowstone and Yosemite, timed for the light and the crowds.",
"kicker": "A map guide by Mara Lindgren",
"bullets": [
{
"text": "Twelve viewpoints in Yellowstone and Yosemite, each with an exact pin",
"order": 1
},
{
"text": "The best hour for every view, and when the crowds arrive",
"order": 2
},
{
"text": "Trailheads, parking and the time each lot fills",
"order": 3
},
{
"text": "Fees, opening hours and closures checked in September 2026",
"order": 4
}
]
},
"pitch": {
"enabled": true,
"title": "Built for the hour you are there",
"description": "Every spot says when to arrive, where to park and how long the walk takes, so the good light finds you at the viewpoint, not in the parking lot.",
"imageAspect": "4:5",
"boxes": [
{
"mediaId": "kg7b4n6m8q0w2e4r6t8y0v2j4p6p8a0s",
"title": "One map for both parks",
"description": "Pins for every viewpoint, trailhead and lot, in the Sceniq app and in your browser.",
"order": 1
},
{
"mediaId": "kg7q8w6e4r2t0y8v6j4p2p0a8s6d4f2g",
"title": "Timed for the light",
"description": "Grand Prismatic mid morning once the steam lifts, Tunnel View at first light.",
"order": 2
},
{
"title": "Parking that works",
"description": "Which lot to use, when it fills, and where to go when it does.",
"order": 3
}
]
},
"reviews": {
"enabled": true,
"source": "product",
"heading": "What buyers say"
},
"gallery": {
"enabled": false,
"slides": []
},
"aboutCreator": {
"enabled": true
},
"buyForm": {
"ctaLabel": "Get the guide",
"reassuranceText": "One payment. Open it in the Sceniq app or in your browser.",
"imageMediaId": "kg7t5y7v9j1p3p5a7s9d1f3g5h7j9k1k"
},
"faq": {
"enabled": true,
"title": "Common questions",
"items": [
{
"question": "Do I need a car?",
"answer": "Yes. Every spot lists where to park, how early the lot fills and how long the walk is from there.",
"order": 1
},
{
"question": "Does the guide work without signal?",
"answer": "Download it in the Sceniq app before you go. The map, the spots and the photos then open without signal, which most of these viewpoints do not have.",
"order": 2
},
{
"question": "When should I go?",
"answer": "Late May to September for both parks. Each spot lists its best months and the hour it looks its best.",
"order": 3
}
]
}
},
"expectedUpdatedAt": 1790241240000
}'Path parameters
- productIdstring · guide idrequired
Id of the guide (a product of type map). From
list_guidesorcreate_guide.
Body parameters
The complete ListingConfig object (read
get_sales_pagefirst and edit that).Show 8 fieldsHide fieldsof ListingConfig
The top of the page, always shown.
Show 6 fieldsHide fieldsof HeroSection
Up to 12 slides that turn automatically. Publishing needs at least one.
Show 3 fieldsHide fieldsof ListingSlide
- mediaIdstring · photo idrequired
A product- or listing-owned photo of this guide (
list_mediawithmarketingOnlytrue). Spot and chapter photos are refused. - captionstringoptional
The caption for this slide. Absent means the photo's own caption.
- ordernumberrequired
Sort key, ascending; fractional values are fine.
- titlestringrequired
The page title, usually the guide's name. Publishing needs one.
- headlinestringoptional
One line under the title, at most 200 characters. Absent or empty falls back to the guide's headline (
update_guide). - kickerstringoptional
An eyebrow above the title.
- bulletsarray of objectsrequired
The selling points: at most 6 on save, 2 to 6 and none empty to publish.
Show 2 fieldsHide fields
- textstringrequired
One selling point.
- ordernumberrequired
Sort key, ascending; fractional values are fine.
- collectionMediaIdstring · photo idoptional
An optional collage image, a product- or listing-owned photo of this guide, shown on the buy card beside the page on wide screens.
What's inside: boxes with a title, text and a photo or icon. Can be switched off.
Show 5 fieldsHide fieldsof PitchSection
- enabledbooleanrequired
false hides the section. Publishing an enabled section needs at least one box, each with a title.
- titlestringoptional
The section heading. Absent or empty shows What's inside.
- descriptionstringoptional
A line under the heading.
- imageAspectstringoptional
The crop of every box photo: 3:2, 1:1 or 4:5 (the default).
3:21:14:5 - boxesarray of objectsrequired
Up to 24 boxes.
Show 5 fieldsHide fields
- mediaIdstring · photo idoptional
An optional photo on top of the box, a product- or listing-owned photo of this guide.
- emojistringoptional
An emoji the creator chose for the box's icon tile, shown when the box has no photo (beside the title when it has one). Agents leave it empty (no emoji in any field); without one the page picks an icon from the title.
- titlestringrequired
The box title. Publishing needs one on every box.
- descriptionstringoptional
The box text.
- ordernumberrequired
Sort key, ascending; fractional values are fine.
Testimonials. Can be switched off.
Show 4 fieldsHide fieldsof ReviewsSection
- enabledbooleanrequired
false hides the section and the star rating under the hero title.
- sourcestringrequired
Where the testimonials come from: custom (the creator's own quotes in custom), platform (testimonials Sceniq curates) or product (labelled Buyer Reviews; the page currently shows the curated platform testimonials for it too).
productplatformcustom - headingstringoptional
The section heading. Absent or empty shows the source's default: What people say (custom), Platform Reviews (platform) or Buyer Reviews (product).
The creator's testimonials, up to 12, shown when source is custom. Publishing an enabled custom section needs at least one.
Show 9 fieldsHide fieldsof CustomReview
- namestringrequired
The reviewer's name. Publishing needs one.
- quotestringrequired
The quote, word for word. Publishing needs one; quotes over 140 characters collapse behind Read more.
- ratingnumberoptional
Stars as a whole number from 1 to 5; stars show only when it is set. Never invent one.
- verifiedbooleanoptional
Ignored: every save removes it, so testimonials the creator enters never show a verified badge.
- platformstringoptional
instagram, tiktok or youtube. With a handle, the handle links to the profile.
instagramtiktokyoutube - handlestringoptional
The reviewer's handle, shown with a leading @.
- followerCountnumberoptional
The reviewer's followers as a whole number from 0, shown next to the handle (12K).
- avatarMediaIdstring · photo idoptional
The reviewer's photo, a product- or listing-owned photo of this guide.
- ordernumberrequired
Sort key, ascending; fractional values are fine.
Full-screen photos with captions. Can be switched off; off in a new draft.
Show 4 fieldsHide fieldsof GallerySection
- enabledbooleanrequired
false hides the section. Publishing an enabled gallery needs at least one slide.
- titlestringoptional
The section heading. Absent or empty shows From the field.
- descriptionstringoptional
A line under the heading.
Up to 48 slides.
Show 3 fieldsHide fieldsof ListingSlide
- mediaIdstring · photo idrequired
A product- or listing-owned photo of this guide (
list_mediawithmarketingOnlytrue). Spot and chapter photos are refused. - captionstringoptional
The caption for this slide. Absent means the photo's own caption.
- ordernumberrequired
Sort key, ascending; fractional values are fine.
The creator's bio, social links and video, with per-page overrides. Can be switched off.
Show 4 fieldsHide fieldsof AboutCreatorSection
- enabledbooleanrequired
false hides the section. Publishing an enabled section needs a bio, social links or a video.
- descriptionOverridestringoptional
The about text for this page only. Absent means the creator's profile bio.
Social links for this page only; [] shows none. Absent means the profile's social links.
Show 4 fieldsHide fieldsof SocialLink
- platformstringrequired
instagram, tiktok or youtube.
instagramtiktokyoutube - handlestringrequired
The account name (@name). Required on the profile; the link pill shows it when there is no follower count.
- urlstringrequired
The profile page (https;
set_profile_socialsrefuses other links). An empty url on a sales page falls back to the link built from platform and handle. - followerCountnumberoptional
Followers as the creator states them, a whole number from 0, shown on the pill (12K) instead of the handle.
A video for the section. Absent shows no video.
Show 6 fieldsHide fieldsof IntroVideo
- providerstringrequired
youtube, vimeo or upload (a video file stored on Sceniq).
youtubevimeoupload - youtubeIdstringoptional
For youtube: the video id (the v= value of a watch link), never a URL or an embed code.
- vimeoIdstringoptional
For vimeo: the numeric id from the video's link. The player loads only after a click.
- storageIdstring · stored file idoptional
For upload: the stored video file. The API cannot upload videos; keep the value you read.
- fileUrlstringoptional
For upload: a direct link to the video file, used when there is no
storageId. - captionstringoptional
A line under the video.
The buy section with the checkout, always shown.
Show 3 fieldsHide fieldsof BuyFormSection
- ctaLabelstringoptional
The label of every buy button on the page, at most 60 characters. Absent or empty falls back to the guide's
purchaseButtonText, then Get the guide. - reassuranceTextstringoptional
A short line over the bottom of the checkout photo, or above the checkout without one.
- imageMediaIdstring · photo idoptional
A photo above the checkout in a 3:2 crop, a product- or listing-owned photo of this guide.
Questions and answers below the buy form. Can be switched off; off in a new draft. Absent on drafts saved before the section existed.
Show 3 fieldsHide fieldsof FaqSection
- enabledbooleanrequired
false hides the section. Publishing an enabled FAQ needs at least one item, each with a question and an answer.
- titlestringoptional
The section heading. Absent or empty shows Common questions.
- itemsarray of objectsrequired
Up to 12 items.
Show 3 fieldsHide fields
- questionstringrequired
The question.
- answerstringrequired
The answer.
- ordernumberrequired
Sort key, ascending; fractional values are fine.
- sectionOrderarray of stringsoptional
The page order of the sections below the hero: pitch, reviews, gallery,
aboutCreator,buyFormand faq, each at most once. Missing sections follow in that default order; absent means the default.pitchreviewsgalleryaboutCreatorbuyFormfaq
- expectedUpdatedAtnumberoptional
Optional staleness guard: the listing
updatedAtyou last read.
Returns
200 OK with this object.
- okbooleanrequired
Always true: the write went through.
Always
true - productIdstring · guide idrequired
The guide's id.
- savedstringrequired
Always draft: the creator publishes the sales page.
Always
"draft"
{
"ok": true,
"productId": "j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2",
"saved": "draft"
}Errors
Every error is { error: { code, message } }. Act on the code.
- 400invalid_argumentA required field is missing, a field is unknown, or a value does not match its type (the Convex validator's path and value are in the message).
- 400invalid_requestA writer refused a value: a map link on a host that is not allowed, a title that is too long, a date that does not exist, too many items in a list. The message is the writer's own sentence.
- 409stale_editorThe row changed after the expectedUpdatedAt you sent (update_chapter, save_sales_page_draft).
- 401unauthenticatedThe request carries no key. Send it as Authorization: Bearer sk_sceniq_... (or X-Api-Key).
- 401invalid_api_keyThe key is unknown, revoked or expired.
- 403api_scope_requiredA read-only key called a write operation, or a key without the publish option called publish_changes.
- 403forbiddenThe key belongs to a creator account that is no longer active.
- 404not_foundThe id does not exist or belongs to another creator. The two answers are identical on purpose, so ids never reveal what exists.
- 413payload_too_largeA JSON body over 2 MB, an image over 6 MB, a batch upload over 19 MB, or an MCP message over 2 MB.
- 429rate_limitedOver a limit: requests per key per minute, per creator per hour, uploads per key per minute, or check_links per guide per hour.
- 500internal_errorAn unexpected failure. The message is hidden on purpose.