Plan a run over your products
What a run over these products would do, before anything starts: how many can be scraped, which cannot and why, and a quoteId. Costs nothing and starts nothing. Needs catalog:read.
This is the step a program takes where a person reads the Studio's card. The product ids are your own catalog's; the lines are built from each product's vendor SKU, category and title the way the Studio's Build from suppliers builds them.
apiKeyAuthorizationBearer <token>Your API key. X-Api-Key: <key> is accepted as an alternative.
A key belongs to an organization, not a user, so it outlives whoever created it. It carries two independent things, and both are checked: an org role (a member key cannot approve a publish or activate a mapping) and a set of scopes — catalog:read, catalog:write, enrichment:write, publishing:read, publishing:write, org:read, org:write. Holding a scope does not grant a role, and holding a role does not grant a scope.
GET /v1/me returns both for the key you are holding.
brandId*stringWhich of your brands this run belongs to. A brand outside your organization answers not found.
application/json- body
productIds*array<>1 <= items <= 5000The plan.
application/json- response
ceiling*integerThe most products one run may take for this brand.
-9007199254740991 <= value <= 9007199254740991eligible*integerProducts a run would scrape.
-9007199254740991 <= value <= 9007199254740991quoteId*stringHand this to POST /runs/from-products with the same productIds. It stays valid while a fresh plan of that selection agrees — the same products eligible under the same ceiling.
skipped*array<>curl -X POST 'https://fabric.inc/api/v1/brands/string/catalog-builder/plans' \ -H 'Content-Type: application/json' \ -d '{ "productIds": [ "string" ]}'{ "ceiling": -9007199254740991, "eligible": -9007199254740991, "quoteId": "string", "skipped": [ { "productId": "string", "reason": "string" } ]}Move an attribute between product and variant scope PATCH
Scope says where an attribute's values live on a product that has variants; on a product without variants the attribute is the product's own either way. Moving to `variant` copies each product's value onto its variants that hold none (a variant's own value is never overwritten), then removes the product's value; a product without variants keeps its value as its own. Content Fabric writes per product cannot move to `variant`. Moving to `product` takes the value a product's variants agree on onto the product and removes it from the variants. Agreement is strict: every variant holds the same value, or none does. If any product disagrees, nothing moves and the answer is 409 with one `errors` entry per product (at most 20). Every value written is recorded in its history against the API key, and the change appears in the brand's activity. A move rewrites up to 25,000 variants in one transaction, so it sits on the `job` budget.
List runs GET
The brand's runs, newest first, counted as the Studio's run list counts them: a person's decision on a row outranks the grader's verdict. `?limit=` up to 200, default 50.