{
  "openapi": "3.0.1",
  "info": {
    "title": "Print on Demand Listing & Design Generator",
    "description": "Score print-on-demand niches, screen every brand and slogan against the US trademark registry, write copy validated against your platform’s own character limits, and generate print-ready transparent artwork. Supports Amazon Merch on Demand, Etsy, Redbubble and Zazzle.",
    "version": "1.0",
    "x-build-id": "ZQa1dEBS6DRBzaFRx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~print-on-demand-listing-generator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-print-on-demand-listing-generator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/sian.agency~print-on-demand-listing-generator/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-print-on-demand-listing-generator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/sian.agency~print-on-demand-listing-generator/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-print-on-demand-listing-generator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "🎛️ Mode",
            "enum": [
              "full",
              "research",
              "clearance",
              "listing",
              "design"
            ],
            "type": "string",
            "description": "Which stages to run. `research` (the default) scores niches only — one charge per keyword, no copy and no artwork. `full` chains all four stages: niche scoring, trademark clearance, listing copy and artwork. Every mode that generates a name screens it for trademarks automatically.",
            "default": "research"
          },
          "platform": {
            "title": "🏪 Platform",
            "enum": [
              "amazon-merch",
              "etsy",
              "redbubble",
              "zazzle"
            ],
            "type": "string",
            "description": "Which storefront the listing copy is written and validated for. Every limit comes from that platform's own documentation — where a platform publishes no limit for a field, none is enforced and the row says so. `amazon-merch` has the strictest rules, so copy validated for it usually fits elsewhere too. Etsy and Zazzle publish listing rules but no artwork spec, so they cannot be used for `design` runs.",
            "default": "amazon-merch"
          },
          "keywords": {
            "title": "🔑 Seed keywords",
            "type": "array",
            "description": "Niche ideas to research, e.g. `cat mom t-shirt`. One charge per keyword. Required for every mode except `clearance`.",
            "default": [
              "cat mom t-shirt"
            ],
            "items": {
              "type": "string"
            }
          },
          "phrases": {
            "title": "⚖️ Phrases to screen",
            "type": "array",
            "description": "Brand names, titles or slogans to check against the trademark registry. Required for `clearance` mode. In every other mode these are generated for you and screened automatically.",
            "items": {
              "type": "string"
            }
          },
          "keywordsFile": {
            "title": "📄 Bulk seed file",
            "type": "string",
            "description": "Optional CSV or TXT with one term per line for bulk runs. A `keyword` / `phrase` header row is ignored."
          },
          "marketplace": {
            "title": "🌍 Marketplace",
            "enum": [
              "US",
              "UK",
              "DE",
              "FR",
              "IT",
              "ES",
              "JP"
            ],
            "type": "string",
            "description": "Which storefront to analyse competitors on. Trademark screening covers the US registry only — other marketplaces still get a screen, plus a warning row telling you it does not reflect local rights.",
            "default": "US"
          },
          "productType": {
            "title": "👕 Product type",
            "enum": [
              "standard-tshirt",
              "premium-tshirt",
              "apparel",
              "mens-graphic-tshirt",
              "womens-sleeveless-top",
              "baseball-cap",
              "bucket-hat",
              "socks",
              "scarf",
              "pin"
            ],
            "type": "string",
            "description": "Sets the print canvas size and safe zone for generated artwork, using the selected platform's own published dimensions. Options that do not exist on your platform fall back to its default product. Amazon Merch: standard or premium t-shirt, both 4500x5400 — the only Merch canvas we could corroborate, since Amazon publishes its specs behind a seller login. Redbubble: apparel, premium tee, graphic tee, sleeveless top, caps, socks, scarf, pin.",
            "default": "standard-tshirt"
          },
          "maxResultsPerKeyword": {
            "title": "📊 Competitor listings per keyword",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many live competitor listings to analyse when scoring each niche.",
            "default": 20
          },
          "includeBestsellerContext": {
            "title": "🏆 Add bestseller context",
            "type": "boolean",
            "description": "Also look at what is already winning the category, not just what matches the term. Uses one extra marketplace lookup per keyword.",
            "default": false
          },
          "includeConflictingMarks": {
            "title": "📋 Return the conflicting marks",
            "type": "boolean",
            "description": "Return the actual blocking trademarks — owner, serial number, status and classes — not just a yes/no. This is what makes the output a clearance report you can act on. Strongly recommended.",
            "default": true
          },
          "trademarkRiskThreshold": {
            "title": "🚦 Risk threshold",
            "enum": [
              "strict",
              "balanced",
              "permissive"
            ],
            "type": "string",
            "description": "How to treat a live mark in a non-apparel class. A live mark that covers apparel always blocks, at every setting.",
            "default": "balanced"
          },
          "artOutput": {
            "title": "🎨 Artwork output",
            "enum": [
              "none",
              "printReady"
            ],
            "type": "string",
            "description": "`none` runs no artwork at all. `printReady` produces a full-resolution 300-DPI transparent print file and requires a paid Apify plan.",
            "default": "none"
          },
          "transparency": {
            "title": "🫧 Transparency mode",
            "enum": [
              "keyed",
              "native"
            ],
            "type": "string",
            "description": "How the artwork gets its transparent background. `keyed` (default) generates the design and then cuts the background out — excellent, and on every plan. `native` asks the model for real transparency from the start, so nothing can be cut away wrongly: on our test renders roughly ten times less semi-transparent edge, which is what shows as a faint halo on a coloured garment. It is billed as its own, higher-rate event and needs a paid plan plus `artOutput: printReady`.",
            "default": "keyed"
          },
          "designStyle": {
            "title": "🖌️ Design style",
            "enum": [
              "typographic",
              "vintage-distressed",
              "line-art",
              "mascot",
              "minimal-graphic"
            ],
            "type": "string",
            "description": "Visual direction for generated artwork.",
            "default": "typographic"
          },
          "designsPerConcept": {
            "title": "🔢 Designs per concept",
            "minimum": 1,
            "maximum": 4,
            "type": "integer",
            "description": "How many variations to generate per keyword. Each one is charged separately. Free plans are capped at 1.",
            "default": 1
          },
          "referenceImage": {
            "title": "🖼️ Reference image (advanced)",
            "type": "string",
            "description": "⚠️ WARNING: uploading artwork you do not own is the single most common cause of permanent print-on-demand account termination. Only upload work you created yourself and hold full rights to. Third-party art, fan art, logos, characters and stock images will get your account closed with no appeal."
          },
          "copyTone": {
            "title": "🗣️ Copy tone",
            "enum": [
              "direct",
              "funny",
              "heartfelt",
              "professional"
            ],
            "type": "string",
            "description": "Voice for the generated listing copy.",
            "default": "direct"
          },
          "platformLimits": {
            "title": "📏 Character limits (advanced)",
            "type": "object",
            "description": "Override the character limits your copy is validated against. Leave this EMPTY unless you have a reason: by default each field is checked against the selected platform's own published limit, and a value here replaces it. `null` in the output means the platform publishes no limit for that field, so none was enforced. Keys: `brand`, `title`, `bullet`, `bulletCount`, `description`."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}