Back to Docs
MCP

Tool Reference

All 60 Vaybel MCP tools — generated from the live tool registry, grouped by workflow domain.

Updated 2026-06-11

60 tools across 14 workflow domains. Generated from the @mcp_tool registry — every signature, credit cost, and scope here matches what the server accepts.


Utility

ping

Return the provided string back to the caller.

Parameters

echostringDefault: "pong"

Any string the caller wants echoed.

Returns

echostring

The string you passed in.


Catalog

catalog.list_blanks

Scopecatalog:readPlanstarter+

List catalog blank products.

Parameters

searchstring

Optional substring matched case-insensitively against title, name, brand, or vaybel_sku. Common shopper terms are normalized (for example "tee" to "t-shirt" and "women's" to "womens"). Preference words such as "premium" and "best-seller" help interpret the search phrase but do not imply true sales or quality data.

techniquestring

Optional technique filter. Accepts: * A specific provider technique string — "dtg", "cut-sew", "sublimation", "direct-to-fabric", "embroidery", "screen-print". * "aop" as a meta-value meaning "any all-over-print technique". Uses is_aop_technique so the set stays in sync with the rest of the platform. Omit to return products of any technique.

categorystring

Optional substring matched against the product's human category title (e.g. "hoodie", "tee", "bag") and its provider type classification (e.g. "T-SHIRT", "CUT-SEW"). Case-insensitive — a match on either column includes the product.

limitintDefault: 20

Max products returned. Clamped to [1, 100].

Returns

resultobject

{"products": [...], "count": <int>} — each product carries uuid, vaybel_sku, handle, name, title, type, brand, default_technique, category, product_tier, and genders. Variants are intentionally omitted (fetched per-product later).


Brand DNA

brand_dna.get

Scopebrand_dna:readPlanstarter+

Return the persisted Brand DNA for the caller's organization. The audiences and niches arrays use the exact shapes set_brand_dna accepts and returns, so a get → edit → set round-trip is lossless.

Returns

has_brand_kitboolean

false when the org hasn't generated a Brand DNA yet. Remaining fields will be empty strings / empty lists (not null) so agents can inspect this flag once.

brand_descriptionstring

AI-generated summary of the brand identity.

user_brand_inputstring

Raw brand description the user originally provided.

colorsstring[]

Hex color codes.

typographystring

Typography guidance.

tonestring

Voice-and-tone descriptor.

product_typesstring[]

Product category names associated with the brand.

logo_urlstring | null

Fully-qualified CDN URL for the uploaded logo, or null if none.

logo_descriptionstring | null

AI description of the logo, or null if no logo.

audiencesobject[]

Target audiences. Each: key, label, age_range ("min-max" string), gender_options, ethnicity_options, description, is_preset, created_at. The key + gender_options are what you pass to virtual_model.generate / virtual_model.list and what drive VTO mockups. Virtual models are auto-generated when an audience is created.

nichesobject[]

Business niches driving trend discovery. Each: name, is_preset. Pass them back through set_brand_dna to keep them — omitting niches there replaces them with [].


brand_dna.set

Scopebrand_dna:writePlanstarter+Rate limit10/min

Fully replace the caller organization's Brand DNA. This write is deterministic for agents: omitted non-logo Brand DNA fields are replaced with empty values. Existing logo fields are preserved unless the optional logo object is supplied.

Parameters

brand_descriptionstringDefault: ""

Reviewed brand identity description.

colorsstring[]

Brand colors as strings or hex codes. Omitted means replace with [].

typographystringDefault: ""

Typography guidance. Omitted means replace with "".

tonestringDefault: ""

Voice-and-tone guidance. Omitted means replace with "".

product_typesstring[]

Product type names, slugs, or display terms. Omitted means replace with [].

nichesstring[]

Business niches as strings, or {name} objects exactly as get_brand_dna returns them. Omitted means replace with [] — pass get_brand_dna().niches through to keep the existing ones.

audiencesobject[]

Target audiences. Accepts exactly what get_brand_dna returns (age_range as a "min-max" string, [min, max], or {min, max}). Preset audiences may be passed as just {"key": ..., "is_preset": true} — see brand_dna.list_audience_presets for the catalog. Matching keys keep their existing rows (and virtual models) instead of recreating them.

user_brand_inputstringDefault: ""

Raw source description. Omitted means replace with "".

categoriesstring[]

Legacy category names, also used to resolve product types when product_types is absent.

logoobject

Optional object with logo_url, logo_s3_key, and/or logo_description to update logo fields.

Returns

brand_descriptionstring

Persisted brand description.

colorsstring[]

Persisted colors.

typographystring

Persisted typography guidance.

tonestring

Persisted tone guidance.

product_typesstring[]

Persisted product type names.

nichesobject[]

Persisted niche rows. Each: name, is_preset.

audiencesobject[]

Persisted audience rows — same shape get_brand_dna returns.

trend_pipeline_requestedboolean

Whether a trend rerun was queued. Fires when the brand description, product types, niches, or audiences changed; runs are debounced per org (~2-minute window), so bursts coalesce into one run.


brand_dna.list_audience_presets

Scopebrand_dna:readPlanstarter+

List the curated audience presets available to every organization. Presets are stable, platform-defined audiences. Reference one in set_brand_dna by passing {"key": <preset key>, "is_preset": true} inside audiences — label, age range, genders, and ethnicities are filled from the preset definition and the row stays flagged as a preset.

Returns

presetsobject[]

Each: key, label, age_range ("min-max" string), gender_options, ethnicity_options, description.


Credits

credits.check

Scopecredits:read

Inspect the caller's credit wallet.

Parameters

requiredintDefault: 0

Optional credit amount to test against the balance. When provided, sufficient reflects whether the org can afford it. 0 just returns the current balance.

Returns

balancenumber

Current credit balance for your organization.

requirednumber

Echo of the required argument.

sufficientboolean

Whether balance >= required. true when required is 0.


credits.list_costs

Scopecredits:readPlanstarter+

Return the canonical credit-cost table so agents can budget before acting.

Returns

costsobject[]

Each: action (machine key), label (human name), credits (int). Worker-billed actions charge on success; see each tool's docstring for when its action applies.


credits.list_usage

Scopecredits:readPlanstarter+

List the org's credit-usage ledger, newest first. The same ledger the dashboard billing page reads — every charge (and refund/adjustment, as negative credits_used) with what triggered it.

Parameters

daysintDefault: 30

Look-back window in days. Clamped to [1, 90].

pageintDefault: 1

1-indexed.

page_sizeintDefault: 50

Clamped to [1, 100].

Returns

resultsobject[]

Each: action, label, credits_used, status, description, tool (MCP tool name when the charge came over MCP, else null), billing_mode, created_at.

totalnumber

Designs

design.generate

Scopedesign:writePlanstarter+Credits10Rate limit10/minIdempotent

Dispatch a design-generation Celery task.

Parameters

product_uuidstringRequired

catalog.Product uuid (e.g. an AOP blank).

promptstringRequired

Free-text design brief passed to the AI Design Generator.

variant_group_uuidstring

Optional catalog.VariantGroup uuid — pin the colorway. Omit to let the pipeline pick a default.

idempotency_keystring

Returns

handlestring

Opaque async handle. Pass to design.get_generation.

status"pending"
messagestring

Describes the design.get_generation(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


design.get_generation

Scopedesign:readPlanstarter+

Return design-generation status and result fields.

Parameters

handlestringRequired

The task id returned from design.generate.

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when the task is complete/failed or the timeout expires.

Returns

handlestring
resource_idstring | null

Same as design_id once known.

status"pending" | "running" | "complete" | "failed"
doneboolean
design_idstring | null

Design UUID. null until the pipeline has produced a design.

progressnumber | null

Fractional progress 0.0-1.0 when known.

stagestring
image_urlstring | null
errorstring

design.list

Scopedesign:readPlanstarter+

Paginated list of designs for the caller's org, newest first.

Parameters

pageintDefault: 1

1-indexed.

page_sizeintDefault: 20

Clamped to [1, 100].

searchstring

Optional case-insensitive substring match against title.

Returns

resultsDesign[]

Each: uuid, title, type, generation_status, generation_stage, generation_progress, generation_error, prompt, catalog_product, catalog_variant_group_uuid, master_design_uuid, referenced_product_design_uuid, trend_match_uuid, created_at.

totalnumber
pagenumber
page_sizenumber

design.get

Scopedesign:readPlanstarter+

Return a single design.

Parameters

design_idstringRequired

ProductDesign.uuid.

Returns

resultobject

See _serialize_design for the shape.


design.get_history

Scopedesign:readPlanstarter+

Return prior revisions / siblings of a design. Walks both the regen chain (via referenced_product_design / next_product_designs) and the colorway family (via master_design / colorways).

Parameters

design_idstringRequired

ProductDesign.uuid.

Returns

resultsDesign[]

Same shape as list_designs.results, ordered by created_at ascending.


Mockups

mockup.generate

Scopemockup:writePlanstarter+Rate limit20/minIdempotent

Dispatch mockup generation for a completed ProductDesign.

Parameters

design_idstringRequired

UUID of the ProductDesign. Must belong to the session org for session-token callers.

kindsstring[]

Which mockups to make — any of "flat" (product-on-white), "detail_closeup", "vto" (virtual try-on). Defaults to ["flat"].

audience_keystring

Required when kinds includes "vto" — the audience whose virtual model wears the design (see brand_dna.get for keys). Call virtual_model.generate first if no model exists.

genderstring

Optional VTO gender ("men" or "women") — useful for unisex products that support both. Must be a gender the audience and product share and that has a CREATED model. Omit to use the first such gender. One gender per call, matching the studio.

qualitystringDefault: "pro"

"standard" (raw Printful) or "pro" (AI-enhanced). Defaults to pro. Applies to flats.

idempotency_keystring

Returns

handlestring | null

Pass to mockup.get_generation. null when every requested mockup already existed (status complete) — their ids are in mockup_ids, so no further call is needed.

status"pending" | "complete"
mockup_idsstring[]

The mockup uuids this call covers (dispatched or already existing).

credit_unitsint

Mockups dispatched. The worker bills 2 credits per successfully rendered mockup; failed renders aren't charged. 0 on a no-op.

messagestring

Describes the mockup.get_generation(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


mockup.get_generation

Scopemockup:readPlanstarter+

Return mockup generation status and the generated assets.

Parameters

handlestringRequired

The task id returned by generate_mockup.

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when the mockups complete/fail or the timeout expires.

Returns

handlestring
status"pending" | "running" | "complete" | "failed"
progressnumber | null

Fractional progress 0.0-1.0 when known.

doneboolean
mockupsobject[]

Each: id, status, external_key, image_url, video_url, error, stage, progress.


mockup.list

Scopemockup:readPlanstarter+

Paginated mockup list, scoped to the caller's org.

Parameters

design_idstring

Optional ProductDesign.uuid to filter to one design.

statusstring

Optional MockupStatus value (PREPARING / QUEUED / GENERATING / CREATED / FAILED).

groupstring

Optional MockupGroup value (e.g. flat_images, vto, lifestyle, shoppable_videos).

pageintDefault: 1

1-indexed.

page_sizeintDefault: 20

Clamped to [1, 100].

Returns

resultsMockup[]
totalnumber
pagenumber
page_sizenumber

mockup.get

Scopemockup:readPlanstarter+

Return a single mockup's full detail.

Parameters

mockup_idstringRequired

mockup.update_selection

Scopemockup:writePlanstarter+Rate limit60/min

Toggle the selected flag — drives which mockups make it onto a listing's image list when listing.create is run.

Parameters

mockup_idstringRequired

Mockup.uuid.

selectedbooleanRequired

True to mark for inclusion, False to deselect.

Returns

resultobject

Updated mockup payload (same shape as get_mockup).


mockup.submit_feedback

Scopemockup:writePlanstarter+Rate limit60/min

Record like/dislike feedback on a mockup. Feedback is consumed by the retry flow — calling retry_mockup with feedback set on the row instructs the generator to course- correct on the next pass.

Parameters

mockup_idstringRequired

Mockup.uuid.

feedbackstringRequired

"like" / "dislike" / null to clear.


mockup.retry

Scopemockup:writePlanstarter+Rate limit20/min

Re-dispatch generation for a CREATED or FAILED mockup. Matches the dashboard's per-mockup retry. The original generation was already billed; retries are free (the worker reuses the same pipeline without a second credit deduction).

Parameters

mockup_idstringRequired

Mockup.uuid.

feedbackstring

Optional free-text feedback merged into the regen conversation history. Omit to reuse any value previously set via submit_mockup_feedback.

Returns

mockup_idstring
handlestring

Pass to mockup.get_generation(handle, wait_sec) to follow the retry.

status"pending"

Virtual Models

virtual_model.list

Scopevirtual_model:readPlanstarter+

List the org's virtual models (the on-model identities behind VTO).

Parameters

audience_keystring

Optional — restrict to one audience (see brand_dna.get for keys).

statusstring

Optional — DRAFT, CREATED (usable for VTO), or FAILED.

pageintDefault: 1

1-based page number.

page_sizeintDefault: 20

Clamped to [1, 100].

Returns

resultsobject[]

Each: id, audience_key, audience_label, gender, ethnicity, age, status, image_url.

totalint

Number of models before pagination.

pageint

Current page.

page_sizeint

Effective page size.


virtual_model.generate

Scopevirtual_model:writePlanstarter+CreditsmeteredRate limit10/minIdempotent

Generate (or top up) virtual models for one audience. Generates one model per gender in the audience that doesn't already have a CREATED one — so this is a safe "fill in what's missing" call. Costs 1 credit per model generated (models auto-created when an audience is first saved are free). When everything already exists it's a no-op (task_id empty, no charge).

Parameters

audience_keystringRequired

Audience to generate for (see brand_dna.get).

idempotency_keystring

Returns

handlestring | null

The task id; pass to virtual_model.get_generation. null when nothing needed generating.

audience_keystring
status"pending" | "complete"
credit_unitsint

Models being generated (= credits charged).

virtual_model_idsstring[]

Already-existing model ids (when complete).

messagestring

Describes the virtual_model.get_generation(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


virtual_model.get_generation

Scopevirtual_model:readPlanstarter+

Return virtual-model generation status and the resulting models.

Parameters

handlestringRequired

The task id returned by virtual_model.generate.

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when generation completes/fails or the timeout expires.

Returns

handlestring
status"pending" | "running" | "complete" | "failed"
progressnumber | null

Fractional progress 0.0-1.0 when known.

doneboolean
virtual_modelsobject[]

The audience's models and their statuses (same shape as virtual_model.list rows).


Listings

listing.create

Scopelisting:writePlanstarter+CreditsmeteredRate limit10/minIdempotent

Dispatch a draft-listing generation task for a ProductDesign.

Parameters

design_idstringRequired

UUID of the completed ProductDesign to list.

channelstringRequired

Sales channel. One of "tiktok_shop", "etsy", "shopify".

genderstring

Optional. Required only when the underlying blank is unisex and you want to override the gender inferred from selected mockups. "mens" or "womens".

idempotency_keystring

Returns

handlestring

Opaque async handle. Pass to listing.get_generation.

status"pending"
channelstring
category"listing"
task_type"create_listing_draft"
messagestring

Describes the listing.get_generation(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


listing.get

Scopelisting:readPlanstarter+

Return a unified listing payload, resolving the channel automatically.

Parameters

listing_idstringRequired

UUID of the parent Listing (the same handle the dashboard uses across TikTok/Etsy/Shopify).

Returns

resultobject

Listing dict with at minimum id, channel, status, content (title/description/images), and channel-native fields (e.g. warehouse, tags).


listing.list

Scopelisting:readPlanstarter+

Paginated cross-channel listing index, scoped to the caller's org.

Parameters

design_idstring

Optional. Filter to listings for one ProductDesign.

channelstring

Optional. One of "tiktok" / "tiktok_shop" / "etsy" / "shopify". Omit to span all channels.

statusstring

Optional. Comma-separated list of statuses ("DRAFT", "ACTIVE", "FAILED", ...). Case-insensitive.

pageintDefault: 1

1-indexed.

page_sizeintDefault: 50

Clamped to [1, 100].

Returns

resultsListing[]
total_countnumber

listing.update

Scopelisting:writePlanstarter+Rate limit20/min

Partial update + push the diff to the listing's channel. Text fields (title / description / tags) are pushed to the marketplace. warehouse_id assigns a TikTok Shop warehouse to the listing locally (required before listing.publish on TikTok) — pick one from listing.list_warehouses. Image and video updates have to go through the channel patch service in a follow-up tool; until that lands, do not accept them here (otherwise local content drifts away from the live listing without anyone knowing).

Parameters

listing_idstringRequired

Parent Listing UUID.

titlestring

New title.

descriptionstring

New description.

tagsstring[]

New tag list. Etsy/Shopify only — passing tags on a TikTok listing is a no-op.

warehouse_idstring

TikTok warehouse id to assign (TikTok Shop listings only; see listing.list_warehouses).

Returns

okboolean
updated_fieldsstring[]

listing.regenerate_field

Scopelisting:writePlanstarter+Rate limit10/min

AI-regenerate one of title, description, or tags. Mirrors the dashboard's per-field regen button. Does not push to the channel — call update_listing after if you want the channel updated.

Parameters

listing_idstringRequired

Parent Listing UUID.

fieldstringRequired

One of "title", "description", "tags".

Returns

fieldstring
valuestring | string[]

listing.publish

Scopelisting:writePlanstarter+Rate limit5/minIdempotent

Dispatch the channel-specific publish task for a draft listing. For TikTok Shop, a warehouse must be assigned on the listing first — today that's done in the dashboard (Listings → the listing → warehouse); publishing without one fails with a clear error. For Etsy/Shopify, the listing must be in DRAFT status.

Parameters

listing_idstringRequired

Parent Listing UUID.

idempotency_keystring

Returns

handlestring

Opaque async handle. Pass to listing.get_generation.

status"pending"
channelstring
task_type"publish_listing_draft"
messagestring

Describes the listing.get_generation(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


listing.delete

Scopelisting:writePlanstarter+Rate limit20/min

Delete a draft listing. Only DRAFT listings (or FAILED listings with no channel-side external id) can be deleted.

Parameters

listing_idstringRequired

Parent Listing UUID.

Returns

okboolean
channelstring

listing.get_generation

Scopelisting:readPlanstarter+

Return listing task status and result fields.

Parameters

handlestringRequired

Task UUID returned from create_listing or publish_listing.

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when the task is complete/failed or the timeout expires.

Returns

handlestring
resource_idstring | null

Same as listing_id once known.

status"pending" | "running" | "complete" | "failed"
doneboolean
task_typestring
progressnumber

Fractional progress 0.0-1.0.

messagestring
listing_idstring | null

Populated once the worker writes the created or published listing.

errorstring

listing.list_warehouses

Scopelisting:readPlanstarter+Rate limit10/min

List the org's TikTok Shop warehouses (needed before publishing there). TikTok Shop requires a warehouse on every listing. Pick a warehouse_id from here and assign it with listing.update(listing_id, warehouse_id=...).

Parameters

refreshbooleanDefault: false

When true, re-sync the warehouse list from the TikTok API first (requires TikTok Shop to be connected). Default reads the locally synced rows.

Returns

warehousesobject[]

Each: warehouse_id, name, region, status, is_default.


Content

content.generate

Scopecontent:writePlangrowth+Rate limit5/minIdempotent

Dispatch a multi-format social-content generation pipeline. The same Short row covers every output format — the difference is what the worker produces (AI video, slideshow MP4, multi-image post, or single still). Each format bills against a different credit action on success (social_video 40 / social_slideshow 12 / social_carousel 4 / social_single 1).

Parameters

listing_idstringRequired

UUID of the parent Listing for a TikTok listing. Non-TikTok listings (Etsy/Shopify) are rejected — the underlying Short.listing FK is to TikTokListing. The resolved buy destination can still be a non-TikTok marketplace.

archetypestringDefault: "graphic_led"

Video archetype. Must be one of the values defined in short.types.VideoArchetype (e.g. "graphic_led", "try_on", "lifestyle", "unboxing", ...). Used by the video / slideshow pipelines; carousel / single ignore it but still validate it.

scene_typestringDefault: "lifestyle"

One of "lifestyle" or "studio". Drives scene staging for video / slideshow; carousel / single ignore it.

formatstringDefault: "video"

One of "video" (default, AI shoppable video), "slideshow" (Ken Burns over stills + music), "carousel" (multi-image post), or "single" (one image).

image_urlsstring[]

Source image CDN URLs. Required (≥1) for carousel/single; single accepts at most one. Allowed (and used as slideshow inputs) for slideshow; allowed but unused for video.

target_sales_channelstring

Optional override for the primary CTA sales channel ("tiktok_shop" / "etsy" / "shopify" / "storefront"). Blank/None defers to runtime resolution at publish time.

idempotency_keystring

Returns

handlestring

The content id — pass to content.get and the social_post.* tools.

status"pending"
listing_idstring
formatstring

Content format the worker will produce.

messagestring

Describes the content.get(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


content.get

Scopecontent:readPlangrowth+

Return content status and generated output fields.

Parameters

handlestringRequired

UUID returned from content.generate.

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when the content is complete/failed or the timeout expires.

Returns

handlestring
resource_idstring

Same as content_id.

status"pending" | "running" | "complete" | "failed"
doneboolean
content_idstring
phasestring

Raw current_phase: planning, generation, assembly, export, complete, failed.

progressnumber

Fractional progress 0.0-1.0.

formatstring

Content format produced by the worker.

requires_video_assemblyboolean

True for video/slideshow (produces an MP4); False for carousel/single (no MP4).

resolved_sales_channelstring

Primary sales channel for CTA copy (e.g. "tiktok_shop", "etsy", "shopify"). Defaults to "tiktok_shop" until resolved at publish time.

video_urlstring | null

Final MP4 URL (video/slideshow only).

image_urlsstring[]

Source images (carousel/single — also returned as publishable_image_refs).

publishable_image_refsstring[]

Image refs that will be pushed to the per-channel publisher for carousel/single posts.

duration_secondsnumber | null
scenes_countnumber
errorstring

content.list

Scopecontent:readPlangrowth+

List content for the caller's org, newest first.

Parameters

listing_idstring

Optional parent Listing.uuid filter.

pageintDefault: 1

1-indexed.

page_sizeintDefault: 20

Clamped to [1, 50].

Returns

resultsContentItem[]

Each: content_id, listing_id, listing_title, status, phase, progress, format, requires_video_assembly, resolved_sales_channel, video_url, image_urls, archetype, scene_type, scenes_count, created_at.

totalnumber

content.delete

Scopecontent:writePlangrowth+Rate limit20/min

Delete a content item. Mirrors the dashboard's delete — there's no constraint on phase, so in-progress content items can be deleted (the Celery task is best-effort — deleting the row mid-pipeline leaves the worker writing into a stale parent that no longer exists; the row's gone either way).

Parameters

content_idstringRequired

UUID from generate_content.

Returns

okboolean

trend.list

Scopetrend:readPlanstarter+

List the org's named trends, strongest first. A named trend is a cluster of related search keywords with a story — "Coastal Grandma Revival", not "linen tshirt". This is the primary trend feed (same data as the dashboard's Find Trend page); the per-keyword metric rows behind each trend live under trend.list_keywords / trend.get_keyword.

Parameters

lifecyclestring

Optional filter — one of "emerging" / "rising" / "peak" / "declining".

trend_typestring

Optional Trend.trend_type filter (e.g. "aesthetic").

pageintDefault: 1

1-indexed.

page_sizeintDefault: 30

Clamped to [1, 100].

Returns

resultsTrend[]

Each: id, name, one_line, lifecycle_stage, trend_type, trend_score, total_search_volume, peak_search_volume, cluster_size, breakout_count, suggested_product_types, seed_group, first_seen_at.

totalnumber
view_countsobject

{all, emerging, rising, peak, declining} for filter UIs.


trend.get

Scopetrend:readPlanstarter+

Return one named trend with its story, momentum, and keyword children.

Parameters

trend_idstringRequired

id from trend.list.

Returns

interest_historynumber[]

Sparkline of aggregate search interest.

first_seen_atstring
keywordsobject[]

Per-keyword children. Each: id, keyword, product_type, search_volume, competition, opportunity. Concept generation is keyword-scoped today — pick a keyword id and call trend.generate_concept(match_id).

has_conceptboolean
launch_conceptobject | null

Trend-level concept when one exists.


trend.list_keywords

Scopetrend:readPlanstarter+

List ranked trends for the caller's org, newest opportunity first.

Parameters

viewstringDefault: "all"

One of "all" / "brand" / "seasonal". Filters by seed_group.

product_typestring

Optional ProductType.search_term filter (e.g. "tshirt", "hoodie").

pageintDefault: 1

1-indexed.

page_sizeintDefault: 20

Clamped to [1, 100].

Returns

resultsTrend[]

Each: id (uuid), trend_name, seed_group, product_type, search_volume, demand, competition, opportunity, why_it_fits, has_concept, is_dismissed, created_at.

totalnumber
view_countsobject

{ all, brand, seasonal } counts for view-switcher UIs.


trend.get_keyword

Scopetrend:readPlanstarter+

Return a single trend with detail fields + any generated concept.

Parameters

match_idstringRequired

TrendMatch.uuid.

Returns

resultobject

Trend detail dict with component_scores, why_it_fits, and a launch_concept list (one entry per audience+gender pairing, each containing the product blueprint). launch_concept is null if generation hasn't been kicked off yet.


trend.generate_concept

Scopetrend:writePlanstarter+CreditsmeteredRate limit10/minIdempotent

Dispatch launch-concept generation for a trend. The concept is an LLM-generated matrix of audience x gender x product type with prompts, written back to TrendMatch.launch_concept. Generation typically completes in 10-60s; call trend.get_generation with wait_sec=0 for a snapshot or wait_sec>0 to long-poll. Bills CONCEPT_CREATED (2 credits) only when a new job is dispatched. Calling on a trend whose concept is already cached returns the cached concept immediately and is free.

Parameters

match_idstringRequired

TrendMatch.uuid.

idempotency_keystring

Returns

handlestring

Opaque async handle. Same as match_id.

status"complete" | "pending"
match_idstring
launch_conceptobject | null

Populated when status == "complete"; null when newly dispatched.

dispatchedboolean

true only when a new generation was kicked off (and a credit charged).

messagestring

Describes the trend.get_generation(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


trend.get_generation

Scopetrend:readPlanstarter+

Return trend detail plus launch-concept generation status.

Parameters

handlestringRequired

TrendMatch.uuid returned from trend.generate_concept.

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when the launch concept is complete/failed or the timeout expires.

Returns

handlestring
resource_idstring

Same as match_id.

status"pending" | "running" | "complete" | "failed"
progressnumber | null

Fractional progress 0.0-1.0.

doneboolean

Trend detail fields, including launch_concept once generated.


trend.submit_feedback

Scopetrend:writePlanstarter+Rate limit60/min

Record feedback on a trend (drives the calibration loop).

Parameters

match_idstringRequired

TrendMatch.uuid.

actionstringRequired

One of "viewed" / "saved" / "dismissed" / "created_concept" / "created_product" / "listed_product".

product_idstring

Optional. The product/listing id associated with the action (used by "created_product" / "listed_product").

revenue_30dnumber

Optional 30-day revenue attribution (USD).

units_sold_30dint

Optional 30-day units-sold attribution.

conversion_ratenumber

Optional CR attribution (0.0-1.0).

Returns

resultobject

{"status": "ok"} on success.


trend.list_seasonal_events

Scopetrend:readPlanstarter+

Return seasonal events currently in their resolved date window. The seasonal calendar is global (not org-scoped); same data the dashboard's /dashboard/trends seasonal sidebar reads.

Returns

eventsSeasonalEvent[]

Each: name, event_date, year, resolved_start, resolved_end, country, pod_relevance, prep_lead_weeks, design_themes, audience_affinity, product_affinity, mood_tags, gift_driven, historical_volume_multiplier, counter_themes.


Insights

insight.get_overview

Scopeinsight:readPlangrowth+

Return chart-free performance KPIs, deltas, channels, and narrative insights.

Parameters

rangestringDefault: "28d"

Time range: 7d or 28d. Defaults to 28d.

channelstringDefault: "all"

all, tiktok, etsy, shopify, or instagram. Defaults to all.

Returns

has_databoolean

false when no meaningful insight snapshots exist for the period.

kpisobject

Orders, GMV, views, and CVR for the selected channel or all channels.

deltasobject

Period-over-period percent changes for orders, GMV, views, and CVR.

per_channelobject[]

Channel breakdown rows with orders, GMV, views, CTR, and CVR.

insightsobject[]

Narrative insight rows with type, severity, and message.


insight.list_design_performance

Scopeinsight:readPlangrowth+

Rank every active design by performance, top to bottom, with paging. Aggregates per-design metrics from the daily analytics snapshots across the range. Covers every design with channel activity (views or orders) in the window — so the bottom of the list is your underperformer/cull signal. Designs with no recorded activity at all are not included.

Parameters

rangestringDefault: "28d"

Time range: 7d or 28d. Defaults to 28d.

sortstringDefault: "gmv"

Sort metric: gmv, orders, or views. Per-design CVR is not available consistently.

pageintDefault: 1

1-based page number.

page_sizeintDefault: 20

Clamped to [1, 100].

Returns

resultsobject[]

Per-design rows including product_design_id, title, views, orders, and GMV.

caveatstring

Notes the "designs with activity" coverage limit.

totalint

Number of designs before pagination.

pageint

Current page.

page_sizeint

Effective page size.


insight.get_guidance

Scopeinsight:readPlangrowth+

Return next-best-action guidance plus stage, revenue, and streak state.

Returns

next_actionobject

{key, title, reason, confidence, requires_credits} or null.

stageobject

Current journey and dashboard stage.

revenueobject

Total revenue in cents and dollars.

streakobject

Weekly publish streak counters.


Optimize Product

optimize.list_providers

Scopeoptimize:readPlangrowth+

Return the POD providers connected to this org that support import.

Returns

providersProvider[]

Each: key ("printify" / "printful"), name, optional shop_id.


optimize.list_provider_products

Scopeoptimize:readPlangrowth+Rate limit30/min

Paginated catalog of importable products from the chosen provider.

Parameters

providerstringRequired

"printify" or "printful".

shop_idstring

Optional. Required for Printify when multiple shops are connected — pick which shop to read from.

pageintDefault: 1

1-indexed.

page_sizeintDefault: 20

Provider-dependent; the underlying service caps it.

Returns

resultsProviderProduct[]

Each: external_id, title, thumbnail_url, variant_count, is_imported, existing_design_uuid, is_supported, is_vaybel_origin.

totalnumber
pagenumber
total_pagesnumber

optimize.check_duplicate

Scopeoptimize:readPlangrowth+

Has this external product already been imported into this org? Cheaper than list_provider_products when the agent only needs the yes/no for one product.

Parameters

providerstringRequired

"printify" or "printful".

external_idstringRequired

The provider-side product id.

Returns

is_importedboolean
existing_design_uuidstring | null

optimize.run

Scopeoptimize:writePlangrowth+Rate limit10/minIdempotent

Dispatch the import + listing-discovery pipeline for one product. The Celery task reads the product from the provider, creates a ProductDesign (plus any colorway variants), discovers the linked sales-channel listing if there is one, and renders the design thumbnail. The MCP wrapper itself doesn't bill — downstream design generation and listing operations handle their own credit accounting.

Parameters

providerstringRequired

"printify" or "printful".

product_idstringRequired

External product id from the provider.

shop_idstring

Optional. Printify-only — picks the shop when multiple are connected.

idempotency_keystring

Returns

handlestring

Opaque async handle. Pass to optimize.get_generation.

status"pending"
category"import"
task_type"import_optimize_product"
messagestring

Describes the optimize.get_generation(..., wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


optimize.refresh_listing

Scopeoptimize:writePlangrowth+Rate limit20/min

Re-check the POD provider for a sales-channel listing linked to a design. Useful when the merchant publishes the product on Etsy/TikTok after starting the Vaybel import — the initial import found no channel listing, but refreshing later discovers it and imports it.

Parameters

design_idstringRequired

ProductDesign.uuid from a previous optimize_product dispatch.

Returns

foundboolean
listing_uuidstring | null
channel"tiktok_shop" | "etsy" | "shopify" | null
messagestring

optimize.get_generation

Scopeoptimize:readPlangrowth+

Return optimize-import status and result fields.

Parameters

handlestringRequired

Task UUID returned from optimize_product.

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when the task is complete/failed or the timeout expires.

Returns

handlestring
resource_idstring | null

Same as product_design_uuid once known.

status"pending" | "running" | "complete" | "failed"
doneboolean
progressnumber

0.0-1.0.

messagestring
product_design_uuidstring | null

Populates around 40% progress.

listing_uuidstring | null

Set only if a sales-channel listing was discovered.

errorstring

Product Video

product_video.generate

Scopeproduct_video:writePlanstarter+Rate limit10/minIdempotent

Dispatch product-video generation for a completed ProductDesign. Product videos render from the design's virtual try-on (VTO) mockups, so those must exist first — generate them with mockup.generate(design_id, kinds=["vto"], audience_key=...) and wait for completion. If they're missing, this fails with a pointer.

Parameters

design_idstringRequired

UUID of the ProductDesign. Must belong to the session org for session-token callers.

channelsstring[]

Which channels to make a listing video for — any of "tiktok_shop" (1:1 square) or "etsy" (1:2 vertical). Defaults to both. One video per channel; the aspect ratio is chosen for you.

idempotency_keystring

Returns

handlestring

Equals design_id — product videos are design-scoped. Pass to product_video.get_generation.

video_idsstring[]

The product-video ids (one per channel).

channelsstring[]

Channels dispatched, aligned with video_ids.

status"pending"
messagestring

Describes the product_video.get_generation(design_id, wait_sec=...) contract. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


product_video.get_generation

Scopeproduct_video:readPlanstarter+

Return a design's product videos and their generation status.

Parameters

handlestringRequired

The handle from product_video.generate (equals the ProductDesign uuid, so a bare design id works too).

wait_secintDefault: 0

0 returns an instant snapshot. Positive values long-poll up to that many seconds and return when every video completes/fails or the timeout expires.

Returns

design_idstring
status"pending" | "running" | "complete" | "failed"
doneboolean
videosobject[]

Each: id, channel, video_type, status, video_url, aspect_ratio, error.


Social Post

social_post.generate

Scopesocial_post:writePlangrowth+Rate limit10/minIdempotent

Generate per-channel captions + hashtags and persist one social post per channel. Resolves the buy destination per social channel (TikTok Shop when live for TikTok, best non-TikTok marketplace otherwise), runs the AI caption generator with the right CTA guardrails, and upserts one social post per channel (status pending).

Parameters

content_idstringRequired

UUID returned from generate_content.

channelsstring[]Required

Subset of ["tiktok", "instagram", "youtube", "x"].

idempotency_keystring

Returns

content_idstring
postsobject[]

Each: id, content_id, channel, text, hashtags, link_url, status (pending after generation), post_url, external_id, error, created_at, updated_at, published_at, created (bool, true on first creation). Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


social_post.list

Scopesocial_post:readPlangrowth+

List the social posts persisted for a content item. Org-scoped (pinned tokens must match the content item's organization).

Parameters

content_idstringRequired

UUID returned from generate_content.

Returns

content_idstring
postsobject[]

One row per persisted channel.


social_post.update

Scopesocial_post:writePlangrowth+

Edit caption / hashtags / link on a social post before publish. Allowed only when the row is in pending or failed (publishing or published rows are immutable).

Parameters

post_idstringRequired

UUID of the social post.

post_textstring

New caption text (omit to leave unchanged).

hashtagsstring[]

New hashtags list (omit to leave unchanged; each entry may include a leading # which is stripped).

link_urlstring

New buy URL. Pass an empty string to clear; omit to leave unchanged.

Returns

objectany

same shape as list_social_posts rows.


social_post.publish

Scopesocial_post:writePlangrowth+Rate limit10/minIdempotent

Publish persisted social posts to the per-channel publishers. For each channel, runs the format-aware guardrail (e.g. YouTube has no carousel surface) and the atomic pending/failedpublishing transition (so concurrent publish calls cannot double-dispatch the same post), then hands the assembled payload to the per-channel publisher.

Parameters

content_idstringRequired

UUID returned from generate_content.

channelsstring[]Required

Subset of ["tiktok", "instagram", "youtube", "x"]. Each channel must have a persisted social post (created via social_post.generate).

tiktok_settingsobject

Optional TikTok post settings (privacy_level, disable_comment, disable_duet, ...). Required fields when present: privacy_level.

idempotency_keystring

Returns

content_idstring
resultsobject[]

One entry per requested channel: channel, status, publish_url, external_id, error. Supports idempotency_key (optional string): send the same key when retrying this exact call — replays return the cached result without re-executing or re-billing.


social_post.get

Scopesocial_post:readPlangrowth+

Return a single social post (status, copy, publish result).

Parameters

post_idstringRequired

id from social_post.generate / social_post.list.

Returns

resultobject

Same row shape as social_post.list: id, content_id, channel, text, hashtags, link_url, status, post_url, external_id, error, created_at, updated_at, published_at.