save_sales_page_draft

Save the sales page draft (never publishes).

PUT/v1/guides/{productId}/sales-page/draft
MCP tool save_sales_page_draftScope: writeStableSince 2026-09-17
Markdown

Full-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

Body parameters

  • draftConfigListingConfigrequired

    The complete ListingConfig object (read get_sales_page first and edit that).

    Show 8 fieldsof ListingConfig
    • heroHeroSectionrequired

      The top of the page, always shown.

      Show 6 fieldsof HeroSection
      • carouselarray of ListingSliderequired

        Up to 12 slides that turn automatically. Publishing needs at least one.

        Show 3 fieldsof ListingSlide
        • mediaIdstring · photo idrequired

          A product- or listing-owned photo of this guide (list_media with marketingOnly true). 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 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.

    • pitchPitchSectionrequired

      What's inside: boxes with a title, text and a photo or icon. Can be switched off.

      Show 5 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 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.

    • reviewsReviewsSectionrequired

      Testimonials. Can be switched off.

      Show 4 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).

      • customarray of CustomReviewoptional

        The creator's testimonials, up to 12, shown when source is custom. Publishing an enabled custom section needs at least one.

        Show 9 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.

    • galleryGallerySectionrequired

      Full-screen photos with captions. Can be switched off; off in a new draft.

      Show 4 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.

      • slidesarray of ListingSliderequired

        Up to 48 slides.

        Show 3 fieldsof ListingSlide
        • mediaIdstring · photo idrequired

          A product- or listing-owned photo of this guide (list_media with marketingOnly true). 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.

    • aboutCreatorAboutCreatorSectionrequired

      The creator's bio, social links and video, with per-page overrides. Can be switched off.

      Show 4 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.

      • socialsOverridearray of SocialLinkoptional

        Social links for this page only; [] shows none. Absent means the profile's social links.

        Show 4 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_socials refuses 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.

      • videoIntroVideooptional

        A video for the section. Absent shows no video.

        Show 6 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.

    • buyFormBuyFormSectionrequired

      The buy section with the checkout, always shown.

      Show 3 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.

    • faqFaqSectionoptional

      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 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 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, buyForm and faq, each at most once. Missing sections follow in that default order; absent means the default.

      pitchreviewsgalleryaboutCreatorbuyFormfaq
  • expectedUpdatedAtnumberoptional

    Optional staleness guard: the listing updatedAt you 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"

Response 200
{
  "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.