API reference.
Connect once, then your assistant calls these endpoints in plain language. Each maps to a tool on the Dough MCP server, scoped to your own account. You never call them by hand, the assistant does.
Connect your assistant to Dough
Two minutes to set up, then build and grow a brand from any chat, using your own login.
- 1
Open Customize → Connectors in Claude.
- 2
Go to Connected, then click Add custom connector.
- 3
Name it "Dough", paste the URL below, and Add.
https://app.dough.do/api/mcp/public - 4
Press Connect and sign in to Dough.
You'll need a Dough account. Available tokens are visible in your account settings,Subscription marks endpoints that need an active subscription, Token marks endpoints that draw from your token balance.
Product creation
Search the catalog or generate draft products, refine one, then turn it into a real product.
generate_productsTokenTurn a description (and optional inspiration image) into 3-4 draft products to choose from. Each draft is labeled "In catalog" (an existing product with no R&D, so faster and cheaper, with a delivery estimate and unit price), "Stock" (a finished marketplace listing sold exactly as shown, ships as photographed, no investment) or "Custom" (a bespoke product requiring R&D, so a longer lead time and higher cost). This returns drafts only, it does not create a product yet. Each draft has a draft_product_id you pass to edit_product or create_product. Synchronous, ~30-60s.
promptstringrequired- Product description, e.g. "an oat milk carton for athletes".
inspiration_imagestringoptional- Optional public image URL to incorporate (the server fetches it). Not base64.
catalog_onlybooleanoptional- When true, return only in-catalog (no-R&D) drafts: faster and cheaper. If nothing in the catalog matches, no drafts are returned. Defaults to false (a mix of in-catalog and custom).
brand_idstringoptional- Design the drafts as siblings of one of your existing brands (its name on the wordmark, its palette as the base). Take the id from get_product (brand.brand_id). Must belong to your account.
catalog_sku_idstringoptional- Pin every draft to this exact in-catalog product: the drafts are label and mockup variations of that SKU, never an alternative product. Implies catalog_only.
target_countnumberoptional- How many drafts to return when catalog_sku_id is set, 1 to 3 (the grid size). Default 3.
edit_productTokenRefine one draft product from a previous generate_products or edit_product result. By default re-generates 3 new drafts that read as edits of the selected one, steered by your instruction; pass mode="single" for one faithful edit instead. Synchronous, ~30-60s.
draft_product_idstringrequired- The id of a draft product returned by generate_products or edit_product.
edit_instructionstringrequired- What to change, e.g. "make the label navy blue".
modeenumoptional- "variations" (default): 3 new drafts. "single": one faithful edit of the selected draft.
create_productTokenTurn a chosen draft product into a real, sellable product. Pass the draft_product_id you picked; the product inherits its prompt, image, and sourcing: an "In catalog, no R&D" draft builds as a catalog product with its SKU locked, a "Stock, ships as shown" draft as a stock product (its design, packaging, materials, specs and variants are fixed; name, copy, price and the offered SKUs are yours), a "Custom" draft as a custom (R&D) product. Every product belongs to a brand: one is created automatically from the prompt, or pass brand_id to add the product to an existing brand (its styling, meaning colors, font and logo, lives on the brand and applies to all of its products). Kicks off branding, website, and sourcing in the background and returns a product id immediately. Poll get_product_status until ready. Sellable by default so buy links work right away. Calling it again with the same draft_product_id returns the existing product instead of building a duplicate.
draft_product_idstringrequired- The id of a draft product returned by generate_products or edit_product.
sales_modeenumoptional- How it sells: 'preorder' (default, Stripe pre-orders), 'order' (immediate ordering), or 'waitlist' (collect emails only, use only if the user explicitly asks).
brand_idstringoptional- Add the product to one of your existing brands instead of creating a new brand from the prompt. Take the id from get_product (brand.brand_id) of a product already in that brand. Must belong to your account.
get_product_statusCheck how a product from create_product is progressing. Returns a status of 'generating', 'ready', or 'failed_or_stalled', plus per-artifact flags (reference image, characteristics, website). ready=true only once both characteristics and website exist, so pricing tools work as soon as it reports ready. On 'failed_or_stalled', build the product again with create_product.
product_idstringrequired- The 8-character product_id returned by create_product, never the product name.
Manage products
Inspect your products, set prices, and run pre-order campaigns.
list_my_productsList all products in your account, most recent first.
No parameters.
get_productFull details of one product: brand info, its SKUs (one per sellable variant, for building a product catalog or a purchase order) and the reference image as an embeddable data: URI (reference_image, use it as the <img> src inside chat canvases). If the inline image cannot be produced, the response instead falls back to a plain reference_image_url.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
archive_productArchive a product you created by mistake or no longer want. Hides it from list_my_products and takes its storefront, buy links, and embed widget offline (any live ad campaign is stopped). A soft action, not a permanent delete: the product and its orders are retained.
product_idstringrequired- The 8-character product_id (from list_my_products) to archive, never the product name.
set_product_priceSet a product's selling price per unit, and optionally absorb shipping so customers see FREE SHIPPING on the storefront. Rejects a price below the minimum viability threshold (production cost per order plus platform fee); the error returns min_viable_price to re-price against. When the product offers sibling variant SKUs, the base price must also clear the offered-set viability floor (the costliest enabled variant), so a below-floor price is rejected with that floor as min_viable_price. Check get_price_breakdown first.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
pricenumberrequired- New selling price in dollars.
free_shippingbooleanoptional- When true, you absorb shipping cost and customers see FREE SHIPPING at checkout. Defaults to false.
free_shipping_min_subtotalnumberoptional- Minimum order subtotal in dollars to unlock free shipping (e.g. 50 for free over $50). Requires free_shipping: true. Omit or 0 for unconditional free shipping.
get_price_breakdownGet the per-order economics at the current selling price: minimum cost per order (and its range), operation fees, absorbed shipping (when free shipping is on), and the resulting potential profit. The same breakdown shown in the pricing UI.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
R&D production
R&D (custom) products only: fund the run with a pre-order launch goal, then manufacture and deliver. Some steps (quotes, questions, sample feedback) are handled over email.
get_launch_goalGet a product's current crowdfunding-style launch goal: target quantity, deadline, and any discount.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
set_launch_goalSet or update a launch goal: the pre-orders to hit by a deadline, with an optional discount. Replaces any active goal.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
target_quantitynumberrequired- Target number of orders to reach.
end_datestringrequired- Deadline as an ISO date (YYYY-MM-DD).
discount_percentnumberoptional- Optional promotional discount, 0-100 (default 0).
show_on_storefrontbooleanoptional- Show (true) or hide (false) the launch-goal progress bar on the storefront and embed widget. Omit to leave the current "Pre-order Progress" setting unchanged.
get_manufacturing_statusWhere a custom (R&D) product sits in the manufacturing flow (a catalog or stock product answers that it needs no manufacturing): the current step and the status of each step (get quote, samples, feedback, finance production, deliver), plus the cost/quote and timeline estimates shown on the Make page, how many pre-orders unlock or fund each step, and any supplier question waiting on you. When a step needs payment (buying samples, funding production), the response points to the right paid tool or the Make page.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
advance_manufacturing_stepMove the current step forward when no payment is due: confirm the quote (once enough pre-orders or waitlist signups are collected, or on a Pro plan, which covers one product in development at a time), submit sample feedback (pass it as message), skip the optional samples step, or confirm the production order once pre-orders have funded it (break-even reached). Refuses anything the Make page would not allow: an out-of-order or already-started step, an unfunded step, or a step that needs payment (use order_sample to buy samples).
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
stepnumberrequired- The step number to advance (1=quote, 2=samples, 3=feedback, 4=finance production).
actionenumoptional- 'confirm' (default) or 'skip' (the optional samples step only).
messagestringoptional- Your sample feedback, required when confirming step 3 (feedback).
Orders & samples
Sample your product and track every sale.
order_sampleOrder a physical sample of your own product to check quality before selling. Returns a Stripe checkout link; Stripe collects the shipping address. Checkout is the supplier cost plus shipping, plus a one-time setup fee charged only on a product's first order (repeat samples of the same product carry none); the response names the fee when one applies. If the product has options, every one needs a value: a partial selection is refused rather than guessed at, since guessing ships the wrong goods.
product_idstringrequired- The 8-character product_id (from list_my_products) to order a sample of, never the product name.
quantitynumberoptional- How many units (1-10, default 1).
product_variantobjectoptional- Required when the product has options, e.g. { selections: { color: "Black", size: "M" } }. A refusal names the options and their values.
list_product_ordersView orders and sales captured by your products' widgets, each with its order_id and the customer contact, shipping, and selected-variant details available to the product owner. Omit product_id to see orders across all products.
product_idstringoptional- Optional: limit to one product. Defaults to all your products.
payment_statusenumoptional- Optional filter: succeeded, pending, refunded, failed, or processing.
limitnumberoptional- Max orders to return (default 100).
get_order_statusPayment and fulfillment status plus owner-visible customer and shipping details for a single order by its order_id. Once shipped it returns tracking_url (a carrier tracking page, safe to link), tracking_number (display text only) and carrier. tracking_url is null when only a number is on file.
order_idstringrequired- The order id returned by order_sample or list_product_orders.
Website
Sell from a chat, embed a buy button, or create a full storefront.
get_buy_linkThe default way to sell. Returns direct "buy now" links, one per variant (e.g. each size), that open the product's secure checkout page immediately. For a custom product that has never been activated for selling, the first call turns selling on so the links work. Always use this when answering in a conversation or building a canvas (e.g. Claude), where embeds do not render: build your own buy button + variant picker from the returned variant_axes and point it at the matching link. When the owner has marked the product sold out, the response carries sold_out: true and the links open the storefront (showing "Sold out") instead of checkout.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
get_website_embedGet an <iframe> embed snippet for the buy widget (buy or capture email inline), plus a live preview URL. ONLY for pasting into a separate website you are building (e.g. Lovable, Webflow); the iframe is blocked inside a chat/canvas, so use get_buy_link there. Works for any product, published or not.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
create_websiteSubscriptionPublish a dedicated <subdomain>.dough.do website for the product. Returns the website URL plus the buy-button code.
product_idstringrequired- The 8-character product_id (from list_my_products) to publish, never the product name.
subdomainstringrequired- Desired subdomain (becomes <subdomain>.dough.do). Lowercase letters, numbers, and hyphens.
get_storefront_design_statusSubscriptionWhich designs this product can serve, which one is live right now, whether a Freestyle design exists, whether a design run is already in progress, the saved version history, and the standing design notes. Call it before any other design endpoint. Freestyle designs are an early-access capability: these endpoints appear only for accounts they are enabled for. design_scope reports whether the design is authored for this PRODUCT or shared across its BRAND (one design serving every product in it); the write endpoints below follow that lineage, so a brand-scoped change applies to every product in the brand.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
read_storefront_designSubscriptionA low-token map of the product's Freestyle storefront: every page (route and title) with the sections it contains. Returns no HTML.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
design_storefrontSubscriptionTokenSend a design instruction to the Freestyle storefront designer. Creates the first Freestyle design when the product has none, and changes the existing one otherwise: copy, layout, styling, sections and whole pages are all in scope. Runs for several minutes and saves a new version. It does not change what shoppers see unless the Freestyle design is already live. One design run per storefront at a time. On a brand-scoped design the change applies to every product in the brand.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
promptstringrequired- The change to make, in plain words. Name the page and section when the request is scoped to one.
image_urlsstring[]optional- Up to 3 public image URLs the designer should see: a style to match, a layout to echo, or a photo to place on the page. The prompt says which is meant; an image is only placed when the prompt asks for it. Public URLs only, never base64.
capture_storefront_screenshotSubscriptionRender the Freestyle storefront and return hosted mobile and desktop PNG URLs, the same capture the design reviewer grades. Returns a reason instead of images when the renderer is unavailable.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
routestringoptional- Route key to capture: "/" for home (default), or a slug from read_storefront_design.
switch_live_storefrontSubscriptionPoint the public storefront at the Standard template or at the Freestyle design. This is what changes the page shoppers see. Switching to the Freestyle design requires one to exist.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
template"standard" | "freestyle"required- "freestyle" is the Freestyle design.
restore_storefront_versionSubscriptionPut a previously saved design version back, by version number from get_storefront_design_status. Saves the old design as a new version rather than deleting anything.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
versionnumberrequired- Version number to restore.
set_storefront_featuresSubscriptionThe owner's Site settings switches for the Freestyle storefront. Send only the switches to change. They shape what the designer may author, and reviews and the email popup are also applied at render, so turning either off changes a live Freestyle page immediately. The result says per switch when shoppers see it: live_now, next_design_run, or saved_design_only. Prefer it over a design run when the user just wants a feature on or off.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
reviewsbooleanoptional- Star rating, review list and a form so buyers can leave one.
emailPopupbooleanoptional- A timed popup offering launch updates or early access.
checkoutAssurancebooleanoptional- Secure checkout, accepted payment methods and delivery timing by the buy button, plus an order-tracking link.
set_design_notesSubscriptionThe owner's standing rules that every future design run follows. Replaces the notes whole: read the current ones from get_storefront_design_status and send the full new text. Empty clears them. Steers future runs only, so follow with design_storefront to apply a rule now. The notes live on the product's brand; a product with no brand reports unavailable.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
notesstringrequired- The complete new notes text, up to 500 characters. Empty clears them.
list_storefront_mediaSubscriptionThe images and videos the designer may place: the owner's uploads plus the system media Dough derives (logo, product shots, generated videos). Each item reports whether it is enabled and whether it can be deleted.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
add_storefront_mediaSubscriptionUpload an image into the storefront media library so the designer may place it. Adding media does not put it on the page: run design_storefront afterwards and say where it goes. Up to 15 owner-uploaded images per storefront.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
image_urlstringrequired- Public image URL (https://...). The server fetches it; never base64.
altstringoptional- Short description of the image, used as the page's alt text.
set_storefront_media_enabledSubscriptionAllow or forbid the designer from using one media item. Disabling is the reversible way to keep an image out of future designs; it does not remove it from a design already saved. Works for system media, which cannot be deleted.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
media_idstringrequired- Item id from list_storefront_media.
enabledbooleanrequired- Whether the designer may use the item.
delete_storefront_mediaSubscriptionPermanently remove one owner-uploaded item from the media library. System media (logo, product shots, generated videos) cannot be deleted; disable it instead. A design already showing the image keeps a broken reference until the next design run.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
media_idstringrequired- Item id from list_storefront_media.
list_storefront_reviewsSubscriptionEvery customer review on this product as its owner sees them, including hidden and unconfirmed ones. Reviews only appear on the storefront when the reviews switch is on.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
set_review_visibilitySubscriptionHide a customer review from the public storefront, or bring a hidden one back. Reversible and non-destructive: the review is never deleted.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
review_idstringrequired- Review id from list_storefront_reviews.
hiddenbooleanrequired- true hides it from shoppers, false shows it again.
Content generation
Access a product's photos and videos, or generate new ones.
list_product_photosList the existing photos for a product. Returns image URLs plus embeddable data: URIs that render inside a chat canvas.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
list_product_videosList the existing videos for a product, each with its type, status, and playable url.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
generate_product_photosTokenGenerate additional on-brand product photos (hero shots, lifestyle scenes, packaging angles) for a product from a text prompt. Each new photo is added to the gallery (never replaces existing shots), and you can keep generating as many as you like until you hit your usage limit. On a stock product only the scene changes: the product is photographed as the supplier ships it. Synchronous and slow (~30-60s): returns the new photos directly as image URLs plus embeddable data: URIs for chat canvases.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
promptstringoptional- What to depict, e.g. 'the bottle on a marble counter in morning light'. Defaults to on-brand hero shots.
countnumberoptional- How many photos to generate (1-4, default 2).
generate_product_videoTokenGenerate a short vertical (9:16) video ad for a product (the engine behind Dough's in-app video ads). Kicks off background generation and returns a video_id; poll list_product_videos (or get_product) until that video's status is ready, then read its url.
product_idstringrequired- The 8-character product_id from list_my_products, never the product or brand name.
promptstringoptional- Creative direction, e.g. 'fast-paced unboxing with upbeat music'. Defaults to an auto-generated concept from the product.
Account & billing
Check your subscription and token balance, subscribe, or top up.
get_subscriptionCheck the account subscription: status, tier, and renewal date. Subscription-only endpoints (marked below) work while this is active.
No parameters.
subscribeStart a Dough subscription. Returns a Stripe checkout link to complete payment in a browser. If you already have an active subscription, it returns your current plan instead and points to account settings on app.dough.do to change it.
tierenumoptional- 'standard' (default) or 'pro'.
billing_cycleenumoptional- 'monthly' (default) or 'yearly'.
get_token_balanceCheck the plan allowance (used, remaining, reset date) and the purchased token balance, which rolls over until used. A subscriber's allowance runs on their billing cycle and resets on their billing date; a free account's runs on the calendar month. Reported in tokens, the same unit the app shows. Product and content generation draw from these.
No parameters.
buy_tokensBuy tokens when the monthly or daily allowance runs low. Requires an active subscription: tokens top up a plan allowance, so without a subscription use subscribe instead. Tokens are spendable right away, even past those limits, and roll over month to month until used. Returns a Stripe checkout link to complete payment in a browser.
amount_usdnumberrequired- Dollar amount to spend. The response says how many tokens that grants.
Feedback
Send a bug report or product idea to the Dough team.
submit_feedbackSend a bug report or feature idea to the Dough team.
messagestringrequired- The feedback or bug report.
typeenumoptional- 'bug', 'idea', or 'other' (default 'other').
product_idstringoptional- Optional product this feedback is about.
Dough Operator
Read what the Operator proposes for a brand, approve or decline its tasks, cancel approved work, and pause or resume it. The same decisions as the Grow panel and the digest email.
get_operator_statusThe Operator's state for a brand: enrolled, phase (daily, weekly, stopped), day_number, paused and paused_until, next_digest_at, the proposals awaiting a decision (task_id, kind, category, title, description, estimated_credits, image_url), in_progress (approved tasks not finished yet, same shape plus status, expected_finish_at, an estimate of when the run should be done, and cancel_requested_at once a stop was asked for) and recent_work from the last 14 days (task_id, title, status, summary, links, actual_credits, finished_at, and brief for a market research task). A brand that is not enrolled answers { enrolled: false, message }, which is a normal result rather than an error. Enrollment happens with the first paid subscription.
brand_idstringoptional- Optional when exactly one of your brands is enrolled (that brand is used); required otherwise, and the error then lists the enrolled brands.
approve_operator_taskTokenApprove one proposed task. Approval is per task and charges its estimated_credits to the allowance; the Operator runs it unattended within a few minutes and reports in the next digest. Returns the task card (task_id, status approved, estimated_credits, approved_at, ...) plus a message. Over the allowance the task stays proposed and the error carries guidance (buy_tokens or wait); a task that is no longer proposed answers an error naming its current status.
brand_idstringrequired- The brand the task belongs to, from get_operator_status or get_product.
task_idstringrequired- A task_id from the proposals in get_operator_status.
decline_operator_taskDecline one proposed task. Nothing is charged, and the same kind of task may be proposed again later. Returns the task card with status declined.
brand_idstringrequired- The brand the task belongs to.
task_idstringrequired- A task_id from the proposals in get_operator_status.
reasonstringoptional- Why the owner turned it down, in their words (up to 300 characters). The planner reads it so the next proposals avoid that angle.
cancel_operator_taskStop an approved task listed in in_progress. Queued work (not started) is cancelled outright and nothing is charged; running work stops at its next step and settles as status cancelled with a receipt of what was already done, and the tokens spent so far stay spent. Work that already landed is not undone. Proposals are declined, not cancelled; finished tasks answer an error naming their status.
brand_idstringrequired- The brand the task belongs to.
task_idstringrequired- A task_id from in_progress in get_operator_status.
pause_operatorPause the Operator for a brand: no new proposals, no execution of approved tasks and no digest emails until it resumes. Pending proposals are kept. Returns { brand_id, paused: true, paused_until, message }. Pausing an already paused Operator replaces the earlier pause.
brand_idstringrequired- The brand to pause.
daysnumberoptional- Resume automatically after this many days (1 to 30). Omit to pause until resume_operator is called.
resume_operatorResume a paused Operator. Proposals, execution and digests pick up at the next tick. No effect on an Operator that is not paused. Returns { brand_id, paused: false, message }.
brand_idstringrequired- The brand to resume.