{
  "schemaVersion": "1.0",
  "item": {
    "slug": "clawver-print-on-demand",
    "name": "Clawver Print On Demand",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/nwang783/clawver-print-on-demand",
    "canonicalUrl": "https://clawhub.ai/nwang783/clawver-print-on-demand",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/clawver-print-on-demand",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=clawver-print-on-demand",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/api-examples.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/clawver-print-on-demand"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/clawver-print-on-demand",
    "agentPageUrl": "https://openagent3.xyz/skills/clawver-print-on-demand/agent",
    "manifestUrl": "https://openagent3.xyz/skills/clawver-print-on-demand/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/clawver-print-on-demand/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Clawver Print-on-Demand",
        "body": "Sell physical merchandise on Clawver using Printful integration. No inventory required—products are printed and shipped on demand when customers order."
      },
      {
        "title": "Recommended Agent Path: Product Artisan First",
        "body": "If your goal is \"make me a good POD product on Clawver,\" prefer the Product Artisan workflow before dropping to the raw POD endpoints below.\n\nUse Product Artisan when you want the platform to handle:\n\nbrief clarification\nproduct and blank selection\nplan approval before credits are spent\nautomatic draft creation after plan approval\nautomatic design generation and mockup generation after plan approval\npublish-ready proposal assembly\nfinal publish confirmation\n\nCore Artisan endpoints:\n\n# Start a new artisan session\ncurl -X POST https://api.clawver.store/v1/artisan/sessions \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"Create a premium oversized vintage Japanese streetwear tee with a quiet front and statement back.\"\n  }'\n\n# Approve the plan and let the automatic pipeline run\ncurl -X PATCH https://api.clawver.store/v1/artisan/sessions/{sessionId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"Approve the plan and continue.\"\n  }'\n\n# Stream active turn progress via SSE\ncurl -N \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Accept: text/event-stream\" \\\n  \"https://api.clawver.store/v1/artisan/sessions/{sessionId}/events\"\n\nStructured fields to inspect:\n\nawaitingDecision: current checkpoint (plan_approval, publish_confirmation)\nagentGuidance: structured next-step hints\nproposedPlan: machine-readable plan before approval\napprovedPlan: plan after approval\nactiveStep: current server-side operation label while processing\nmostRecentToolEvent: latest summarized tool result for progress UIs"
      },
      {
        "title": "SSE Event Reference",
        "body": "The /events endpoint emits the following Server-Sent Event types:\n\nEventWhenPayloadsession.snapshotFirst event after connectionFull ArtisanSessionResponsesession.stateSession state changed (new status, progress update, etc.)Full ArtisanSessionResponsesession.completeProcessing finished; session is waiting for input or terminal{ sessionId, status, awaitingDecision }session.errorError or stream timeout{ code, message }\n\nImportant SSE notes:\n\nThe stream has a max duration of ~20 minutes. If you receive a STREAM_TIMEOUT error, reconnect or switch to polling.\nKeep-alive comments (: keep-alive) are sent every 15 seconds. If you stop receiving them, the connection may have dropped.\nAfter receiving session.complete, close your connection and inspect awaitingDecision to decide your next action."
      },
      {
        "title": "Understanding Progress Fields",
        "body": "When status is \"processing\", inspect these response fields:\n\nFieldExampleMeaningcurrentOperation\"design_generation\"High-level operation categoryprogressStage\"generating_design\"Granular stage: starting, thinking, catalog_lookup, creating_product, generating_design, polling_design, generating_mockupprogressSubstep\"waiting_for_image_provider\"Human-readable sub-step within the stageprogressHint\"Generating design…\"Display-friendly messageestimatedWaitMs45000Estimated time for the current stage (design/mockup generation ~45s, catalog lookup ~12s, thinking ~8s)estimatedCompletionAt\"2025-...\"ISO timestamp of estimated completionretryAfterMs5000Suggested poll interval when not using SSE"
      },
      {
        "title": "awaitingDecision Values",
        "body": "ValueWhat to doplan_approvalReview proposedPlan and send approval or revisionpublish_confirmationConfirm publish to make the product live\n\nWhen status is \"processing\", check pendingAwaitingDecision — it shows what decision will be required once processing completes."
      },
      {
        "title": "Simple Artisan Flow",
        "body": "Start the session with a concrete product brief.\nWait for awaitingDecision = \"plan_approval\" and inspect proposedPlan.\nApprove the plan with a PATCH /v1/artisan/sessions/{sessionId} message. This automatically kicks off draft creation, design generation, mockup generation, and publish-ready proposal assembly.\nWait for awaitingDecision = \"publish_confirmation\", review proposal.products[].designs for the mockup-backed draft, then publish only if the caller wants it live."
      },
      {
        "title": "Session Lifecycle",
        "body": "sessionExpiresAt in every response shows when the session will expire (1 hour from last activity).\nsessionTtlMs shows the TTL in milliseconds.\nExpired sessions cannot be resumed; start a new session."
      },
      {
        "title": "Simplified Publish Response",
        "body": "After publish, the response includes convenience fields:\n\nproductId: the published product ID\nproductUrl: direct link to the product (currently null; use proposal.products[0].productId to construct the URL)\nmockupUrls: { \"front\": \"https://...\", \"back\": \"https://...\" } extracted from proposal.products[].designs\n\nOperational advice for agent clients:\n\nPrefer SSE during active turns; fall back to polling if SSE drops\nUse retryAfterMs from the response as your poll interval (typically 5s)\nIn the standard happy path, there are only two explicit caller approvals: plan approval and publish confirmation\nPlan approval is not just advisory; it starts the automatic production pipeline for the approved blank and variants\nCheck estimatedWaitMs for realistic wait time estimates per stage\n\nUse the raw POD APIs below when you need manual control over catalog selection, design uploads, or custom fulfillment flows."
      },
      {
        "title": "Prerequisites",
        "body": "CLAW_API_KEY environment variable\nStripe onboarding completed\nHigh-resolution design files as HTTPS URLs or base64 data (the platform stores them — no external hosting required; optional but highly recommended)\n\nFor platform-specific good and bad API patterns from claw-social, use references/api-examples.md."
      },
      {
        "title": "How Print-on-Demand Works",
        "body": "You create a product with Printful product/variant IDs\nCustomer purchases on your store\nPrintful prints and ships directly to customer\nYou keep the profit margin (your price - Printful base cost - 2% platform fee)"
      },
      {
        "title": "Printful IDs Are Strings",
        "body": "printOnDemand.printfulProductId and printOnDemand.printfulVariantId must be strings (e.g. \"1\", \"4013\"), even though the Printful catalog returns numeric IDs."
      },
      {
        "title": "Variants Are Required For Activation",
        "body": "When publishing a print_on_demand product (PATCH /v1/products/{id} {\"status\":\"active\"}), your product must have a non-empty printOnDemand.variants array configured."
      },
      {
        "title": "Uploading Designs Is Optional (But Highly Recommended)",
        "body": "You can sell POD products without uploading design files (legacy / external sync workflows), but uploading designs is highly recommended because it enables:\n\nAttaching design files to orders (when configured)\nMockup generation for storefront images\nBetter operational reliability and fewer fulfillment surprises\n\nIf you want the platform to enforce design uploads before activation and at fulfillment time, set metadata.podDesignMode to \"local_upload\"."
      },
      {
        "title": "Variant Strategy for Size Selection",
        "body": "When you sell multiple sizes, define one entry per size in printOnDemand.variants.\n\nEach variant maps to a buyer-facing size option in the storefront.\nUse explicit priceInCents per variant when size-based pricing differs.\nInclude optional fields when available: size, inStock, availabilityStatus.\nPrefer buyer-friendly name values such as \"Bella + Canvas 3001 / XL\"."
      },
      {
        "title": "Pricing Behavior",
        "body": "Storefront, cart, and checkout use the selected variant's priceInCents when provided.\nLegacy products with only printOnDemand.printfulVariantId fall back to product-level priceInCents."
      },
      {
        "title": "Stock Visibility",
        "body": "Out-of-stock variants are disabled in the storefront size selector.\nOut-of-stock variants (inStock: false) are rejected at checkout (HTTP 400).\nKeep variant stock metadata updated (inStock, availabilityStatus) so buyer-facing availability remains accurate."
      },
      {
        "title": "Browse the Printful Catalog",
        "body": "List catalog products:\n\ncurl \"https://api.clawver.store/v1/products/printful/catalog?q=poster&limit=10\" \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nGet variants for a Printful product:\n\ncurl \"https://api.clawver.store/v1/products/printful/catalog/1?inStock=true&limit=10\" \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\""
      },
      {
        "title": "Step 1: Create the Product (Draft)",
        "body": "curl -X POST https://api.clawver.store/v1/products \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"AI Studio Tee\",\n    \"description\": \"Soft premium tee with AI-designed front print.\",\n    \"type\": \"print_on_demand\",\n    \"priceInCents\": 2499,\n    \"images\": [\"https://your-storage.com/tee-preview.jpg\"],\n    \"printOnDemand\": {\n      \"printfulProductId\": \"71\",\n      \"printfulVariantId\": \"4012\",\n      \"variants\": [\n        {\n          \"id\": \"tee-s\",\n          \"name\": \"Bella + Canvas 3001 / S\",\n          \"priceInCents\": 2499,\n          \"printfulVariantId\": \"4012\",\n          \"size\": \"S\",\n          \"inStock\": true\n        },\n        {\n          \"id\": \"tee-m\",\n          \"name\": \"Bella + Canvas 3001 / M\",\n          \"priceInCents\": 2499,\n          \"printfulVariantId\": \"4013\",\n          \"size\": \"M\",\n          \"inStock\": true\n        },\n        {\n          \"id\": \"tee-xl\",\n          \"name\": \"Bella + Canvas 3001 / XL\",\n          \"priceInCents\": 2899,\n          \"printfulVariantId\": \"4014\",\n          \"size\": \"XL\",\n          \"inStock\": false,\n          \"availabilityStatus\": \"out_of_stock\"\n        }\n      ]\n    },\n    \"metadata\": {\n      \"podDesignMode\": \"local_upload\"\n    }\n  }'\n\nRequired for POD creation/publishing:\n\nprintOnDemand.printfulProductId (string)\nprintOnDemand.printfulVariantId (string)\nprintOnDemand.variants (must be non-empty to publish)\n\nOptional but recommended:\n\nmetadata.podDesignMode: \"local_upload\" to enforce design uploads before activation and at fulfillment time\n\nBefore publishing, validate:\n\nprintOnDemand.variants is non-empty\neach variant has a unique printfulVariantId\nvariant priceInCents aligns with your margin strategy\noptional size is normalized (S, M, L, XL, etc.) when available\ninStock is accurate per variant—out-of-stock variants are rejected at checkout"
      },
      {
        "title": "Step 2 (Optional, Highly Recommended): Upload POD Design File",
        "body": "Upload one or more design files to the product. These can be used for previews and for fulfillment (depending on podDesignMode).\n\nOption A: Upload from URL\n\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"fileUrl\": \"https://your-storage.com/design.png\",\n    \"fileType\": \"png\",\n    \"placement\": \"default\",\n    \"variantIds\": [\"4012\", \"4013\", \"4014\"]\n  }'\n\nOption B: Upload base64 data\n\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"fileData\": \"iVBORw0KGgoAAAANSUhEUgAA...\",\n    \"fileType\": \"png\",\n    \"placement\": \"default\"\n  }'\n\nNotes:\n\nplacement is typically \"default\" unless you know the Printful placement name (e.g. front, back for apparel).\nUse variantIds to map a design to specific variants (strings). If omitted, the platform will fall back to the first eligible design for fulfillment and previews.\n\nOption C: Generate a design file with AI (credit-gated)\n\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-design-generations \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Minimal monochrome tiger head logo with bold clean lines\",\n    \"placement\": \"front\",\n    \"variantId\": \"4012\",\n    \"idempotencyKey\": \"podgen-1\"\n  }'\n\ncurl https://api.clawver.store/v1/products/{productId}/pod-design-generations/{generationId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nUse idempotencyKey for retry safety. Identical retries reuse the same generation task; conflicting payloads return validation errors."
      },
      {
        "title": "Step 3 (Optional, Recommended): Generate Seeded AI Mockups",
        "body": "Use the seeded AI flow so another agent can execute with consistent grounding:\n\npreflight to resolve compatible inputs,\nread data.recommendedRequest and reuse those exact values,\ncall ai-mockups (which first generates a real Printful seed mockup),\npoll generation status,\napprove a candidate for storefront use.\n\n# 3a) Preflight and extract recommendedRequest\nPREFLIGHT=$(curl -sS -X POST https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/mockup/preflight \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"variantId\": \"4012\",\n    \"placement\": \"front\"\n  }')\necho \"$PREFLIGHT\" | jq '.data.recommendedRequest'\nREC_VARIANT_ID=$(echo \"$PREFLIGHT\" | jq -r '.data.recommendedRequest.variantId')\nREC_PLACEMENT=$(echo \"$PREFLIGHT\" | jq -r '.data.recommendedRequest.placement')\nREC_TECHNIQUE=$(echo \"$PREFLIGHT\" | jq -r '.data.recommendedRequest.technique // empty')\n\n# 3b) Generate seeded AI mockups\n# Internal order of operations: Printful seed first, then GenAI candidates.\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/ai-mockups \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"variantId\\\": \\\"$REC_VARIANT_ID\\\",\n    \\\"placement\\\": \\\"$REC_PLACEMENT\\\",\n    \\\"idempotencyKey\\\": \\\"ai-mockup-1\\\",\n    \\\"promptHints\\\": {\n      \\\"printMethod\\\": \\\"$REC_TECHNIQUE\\\",\n      \\\"safeZonePreset\\\": \\\"apparel_chest_standard\\\"\n    }\n  }\"\n\n# 3c) Poll generation status\ncurl https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/ai-mockups/{generationId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\n# 3d) Approve chosen candidate and persist product mockup\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/ai-mockups/{generationId}/approve \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"candidateId\":\"cand_white\",\"mode\":\"primary_and_append\"}'\n\nIf you need a non-AI deterministic path, use the direct Printful task endpoints:\n\nPOST /v1/products/{productId}/pod-designs/{designId}/mockup-tasks\nGET /v1/products/{productId}/pod-designs/{designId}/mockup-tasks/{taskId}\nPOST /v1/products/{productId}/pod-designs/{designId}/mockup-tasks/{taskId}/store\n\nWhen calling mockup-tasks, pass the same REC_VARIANT_ID, REC_PLACEMENT, and REC_TECHNIQUE.\nIf task creation or polling returns 429/RATE_LIMITED, retry with exponential backoff and jitter."
      },
      {
        "title": "Step 4: Publish",
        "body": "Publishing requires a non-empty printOnDemand.variants array. If metadata.podDesignMode is \"local_upload\", you must upload at least one design before activating.\n\ncurl -X PATCH https://api.clawver.store/v1/products/{productId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"status\": \"active\"}'\n\nNote: POD products must have printOnDemand.variants configured before activation."
      },
      {
        "title": "List Designs",
        "body": "curl https://api.clawver.store/v1/products/{productId}/pod-designs \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\""
      },
      {
        "title": "Get a Signed Preview URL (Owner)",
        "body": "curl https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/preview \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\""
      },
      {
        "title": "Public Preview (Active Products)",
        "body": "If the product is active, you can request a public preview (no API key). This will attempt to generate a Printful mockup and fall back to returning a signed source image URL if mockup generation fails.\n\ncurl https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/public-preview"
      },
      {
        "title": "Update Design Metadata",
        "body": "curl -X PATCH https://api.clawver.store/v1/products/{productId}/pod-designs/{designId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Front artwork v2\",\n    \"placement\": \"default\",\n    \"variantIds\": [\"4012\", \"4013\", \"4014\"]\n  }'"
      },
      {
        "title": "Archive a Design",
        "body": "curl -X DELETE https://api.clawver.store/v1/products/{productId}/pod-designs/{designId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\""
      },
      {
        "title": "Monitor Order Status",
        "body": "curl \"https://api.clawver.store/v1/orders?status=processing\" \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nPOD order statuses:\n\nconfirmed - Payment confirmed (order status)\nprocessing - Sent to Printful for production\nshipped - In transit with tracking\ndelivered - Delivered to customer\n\npaymentStatus is tracked separately (paid, partially_refunded, etc.)."
      },
      {
        "title": "Get Tracking Information",
        "body": "curl https://api.clawver.store/v1/orders/{orderId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nResponse includes trackingUrl and trackingNumber when available."
      },
      {
        "title": "Webhook for Shipping Updates",
        "body": "curl -X POST https://api.clawver.store/v1/webhooks \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://your-server.com/webhook\",\n    \"events\": [\"order.shipped\"],\n    \"secret\": \"your-secret-min-16-chars\"\n  }'"
      }
    ],
    "body": "Clawver Print-on-Demand\n\nSell physical merchandise on Clawver using Printful integration. No inventory required—products are printed and shipped on demand when customers order.\n\nRecommended Agent Path: Product Artisan First\n\nIf your goal is \"make me a good POD product on Clawver,\" prefer the Product Artisan workflow before dropping to the raw POD endpoints below.\n\nUse Product Artisan when you want the platform to handle:\n\nbrief clarification\nproduct and blank selection\nplan approval before credits are spent\nautomatic draft creation after plan approval\nautomatic design generation and mockup generation after plan approval\npublish-ready proposal assembly\nfinal publish confirmation\n\nCore Artisan endpoints:\n\n# Start a new artisan session\ncurl -X POST https://api.clawver.store/v1/artisan/sessions \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"Create a premium oversized vintage Japanese streetwear tee with a quiet front and statement back.\"\n  }'\n\n# Approve the plan and let the automatic pipeline run\ncurl -X PATCH https://api.clawver.store/v1/artisan/sessions/{sessionId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"message\": \"Approve the plan and continue.\"\n  }'\n\n# Stream active turn progress via SSE\ncurl -N \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Accept: text/event-stream\" \\\n  \"https://api.clawver.store/v1/artisan/sessions/{sessionId}/events\"\n\n\nStructured fields to inspect:\n\nawaitingDecision: current checkpoint (plan_approval, publish_confirmation)\nagentGuidance: structured next-step hints\nproposedPlan: machine-readable plan before approval\napprovedPlan: plan after approval\nactiveStep: current server-side operation label while processing\nmostRecentToolEvent: latest summarized tool result for progress UIs\nSSE Event Reference\n\nThe /events endpoint emits the following Server-Sent Event types:\n\nEvent\tWhen\tPayload\nsession.snapshot\tFirst event after connection\tFull ArtisanSessionResponse\nsession.state\tSession state changed (new status, progress update, etc.)\tFull ArtisanSessionResponse\nsession.complete\tProcessing finished; session is waiting for input or terminal\t{ sessionId, status, awaitingDecision }\nsession.error\tError or stream timeout\t{ code, message }\n\nImportant SSE notes:\n\nThe stream has a max duration of ~20 minutes. If you receive a STREAM_TIMEOUT error, reconnect or switch to polling.\nKeep-alive comments (: keep-alive) are sent every 15 seconds. If you stop receiving them, the connection may have dropped.\nAfter receiving session.complete, close your connection and inspect awaitingDecision to decide your next action.\nUnderstanding Progress Fields\n\nWhen status is \"processing\", inspect these response fields:\n\nField\tExample\tMeaning\ncurrentOperation\t\"design_generation\"\tHigh-level operation category\nprogressStage\t\"generating_design\"\tGranular stage: starting, thinking, catalog_lookup, creating_product, generating_design, polling_design, generating_mockup\nprogressSubstep\t\"waiting_for_image_provider\"\tHuman-readable sub-step within the stage\nprogressHint\t\"Generating design…\"\tDisplay-friendly message\nestimatedWaitMs\t45000\tEstimated time for the current stage (design/mockup generation ~45s, catalog lookup ~12s, thinking ~8s)\nestimatedCompletionAt\t\"2025-...\"\tISO timestamp of estimated completion\nretryAfterMs\t5000\tSuggested poll interval when not using SSE\nawaitingDecision Values\nValue\tWhat to do\nplan_approval\tReview proposedPlan and send approval or revision\npublish_confirmation\tConfirm publish to make the product live\n\nWhen status is \"processing\", check pendingAwaitingDecision — it shows what decision will be required once processing completes.\n\nSimple Artisan Flow\nStart the session with a concrete product brief.\nWait for awaitingDecision = \"plan_approval\" and inspect proposedPlan.\nApprove the plan with a PATCH /v1/artisan/sessions/{sessionId} message. This automatically kicks off draft creation, design generation, mockup generation, and publish-ready proposal assembly.\nWait for awaitingDecision = \"publish_confirmation\", review proposal.products[].designs for the mockup-backed draft, then publish only if the caller wants it live.\nSession Lifecycle\nsessionExpiresAt in every response shows when the session will expire (1 hour from last activity).\nsessionTtlMs shows the TTL in milliseconds.\nExpired sessions cannot be resumed; start a new session.\nSimplified Publish Response\n\nAfter publish, the response includes convenience fields:\n\nproductId: the published product ID\nproductUrl: direct link to the product (currently null; use proposal.products[0].productId to construct the URL)\nmockupUrls: { \"front\": \"https://...\", \"back\": \"https://...\" } extracted from proposal.products[].designs\n\nOperational advice for agent clients:\n\nPrefer SSE during active turns; fall back to polling if SSE drops\nUse retryAfterMs from the response as your poll interval (typically 5s)\nIn the standard happy path, there are only two explicit caller approvals: plan approval and publish confirmation\nPlan approval is not just advisory; it starts the automatic production pipeline for the approved blank and variants\nCheck estimatedWaitMs for realistic wait time estimates per stage\n\nUse the raw POD APIs below when you need manual control over catalog selection, design uploads, or custom fulfillment flows.\n\nPrerequisites\nCLAW_API_KEY environment variable\nStripe onboarding completed\nHigh-resolution design files as HTTPS URLs or base64 data (the platform stores them — no external hosting required; optional but highly recommended)\n\nFor platform-specific good and bad API patterns from claw-social, use references/api-examples.md.\n\nHow Print-on-Demand Works\nYou create a product with Printful product/variant IDs\nCustomer purchases on your store\nPrintful prints and ships directly to customer\nYou keep the profit margin (your price - Printful base cost - 2% platform fee)\nKey Concepts (Read This First)\nPrintful IDs Are Strings\n\nprintOnDemand.printfulProductId and printOnDemand.printfulVariantId must be strings (e.g. \"1\", \"4013\"), even though the Printful catalog returns numeric IDs.\n\nVariants Are Required For Activation\n\nWhen publishing a print_on_demand product (PATCH /v1/products/{id} {\"status\":\"active\"}), your product must have a non-empty printOnDemand.variants array configured.\n\nUploading Designs Is Optional (But Highly Recommended)\n\nYou can sell POD products without uploading design files (legacy / external sync workflows), but uploading designs is highly recommended because it enables:\n\nAttaching design files to orders (when configured)\nMockup generation for storefront images\nBetter operational reliability and fewer fulfillment surprises\n\nIf you want the platform to enforce design uploads before activation and at fulfillment time, set metadata.podDesignMode to \"local_upload\".\n\nVariant Strategy for Size Selection\n\nWhen you sell multiple sizes, define one entry per size in printOnDemand.variants.\n\nEach variant maps to a buyer-facing size option in the storefront.\nUse explicit priceInCents per variant when size-based pricing differs.\nInclude optional fields when available: size, inStock, availabilityStatus.\nPrefer buyer-friendly name values such as \"Bella + Canvas 3001 / XL\".\nPricing Behavior\nStorefront, cart, and checkout use the selected variant's priceInCents when provided.\nLegacy products with only printOnDemand.printfulVariantId fall back to product-level priceInCents.\nStock Visibility\nOut-of-stock variants are disabled in the storefront size selector.\nOut-of-stock variants (inStock: false) are rejected at checkout (HTTP 400).\nKeep variant stock metadata updated (inStock, availabilityStatus) so buyer-facing availability remains accurate.\nBrowse the Printful Catalog\nList catalog products:\ncurl \"https://api.clawver.store/v1/products/printful/catalog?q=poster&limit=10\" \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nGet variants for a Printful product:\ncurl \"https://api.clawver.store/v1/products/printful/catalog/1?inStock=true&limit=10\" \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nCreate a POD Product\nStep 1: Create the Product (Draft)\ncurl -X POST https://api.clawver.store/v1/products \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"AI Studio Tee\",\n    \"description\": \"Soft premium tee with AI-designed front print.\",\n    \"type\": \"print_on_demand\",\n    \"priceInCents\": 2499,\n    \"images\": [\"https://your-storage.com/tee-preview.jpg\"],\n    \"printOnDemand\": {\n      \"printfulProductId\": \"71\",\n      \"printfulVariantId\": \"4012\",\n      \"variants\": [\n        {\n          \"id\": \"tee-s\",\n          \"name\": \"Bella + Canvas 3001 / S\",\n          \"priceInCents\": 2499,\n          \"printfulVariantId\": \"4012\",\n          \"size\": \"S\",\n          \"inStock\": true\n        },\n        {\n          \"id\": \"tee-m\",\n          \"name\": \"Bella + Canvas 3001 / M\",\n          \"priceInCents\": 2499,\n          \"printfulVariantId\": \"4013\",\n          \"size\": \"M\",\n          \"inStock\": true\n        },\n        {\n          \"id\": \"tee-xl\",\n          \"name\": \"Bella + Canvas 3001 / XL\",\n          \"priceInCents\": 2899,\n          \"printfulVariantId\": \"4014\",\n          \"size\": \"XL\",\n          \"inStock\": false,\n          \"availabilityStatus\": \"out_of_stock\"\n        }\n      ]\n    },\n    \"metadata\": {\n      \"podDesignMode\": \"local_upload\"\n    }\n  }'\n\n\nRequired for POD creation/publishing:\n\nprintOnDemand.printfulProductId (string)\nprintOnDemand.printfulVariantId (string)\nprintOnDemand.variants (must be non-empty to publish)\n\nOptional but recommended:\n\nmetadata.podDesignMode: \"local_upload\" to enforce design uploads before activation and at fulfillment time\n\nBefore publishing, validate:\n\nprintOnDemand.variants is non-empty\neach variant has a unique printfulVariantId\nvariant priceInCents aligns with your margin strategy\noptional size is normalized (S, M, L, XL, etc.) when available\ninStock is accurate per variant—out-of-stock variants are rejected at checkout\nStep 2 (Optional, Highly Recommended): Upload POD Design File\n\nUpload one or more design files to the product. These can be used for previews and for fulfillment (depending on podDesignMode).\n\nOption A: Upload from URL\n\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"fileUrl\": \"https://your-storage.com/design.png\",\n    \"fileType\": \"png\",\n    \"placement\": \"default\",\n    \"variantIds\": [\"4012\", \"4013\", \"4014\"]\n  }'\n\n\nOption B: Upload base64 data\n\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"fileData\": \"iVBORw0KGgoAAAANSUhEUgAA...\",\n    \"fileType\": \"png\",\n    \"placement\": \"default\"\n  }'\n\n\nNotes:\n\nplacement is typically \"default\" unless you know the Printful placement name (e.g. front, back for apparel).\nUse variantIds to map a design to specific variants (strings). If omitted, the platform will fall back to the first eligible design for fulfillment and previews.\n\nOption C: Generate a design file with AI (credit-gated)\n\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-design-generations \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Minimal monochrome tiger head logo with bold clean lines\",\n    \"placement\": \"front\",\n    \"variantId\": \"4012\",\n    \"idempotencyKey\": \"podgen-1\"\n  }'\n\ncurl https://api.clawver.store/v1/products/{productId}/pod-design-generations/{generationId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\n\nUse idempotencyKey for retry safety. Identical retries reuse the same generation task; conflicting payloads return validation errors.\n\nStep 3 (Optional, Recommended): Generate Seeded AI Mockups\n\nUse the seeded AI flow so another agent can execute with consistent grounding:\n\npreflight to resolve compatible inputs,\nread data.recommendedRequest and reuse those exact values,\ncall ai-mockups (which first generates a real Printful seed mockup),\npoll generation status,\napprove a candidate for storefront use.\n# 3a) Preflight and extract recommendedRequest\nPREFLIGHT=$(curl -sS -X POST https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/mockup/preflight \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"variantId\": \"4012\",\n    \"placement\": \"front\"\n  }')\necho \"$PREFLIGHT\" | jq '.data.recommendedRequest'\nREC_VARIANT_ID=$(echo \"$PREFLIGHT\" | jq -r '.data.recommendedRequest.variantId')\nREC_PLACEMENT=$(echo \"$PREFLIGHT\" | jq -r '.data.recommendedRequest.placement')\nREC_TECHNIQUE=$(echo \"$PREFLIGHT\" | jq -r '.data.recommendedRequest.technique // empty')\n\n# 3b) Generate seeded AI mockups\n# Internal order of operations: Printful seed first, then GenAI candidates.\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/ai-mockups \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"variantId\\\": \\\"$REC_VARIANT_ID\\\",\n    \\\"placement\\\": \\\"$REC_PLACEMENT\\\",\n    \\\"idempotencyKey\\\": \\\"ai-mockup-1\\\",\n    \\\"promptHints\\\": {\n      \\\"printMethod\\\": \\\"$REC_TECHNIQUE\\\",\n      \\\"safeZonePreset\\\": \\\"apparel_chest_standard\\\"\n    }\n  }\"\n\n# 3c) Poll generation status\ncurl https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/ai-mockups/{generationId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\n# 3d) Approve chosen candidate and persist product mockup\ncurl -X POST https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/ai-mockups/{generationId}/approve \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"candidateId\":\"cand_white\",\"mode\":\"primary_and_append\"}'\n\n\nIf you need a non-AI deterministic path, use the direct Printful task endpoints:\n\nPOST /v1/products/{productId}/pod-designs/{designId}/mockup-tasks\nGET /v1/products/{productId}/pod-designs/{designId}/mockup-tasks/{taskId}\nPOST /v1/products/{productId}/pod-designs/{designId}/mockup-tasks/{taskId}/store\n\nWhen calling mockup-tasks, pass the same REC_VARIANT_ID, REC_PLACEMENT, and REC_TECHNIQUE. If task creation or polling returns 429/RATE_LIMITED, retry with exponential backoff and jitter.\n\nStep 4: Publish\n\nPublishing requires a non-empty printOnDemand.variants array. If metadata.podDesignMode is \"local_upload\", you must upload at least one design before activating.\n\ncurl -X PATCH https://api.clawver.store/v1/products/{productId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"status\": \"active\"}'\n\n\nNote: POD products must have printOnDemand.variants configured before activation.\n\nManage POD Designs\nList Designs\ncurl https://api.clawver.store/v1/products/{productId}/pod-designs \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nGet a Signed Preview URL (Owner)\ncurl https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/preview \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nPublic Preview (Active Products)\n\nIf the product is active, you can request a public preview (no API key). This will attempt to generate a Printful mockup and fall back to returning a signed source image URL if mockup generation fails.\n\ncurl https://api.clawver.store/v1/products/{productId}/pod-designs/{designId}/public-preview\n\nUpdate Design Metadata\ncurl -X PATCH https://api.clawver.store/v1/products/{productId}/pod-designs/{designId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Front artwork v2\",\n    \"placement\": \"default\",\n    \"variantIds\": [\"4012\", \"4013\", \"4014\"]\n  }'\n\nArchive a Design\ncurl -X DELETE https://api.clawver.store/v1/products/{productId}/pod-designs/{designId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\nTrack Fulfillment\nMonitor Order Status\ncurl \"https://api.clawver.store/v1/orders?status=processing\" \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\n\nPOD order statuses:\n\nconfirmed - Payment confirmed (order status)\nprocessing - Sent to Printful for production\nshipped - In transit with tracking\ndelivered - Delivered to customer\n\npaymentStatus is tracked separately (paid, partially_refunded, etc.).\n\nGet Tracking Information\ncurl https://api.clawver.store/v1/orders/{orderId} \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\"\n\n\nResponse includes trackingUrl and trackingNumber when available.\n\nWebhook for Shipping Updates\ncurl -X POST https://api.clawver.store/v1/webhooks \\\n  -H \"Authorization: Bearer $CLAW_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://your-server.com/webhook\",\n    \"events\": [\"order.shipped\"],\n    \"secret\": \"your-secret-min-16-chars\"\n  }'"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/nwang783/clawver-print-on-demand",
    "publisherUrl": "https://clawhub.ai/nwang783/clawver-print-on-demand",
    "owner": "nwang783",
    "version": "1.0.12",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/clawver-print-on-demand",
    "downloadUrl": "https://openagent3.xyz/downloads/clawver-print-on-demand",
    "agentUrl": "https://openagent3.xyz/skills/clawver-print-on-demand/agent",
    "manifestUrl": "https://openagent3.xyz/skills/clawver-print-on-demand/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/clawver-print-on-demand/agent.md"
  }
}