Back to Docs
MCP

Tool Reference

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

Updated 2026-06-04

53 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:read

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_brand_dna

Scopebrand_dna:read

Return the persisted Brand DNA for the caller's organization.

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, gender_options, ethnicity_options, age_range ({min, max}). 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.


brand_dna.set_brand_dna

Scopebrand_dna:write

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. Omitted means replace with [].

audiencesobject[]

Target audiences. Generated Brand DNA audience suggestions are accepted.

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.

audiencesobject[]

Persisted audience rows.

trend_pipeline_requestedboolean

Whether a trend rerun was queued after the description changed.


Credits

credits.check_credits

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.


Designs

design.generate_design

Scopedesign:writeCreditsmeteredRate 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.

Returns

handlestring

Opaque async handle. Pass to design.get.

status"pending"
messagestring

Describes the design.get(..., wait_sec=...) contract.


design.get

Scopedesign:read

Return design-generation status and result fields.

Parameters

handlestringRequired

The task id returned from design.generate_design.

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_designs

Scopedesign:read

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_design

Scopedesign:read

Return a single design.

Parameters

design_idstringRequired

ProductDesign.uuid.

Returns

resultobject

See _serialize_design for the shape.


design.get_design_history

Scopedesign:read

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_mockup

Scopemockup:writeCreditsmeteredRate 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_brand_dna 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.

Returns

handlestring | null

Pass to mockup.get. null when every requested mockup already existed (status complete) — read those with mockup.list_mockups(design_id).

status"pending" | "complete"
credit_unitsint

Mockups dispatched (= credits charged); 0 on a no-op.

messagestring

Describes the mockup.get(..., wait_sec=...) contract.


mockup.get

Scopemockup:read

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_mockups

Scopemockup:read

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_mockup

Scopemockup:read

Return a single mockup's full detail.

Parameters

mockup_idstringRequired

mockup.update_mockup_selection

Scopemockup:writeRate limit60/min

Toggle the selected flag — drives which mockups make it onto a listing's image list when listing.create_listing 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_mockup_feedback

Scopemockup:writeRate 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_mockup

Scopemockup:writeRate 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
celery_task_idstring
statusstring

Always "PREPARING" immediately after dispatch.


Product Video

The short marketplace showcase clip attached to a listing — its own domain, not a mockup. Rendered from the design's virtual try-on (VTO) front/back mockups, so generate those first. The agent picks a channel; the aspect ratio is chosen for it (TikTok Shop → 1:1, Etsy → 1:2). Distinct from social content.* videos.

product_video.generate

Scopeproduct_video:writeCreditsmeteredRate limit10/min

Dispatch product-video generation for a design. Requires the design's VTO mockups to be ready (mockup.generate_mockup(design_id, kinds=["vto"], audience_key=...) first). Costs 20 credits per video, billed by the worker on successful render (failed renders aren't charged); a balance preflight rejects underfunded batches up front. Idempotent — channels already rendered are skipped (not re-dispatched or re-charged).

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.

Returns

video_idsstring[]

The product-video ids for the requested channels.

channelsstring[]

Channels dispatched, aligned with the request.

status"pending" | "complete"

complete (with no dispatch) when every requested channel already exists.

messagestring

Describes the product_video.get(design_id, wait_sec=...) contract.


product_video.get

Scopeproduct_video:read

Return a design's product videos and their generation status. Keyed by design_id (videos are design-scoped, one per channel).

Parameters

design_idstringRequired

UUID of the ProductDesign whose videos to read.

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.


Virtual Models

virtual_model.list

Scopevirtual_model:read

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

Parameters

audience_keystring

Optional — restrict to one audience (see brand_dna.get_brand_dna 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: uuid, 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:writeCreditsmeteredRate limit10/min

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_brand_dna).

Returns

handlestring | null

The task id; pass to virtual_model.get. 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(..., wait_sec=...) contract.


virtual_model.get

Scopevirtual_model:read

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_listing

Scopelisting:writeCreditsmeteredRate 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".

Returns

handlestring

Opaque async handle. Pass to listing.get.

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

Describes the listing.get(..., wait_sec=...) contract.


listing.get_listing

Scopelisting:read

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 uuid, channel, status, content (title/description/images), and channel-native fields (e.g. warehouse, tags).


listing.list_listings

Scopelisting:read

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_listing

Scopelisting:writeRate limit20/min

Partial update + push the diff to the listing's channel. Only text fields (title / description / tags) are supported today — those are what the provider push actually mirrors to the marketplace. 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.

Returns

okboolean
updated_fieldsstring[]

listing.regenerate_listing_field

Scopelisting:writeRate 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_listing

Scopelisting:writeRate limit5/minIdempotent

Dispatch the channel-specific publish task for a draft listing. For TikTok Shop, warehouse must be assigned on the listing first (set via update_listing with warehouse_id once that field is plumbed, or in the dashboard). For Etsy/Shopify, the listing must be in DRAFT status.

Parameters

listing_idstringRequired

Parent Listing UUID.

Returns

handlestring

Opaque async handle. Pass to listing.get.

status"pending"
channelstring
task_type"publish_listing_draft"
messagestring

Describes the listing.get(..., wait_sec=...) contract.


listing.delete_listing

Scopelisting:writeRate 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

Scopelisting:read

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

Content

content.generate

Scopecontent:writeRate 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.

short_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.

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.


content.get

Scopecontent:read

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.

progress_percentagenumber

0-100 integer.

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:read

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, short_type, scenes_count, created_at.

totalnumber

content.delete

Scopecontent:writeRate 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

Scopetrend:read

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_trend_match

Scopetrend:read

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_launch_concept

Scopetrend:writeCreditsmeteredRate 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 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.

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(..., wait_sec=...) contract.


trend.get

Scopetrend:read

Return trend detail plus launch-concept generation status.

Parameters

handlestringRequired

TrendMatch.uuid returned from trend.generate_launch_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_trend_feedback

Scopetrend:writeRate 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:read

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:read

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:read

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:read

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:read

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:readRate 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:read

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.optimize_product

Scopeoptimize:writeRate 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.

Returns

handlestring

Opaque async handle. Pass to optimize.get.

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

Describes the optimize.get(..., wait_sec=...) contract.


optimize.refresh_listing

Scopeoptimize:writeRate 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

Scopeoptimize:read

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

Social Post

social_post.generate

Scopesocial_post:writeRate limit10/min

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"].

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


social_post.list

Scopesocial_post:read

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:write

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:writeRate limit10/min

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.

Returns

content_idstring
resultsobject[]

One entry per requested channel: channel, status, publish_url, external_id, error.