ApparelHub

io.github.ApparelHub-AI由 GitHub 账号 ApparelHub-AI 发布v0.21.1更新于 Nov 14, 2026

Run a custom-merch store from an agent: design, build products, list on every channel, fulfill.

已验证Streamable HTTP可网页运行效率与工作流商业与电商媒体与设计

概览

AI 生成的概览

让助手运营 ApparelHub 按需印制周边店铺:设计服饰、创建商品、上架到销售渠道并处理订单。

可以做什么
  • 检查账户配置就绪情况,连接履约供应商与销售渠道(含浏览器授权流程)
  • 列出工作区、店铺、设计、商品与订单,并查看订单详情
  • 浏览并跨供应商搜索服饰目录,获取选品建议
  • 生成、迭代、上传与管理设计图,包括透明底抠图和文字校验
  • 创建商品、添加规格、同步到履约与渠道、更新价格与商品图片
  • 处理订单、履约问题、合集、数据分析与 TikTok 商品诊断
适用场景
当希望助手真正运营一家按需印制店铺而不只是调用接口时使用:完成店铺初始化、把素材变成商品、发布到 Shopify、WooCommerce、Wix 或 TikTok Shop,并处理随之而来的订单。
运行要求
可使用经 OAuth 授权的远程托管端点,或在本地以 stdio 运行 npm 包,需 Node.js 20+ 及 APPARELHUB_API_KEY 环境变量。自行运行的设计与质检工具还需 Python 3 与 Pillow,可选 tesseract。需要 ApparelHub 账户。
安装前请注意
自行运行需在环境中保存 APPARELHUB_API_KEY;托管连接器会代为签发密钥。许多工具会创建、同步、定价、归档或删除商品与设计,部分会作用于线上销售渠道,删除不可恢复。可选遥测可用 APPARELHUB_MCP_TELEMETRY=off 关闭。

安装

在 SourceWeft 中

  1. 打开 控制台中的 ApparelHub,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.ApparelHub-AI%2Fapparelhub-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "apparelhub": {
      "type": "http",
      "url": "https://mcp.apparelhub.ai/"
    }
  }
}

README

@apparelhub/mcp-server

Workflow-level MCP tools that let an AI agent run an ApparelHub store end to end: set it up, design apparel, build products, list them across sales channels, and work the orders and listings that come back. Each tool wraps the ApparelHub Agent API and bakes in the platform's hard-won production lessons, so the agent gets correct behavior for free instead of learning the gotchas itself.

There are two ways to run it: a hosted connector you authorize with OAuth (recommended, no API key to handle) and this npm package you run yourself with a key. Both serve the identical tool surface.

Status: early access. The npm package is pre-1.0 while the surface stabilizes. The agent-facing tool surface is v1 and is the contract we keep stable (see CHANGELOG.md and Versioning).

What makes this different

A thin wrapper around a REST API just renames HTTP calls. These tools are at the workflow level: one ship_product call resolves variants, generates and waits for a mockup (through the waiting until its images are actually published), creates the product with the right field names, adds every variant, associates it with a store, and syncs to fulfillment and channels in the correct order, refusing a negative-margin price and warning on known variant traps along the way. The scar tissue lives in the code, not in your agent's context.

Connect

Prefer the hosted connector. Authorizing it provisions the API key for you, so there is no credential to create, paste, rotate, or leak into a config file. Reach for the self-run package only when your client cannot speak remote MCP or OAuth, or when you specifically want the server running on your own machine.

Hosted connector (OAuth)Self-run package (API key)
CredentialProvisioned for you on approvalYou create and paste an API key
Local prerequisitesNoneNode.js 20+, Python 3 + Pillow, optionally tesseract
TransportRemote MCP over HTTPstdio
Best forAny client that supports remote MCPClients without remote/OAuth support, local control, development

Recommended: the hosted connector

https://mcp.apparelhub.ai

Add that URL to any MCP client that supports remote servers, sign in to ApparelHub, and approve. You never handle an API key. Approving the grant provisions a connector key on your account (or reuses the one you already have), and the hosted server resolves your session to it on every call. Nothing to paste, nothing to rotate by hand, nothing sitting in a dotfile.

The hosted server also carries the imaging toolchain the design and quality tools need, so transparency keying, image statistics, and OCR all work with no local dependencies at all: no Node, no Python, no Pillow, no tesseract.

Claude Code

bash
claude mcp add --transport http apparelhub https://mcp.apparelhub.ai

Then run /mcp and choose Authenticate.

Any client that reads an MCP config file

jsonc
{  "mcpServers": {    "apparelhub": {      "type": "http",      "url": "https://mcp.apparelhub.ai"    }  }}

claude.ai — add it as a custom connector under Settings → Connectors, paste the same URL, then authorize when prompted.

The bare origin above is the server's canonical address: it is the resource identifier its own OAuth metadata advertises. A path is not routed on, so an existing config pointing at https://mcp.apparelhub.ai/mcp keeps working and needs no change.

What the handshake actually does

Standard OAuth 2.1, nothing custom for you to configure. Your client discovers the authorization server from /.well-known/oauth-protected-resource (RFC 9728), registers itself dynamically, and runs an authorization-code flow with PKCE (S256) for the mcp scope against https://api.apparelhub.ai. Refresh tokens and revocation are supported. Access tokens are opaque: the hosted server exchanges yours for your connector key server-side, so the key is never in your client, your config, or your chat history.

Key slots and revoking

One connector key is minted per account and shared across every chat surface you grant, and it counts against your plan's API key allowance. The Free plan includes API access with one slot, so if that slot is already taken by a self-service key the consent screen says so and offers to free it or upgrade. To revoke, disconnect from the client that holds the grant, or delete the connector key at https://apparelhub.ai/developer/api-keys.

Alternative: run the package yourself

Requirements:

  • Node.js 20+.
  • An ApparelHub account and API key — generate one at https://apparelhub.ai/developer/api-keys.
  • For the design + quality tools only: Python 3 with Pillow (transparency keying, image QC) and optionally tesseract (OCR text detection). These run locally; if they're missing, those tools return a clear notice telling you exactly what to install, and never crash.

The server reads your key from the APPARELHUB_API_KEY environment variable at startup and speaks MCP over stdio. It never accepts the key as a tool argument, and the API host is pinned (no override).

Claude Code
jsonc
// ~/.claude/mcp.json (or a project .mcp.json){  "mcpServers": {    "apparelhub": {      "command": "npx",      "args": ["-y", "@apparelhub/mcp-server"],      "env": { "APPARELHUB_API_KEY": "your-key-here" }    }  }}
Cursor
jsonc
// .cursor/mcp.json{  "mcpServers": {    "apparelhub": {      "command": "npx",      "args": ["-y", "@apparelhub/mcp-server"],      "env": { "APPARELHUB_API_KEY": "your-key-here" }    }  }}
Aider
yaml
# .aider.conf.ymlmcp-servers:  apparelhub:    command: npx    args: ["-y", "@apparelhub/mcp-server"]    env:      APPARELHUB_API_KEY: your-key-here
Any other MCP client

Same shape everywhere: run npx -y @apparelhub/mcp-server with APPARELHUB_API_KEY in its environment.

Environment variables
VariablePurpose
APPARELHUB_API_KEYRequired. Your ApparelHub API key. Not needed on the hosted connector.
APPARELHUB_MCP_TELEMETRYSet to off to disable the coarse usage signal (see Privacy).
APPARELHUB_MCP_PYTHONPath to the Python 3 interpreter for the local image tools (default python3).

Tools

127 tools. docs/TOOLS.md walks through the core groups; call tools/list from your agent for the authoritative live schemas.

  • Setup & connect — check_setup_readiness (what the account has, what it needs, the single next action), list_connectable_providers, connect_fulfillment_provider and connect_sales_channel (API-token providers connected entirely in chat), plus start_channel_connect / check_connection_status for the browser-based ones (Printful, Shopify, TikTok Shop, Fourthwall).
  • Read — list_my_workspaces, list_my_stores, list_my_designs, get_design_collection, list_my_products, list_my_orders, get_order_details.
  • Catalog — browse_catalog, get_garment_details, find_garments (search every connected provider at once for a capability), recommend_garment, list_catalog_providers.
  • Design — design_apparel, iterate_design, upload_design (bring artwork the merchant already owns), fit_aspect (quota-free reshape), design lifecycle (archive_design, restore_design, delete_design), and split primitives generate_image, process_transparency, verify_design_text.
  • Product — ship_product, update_product, delete_product, unsync_from_channel, diagnose_tiktok_listings, and split primitives create_product, add_variants, sync_to_fulfillment, sync_to_channel.
  • Orders — lifecycle (approve_order, unapprove_order, hold_order, cancel_order, confirm_order, submit_order_to_fulfillment, check_order_status, reconcile_order), draft edits (add_order_item, remove_order_item), and design-approval holds (list_order_holds, approve_order_hold, request_hold_changes).
  • Fulfillment issues — report_fulfillment_issue (report a defect on an order), list_fulfillment_issues (per-order or workspace-wide inbox), check_fulfillment_issue (full issue plus the provider-ready problem report), resolve_fulfillment_issue (record the provider filing, close with a resolution, or create a replacement order).
  • Channel intelligence — what the sales channel itself reports and what you can set on it: channel_performance, channel_opportunities, channel_coverage, listing_changes (did the last edit actually work), describe_listing_attributes, set_listing_attributes, set_channel_settings, import_size_measurements.
  • Catalog import (tracked listings) — bring what a merchant already sells on a channel in, read-only: import_channel_catalog (start; returns the run already going if there is one), get_catalog_import_run (poll), list_tracked_listings (the listings plus each channel's catalog_read and last run). Nothing is written to the merchant's store and those products keep shipping as today. Shopify, WooCommerce, Wix and TikTok Shop. To have ApparelHub fulfil one, bind_tracked_listing binds it to an ApparelHub product (their listing is not changed); unbind_tracked_listing undoes it.
  • Analytics — analytics_summary, analytics_timeseries, analytics_breakdown, analytics_ops, analytics_portfolio.
  • Collections — list_collections, get_collection, create_collection, update_collection, delete_collection, add_products_to_collection, remove_product_from_collection, sync_collection.
  • Cross-workspace transfer — copy_product_to_workspace, move_product_to_workspace, check_product_move, and the design equivalents.
  • Workspace & team management (agency / Enterprise, account-wide key) — workspaces (create_workspace, update_workspace, delete_workspace, check_workspace_deletion, assign_workspace_member, unassign_workspace_member, move_store_to_workspace, get_role_matrix) and team (get_account_overview, list_account_members, remove_member, invite_member, list_invites, revoke_invite, resend_invite, accept_invite).
  • Store & order management — store settings/lifecycle (get_store_settings, update_store_settings, create_store, archive_store, unarchive_store, activate_store), order payment/ops (record_order_payment, mark_order_no_payment, set_order_payment_method, sync_orders, estimate_order_costs, get_orders_summary, list_pending_fulfillments), and archive_product / restore_product.
  • Systems of action — analyze_what_works, auto_optimize_listings, cascade_price_change, set_prices_by_margin, recover_from_outage.
  • Safety — verify_design_quality, verify_mockup_quality, check_design_compliance.
  • API escape hatch — get_api_reference (discover the full agent API from the live OpenAPI spec) and api_request (call any /agents/v1 endpoint when no dedicated tool fits).

Read tools are read-only. Product and design tools default to draft, never live, enforce pricing floors, and guard known variant traps. Systems-of-action mutations default to a dry run and only take safe actions (archive, never delete) when applied. Every product/order/store result carries a view_url back into apparelhub.ai. Errors come back in a consistent shape ({error: {code, message, retry_after?, suggestion?}}) — tools never throw across the MCP boundary.

get_api_reference also reports what the server you are actually talking to serves — its version, tool count, and every tool name — so an agent can tell "that tool does not exist" apart from "my cached tool list is stale" instead of guessing.

Privacy

An optional, coarse usage signal helps improve the tools. It sends only non-identifying features — the tool name, outcome, latency, error code, and a strict allowlist of coarse fields (e.g. AI source name, garment category). It never sends prompts, images, ids, URLs, or customer data. It's buffered and fire-and-forget (it can never affect a tool call). Turn it off entirely with APPARELHUB_MCP_TELEMETRY=off.

The hosted connector additionally records one operational metric per request (outcome, latency, and for a tool call the tool name). It carries no per-identity dimension and no user data.

Skill vs. MCP vs. recipes

ApparelHub ships the agent surface in three forms:

  • The markdown skill is the lowest-friction way to use ApparelHub from Claude Code — it teaches the agent the REST API and the design rules directly.
  • This MCP server turns that knowledge into a typed, callable tool surface (with the systems-of-action tools) that works across any MCP-capable agent, and, through the hosted connector, in chat surfaces that cannot run a skill or a local process at all.
  • The recipes are end-to-end operating blueprints you drop into your agent's runtime: a charter the agent follows, a memory model it keeps across runs, and the prompts to start it. They drive this tool surface, with money and go-live gates on by default.

Use the skill for a quick start in Claude Code; use the MCP server when you want typed tools, the higher-order workflows, or a client other than Claude Code; use a recipe when you want the agent to run a whole store pattern rather than answer one request at a time.

Development

bash
npm cinpm run build      # tsc -> dist/npm run typechecknpm run lintnpm test           # vitest

The image tools shell out to bundled Python scripts in python/; the imaging layer is injectable, so the tool orchestration is unit-tested with a fake and the scripts are smoke-tested directly.

Versioning & stability

The tool surface is versioned separately from the package (this is v1). When the underlying REST API evolves, the server adapts internally — the agent-facing tool names + shapes stay stable. That's the contract that lets you install once and keep working. Package releases follow Semantic Versioning; see docs/RELEASING.md.

On the hosted connector you are always on the current version, which is another reason to prefer it: new tools appear without you upgrading anything. Clients cache the tool list, so ask get_api_reference if you suspect yours has fallen behind.

License

MIT © ApparelHub. See LICENSE.

来源:README.md,提交 c9cd934

工具

129

check_setup_readiness

What this account already has, what it still needs, and the single next action to take. Returns ready_to_design / ready_to_fulfill / ready_to_sell, a per-store breakdown, and an ordered next_steps list. Start here for any first-time setup, and call it again after each connection to confirm the state actually changed. Read-only, makes no provider calls, and is safe to poll. [#01f20c]

输入参数workspace

list_connectable_providers

Fulfillment providers and sales channels this account may connect, each marked with how it connects: connect_mode "in_chat" means you can complete it here by asking for a credential, "browser" means you must dispatch an authorization link with start_channel_connect and poll. Also returns where the merchant generates the credential, when there is one. Use this before asking a user for anything, so you ask for the right thing. [#21af2f]

输入参数workspace

connect_fulfillment_provider

Connect an API-token fulfillment provider (Printify, Gelato) to a store, entirely in chat. Validates the token first, so a bad token fails before anything is stored. If the token maps to more than one shop the result asks you to pick one and lists them — call again with shop_id set. For Printful use start_channel_connect instead: it needs a browser. Never repeat the token back to the user. [#98598c]

输入参数shop_idapi_token必填workspacestore_uuid必填provider_uuid必填

connect_sales_channel

Connect an API-key sales channel (WooCommerce, Wix) to a store, entirely in chat. For Shopify and TikTok Shop use start_channel_connect instead: they need a browser. Credentials are write-only and are never returned. [#c9093d]

输入参数workspacestore_uuid必填credentials必填provider_uuid必填

start_channel_connect

Begin a browser-based connection (Printful, Shopify, TikTok Shop, Fourthwall). Shopify additionally requires shop_url, the merchant myshopify domain — ask for it before calling. Returns an authorization URL to give the user. THE CONNECTION IS NOT FINISHED WHEN THIS RETURNS. You must keep polling check_connection_status (passing the same provider_uuid) until it reports connected, then tell the user. The browser tab where they authorize is NOT this conversation and cannot report back to you, so polling is the only way you or they will learn it worked. Poll every few seconds, up to about two minutes, and if it has not landed by then ask whether they finished authorizing rather than giving up silently. If they need to create an upstream account first, let them, then call this again for a fresh link. [#f8e1fa]

输入参数kind必填shop_urlworkspacestore_namestore_uuidcallback_urlprovider_uuid必填

check_connection_status

Poll whether a dispatched connection has completed. Call this repeatedly after start_channel_connect while the user authorizes in their browser, and announce the result when it lands: they cannot see this conversation from the tab they authorized in, so if you do not tell them, nobody does. Read-only, makes no provider call, and is safe to poll every few seconds. connected true means say so and continue setup. connected false means keep waiting. needs_reconnect means retrying will never work and you must dispatch a fresh link with start_channel_connect. [#807361]

输入参数workspacestore_uuidprovider_uuid

list_my_workspaces

List the workspaces this account can act in, each with its uuid. Agency / multi-brand accounts have more than one (e.g. a workspace per client); a single account just has Default. The store / product / order / design tools operate on the Default workspace unless you pass workspace=<uuid>. Use this FIRST to resolve a workspace by name (e.g. a client's name) to the uuid those tools need. Read-only. [#358d40]

无需输入参数。

list_my_stores

List the merchant's ApparelHub stores, each with its fulfillment providers (Printful/Printify) and connected sales channels (Shopify/WooCommerce/Wix). Read-only. [#739377]

输入参数workspace

list_my_designs

List the merchant's generated design images (newest first). Read-only. Use these design_uuids with the design/product tools. Pass on_products=false to find orphan designs (designs not used by any live product), the supported way to audit a workspace for unused designs before archiving them. Pass archived=true to list already-archived designs. A design with no full_url carries processing_status: "pending"/"processing" means it is still being made and is worth polling, while "failed" means it gave up and processing_error says why. Branch on processing_error_code rather than matching the message text, and do not retry a design whose failure is a content block — it will fail the same way every time. [#58124e]

输入参数sortlimitsearchsourcearchivedworkspaceon_products

get_design_collection

List the OTHER designs that came out of the same generation as this one. When generate_image is called with concepts > 1, one generation produces a themed set; every design is saved separately and this is how you find its siblings. The design you ask about is never included, and the list is oldest first. An ordinary design returns an empty list, which is the honest answer, not an error (an inaccessible or unknown uuid also reads as empty, so an empty list does not prove the design exists). Read-only and not metered. Each entry carries title and concept_description: the product name and retail description the model wrote for that concept. Use them to build products without asking the merchant to retype copy the model already produced; either may be null and must never be invented. background_state says whether the design can be lifted off its background: transparent is ready to place, opaque_box can be keyed automatically (process_transparency), opaque_varied cannot be separated and will print WITH its background. Asked for a set, the model often answers with pictures of finished garments rather than flat art, and building a product from one prints a garment onto a garment, so do NOT build a product from an opaque_varied design without telling the user it will print with its background. Do not describe it as "a photograph" either: legitimately textured art reports opaque_varied too. [#f2d543]

输入参数workspacedesign_uuid必填

list_my_products

List the merchant's products with their fulfillment and sales-channel sync status. Each channel entry also carries `health` — what the channel last said about the listing. A channel can remove or deactivate a listing at any time, so check `health`, not just `sync_status`: a product can read 'Synced' historically and still be gone. Pass store_uuid to scope to one store; omit for all products. Read-only. [#06afd6]

输入参数limitsearchstatusworkspacestore_uuidsync_state

list_my_orders

List the merchant's recent orders across channels. An order with `fulfilled_by: 'merchant'` is for the merchant's own products (brought in from their sales channel, not made in ApparelHub): their store fulfils it, ApparelHub only records it, and approve / submit / confirm / cancel / hold / record-payment refuse it with `fulfilled_by_merchant`; tell the user to act on it in their store. Pass fulfilled_by to list only those ('merchant') or only ApparelHub-fulfilled orders ('apparelhub'). An order carrying `needs_attention` is one the merchant must act on (the fulfillment provider failed or cancelled it, the buyer cancelled after production started, it was paid but never sent to production, the sales channel's ship-by deadline is close or missed, or the channel refused the tracking): always tell the user about those, with the `message`. `ship_by_at` is the channel's ship-by deadline (UTC) when it has one. Read-only. [#fc1938]

输入参数limitsincestatusworkspacestore_uuidfulfilled_by

get_order_details

Full detail for one order: line items, payment + fulfillment status, shipments/tracking, and `ship_by_at` (the sales channel's ship-by deadline, UTC) when the channel has one. If `needs_attention` is present the order will not complete on its own; tell the user its `title` and `message`. `cost` and `profit` are this order's own figures once the provider has priced it. If `checkout_split` is present, the buyer's checkout was split into `checkout_split.order_count` orders across the merchant's stores and this order holds only its share: when asked how the sale did, report `checkout_split.profit` (the whole checkout), and never add it up across the orders in the split. Read-only. [#c15baa]

输入参数workspaceorder_uuid必填

browse_catalog

Browse ONE fulfillment provider's catalog for garments to print on. `category` is resolved against THAT provider's own taxonomy (providers use different vocabularies for the same idea) and an unknown category is rejected with the valid list rather than quietly returning everything. `keyword` matches product names across the whole catalog. ALWAYS read `warnings` in the response: they tell you when your results are narrower than you asked for -- e.g. a category that only exists inside one department. Each garment carries `decoration_method` / `accepts_photoreal` (`accepts_photoreal` absent means the provider publishes no signal -- unchecked, NOT unsuitable). This searches a SINGLE provider: to ask what the whole account can do, or before concluding a garment cannot take a design, use find_garments. Read-only. [#5e449d]

输入参数pagehas_aopkeywordcategoryper_pageprovider必填workspace

get_garment_details

Full detail for one garment: the variant matrix (colors/sizes/costs), print templates, ApparelHub pricing floor, and quality tier. Read-only. [#16a079]

输入参数provider必填workspaceproduct_ref_id必填

find_garments

Search EVERY fulfillment provider on the account at once for garments matching a capability. USE THIS BEFORE TELLING A USER AN ITEM CANNOT BE BUILT. A capability limit is almost always scoped to one provider, not to the category of garment: one provider carrying only embroidered headwear says nothing about another's printed caps. browse_catalog answers 'what does THIS provider carry'; this answers 'what on this ACCOUNT can take this design'. Provider scope defaults to every provider available — pass `providers` only to deliberately narrow it. Returns a compact ranked shortlist (confirmed capability first), plus `providers_searched` so you can state your coverage honestly rather than implying you checked everything. An empty result means nothing matched THESE filters on THESE providers; it is not proof the garment does not exist, and the warnings say so. Read-only. [#e5ad81]

输入参数limitverifykeywordcategoryprovidersworkspaceinclude_unknownaccepts_photorealdecoration_method

recommend_garment

Recommend a garment type for a design/use-case, encoding ApparelHub's garment trade-offs (BC 3001 vs Comfort Colors, budget vs premium, pricing floors). Returns a pick + rationale + alternatives. Advisory / knowledge-based. [#66d03b]

输入参数budget_tierdesign_uuidtarget_audience

list_catalog_providers

List the fulfillment providers this account can browse catalogs from. Use this to discover valid `provider` values for browse_catalog / get_garment_details — the set is account-specific and auth-gated on the platform (a provider only appears if this account is entitled to it), so never assume a fixed list. Read-only. [#f0ed53]

输入参数workspace

generate_image

Generate a design image (split primitive of design_apparel). The platform decides the background from the prompt and reports it: isolated artwork (a logo, lettering, a character) comes back with its background already removed, while a full scene, poster or all-over pattern is left exactly as written. Read print_ready, background_state and design_intent on the result, and call process_transparency only when the design needs a transparent background and print_ready.applied is not true. Rate-limit errors are classified (model_rate_limited = one model's provider vs platform_rate_limited = this key's ApparelHub throttle vs request_not_sent = the call never reached ApparelHub), and fallback_trail shows any model substitutions. When the platform has advice on the prompt it is returned as prompt_improvement. It is advice with one exception: when the prompt names or depicts the product ("a hoodie with a wolf on it"), the image model is sent improved_prompt instead of your wording, because naming a product makes image models draw the product. The result then has prompt_improvement.applied true and a prompt_rewritten note; pass prompt_improvement "skip" to keep your wording. If its issues include "brand_brief", the prompt describes a whole brand, collection or storefront rather than one design, and improved_prompt is the single strongest design EXTRACTED from it: either generate that one design, or keep the brief and call again with concepts (4 is a good default) to get a themed set from one generation. With concepts > 1 this still returns ONE image; the other designs from the same generation are saved to the workspace and read with get_design_collection(image_uuid). [#f7097a]

输入参数sizestyleprompt必填sourceauto_keyconceptsworkspaceno_fallbackprompt_improvementaugment_prompt_for_transparency

process_transparency

Key a solid background out of a generated image to true RGBA transparency (flood-fill + enclosed-region sweep + tight crop) and upload the result. Runs server-side (Python + Pillow). If the generator produced a tinted/muted green instead of pure #00FF00, it auto-recovers by re-keying in green-dominance mode (safe for art with no bright-green/lime elements). Returns a NEW image_uuid plus keying_mode. [#3cd7e7]

输入参数forceimage_urlworkspaceimage_uuid必填background_mode

verify_design_text

Read the text in a design with local OCR (tesseract) when available, so the agent can confirm spelling. Advisory: pass expected_text to get a match verdict, otherwise the detected text is returned for visual review. has_text is null when OCR is unavailable, meaning UNKNOWN — not "no text"; read the design image yourself in that case. [#57c0af]

输入参数image_urlworkspaceimage_uuid必填expected_text

design_apparel

End-to-end apparel design with the platform lessons baked in: solid-green-background prompt, transparency keying, and (optionally) a local text check. Returns ready-to-use design(s). Streams progress. Set needs_transparency=false for all-over-print products. Rate-limit errors are classified (model_rate_limited = one model's provider vs platform_rate_limited = this key's ApparelHub throttle vs request_not_sent = the call never reached ApparelHub), and each design's fallback_trail shows any model substitutions. This GENERATES new artwork — when the merchant already owns the file (a logo, a brand mark, a cleared cover), use upload_design instead and do not regenerate their mark. [#d84efc]

输入参数countstyleprompt必填sourceworkspaceno_fallbackverify_textgarment_typeneeds_transparency

iterate_design

Generate a variation of an existing design via img2img (e.g. "make the cactus blue"). Almost every source supports editing; only Google Imagen 4 is text-to-image-only (rejected). Multi-reference edits (several source images) work on Seedream, Flux 2 Pro, and Wan; slow-model edits return 202 and are polled automatically. [#63592e]

输入参数sourcepreserveworkspaceno_fallbackchange_description必填source_design_uuid必填

fit_aspect

Fit an EXISTING design image to a target aspect ratio without generating a new one. mode="pad" letterboxes it onto a background (keeps the whole design, nothing cropped); mode="crop" center-crops (trims the edges to fill the shape). QUOTA-FREE: this reshapes an existing image and does NOT consume an image-generation credit. Use to adapt a square design to a product's print area (e.g. a tall 9:16 for a phone case or poster, a wide 16:9 for a mug or banner). Returns a NEW design (image uuid + url). Note: for an AI-generated EXTENSION of the borders (outpainting) instead of a flat pad/crop, generate a new image with generate_image at the target size — that DOES use the image-generation quota. [#9ca805]

输入参数mode必填aspect必填workspacebackgroundimage_uuid必填

archive_design

Archive a design so it stops showing in the default gallery listing. Reversible with restore_design, and safe: it never touches products that already use the design. This is the right way to retire an unwanted or orphan design. Prefer it over delete_design unless the design must be removed permanently. Find orphan designs first with list_my_designs(on_products=false). [#16a475]

输入参数workspacedesign_uuid必填

restore_design

Restore a previously archived design so it appears in the default gallery listing again. List archived designs with list_my_designs(archived=true). [#f0d74b]

输入参数workspacedesign_uuid必填

delete_design

Permanently delete a design and its stored files. Irreversible. Refused with design_in_use if any live product still uses the design, in which case archive_design is the safe alternative. Use archive_design unless the design genuinely must be erased. [#02e216]

输入参数workspacedesign_uuid必填

upload_design

Upload artwork the merchant ALREADY OWNS and turn it into a design_uuid usable by create_product / ship_product. This is the way to build products from a client's own files — a logo, a brand mark, a cleared cover, a photograph — instead of generating something new. If a client says their mark must not be redrawn, use this; never regenerate or approximate a mark to work around a missing file. Three ways to supply the file, pick the cheapest one available: 1. `source_url` — an https URL the server can fetch. One call, no context cost. Best when the asset is already hosted or reachable by link (the link must not require sign-in). 2. no source at all — returns a presigned `upload_url` you PUT the bytes to yourself, then call this tool again with the returned `image_uuid` to finish. No context cost, full resolution, and the right choice whenever you can make an HTTP request (curl, fetch, requests). 3. `image_base64` — inline bytes. Works anywhere, but costs roughly 350k tokens per megabyte of file, so reserve it for small files when neither of the above is possible. Accepts PNG, JPEG, WEBP and SVG. SVG is the BEST input for a logo or mark: it is rendered server-side at print resolution, so it stays crisp at any size. Two things must be true of the SVG first — text converted to outlines, and any linked image embedded — otherwise the upload is refused with instructions rather than silently losing that part of the artwork. For pixel art, or any hard-edge raster mark that must stay crisp, pass upscale="pixel" so a small file is enlarged without being smoothed. [#85542c]

输入参数titleupscalefilenameworkspaceimage_uuidsource_urlcontent_typeimage_base64

ship_product

End-to-end pipeline in ONE call: take a design, generate + verify a mockup (one per imported color, so every color variant has a matching mockup), create the product with the correct field names, add all variants, associate with a store, sync to fulfillment, then (optionally) sync to sales channels as DRAFT. Handles EMBROIDERY garments automatically WHEN the garment is actually embroidered: routes the design to the real embroidery placement and attaches thread colors (derived from the design, or pass thread_colors). Headwear is NOT inherently embroidered -- some providers carry printed (DTF) caps that take photoreal art as-is, so check `accepts_photoreal` on the garment rather than assuming, and call find_garments before concluding a design cannot go on a hat. Face goods (canvas, posters, backpacks, bags, socks, towels, blankets, pillows, cases...) default to print_style "fill": the design is recomposed onto an aesthetically matching background and printed edge-to-edge, so no green-screen background or contrasting borders reach the product. Enforces pricing floors and guards the AQUA-vs-Navy variant trap. Streams progress. PREFER this over chaining create_product + add_variants + sync_to_fulfillment + sync_to_channel yourself — especially for AUTOMATED or SCHEDULED runs — because it guarantees the correct order (store association + fulfillment sync BEFORE any channel sync). Use the split primitives only when you deliberately need a partial/interactive flow. [#232f74]

输入参数garment必填pricing必填variants必填workspacedesign_urlstore_uuiddesign_uuid必填print_styleproduct_meta必填thread_colorsgenerate_mockupsync_to_channels

create_product

Create a STANDALONE product from a design (split primitive) — it is NOT placed on any store yet. Applies the correct field names + pricing floor, routes EMBROIDERY garments (caps/beanies) to their real embroidery placement with Printful thread colors (derived or explicit), and defaults face goods (canvas/backpacks/bags/socks/towels/blankets/pillows/cases...) to print_style "fill" (design recomposed onto a matching background, printed edge-to-edge). Set generate_mockup: true to render a garment mockup as the display image (it auto-derives representative variants from the catalog, so you do NOT need mockup_variant_ids) — otherwise the raw design is used as the display image. To get it onto a store and listed, the required sequence is: add_variants -> sync_to_fulfillment(product_uuid, store_uuid) [associates it with the store + syncs to Printful/Printify] -> sync_to_channel [sales channel]. To run that whole pipeline in one call instead, use ship_product. [#e8704a]

输入参数garment必填pricing必填workspacedesign_urldesign_uuid必填print_styleproduct_meta必填thread_colorsgenerate_mockupmockup_variant_ids

add_variants

Add variants to an existing product (split primitive). Resolves provider_variant_ids by color+size from the product's provider options (or pass them explicitly). Warns on the AQUA-vs-Navy trap. Variants must exist before syncing. [#c9cff4]

输入参数variants必填workspaceproduct_uuid必填product_ref_id

sync_to_fulfillment

Associate a product with a store AND sync it to that store's fulfillment provider (Printful/Printify). This is the REQUIRED step before sync_to_channel: it both puts the product on the store (a product from create_product is standalone) and creates the manufacturing path the sales-channel listing binds to. Run it after the product has variants. [#58f859]

输入参数workspacestore_uuid必填product_uuid必填

sync_to_channel

Sync one product to a sales channel (WooCommerce/Shopify/Wix) as a listing. PREREQUISITE: the product must first be associated with the store AND synced to its fulfillment provider — call sync_to_fulfillment(product_uuid, store_uuid) FIRST (it does the store association too). If that prerequisite is missing, this tool now AUTO-HEALS it (associate + fulfillment-sync, then retries once) instead of failing with "product not associated with store" — but the clean, explicit order is sync_to_fulfillment then sync_to_channel, and ship_product does the whole pipeline in one call. Defaults to DRAFT — only push live when the user explicitly asks. [#32962d]

输入参数stateworkspacestore_uuid必填product_uuid必填integration_uuid必填

update_product

Update a product (name, description, price). For a price change that must propagate to synced channels, prefer cascade_price_change. Optionally set tiktok_listing to enrich the TikTok Shop listing (SEO search terms, product highlights, brand, packaging, TikTok-only title/description, and category_id) — applied when the product is synced to a TikTok channel; ignored by other channels. For channel-defined ATTRIBUTES (Material, Style, Washing Instructions...) use set_listing_attributes instead: it validates against the listing category's real schema and tells you which values the channel refused, which this tool cannot. [#c20857]

输入参数changes必填workspaceproduct_uuid必填

set_product_images

Set an existing product's listing images: attach an uploaded photo or a generated lifestyle shot, reorder them, and choose the cover. Use this AFTER the product exists — create_product / ship_product pick the initial mockup themselves. ⚠️ THE LIST REPLACES, IT DOES NOT MERGE. What you send becomes the whole gallery, in the order given. To add one image, READ the current list first and send it back with the new entry in it — sending the new entry alone deletes every other image. Pass `images: null` to reset the gallery back to the product's provider mockups. ⚠️ ORDER IS FUNCTIONAL, NOT COSMETIC. Channels cap how many images a listing may carry and TRUNCATE IN GALLERY ORDER, so position decides what actually ships: TikTok Shop takes 9, Wix 15, Shopify and WooCommerce are unlimited. On a capped channel an image in position 10 is not a lower-priority image, it is an absent one. Put the images that must survive first. The platform stores at most 20. Each entry carries provenance. `source` says where the file came from (mockup / upload / ai_mockup / print_file / unknown). `ai_generated` is SEPARATE and tri-state on purpose: an uploaded photo may itself have been AI-generated and the platform cannot detect that, so only you can say. Set it truthfully — true, false, or leave it unset when you genuinely do not know. Do not guess it from `source`. `cover` sets the display image independently of order, so the cover need not be first. A cover that is not in the gallery is added to it. Replace the gallery without naming a cover and the cover follows to the new first image. CONCURRENCY: this reads the product first and passes its version back with the write, so a change someone else made in between is REFUSED rather than silently overwritten. On a conflict the tool re-reads and returns `conflict: true` with the current images — it does NOT retry, because the list you built was based on a gallery that no longer exists. Rebuild from `current_images` and call again. [#781240]

输入参数coverimagesworkspaceproduct_uuid必填

generate_listing_image

Generate listing photography for an existing product — an on-model shot, a detail crop, a flat lay, or the product in a real setting. HOW IT WORKS: this EDITS the product's own rendered mockup. It is not text-to-image, and that is the point — the photo shows the actual colourway and the actual printed design, so it depicts the product a shopper will receive. ⚠️ A PRODUCT WITH NO MOCKUP IS REFUSED, not silently generated from scratch. A from-scratch product photo invents a product that does not exist and publishes it as photography of one that does — a listing-takedown and chargeback risk, not merely a quality problem. On `product_has_no_mockup`, render a mockup preview first (ship_product / create_product do this) and call again. Raw print artwork does not count as a mockup. `guidance` is EXTRA wording folded in on top of the chosen preset — it does NOT replace it, and it cannot override the constraint that keeps the garment, colour and artwork unchanged. Use it for setting or mood ("outdoors at golden hour"), not to restate the product. COST: this spends an image generation from the account's quota, like any other. Four styles across thirty products is 120 generations — more than some plans allow in total. Check the plan before looping over a catalogue. By default the image is generated and RETURNED, not attached: putting a machine-made photo on a live storefront is a separate decision from making one. Pass `attach: true` to append it to the gallery — appended, so existing images are kept, unlike set_product_images which replaces the whole gallery. [#b24313]

输入参数style必填attachguidanceworkspaceproduct_uuid必填set_as_coversource_image_url

unsync_from_channel

Remove a product from ONE sales channel, leaving every other channel and the fulfillment provider untouched. The product stays in ApparelHub; only that channel listing goes away. Use this to delist from a single channel — do NOT hand-roll it against the raw unsync endpoint: that endpoint is product-level and defaults to detaching fulfillment AND cascading to every channel, so getting the parameters slightly wrong unsyncs far more than you asked for. To remove a product from EVERYTHING, use archive_product instead. [#bd6407]

输入参数workspacestore_uuid必填product_uuid必填integration_uuid必填

delete_product

Delete (default) or archive a product. Hard delete cascades to variants; if the product is synced to channels, unsync it first to avoid orphan listings — unsync_from_channel for one channel, archive_product for all of them. (sync_to_channel cannot unsync; it only syncs.) [#020483]

输入参数workspacearchive_onlyproduct_uuid必填

diagnose_tiktok_listings

Diagnose TikTok Shop listing quality and optionally apply TikTok's own recommendations. TikTok grades each listing POOR/FAIR/GOOD and a low grade suppresses reach. Returns, per listing: the current tier, the machine-readable issues behind it (code + how_to_solve + the tier that ONE fix unlocks), and TikTok's recommended search terms / titles / descriptions. READ-ONLY unless you pass `apply`. `apply:['search_terms']` is the safe default action — search terms are hidden listing metadata. Passing 'title' or 'description' replaces merchant-visible copy with machine-generated text, so ask the user first; those land on a TikTok-ONLY override and never rewrite the shared product record (which would also change the Shopify/WooCommerce/Wix listings). Use `dry_run` to preview. IMPORTANT — TikTok often flags a title WITHOUT offering a replacement, so `apply:["title"]` returns no_recommendation. That is not a dead end: each listing also carries `requirements` (the computed target, e.g. 40-150 chars — TikTok's own length rules contradict each other and this is the intersection), `building_blocks` (the product's real garment/colors/sizes, so you write from facts rather than inventing them), and `candidates.title` (ready-to-use options, shortest first, each already validated against the requirements). Offer the candidates to the user, or write your own title to the requirements and set it via update_product tiktok_listing.title. Check `issues[].fixable_by` before acting: `photography` means the listing needs new imagery, not better writing — report it rather than trying to write around it. ⚠️ `diagnosable` means "TikTok returned a diagnosis", NOT "this listing is live". TikTok also answers for deactivated and deleted listings, so a catalog can come back entirely diagnosable:true while a third of it is no longer for sale. Read `listing_health` for liveness: "Removed" is gone, "Needs Attention" is present but not visible to buyers, and null means we have never checked — which is NOT

输入参数applydry_runworkspacestore_uuid必填product_uuidsintegration_uuid

analyze_what_works

Surface insights from the merchant's own products + orders: best sellers, top channel, average order value. Read-only. Own-account signal (cross-merchant intelligence is a future feature). [#f6f4f3]

输入参数scopeworkspacestore_uuidtime_window

auto_optimize_listings

Propose (and, with dry_run=false, apply) optimizations across listings. Uses the sales channel's own demand data, so a listing that people SEE but do not buy is flagged for a listing fix rather than archived — that listing is proven demand with broken conversion, and archiving it destroys the best opportunity in the catalogue. Only a listing the channel reports as genuinely inert is ever archived. Where no demand data is available the proposal is "review" and NOTHING is applied. DEFAULTS TO DRY-RUN; applying only ever archives (never deletes, never goes live). [#170c11]

输入参数scopedry_runworkspacestore_uuid

cascade_price_change

Change a product price once and propagate it: the platform cascades to all variants, and (when store_uuid is given) this re-syncs each connected channel so the price is consistent everywhere. Avoids the "changed on one channel, forgot the others" footgun. [#b8aca8]

输入参数new_price必填workspacestore_uuidproduct_uuid必填also_update_channels

set_prices_by_margin

Set each variant's price to hit a target profit margin off its OWN cost: price = cost / (1 - margin). Reads per-variant production cost (populated after the fulfillment sync), applies a per-variant price, then re-syncs connected channels. Use this instead of one flat price when costs tier by size (larger sizes cost more, so a single price gives a different margin per size — and can go negative on the biggest). Requires store_uuid (cost lives on the store-products list, not product detail). [#54cd6b]

输入参数margin必填workspacestore_uuid必填product_uuid必填also_update_channels

recover_from_outage

Find products in a failed sync state (fulfillment or channel) and, with dry_run=false + a store_uuid, retry the syncs. DEFAULTS TO DRY-RUN (diagnose only). [#57cf54]

输入参数scopedry_runworkspacestore_uuid

verify_design_quality

Local QC gate for a design: transparency correctness (alpha, clean corners, white premultiply), resolution, and detected text. Returns a 0-100 score + issues. Needs local Python + Pillow. [#8e74ec]

输入参数image_urlworkspacedesign_uuid必填needs_transparency

check_design_compliance

Advisory pre-flight for IP / trademark / prohibited-content risk. Scans the prompt/name and any detected text against common protected marks. NOT legal advice, and NOT an image-content trademark check. [#fba5cb]

输入参数namepromptimage_urlworkspacedesign_uuidtarget_channels

verify_mockup_quality

QC gate for a rendered product MOCKUP (verify_design_quality checks the design; this checks the render on the garment). Deterministically catches three defects that have actually shipped: an un-keyed chroma-green background printed onto the product, an empty render, and a render too small to judge. It does NOT decide whether the design is upright, clipped, seam-split, or whether every face is printed: those need looking at the image, and a pixel statistic that guessed would be confidently wrong on exactly those cases. It returns a fixed visual_checklist for you to answer by VIEWING the render, so grading is consistent across callers. Treat a clean result as "no hard defect found", not "the mockup is good" until you have answered the checklist. [#feb72a]

输入参数preview_url必填

approve_order

Approve an order that is awaiting approval, releasing it for fulfillment. For sales-channel (webhook) orders this also auto-submits the order to the fulfillment provider (Printful/Printify). ALWAYS check auto_submitted in the result: false means the order is approved but NOT in production, and submit_error says why. Use when an order is held for review and the user wants to let it proceed. [#87b954]

输入参数workspaceorder_uuid必填

unapprove_order

Revert an approved order back to pending so it can be reviewed / re-approved. Only works if the order has NOT yet been submitted to the fulfillment provider. Use to undo an approve_order that was done too early. [#1d050e]

输入参数workspaceorder_uuid必填

hold_order

Put an order on hold with an optional reason, pausing it before it is submitted to fulfillment. Use when the user wants to stop an order from proceeding (e.g. to double-check the design or address). Release it later with approve_order. [#9a2fd5]

输入参数reasonworkspaceorder_uuid必填

cancel_order

Cancel an order. Cancels it locally and, where possible, cancels the draft/order at the fulfillment provider (Printful/Printify). This does NOT refund the customer on the sales channel — the channel is the source of payment. Destructive: only cancel when the user explicitly asks. [#9e800b]

输入参数workspaceorder_uuid必填

confirm_order

Confirm a DRAFT order to send it into production at the fulfillment provider. Only works for orders in "draft" status that have already been submitted to a provider (have a provider order id). Use after submit_order_to_fulfillment on a "prepare, then I confirm" store. [#ebe558]

输入参数workspaceorder_uuid必填

submit_order_to_fulfillment

Manually submit an order to its fulfillment provider (Printful/Printify) as a DRAFT. For sales-channel orders this auto-fetches the recipient from the channel. Use to un-stick a paid order that never got submitted; confirm it afterward with confirm_order if the store requires confirmation. [#437d68]

输入参数workspaceorder_uuid必填

add_order_item

Add an item (e.g. another variant of the same product) to a DRAFT order, before it is confirmed to production. Optionally set custom_price (the new item's per-unit retail price) and/or shipping_cost (the order-level retail shipping the customer pays — NOT the provider's cost); omit them and the variant price / existing shipping are kept. Only works while the order is in "draft" status. Printful and Gelato edit the existing provider draft IN PLACE; Printify has no edit API, so it CANCELS + RE-CREATES the order — the result then carries edit_method="recreated" and a new fulfillment_external_id. Nothing is charged on a draft, so re-creation is safe. Returns 409 "order_not_editable" if the order was already confirmed/submitted to production. [#f416d1]

输入参数quantityworkspaceorder_uuid必填custom_pricevariant_uuid必填shipping_cost

remove_order_item

Remove a line item from a DRAFT order (the order must keep at least one item). Same provider semantics as add_order_item: Printful/Gelato edit in place, Printify cancels + re-creates. Only works while the order is a draft. Get the order_item_id from get_order_details (each item carries an id). [#b20b6e]

输入参数workspaceorder_uuid必填order_item_id必填

check_order_status

Poll the fulfillment provider for the latest status of an order and update it locally (including any design-approval holds). Read-mostly refresh — safe to call repeatedly. Use to see whether an order has shipped or is on hold at the provider. [#81b1a2]

输入参数workspaceorder_uuid必填

reconcile_order

Reconcile a sales-channel order with the channel it came from: pull payment / cancellation FROM the channel and push fulfillment status + tracking TO it. Only sales-channel orders can be reconciled (native orders return reconcilable=false). Use to re-sync an order that drifted (e.g. tracking not relayed to the storefront). [#ac6b88]

输入参数workspaceorder_uuid必填

list_order_holds

List the design-approval holds on an order (active and released). Set refresh=true to also poll the fulfillment provider for newly-discovered holds. Read-only. Use to see why an order is stuck at the provider and get the hold_uuid for approve_order_hold / request_hold_changes. [#2c7422]

输入参数refreshworkspaceorder_uuid必填

approve_order_hold

Approve a design-approval hold on an order so the provider can proceed. If the provider can't flip the hold via its API (Printful today), the result is deferred with a dashboard_url to finish the approval manually — the hold stays active until the provider's release fires. Get the hold_uuid from list_order_holds. [#7b5295]

输入参数hold_uuid必填workspaceorder_uuid必填

request_hold_changes

Request design changes on a held shipment instead of approving it. change_kind is 'minor' (notes REQUIRED — describe the edit) or 'full_replacement' (re-do the design). If the provider can't action it via API (Printful today), the result is deferred with a dashboard_url. Get the hold_uuid from list_order_holds. [#acd99f]

输入参数noteshold_uuid必填workspaceorder_uuid必填change_kind必填

report_fulfillment_issue

Report a post-sale fulfillment issue (defect) on an order: the item does not match the approved mockup, poor print quality, damaged in transit, wrong/missing item, late or lost. Creates a tracked issue and computes the provider report window (30 days from delivery). Follow up with check_fulfillment_issue for the provider-ready problem report and resolve_fulfillment_issue to file/close it or create a replacement order. [#dc88bc]

输入参数itemstitlecategory必填workspaceorder_uuid必填description必填shipment_refresolution_requested

list_fulfillment_issues

List fulfillment issues. With order_uuid: that order's issues plus its report-window eligibility. Without: the workspace-wide issues inbox, filterable by status ('open_any' = open + filed upstream) and store, with limit/offset paging. Read-only. [#533758]

输入参数limitstoreoffsetstatusworkspaceorder_uuid

check_fulfillment_issue

Fetch one fulfillment issue in full (affected items, evidence attachments, provider claim tracking, resolution) and, by default, the provider-ready problem report: a copy-paste summary_text plus the provider dashboard deep-link where the report must be filed (Printful/Printify accept problem reports only in their own dashboards). Read-only. [#2f6bdb]

输入参数workspaceissue_uuid必填include_report

resolve_fulfillment_issue

Progress a fulfillment issue. action='submit_upstream' records that the problem report was filed with the provider (optionally with their claim reference) and returns the dashboard link + summary. action='resolve' closes it with a resolution_type (reprint, refund_wallet, refund_customer, replacement_order, other, none). action='create_replacement' builds a one-click zero-charge replacement (reship) draft order from the affected items; if it cannot be built automatically (no recipient on the provider record, an unlinked variant, or a replacement already exists) the error says what to do instead. [#a819f9]

输入参数notesaction必填workspaceissue_uuid必填resolution_typeprovider_claim_ref

analytics_summary

Headline order/merch KPIs for a date range (gross revenue, orders, units, AOV, COGS, gross profit, margin, cancel/refund/hold rates, fulfillment velocity) plus prior-period deltas. Defaults to the last 30 days. Requires an Advanced Analytics plan (Professional or Enterprise). Read-only. [#6b72a2]

输入参数endstartstorecurrencyworkspace

analytics_timeseries

KPI trend series over a date range, bucketed by day, week, or month (zero-filled). Each bucket carries gross revenue, gross profit, COGS, order count, units, AOV, average margin, and margin coverage. Requires an Advanced Analytics plan. Read-only. [#48246d]

输入参数endstartstorecurrencyintervalworkspace

analytics_breakdown

Aggregate KPIs broken down by one dimension: product_type, sales_channel, fulfillment_provider, product, variant, or hold_reason. Rows are sorted for display; overflow past the limit folds into an "(everything else)" row so totals still reconcile. Requires an Advanced Analytics plan. Read-only. [#127113]

输入参数endlimitstartstorecurrencydimension必填workspace

analytics_ops

Operational health for a date range: fulfillment velocity (payment→submit→ship→deliver averages), order counts, and cancellation / refund / hold rates, plus a hold-reason breakdown. Requires an Advanced Analytics plan. Read-only. [#ed8ddd]

输入参数endstartstorecurrencyworkspace

analytics_portfolio

Cross-client portfolio: per-workspace (per-client) KPIs plus rolled-up totals — the agency view. Groups store rollups by each store's current workspace over every workspace you can view analytics in. Requires an agency (Enterprise) account with Advanced Analytics; other accounts get a feature_unavailable error. Read-only. [#65a008]

输入参数endstartcurrencyworkspace

describe_listing_attributes

Discover the channel-defined listing fields you can set — TikTok product attributes, eBay item specifics, WooCommerce product attributes — and what is currently set. READ-ONLY. Call this BEFORE set_listing_attributes or set_channel_settings: the field names and their allowed values are defined by the channel, so guessing them gets the value dropped. Pass `product_uuid` for one listing, or `integration_uuid` alone for the shop-wide settings (compliance answers, the shipping template, and a fallback size chart). BRAND and the per-listing SIZE CHART are per-PRODUCT, not shop-wide — both describe the blank, so a shop selling two blanks needs two values, and a shop-wide size chart would replace the accurate per-garment one on every other listing at once. Ask for them with `product_uuid`. Each field carries `value_type`, `cardinality` (single vs multi), `free_text` (whether a value outside the list is accepted) and `requirement`. Those are separate on purpose: most fields are enumerated AND accept free text, so neither flag alone tells you what is legal. `requirement: "conditional"` means the field only becomes required once `required_when` holds — typically after you answer a related question one particular way. `values` is what is LIVE ON THE CHANNEL, which is not the same as what was last written from here: platform auto-fills and merchant edits made directly in the channel's own admin show up here too. That drift is usually the most useful thing in the response. `unset_required` lists fields that are required and empty. Those are NOT filled in for you, deliberately — several are legal attestations. Left unset, the channel picks its own default or grades the listing down, so they are worth resolving with the merchant. ⚠️ CHECK `resolved_for.resolution` when it is present. `explicit_override` means the merchant chose the category. `keyword_match` means it was GUESSED from the product name, and a wrong guess means these fields belong to a different kind of product

输入参数workspacestore_uuid必填product_uuidinclude_valuesintegration_uuid

set_listing_attributes

Set channel-defined listing attributes on ONE product (Material, Style, Washing Instructions and similar). Call describe_listing_attributes first to learn the field keys and their allowed values. A PARTIAL WRITE SUCCEEDS. Send four values with one bad and the three good ones are stored while the bad one is reported — you do not have to get them all right at once. A value the channel refuses comes back in `rejected` with a machine-readable `reason` and the allowed values echoed, so you can correct it in one more turn rather than guessing. Rejections are never dropped silently. ⛔ NEVER INVENT A VALUE. Relay what the merchant told you. If you cannot get a value from them, leave it UNSET and say so — an unset field is honest, an invented one is not. Do not infer it from the product type, do not copy it from another shop, and do not pick the nearest allowed value because it looks close. 📏 SIZE CHART. US apparel is graded down without one. A chart is normally rendered automatically from the fulfillment provider's real measurements, so most listings need nothing. When one IS flagged, prefer `size_chart_measurements` (an object — call import_size_measurements to fill it from the provider) over `size_chart_template_id`: the template id can only come from a human in the channel's own admin, because the channel publishes no way to list, verify or correct one. ⛔ NEVER INVENT MEASUREMENTS. They are what a buyer reads before choosing a size. Do not derive a table from the garment type, do not copy one from a similar product, and do not fill a gap with a plausible number. A malformed table is refused whole, with a reason — nothing is half-applied. A missing cell is fine and renders blank; an invented one means somebody receives a garment that does not fit. Setting a value does NOT change the live listing on its own — the channel is updated on the next sync. Pass `sync: true` to push it immediately, or run sync_to_channel afterwards. [#ef218b]

输入参数syncremovevalues必填workspacestore_uuid必填product_uuid必填integration_uuid

set_channel_settings

Set SHOP-WIDE listing settings for one connected sales channel: product compliance attestations, the shipping template, and a fallback size chart. These apply to every listing on that channel, so they are set once rather than per product. Call describe_listing_attributes with `integration_uuid` (and no `product_uuid`) first to see which settings this channel defines and what each one accepts. ⚠️ BRAND and the per-listing SIZE CHART are NOT here — they are per-product (use set_listing_attributes), because both describe the blank rather than the shop. `default_size_measurements` is the one size-chart setting that is shop-wide, and only as a FALLBACK for listings with no provider measurements of their own. Set it only when the whole catalogue is ONE blank: with a mixed catalogue it would be applied to garments it does not describe. ⛔ SOME OF THESE ARE LEGAL ATTESTATIONS. Product-compliance answers (for example California Proposition 65 questions) are statements the MERCHANT makes about their goods, and they carry legal weight. ⛔ NEVER INVENT A VALUE. Relay what the merchant told you. If you cannot get a value from them, leave it UNSET and say so — an unset field is honest, an invented one is not. Do not infer it from the product type, do not copy it from another shop, and do not pick the nearest allowed value because it looks close. In particular: do not answer "No" because it is usually "No", and do not reason from the product being printed apparel — Proposition 65 covers clothing, and some inks and finishes do contain listed chemicals. Ask the merchant, relay their answer, and if they do not have one, leave it unset and tell them it is outstanding. Answering one of these questions "Yes" can make a follow-up field required — naming the specific chemicals, from a list of hundreds. That follow-up appears in `unset_required` and is never filled in for the merchant. A value the channel refuses comes back in `rejected` with a machine-readable `reason` and the allowed v

输入参数removevalues必填workspacestore_uuid必填integration_uuid必填

import_size_measurements

Get the blank's real per-size measurements from its fulfillment provider, in the exact shape `size_chart_measurements` takes. READ-ONLY. Use this instead of asking a merchant to type a size chart, and never instead of asking them when it comes back unavailable. It imports nothing by itself — adopting a set of measurements is the merchant's decision. Show them the table, let them correct it, then write it back with set_listing_attributes as `size_chart_measurements`. `available: false` is an ANSWER, not a failure. Branch on `reason`: • `provider_publishes_no_size_guide` — this provider has no size-guide API at all (Printify and Gelato), so no product of theirs will ever import. Permanent: ask the merchant for the blank manufacturer's own numbers. • `no_size_guide_for_this_blank` — the provider does publish guides, just not for this item. Normal for non-apparel. • `provider_lookup_unavailable` — transient. Retry. • `product_has_no_fulfillment_provider` — nothing to import from. ⚠️ TELL THE MERCHANT WHERE THE NUMBERS CAME FROM. `source` names the provider and the catalog item. These are measurements a buyer makes a purchase decision on, published in the merchant's name — present them as the provider's figures for a specific blank, not as something you know. `notes`, when present, lists what was adjusted on the way through (a provider sometimes files a measurement under a size outside its own size list). Pass those on rather than dropping them. [#19618b]

输入参数workspacestore_uuid必填product_uuid必填

channel_performance

What the sales channel reports about each of your listings: impressions, clicks, click-through rate and units sold, plus a state telling you what to do about it. Use this to find listings people SEE but do not BUY — the order-based analytics tools cannot show you those, because to them a listing with 5,000 views and no sales looks identical to one nobody has ever seen. States: winner (scale it), conversion_blocked (lots of views, few clicks — the listing card is losing them), pdp_blocked (they click but do not buy — the product page is losing them), starved (too few views to judge; needs discovery, NOT a rewrite), dead (no activity at all; the only state safe to archive), no_channel_data (synced to the channel, but the channel has never reported it — usually means it is not actually live; check the listing before anything else), insufficient_data (not enough signal, or this channel does not report it). READ `summary.shop` FIRST. If it says no_channel_traffic, the whole shop is barely being served and no per-listing state means anything yet — the problem is distribution, and editing titles or images cannot fix a listing nobody is shown. Each row says which channel and store it came from — always check that before comparing two rows, since a channel product id is only unique within its own channel. ALWAYS check the coverage block before treating a missing metric as zero. Read-only. [#73dd2d]

输入参数endlimitstartstatestoreproviderworkspace

channel_opportunities

The listings wasting the most demand: proven traffic, broken conversion, ranked by how many people saw them and did not buy. This is the natural starting point for an optimisation pass — fix these before touching anything else, because the demand is already there and only the listing is in the way. Also returns per-state counts and, separately, the listings that are genuinely inert (state "dead") and therefore safe to archive. Nothing else is safe to archive. READ `shop` BEFORE acting on anything else here. If the shop as a whole is getting almost no views, safe_to_archive will be empty and top_opportunities will be thin — not because the listings are fine, but because nothing has been seen enough to judge. That is a distribution problem and no listing edit will move it. Read-only. [#7c8c30]

输入参数endstartstoreproviderworkspace

channel_coverage

Which of your connected sales channels report performance data, and which metrics each one supplies. Check this before concluding a listing has no traffic: a channel that reports nothing looks identical to a channel reporting zeros unless you look here. Also flags shops that must be RECONNECTED before performance data can flow. Read-only. [#df2820]

输入参数workspace

listing_changes

What has been changed on your listings, and whether it worked. The other half of channel_performance: that says what to fix, this says whether the last fix landed. Every shopper-visible change — title, description, images, price, search terms, variants, availability — is recorded automatically when it is made, along with the signal state that prompted it. Once the channel has finalised enough days either side, a verdict is computed on the ONE metric that change should have moved (a title is judged on click-through, not revenue). ⛔ `unmeasurable` IS THE DEFAULT VERDICT, NOT AN ERROR, and it does not mean the change had no effect. It means the data cannot support a conclusion — most often because the shop is not getting enough views for any single edit to register, in which case the answer is distribution and not more editing. Read `verdict_reason` before saying anything about a change: no_shop_traffic, window_not_final, metric_not_reported, no_baseline. `confounded` means two changes landed close enough together that neither owns the result. Do not attribute it to whichever was most recent. Read-only. Verdicts settle when read, so a window that closed since you last looked is already answered. [#a02f68]

输入参数dayskindstoreproductverdictworkspace

import_channel_catalog

Bring the products a merchant ALREADY sells on a connected sales channel into ApparelHub as TRACKED listings, so you can see their whole catalog, not just what ApparelHub made. Use it when an established seller wants to see or manage what they already sell. READ-ONLY against the channel: nothing is written to the merchant's store, and those products keep being fulfilled exactly as they are today (ApparelHub never fulfils them). Tell the merchant both of those things before you start. Listings ApparelHub created are recognised and linked to their product, not duplicated. Images stay the channel's own URLs. Available where the channel reports catalog_read: true (Shopify, WooCommerce, Wix and TikTok Shop). To check first, call list_tracked_listings(store_uuid): its `channels` list every connected channel with catalog_read and last_run, even before any import. The import runs in the background: this returns a run to poll with get_catalog_import_run every few seconds until completed or failed, then read the result with list_tracked_listings. If an import for this channel is already running, this returns THAT run (already_running: true) instead of starting another; poll it. Re-running later is safe: it updates, never duplicates, and marks listings that left the channel as removed. [#12dc8a]

输入参数workspacestore_uuid必填integration_uuid必填

get_catalog_import_run

Progress of a catalog import started with import_channel_catalog. status is queued, running, completed or failed, with counts: pages read, listings seen, created, updated, ours (listings ApparelHub made, linked to their product), removed (left the channel since the last import) and images_fetched. A failed run states `error`; what was read before it stopped is kept and nothing is marked removed on a partial pass. Poll every few seconds while queued/running. Read-only. [#f0059c]

输入参数run_uuid必填workspacestore_uuid必填

list_tracked_listings

The listings imported from a store's sales channels with import_channel_catalog, plus each channel's import state (catalog_read, last_run). Each listing is the channel's view: title, description, price, currency, channel_status (live/draft/archived/unknown), SKUs, variants and the channel's own image_url. made_in_apparelhub + product_uuid mark a listing ApparelHub created. scope "external" returns only the merchant's own listings (what they sold before ApparelHub), "ours" only ApparelHub-made ones, "all" both. TRACKED LISTINGS ARE NOT APPARELHUB PRODUCTS: you cannot sync, price-cascade, edit or fulfil them through ApparelHub, and they keep shipping exactly as today. Removed listings (gone from the channel) are hidden unless include_removed is true. Paged: limit 1-500 (default 100), offset. Read-only. [#ab1488]

输入参数limitscopeoffsetworkspacestore_uuid必填integrationinclude_removed

bind_tracked_listing

Make a tracked listing (a product the merchant already sells on their channel that ApparelHub did not make) FULFILLABLE by binding it to an ApparelHub product, so ApparelHub sends that listing's orders to the product's fulfillment provider as ordinary orders. Build the product first the normal way (their artwork on one of our blanks, variants added, synced to fulfillment), in the same store. The merchant's channel listing is NOT changed, and while bound the product cannot be synced to that channel (it would duplicate their listing). Tell the merchant both things. Every variant on the listing must map to one of the product's variants: options are auto-matched by name ('Black / Medium' -> Black, M) and variant_map supplies or overrides the rest. This tool PREVIEWS first and only binds when everything maps and the product can be made; otherwise it returns bound: false with `unmapped` (the channel variants left) and `product_variants` (the choices). Ask the merchant or choose by option names, then call again with variant_map. TikTok Shop listings carry no option names, so they always need variant_map. Find listing_uuid with list_tracked_listings (scope 'external'). [#654d67]

输入参数workspacestore_uuid必填variant_maplisting_uuid必填product_uuid必填

unbind_tracked_listing

Undo bind_tracked_listing. The listing is tracked again and its new orders are recorded as fulfilled by the merchant's own store (fulfilled_by: 'merchant'), not sent to a provider. Orders already submitted are not affected. Nothing changes on the channel. [#049adb]

输入参数workspacestore_uuid必填listing_uuid必填

list_collections

List a store's product collections (categories/groups), each with its product count and per-channel sync status. Read-only. [#1d7020]

输入参数workspacestore_uuid必填

get_collection

Get a single collection by uuid, including its member products and per-channel sync status. Read-only. [#71cbae]

输入参数workspacestore_uuid必填collection_uuid必填

create_collection

Create a new (empty) collection in a store. Provide a name (sent to the platform as the collection title) and an optional description. Add products with add_products_to_collection, then sync_collection to push it to a sales channel. [#ff2c5e]

输入参数name必填workspacestore_uuid必填description

update_collection

Update a collection's name and/or description. A name change is sent to the platform as the collection title. Editing a synced collection marks it for re-sync. [#1d73cf]

输入参数nameworkspacestore_uuid必填descriptioncollection_uuid必填

delete_collection

Delete a collection. If it is synced to any sales channel, the platform unsyncs it there first. The member products are NOT deleted, only the grouping. [#afdbfe]

输入参数workspacestore_uuid必填collection_uuid必填

add_products_to_collection

Add one or more products (by uuid) to a collection. The products must already be associated with the store. If the collection is synced to a channel, the products are added there too. [#e8080a]

输入参数workspacestore_uuid必填product_uuids必填collection_uuid必填

remove_product_from_collection

Remove a single product from a collection (the product itself is not deleted). If the collection is synced to a channel, the product is removed there too. [#c2fc5a]

输入参数workspacestore_uuid必填product_uuid必填collection_uuid必填

sync_collection

Sync a collection to a sales channel (creates/updates the channel-side category and places all products in it that are already synced there). integration_uuid selects which channel; not all channels support collections (e.g. TikTok Shop), which returns a clear "collections_unsupported" error. [#7f246a]

输入参数workspacestore_uuid必填collection_uuid必填integration_uuid必填

copy_product_to_workspace

Copy a product into another workspace (agency accounts). Non-destructive: the original is untouched and the copy lands as an unsynced DRAFT (no store mapping, fresh variants). Use list_my_workspaces to get the destination workspace uuid. If the product lives in a non-Default workspace, pass source_workspace too. [#d046a8]

输入参数product_uuid必填source_workspacedestination_workspace必填

move_product_to_workspace

Move a product to another workspace (agency accounts) by re-stamping its workspace. Fails with a 409 (blocking list) if the product is mapped to a store or has orders — copy it instead in that case (check first with check_product_move). Use list_my_workspaces for the destination uuid; pass source_workspace if the product is not in your Default workspace. [#f36e77]

输入参数product_uuid必填source_workspacedestination_workspace必填

check_product_move

Dry run: report whether a product can be MOVED to another workspace, without changing anything. Returns {eligible, blockers} — a non-empty blockers list (e.g. asset_in_use, asset_has_orders, forbidden_source/destination) means move would fail, so copy instead. Read-only. [#81f916]

输入参数product_uuid必填source_workspacedestination_workspace必填

copy_design_to_workspace

Copy a generated design image into another workspace (agency accounts). Non-destructive: the original stays put and the copy gets its own duplicated image file. Use list_my_workspaces for the destination uuid; pass source_workspace if the design is not in your Default workspace. [#3090dc]

输入参数design_uuid必填source_workspacedestination_workspace必填

move_design_to_workspace

Move a generated design image to another workspace (agency accounts). Fails with a 409 (blocking list) if a product that uses the design is mapped to a store or has orders — copy it instead in that case (check first with check_design_move). Use list_my_workspaces for the destination uuid; pass source_workspace if the design is not in your Default workspace. [#8b8b8a]

输入参数design_uuid必填source_workspacedestination_workspace必填

check_design_move

Dry run: report whether a generated design can be MOVED to another workspace, without changing anything. Returns {eligible, blockers} — a non-empty blockers list (a product using the design is in use, or forbidden_source/destination) means move would fail, so copy instead. Read-only. [#1e988c]

输入参数design_uuid必填source_workspacedestination_workspace必填

create_workspace

Create a new workspace in the account (agency / Enterprise). Name must be unique within the account. Needs an account-wide key; a tier without the agency feature gets feature_unavailable. Returns the new workspace uuid. [#51f6a7]

输入参数name必填

update_workspace

Rename a workspace or archive/unarchive it (agency / Enterprise). The Default workspace cannot be archived. Needs an account-wide key. [#e8ebf4]

输入参数namearchivedworkspace_uuid必填

check_workspace_deletion

Dry run: preview deleting a workspace (agency / Enterprise) — the stores that would move to the Default workspace and the members whose assignment would be revoked. Changes nothing. Read-only. [#bcfd4e]

输入参数workspace_uuid必填

delete_workspace

Delete a workspace (agency / Enterprise). Its stores are reassigned to the Default workspace and member assignments revoked first. The Default workspace cannot be deleted. Preview with check_workspace_deletion. Needs an account-wide key. [#c566a1]

输入参数workspace_uuid必填

assign_workspace_member

Assign an account member to a workspace with a role, or update their existing role (agency / Enterprise). The target must already be a member of the account (invite_member first). Needs an account-wide key. [#5ec6df]

输入参数role必填user_public_id必填workspace_uuid必填

unassign_workspace_member

Revoke a member's assignment to a workspace (agency / Enterprise). The account owner cannot be unassigned from the Default workspace. Needs an account-wide key. [#7d3ad6]

输入参数user_public_id必填workspace_uuid必填

move_store_to_workspace

Move a store into one of the account's workspaces (agency / Enterprise). This changes who can access the store, so it needs account owner/admin + an account-wide key. [#9dde84]

输入参数store_uuid必填workspace_uuid必填

get_account_overview

Account name, your role, whether the agency feature is enabled, and seat accounting (used / included / billable). Agency / Enterprise; needs an account-wide key. Read-only. [#bf5472]

无需输入参数。

get_role_matrix

The workspace roles and the role → capability matrix, so you can pick a role before assigning a member. Agency / Enterprise; needs an account-wide key. Read-only. [#894f5c]

无需输入参数。

list_account_members

List account members and their per-workspace assignments (agency / Enterprise). Filterable + paginated. Needs an account-wide key. Read-only. [#b3bd65]

输入参数qpageper_pageaccount_rolein_workspaceworkspace_role

remove_member

Remove a member from the account entirely (agency / Enterprise): all their workspace assignments are revoked and seat billing synced. The account owner cannot be removed. Needs an account-wide key. [#e5169b]

输入参数user_public_id必填

invite_member

Invite someone to the account by email, optionally pre-assigning a workspace + role (agency / Enterprise). An existing ApparelHub user is auto-added immediately; a new email gets a pending invite. Needs an account-wide key. [#d3c424]

输入参数roleemail必填account_roleworkspace_uuid

list_invites

List the account’s pending invites, each with the target workspace name and a copyable accept URL (agency / Enterprise). Needs an account-wide key. Read-only. [#0cf62c]

无需输入参数。

revoke_invite

Revoke a pending invite so its token can no longer be used (agency / Enterprise). Needs an account-wide key. [#8a3ee8]

输入参数invite_uuid必填

resend_invite

Re-send a pending invite’s email with the SAME token and extend its TTL 14 days (agency / Enterprise). Needs an account-wide key. [#4dd71c]

输入参数invite_uuid必填

accept_invite

Accept a pending invite by token. The authenticated key-holder’s email must match the invite. Works on any tier and with a workspace-scoped key (the invitee side). Returns the account + workspace you were added to. [#e7e5ee]

输入参数token必填

get_store_settings

Read a store's fulfillment workflow + notification settings: fulfillment_mode (auto/confirm/review), approval_authority (human/agent/rules), the margin / high-value / first-time-customer hold guardrails, auto-reconcile, and payment settings. Read-only. [#3b3cd0]

输入参数workspacestore_uuid必填

update_store_settings

Update a store's fulfillment workflow / notification settings. Only the fields you pass are changed. fulfillment_mode: "auto" (auto-pilot: paid -> draft -> auto-confirm -> production), "confirm" (auto-draft, you confirm each order), "review" (held before submission for approval). The hold_* guardrails escalate an otherwise-auto/confirm order to a pre-submission review. Set hold_orders_above_amount / hold_below_margin_pct to null to disable that guardrail. hold_channel_risk_review is ON by default and OVERRIDES fulfillment_mode (including "auto"): an order the sales channel is reviewing is never sent to fulfillment while it may still be voided. [#095099]

输入参数workspacestore_uuid必填fulfillment_modeapproval_authoritynotify_on_shipmentnotify_on_new_orderauto_reconcile_ordershold_below_margin_pctauto_fulfill_on_paymenthold_on_negative_marginhold_channel_risk_reviewhold_first_time_customer另有 3 个

create_store

Create a new ApparelHub store. Only a name is required. The store starts CLOSED — connect a fulfillment provider (Printful/Printify), then call activate_store to make it ACTIVE. In an agency account pass workspace=<uuid> to create it in a specific client workspace. [#9d5cbc]

输入参数logoname必填workspacedescription

archive_store

Archive a store (use instead of delete for stores with order history — order records are kept for accounting, but the store is hidden from the default listing and stops ingesting new orders). Restore it later with unarchive_store. Set disconnect_provider=true to also disconnect every connected fulfillment provider and remove its stored credentials. [#b85c96]

输入参数workspacestore_uuid必填disconnect_provider

unarchive_store

Restore an archived store. It comes back as CLOSED (or ACTIVE if a fulfillment provider is still connected); if it landed CLOSED, connect a provider and call activate_store to reopen it. [#468f04]

输入参数workspacestore_uuid必填

activate_store

Activate a store so it can list products and ingest orders. Requires at least one fulfillment provider (e.g. Printful) to be connected first — otherwise this fails. Use after create_store or unarchive_store once a provider is connected. [#87c31f]

输入参数workspacestore_uuid必填

record_order_payment

Record a manual payment on an order that is awaiting payment (payment_status="pending"). Use payment_method="sales_channel" for an order already paid on its storefront (Shopify/WooCommerce/Wix — the channel is the source of payment), or "stripe" for an order taken through ApparelHub's own card flow. This marks the order paid; it does not charge a card. [#81d42b]

输入参数amountworkspaceorder_uuid必填payment_method必填

mark_order_no_payment

Mark an order as having no payment expected (e.g. a free / comp / sample order). Sets its payment status to "no payment". Use when an order should proceed without a recorded payment. [#23c7f4]

输入参数workspaceorder_uuid必填

set_order_payment_method

Change the recorded payment method on an order that already has a payment recorded (e.g. correct "stripe" to "sales_channel"). This is a bookkeeping label change; it does not move any money. [#588a7f]

输入参数workspaceorder_uuid必填payment_method必填

sync_orders

Import orders that never reached ApparelHub and refresh order status from fulfillment providers. For each connected Shopify shop it imports recent orders a webhook should have delivered, scoped to orders placed after the shop was connected and excluding cancelled or already-fulfilled ones (an imported paid order is sent to the fulfillment provider like a live one). Pass store_uuid to sync one store; omit it for all stores. Read `shopify[]`: `processed` imported now, `not_eligible_reasons` why others were left alone, `truncated` means run again, `outcome: "auth_revoked"` carries a reconnect_url the merchant must open. Report `errors[]`. [#e208cf]

输入参数workspacestore_uuid

estimate_order_costs

Estimate production + shipping + tax + total for an order WITHOUT creating it (read-only against the fulfillment provider, no order placed). Give the store, the recipient, and the variants + quantities. Use to preview landed cost before placing an order. AVAILABLE FOR PRINTFUL AND GELATO ONLY: Printify offers no pre-order estimate, so a Printify-fulfilled store returns a refusal rather than a number — do not retry it, and do not present a cross-provider landed-cost comparison that silently omits Printify. Both country_code AND address1 are required; the platform rejects the request without a street address. The variants must already be synced to the fulfillment provider. [#a2bd48]

输入参数items必填currencyrecipient必填workspacestore_uuid必填

get_orders_summary

Aggregated stats for the orders dashboard: counts of orders pending approval / awaiting payment / in fulfillment / shipped today, plus today's revenue and profit, and a per-store breakdown. Read-only. [#88d8a4]

输入参数workspace

list_pending_fulfillments

List orders in a store that have pending fulfillment data needing attention (used by the reconciliation view). Read-only. Use to find orders that stalled before reaching the provider. [#80ba1e]

输入参数workspacestore_uuid必填

archive_product

Archive a product: unsync it from every connected sales channel and its fulfillment provider, then hide it. Fails (returns blocking_orders) if any pending order still references its variants — cancel or fulfill those first. Restore it later with restore_product. Use archive rather than delete_product when a product has order history. [#4b1462]

输入参数workspaceproduct_uuid必填

restore_product

Restore a previously archived product (sets it back to active). It is not re-synced to any sales channel automatically — sync it again afterward if you want it live. Use to undo archive_product. [#8d20f7]

输入参数workspaceproduct_uuid必填

get_api_reference

Discover the full ApparelHub agent API: returns a compact index of every endpoint (path, methods, summary) from the live OpenAPI spec. Use this when no dedicated tool covers what you need, then call it with api_request. Read-only. Also returns `connector`, which reports what THIS server actually serves: its version, and the name of every tool. **If a capability seems missing, check that first.** A tool listed in `connector.tool_names` that you cannot call means your own tool list is stale, not that the tool is unbuilt — say so and tell the user to reconnect, rather than reporting the feature as missing. [#5dc40c]

输入参数filter

api_request

Escape hatch: make an authenticated request to any ApparelHub agent API endpoint under /agents/v1, as the connected account. PREFER a dedicated tool when one exists (they return clean, guarded results) — use this only for capabilities no tool covers. Call get_api_reference first to find the right path. `path` is relative (e.g. "orders", "store/<uuid>/settings"); no full URLs. Scoped to the account's own permissions. [#48e53d]

输入参数bodypath必填querymethod必填workspace

版本历史

9
  1. v0.21.1最新Nov 14, 2026
  2. v0.20.1Nov 14, 2026
  3. v0.20.0Oct 26, 2026
  4. v0.19.1Oct 23, 2026
  5. v0.19.0Oct 23, 2026
  6. v0.18.0Oct 22, 2026
  7. v0.16.2Oct 20, 2026
  8. v0.15.3Oct 17, 2026
  9. v0.15.2Sep 29, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分