{"components":{"parameters":{"AnySourceId":{"description":"A source of your account","in":"path","name":"source_id","required":true,"schema":{"type":"integer"}},"FeedId":{"description":"A feed of your account","in":"path","name":"feed_id","required":true,"schema":{"type":"integer"}},"ReportId":{"description":"A report of your account","in":"path","name":"report_id","required":true,"schema":{"type":"integer"}},"RunId":{"in":"path","name":"run_id","required":true,"schema":{"type":"integer"}},"SetId":{"description":"A creative set of your account","in":"path","name":"set_id","required":true,"schema":{"type":"integer"}},"SourceId":{"description":"A Product API source of your account","in":"path","name":"source_id","required":true,"schema":{"type":"integer"}},"TagId":{"description":"A tag of your account","in":"path","name":"tag_id","required":true,"schema":{"type":"integer"}}},"schemas":{"Alert":{"properties":{"id":{"type":"integer"},"monitor":{"type":"string"},"opened_at":{"format":"date-time","type":["string","null"]},"params":{"type":"object"},"resolved_at":{"format":"date-time","type":["string","null"]},"severity":{"enum":["warning","danger"],"type":"string"},"status":{"enum":["open","resolved"],"type":"string"},"subject":{"properties":{"id":{"type":"integer"},"name":{"type":"string"},"type":{"enum":["source","feed","tag","creative_set","account"],"type":"string"}},"type":"object"}},"type":"object"},"Batch":{"properties":{"batch_id":{"type":"string"},"counts":{"properties":{"created":{"type":"integer"},"deleted":{"type":"integer"},"failed":{"type":"integer"},"unchanged":{"type":"integer"},"updated":{"type":"integer"}},"type":"object"},"finished_at":{"format":"date-time","type":["string","null"]},"items":{"type":"integer"},"operation":{"enum":["upsert","update","delete","tag"],"type":"string"},"received_at":{"format":"date-time","type":"string"},"source_id":{"type":"integer"},"started_at":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/Status"},"status_url":{"type":"string"}},"type":"object"},"Creative":{"properties":{"current":{"additionalProperties":{"type":"boolean"},"description":"Size \u2192 whether the image still shows the product as it is now","type":"object"},"id":{"description":"The product's id","type":"string"},"images":{"additionalProperties":{"type":"string"},"description":"Size \u2192 image address","type":"object"},"reason":{"description":"Why a product has no creative","type":["string","null"]},"rendered_at":{"format":"date-time","type":["string","null"]},"source_id":{"type":"integer"},"status":{"enum":["ok","skipped","failed"],"type":"string"}},"type":"object"},"CreativeRun":{"properties":{"counts":{"properties":{"failed":{"type":"integer"},"held_back":{"type":"integer"},"matched":{"type":"integer"},"planned":{"type":"integer"},"removed":{"type":"integer"},"rendered":{"type":"integer"},"skipped":{"type":"integer"},"unchanged":{"type":"integer"}},"type":"object"},"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"type":["object","null"]},"finished_at":{"format":"date-time","type":["string","null"]},"id":{"type":"integer"},"queued_at":{"format":"date-time","type":"string"},"set_id":{"type":"integer"},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","planning","rendering","success","partial","failed"],"type":"string"},"status_url":{"type":"string"},"trigger":{"enum":["create","manual","chain","sale","settings","plan","api"],"type":"string"},"warnings":{"items":{"enum":["render_quota","image_cap"],"type":"string"},"type":"array"}},"type":"object"},"CreativeSet":{"properties":{"active":{"type":"boolean"},"auto_render":{"type":"boolean"},"created_at":{"format":"date-time","type":"string"},"creatives_url":{"type":"string"},"fallback":{"enum":["image","empty"],"type":"string"},"feed_placeholder":{"example":"{creative.summer_sale.<size>}","type":"string"},"format":{"enum":["jpeg","png"],"type":"string"},"id":{"type":"integer"},"images":{"type":"integer"},"key":{"type":"string"},"last_rendered_at":{"format":"date-time","type":["string","null"]},"last_run_id":{"type":["integer","null"]},"name":{"type":"string"},"paused_reason":{"enum":["user","plan_limit",null],"type":["string","null"]},"products":{"type":"integer"},"runs_url":{"type":"string"},"sizes":{"items":{"enum":["1x1","4x5","9x16"],"type":"string"},"type":"array"},"template":{"properties":{"code":{"type":"string"},"kind":{"enum":["gallery","account"],"type":"string"},"name":{"type":"string"},"revision":{"type":"integer"}},"type":"object"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"DeleteRequest":{"properties":{"ids":{"items":{"type":"string"},"maxItems":1000,"minItems":1,"type":"array"},"operation":{"const":"delete"}},"required":["operation","ids"],"type":"object"},"Error":{"properties":{"error":{"properties":{"code":{"type":"string"},"details":{},"message":{"type":"string"}},"type":"object"}},"type":"object"},"Event":{"properties":{"account":{"properties":{"id":{"type":"integer"},"name":{"type":"string"}},"type":"object"},"created_at":{"format":"date-time","type":"string"},"data":{"type":"object"},"id":{"description":"evt_\u2026, the same on every retry","type":"string"},"type":{"type":"string"}},"required":["id","type","created_at","account","data"],"type":"object"},"Feed":{"properties":{"access":{"description":"basic: the URL needs the feed's user name and password","enum":["token","basic"],"type":"string"},"active":{"type":"boolean"},"channel":{"properties":{"code":{"type":"string"},"name":{"type":"string"}},"type":["object","null"]},"created_at":{"format":"date-time","type":["string","null"]},"file":{"properties":{"generated_at":{"format":"date-time","type":["string","null"]},"items":{"type":"integer"},"sha256":{"type":["string","null"]},"size":{"type":"integer"}},"type":"object"},"format":{"type":"string"},"id":{"type":"integer"},"last_build_status":{"type":["string","null"]},"last_fetched_at":{"format":"date-time","type":["string","null"]},"name":{"type":"string"},"paused_reason":{"type":["string","null"]},"revision":{"type":"integer"},"schedule":{"allOf":[{"properties":{"interval_min":{"type":["integer","null"]},"mode":{"enum":["interval","daily_at","manual"],"type":"string"},"next_run_at":{"format":"date-time","type":["string","null"]},"time_local":{"description":"daily_at: the time of the daily run in the account's time zone. interval, feeds only: the time of day the interval is counted from (every 6 hours from 02:00 runs at 02:00, 08:00, 14:00 and 20:00), used while the plan includes it; null: counted from the last scheduled run.","example":"03:00","type":["string","null"]}},"type":"object"},{"properties":{"after_source_sync":{"type":"boolean"}},"type":"object"}]},"source_ids":{"items":{"type":"integer"},"type":"array"},"status":{"type":"string"},"updated_at":{"format":"date-time","type":["string","null"]},"url":{"description":"The file's address for channels","type":"string"}},"type":"object"},"FeedBrief":{"properties":{"format":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string"}},"type":"object"},"FeedRun":{"properties":{"counts":{"properties":{"exported":{"type":"integer"},"filtered":{"type":"integer"},"invalid":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"duration_ms":{"type":["integer","null"]},"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"type":["object","null"]},"feed_id":{"type":"integer"},"file":{"properties":{"changed":{"type":"boolean"},"sha256":{"type":"string"},"size":{"type":"integer"}},"type":["object","null"]},"finished_at":{"format":"date-time","type":["string","null"]},"held":{"description":"Held builds: the file channels keep","properties":{"drop_pct":{"type":"number"},"products_before":{"type":"number"},"products_now":{"type":"number"}},"type":"object"},"id":{"type":"integer"},"item_errors":{"items":{"type":"object"},"type":"array"},"queued_at":{"format":"date-time","type":["string","null"]},"revision":{"type":["integer","null"]},"rule_stats":{"description":"One build only: what each rule and filter group did. null for a build that didn't count (failed, or from before 1.5.0)","properties":{"filters":{"items":{"properties":{"group":{"description":"include:<n> or exclude:<n>; rows: products without an entry in the feed's row list","type":"string"},"left_out":{"description":"Products this group left out; a product several groups would leave out counts once, at the first","type":["integer","null"]},"state":{"enum":["counted","not_active"],"type":"string"}},"type":"object"},"type":"array"},"products":{"description":"Products the rules ran on","type":"integer"},"rules":{"items":{"properties":{"action":{"type":"string"},"changed":{"description":"Products whose target field then had another value","type":["integer","null"]},"matched":{"description":"Products its condition held for","type":["integer","null"]},"note":{"description":"action, target and note are there while the feed's rules are still the ones this build used","type":["string","null"]},"rule":{"description":"The rule's number, from 1","type":"integer"},"state":{"description":"off: switched off; not_active: outside its active dates","enum":["counted","off","not_active"],"type":"string"},"target":{"type":["string","null"]}},"type":"object"},"type":"array"}},"type":["object","null"]},"started_at":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/RunStatus"},"status_url":{"type":"string"},"trigger":{"description":"schedule, chain (after a sync), manual, api","type":"string"},"warnings":{"items":{"type":"object"},"type":"array"}},"type":"object"},"ItemError":{"properties":{"code":{"type":"string"},"field":{"type":"string"},"id":{"type":["string","null"]},"index":{"type":["integer","null"]},"message":{"type":"string"}},"type":"object"},"Product":{"additionalProperties":true,"description":"Normalized product fields; unknown keys are kept under attributes. Prices may carry a currency (\"12.90 EUR\").","properties":{"age_group":{"type":["string","number","null"]},"availability":{"type":["string","number","null"]},"brand":{"type":["string","number","null"]},"color":{"type":["string","number","null"]},"condition":{"type":["string","number","null"]},"currency":{"type":["string","number","null"]},"custom_label_0":{"type":["string","number","null"]},"description":{"type":["string","number","null"]},"gender":{"type":["string","number","null"]},"google_product_category":{"type":["string","number","null"]},"gtin":{"type":["string","number","null"]},"id":{"type":["string","number","null"]},"image_link":{"type":["string","number","null"]},"item_group_id":{"type":["string","number","null"]},"link":{"type":["string","number","null"]},"material":{"type":["string","number","null"]},"mpn":{"type":["string","number","null"]},"pattern":{"type":["string","number","null"]},"price":{"type":["string","number","null"]},"product_type":{"type":["string","number","null"]},"quantity":{"type":["string","number","null"]},"rating":{"type":["string","number","null"]},"review_count":{"type":["string","number","null"]},"sale_price":{"type":["string","number","null"]},"signals":{"description":"Read only: the last change FeedManager saw of the price shoppers pay (price_prev, price_changed_at, price_change_pct), of availability (availability_prev, availability_changed_at) and the last restock (restocked_at, restock_units, restock_pct).","readOnly":true,"type":"object"},"size":{"type":["string","number","null"]},"sku":{"type":["string","number","null"]},"tags":{"description":"Read only: the names of the tags the product carries; change them with a tag batch.","items":{"type":"string"},"readOnly":true,"type":"array"},"title":{"type":["string","number","null"]},"video_link":{"type":["string","number","null"]}},"required":["id"],"type":"object"},"Report":{"properties":{"id":{"type":"integer"},"kind":{"enum":["weekly","monthly"],"type":"string"},"made_at":{"format":"date-time","type":["string","null"]},"pdf_url":{"type":"string"},"period":{"description":"First and last day, in the account's time zone","properties":{"end":{"format":"date","type":"string"},"start":{"format":"date","type":"string"}},"type":"object"},"recipients":{"description":"Addresses it was queued for","type":"integer"},"sections":{"description":"Only on GET /v1/reports/{report_id}: feeds, health, stock, syncs, builds, alerts, ai, performance, merchant, page_checks and price_updates as codes and counts","type":"object"},"sent_at":{"format":"date-time","type":["string","null"]},"summary":{"additionalProperties":{"type":["number","string","null"]},"description":"Headline numbers of the whole account: products, new_products, active_feeds, paused_feeds, feed_readiness, catalog_health, out_of_stock, open_alerts, alerts_opened, alerts_resolved, syncs_completed, syncs_failed, builds_completed, builds_held, builds_failed, pages_read, pages_differ, pages_missing, updates_sent, ai_runs, ai_products, revenue, currency, purchases, product_views, merchant_clicks, merchant_impressions, search_clicks, search_impressions, merchant_approved, merchant_disapproved. null when the account has no such data. Performance numbers cover the period their source reads, not the report's.","type":"object"},"trigger":{"enum":["schedule","manual"],"type":"string"},"url":{"type":"string"}},"type":"object"},"RunStatus":{"enum":["queued","running","success","partial","failed","held"],"type":"string"},"Source":{"properties":{"active":{"type":"boolean"},"batch_url":{"description":"Product API sources","type":"string"},"created_at":{"format":"date-time","type":["string","null"]},"id":{"type":"integer"},"kind":{"enum":["product","supplement","enrichment"],"type":"string"},"last_success_at":{"format":"date-time","type":["string","null"]},"last_sync":{"properties":{"at":{"format":"date-time","type":["string","null"]},"status":{"type":["string","null"]}},"type":"object"},"name":{"type":"string"},"paused_reason":{"type":["string","null"]},"product_count":{"type":"integer"},"schedule":{"properties":{"interval_min":{"type":["integer","null"]},"mode":{"enum":["interval","daily_at","manual"],"type":"string"},"next_run_at":{"format":"date-time","type":["string","null"]},"time_local":{"description":"daily_at: the time of the daily run in the account's time zone. interval, feeds only: the time of day the interval is counted from (every 6 hours from 02:00 runs at 02:00, 08:00, 14:00 and 20:00), used while the plan includes it; null: counted from the last scheduled run.","example":"03:00","type":["string","null"]}},"type":"object"},"status":{"type":"string"},"type":{"description":"xml_url, csv_url, shopify, api, \u2026","type":"string"},"updated_at":{"format":"date-time","type":["string","null"]}},"type":"object"},"SourceBrief":{"properties":{"id":{"type":"integer"},"kind":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}},"type":"object"},"Status":{"enum":["queued","processing","completed","completed_with_errors","failed"],"type":"string"},"SyncRun":{"properties":{"counts":{"properties":{"created":{"type":"integer"},"excluded":{"type":"integer"},"failed":{"type":"integer"},"removed":{"type":"integer"},"seen":{"type":"integer"},"unchanged":{"type":"integer"},"unmatched":{"type":"integer"},"updated":{"type":"integer"}},"type":"object"},"duration_ms":{"type":["integer","null"]},"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"type":["object","null"]},"finished_at":{"format":"date-time","type":["string","null"]},"id":{"type":"integer"},"item_errors":{"description":"One run only; the first 100","items":{"properties":{"code":{"type":"string"},"field":{"type":"string"},"id":{"type":"string"},"message":{"type":"string"}},"type":"object"},"type":"array"},"kind":{"description":"full: everything the source has, and what it lacks is removed. changes: only what the store changed since the last read (scheduled syncs of Shopify and WooCommerce sources between daily full reads); its counts cover those products only.","enum":["full","changes"],"type":"string"},"queued_at":{"format":"date-time","type":["string","null"]},"source_id":{"type":"integer"},"started_at":{"format":"date-time","type":["string","null"]},"status":{"$ref":"#/components/schemas/RunStatus"},"status_url":{"type":"string"},"trigger":{"description":"schedule, manual, api, upload, mapping, settings, webhook (the store named products that changed)","type":"string"}},"type":"object"},"Tag":{"properties":{"created_at":{"format":"date-time","type":"string"},"description":{"type":["string","null"]},"dynamic":{"description":"Dynamic tags only (never the rule)","properties":{"active":{"type":"boolean"},"frequency":{"properties":{"after_syncs":{"type":"boolean"},"at":{"type":"string"},"every":{"enum":["1h","6h","1d","7d"],"type":"string"},"weekday":{"type":"integer"}},"type":"object"},"last_evaluated_at":{"format":"date-time","type":["string","null"]},"last_run_id":{"type":["integer","null"]},"next_run_at":{"format":"date-time","type":["string","null"]},"paused_reason":{"enum":["user","plan_limit",null],"type":["string","null"]},"ranking_cut":{"properties":{"metric":{"type":"string"},"value":{"type":["number","null"]}},"type":["object","null"]},"runs_url":{"type":"string"}},"type":"object"},"id":{"type":"integer"},"kind":{"enum":["static","dynamic"],"type":"string"},"name":{"type":"string"},"products":{"description":"Active products carrying the tag","type":"integer"},"products_url":{"type":"string"},"tone":{"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"type":"object"},"TagRequest":{"description":"Static tags by name on products of the source: add and/or remove, or set (exactly these static tags; dynamic ones stay). Item errors: not_found, unknown_tag (unless create_missing), dynamic_tag, tag_limit, too_many_tags (a product holds at most 50 tags).","properties":{"create_missing":{"default":false,"description":"Create unknown names as static tags (within the plan)","type":"boolean"},"operation":{"const":"tag"},"products":{"items":{"additionalProperties":false,"properties":{"add":{"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":50,"type":"array"},"id":{"type":"string"},"remove":{"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":50,"type":"array"},"set":{"items":{"maxLength":64,"minLength":1,"type":"string"},"maxItems":50,"type":"array"}},"required":["id"],"type":"object"},"maxItems":1000,"minItems":1,"type":"array"}},"required":["operation","products"],"type":"object"},"TagRun":{"properties":{"error":{"properties":{"code":{"enum":["rules_too_slow","stuck","es_error"],"type":"string"}},"type":"object"},"finished_at":{"format":"date-time","type":["string","null"]},"id":{"type":"integer"},"products_scanned":{"type":["integer","null"]},"queued_at":{"format":"date-time","type":"string"},"started_at":{"format":"date-time","type":["string","null"]},"status":{"enum":["queued","running","success","failed"],"type":"string"},"status_url":{"type":"string"},"tag_ids":{"items":{"type":"integer"},"type":"array"},"tags":{"additionalProperties":{"properties":{"added":{"type":["integer","null"]},"removed":{"type":["integer","null"]},"skipped":{"type":["integer","null"]},"total":{"type":["integer","null"]}},"type":"object"},"description":"Per tag id: products after the pass and the changes","type":"object"},"trigger":{"description":"window: a rule's or filter group's active window started or ended","enum":["schedule","chain","manual","create","api","window"],"type":"string"}},"type":"object"},"UpdateRequest":{"description":"Changes only the fields sent of products the source already has (an unknown id is an item error, not_found); a field sent as null is cleared; attributes merge key by key. Not for supplemental sources: their upsert already changes only the fields sent, and null takes a value out of the row.","properties":{"operation":{"const":"update"},"products":{"items":{"$ref":"#/components/schemas/Product"},"maxItems":1000,"minItems":1,"type":"array"}},"required":["operation","products"],"type":"object"},"Upload":{"properties":{"address":{"type":"string"},"at":{"format":"date-time","type":["string","null"]},"destination_id":{"type":"integer"},"duration_ms":{"type":["integer","null"]},"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"type":["object","null"]},"reason":{"enum":["build","manual","daily","saved","retry"],"type":"string"},"remote_path":{"type":["string","null"]},"sha256":{"type":["string","null"]},"size":{"type":["integer","null"]},"status":{"enum":["ok","failed"],"type":"string"}},"type":"object"},"UpsertRequest":{"properties":{"operation":{"const":"upsert"},"products":{"items":{"$ref":"#/components/schemas/Product"},"maxItems":1000,"minItems":1,"type":"array"}},"required":["operation","products"],"type":"object"}},"securitySchemes":{"bearer":{"bearerFormat":"fm_live_<prefix>_<secret>","description":"Create keys on the panel's API Access page. Scopes: products:write, products:read, batches:read, sources:read, feeds:read, runs:write, tags:read, tags:write, creatives:read, reports:read.","scheme":"bearer","type":"http"}}},"info":{"description":"Push products into a FeedManager Product API source: requests carry at most 1,000 products, are validated, stored and queued; poll the batch for the result (or listen to the batch.completed webhook). Products not mentioned in a batch are never touched. The same keys can read sources, feeds and their runs, and start a sync or a feed build, read tags and their products, tag products of any source, and read the account's scheduled reports. Webhooks are added on the panel's API Access page.","title":"FeedManager API","version":"1.5.0"},"openapi":"3.1.0","paths":{"/v1/batches":{"get":{"operationId":"listBatches","parameters":[{"in":"query","name":"source_id","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"$ref":"#/components/schemas/Status"}},{"in":"query","name":"since","schema":{"format":"date-time","type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Batch"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page of batches"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["batches:read"]}],"summary":"Recent batches, newest first"}},"/v1/batches/{batch_id}":{"get":{"operationId":"getBatch","parameters":[{"in":"path","name":"batch_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Batch"},{"properties":{"item_errors":{"items":{"$ref":"#/components/schemas/ItemError"},"type":"array"}},"type":"object"}]}}},"description":"The batch"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No batch with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["batches:read"]}],"summary":"One batch with counts and the first 100 item errors"}},"/v1/creative-sets":{"get":{"operationId":"listCreativeSets","parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CreativeSet"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"creative_studio_unavailable: not part of your plan, or a missing scope"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["creatives:read"]}],"summary":"Your creative sets (Creative Studio)"}},"/v1/creative-sets/{set_id}":{"get":{"operationId":"getCreativeSet","parameters":[{"$ref":"#/components/parameters/SetId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreativeSet"}}},"description":"The set"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No creative set with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["creatives:read"]}],"summary":"One creative set"}},"/v1/creative-sets/{set_id}/creatives":{"get":{"description":"Products by id (the lowest first), with the address of each size and whether it still shows what the product is now (`current`, the check feeds make: a new price or an ended sale makes it false until the set renders again). current=true returns only current images (a page may then hold fewer items; follow next_cursor).","operationId":"listCreatives","parameters":[{"$ref":"#/components/parameters/SetId"},{"in":"query","name":"product_id","schema":{"type":"string"}},{"in":"query","name":"source_id","schema":{"type":"integer"}},{"in":"query","name":"size","schema":{"enum":["1x1","4x5","9x16"],"type":"string"}},{"in":"query","name":"status","schema":{"enum":["ok","skipped","failed"],"type":"string"}},{"in":"query","name":"current","schema":{"type":"boolean"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Creative"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No creative set with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["creatives:read"]}],"summary":"The set's products with their images"}},"/v1/creative-sets/{set_id}/render":{"post":{"description":"Like the panel's Render Now: only products whose creative changed are drawn; once per 5 minutes per set.","operationId":"renderCreativeSet","parameters":[{"$ref":"#/components/parameters/SetId"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreativeRun"}}},"description":"Queued; follow status_url"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No creative set with this id in your account"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"run_in_progress (details.run) or paused"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"rate_limited: too soon after the last render \u2014 see Retry-After"}},"security":[{"bearer":["runs:write"]}],"summary":"Render a set now"}},"/v1/creative-sets/{set_id}/runs":{"get":{"operationId":"listCreativeRuns","parameters":[{"$ref":"#/components/parameters/SetId"},{"in":"query","name":"status","schema":{"enum":["queued","planning","rendering","success","partial","failed"],"type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CreativeRun"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No creative set with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["creatives:read"]}],"summary":"The set's render runs, newest first"}},"/v1/creative-sets/{set_id}/runs/{run_id}":{"get":{"operationId":"getCreativeRun","parameters":[{"$ref":"#/components/parameters/SetId"},{"$ref":"#/components/parameters/RunId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreativeRun"}}},"description":"The run"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No such run"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["creatives:read"]}],"summary":"One render run"}},"/v1/feeds":{"get":{"operationId":"listFeeds","parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Feed"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["feeds:read"]}],"summary":"List feeds"}},"/v1/feeds/{feed_id}":{"get":{"operationId":"getFeed","parameters":[{"$ref":"#/components/parameters/FeedId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feed"}}},"description":"The feed"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No feed with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["feeds:read"]}],"summary":"One feed"}},"/v1/feeds/{feed_id}/build":{"post":{"description":"Queues a build like the panel's Build now button, limited in the same way.","operationId":"buildFeed","parameters":[{"$ref":"#/components/parameters/FeedId"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedRun"}}},"description":"Queued; follow status_url"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No such source or feed in your account"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"run_in_progress (details.run is the run on its way), paused, needs_mapping, no_sources or confirm_size (the first sync of a store larger than the plan's room is confirmed in the panel)"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"nothing_to_sync: a Product API source receives products, it isn't synced"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"rate_limited: too soon after the last manual or API run, or the account's request budget is used up \u2014 see Retry-After"}},"security":[{"bearer":["runs:write"]}],"summary":"Build a feed now"}},"/v1/feeds/{feed_id}/runs":{"get":{"operationId":"listFeedRuns","parameters":[{"$ref":"#/components/parameters/FeedId"},{"in":"query","name":"status","schema":{"$ref":"#/components/schemas/RunStatus"}},{"description":"Runs queued at or after this time","in":"query","name":"since","schema":{"format":"date-time","type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FeedRun"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No feed with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["feeds:read"]}],"summary":"A feed's builds, newest first"}},"/v1/feeds/{feed_id}/runs/{run_id}":{"get":{"operationId":"getFeedRun","parameters":[{"$ref":"#/components/parameters/FeedId"},{"$ref":"#/components/parameters/RunId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedRun"}}},"description":"The build"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No such build"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["feeds:read"]}],"summary":"One build with warnings, the first 100 rejected products and what each rule and filter group did"}},"/v1/limits":{"get":{"operationId":"getLimits","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"api_requests_per_min":{"type":["integer","null"]},"max_items_per_request":{"type":"integer"},"max_products":{"type":["integer","null"]},"max_queued_api_batches":{"type":["integer","null"]},"plan":{"type":"string"},"products_used":{"type":"integer"},"queued_batches":{"type":"integer"},"requests_remaining_this_minute":{"type":["integer","null"]}},"type":"object"}}},"description":"Limits"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["batches:read"]}],"summary":"Plan limits, usage and the remaining rate-limit budget"}},"/v1/reports":{"get":{"description":"The weekly and monthly reports that were made, each with its period and headline numbers (summary). The numbers are the whole account's, whatever sections and feeds the emailed report shows.","operationId":"listReports","parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}},{"in":"query","name":"kind","schema":{"enum":["weekly","monthly"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Report"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"invalid_kind"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["reports:read"]}],"summary":"Scheduled reports, newest first"}},"/v1/reports/{report_id}":{"get":{"operationId":"getReport","parameters":[{"$ref":"#/components/parameters/ReportId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}},"description":"The report, with sections"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No report with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["reports:read"]}],"summary":"One report with the numbers behind every section"}},"/v1/reports/{report_id}/pdf":{"get":{"operationId":"getReportPdf","parameters":[{"$ref":"#/components/parameters/ReportId"}],"responses":{"200":{"content":{"application/pdf":{"schema":{"format":"binary","type":"string"}}},"description":"The PDF"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No report with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["reports:read"]}],"summary":"A report's PDF, as its recipients got it"}},"/v1/sources":{"get":{"operationId":"listSources","parameters":[{"in":"query","name":"kind","schema":{"enum":["product","supplement","enrichment"],"type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Source"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["sources:read"]}],"summary":"List sources"}},"/v1/sources/{source_id}":{"get":{"operationId":"getSource","parameters":[{"$ref":"#/components/parameters/AnySourceId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Source"}}},"description":"The source"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No source with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["sources:read"]}],"summary":"One source"}},"/v1/sources/{source_id}/products/batch":{"post":{"description":"A Product API source takes upsert (create or replace), update (change only the fields sent) and delete (scope products:write). A supplemental Product API source takes rows for other sources' products, matched on its match field: upsert (the fields sent change, null takes one out of the row) and delete (by match value). Every product source \u2014 file, store platform or API \u2014 takes tag (scope tags:write): static tags added, removed or set by name, applied in order with the source's syncs and other batches.","operationId":"submitBatch","parameters":[{"$ref":"#/components/parameters/SourceId"},{"description":"Repeat a request safely for 24 hours: the same key and body return the original batch.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":64,"type":"string"}}],"requestBody":{"content":{"application/json":{"examples":{"delete":{"value":{"ids":["SKU-1","SKU-2"],"operation":"delete"}},"tag":{"value":{"create_missing":true,"operation":"tag","products":[{"add":["Summer","Homepage"],"id":"SKU-1","remove":["Winter"]},{"id":"SKU-2","set":["Clearance"]}]}},"update":{"value":{"operation":"update","products":[{"id":"SKU-1","price":"17.50 EUR","quantity":3,"sale_price":null}]}},"upsert":{"value":{"operation":"upsert","products":[{"availability":"in_stock","brand":"Acme","id":"SKU-1","image_link":"https://cdn.example.com/sku-1.jpg","link":"https://shop.example.com/p/sku-1","price":"89.90 EUR","title":"Trail running shoe"}]}}},"schema":{"oneOf":[{"$ref":"#/components/schemas/UpsertRequest"},{"$ref":"#/components/schemas/UpdateRequest"},{"$ref":"#/components/schemas/DeleteRequest"},{"$ref":"#/components/schemas/TagRequest"}]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}},"description":"Same Idempotency-Key and body: the original batch"},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}},"description":"Queued"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No Product API source (tag: no product source) with this id in your account"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request did not pass validation (nothing was queued)"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["products:write"]},{"bearer":["tags:write"]}],"summary":"Queue a batch of product upserts, updates, deletes or tag changes (or supplement rows)"}},"/v1/sources/{source_id}/products/{product_id}":{"get":{"operationId":"getProduct","parameters":[{"$ref":"#/components/parameters/SourceId"},{"in":"path","name":"product_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}},"description":"The product"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No such product in this source"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["products:read"]}],"summary":"Read back one product as stored (normalized)"}},"/v1/sources/{source_id}/runs":{"get":{"operationId":"listSyncRuns","parameters":[{"$ref":"#/components/parameters/AnySourceId"},{"in":"query","name":"status","schema":{"$ref":"#/components/schemas/RunStatus"}},{"description":"Runs queued at or after this time","in":"query","name":"since","schema":{"format":"date-time","type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SyncRun"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No source with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["sources:read"]}],"summary":"A source's syncs, newest first"}},"/v1/sources/{source_id}/runs/{run_id}":{"get":{"operationId":"getSyncRun","parameters":[{"$ref":"#/components/parameters/AnySourceId"},{"$ref":"#/components/parameters/RunId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRun"}}},"description":"The sync"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No such sync"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["sources:read"]}],"summary":"One sync with the first 100 item errors"}},"/v1/sources/{source_id}/sync":{"post":{"description":"Queues a sync like the panel's Sync now button, limited in the same way per plan.","operationId":"syncSource","parameters":[{"$ref":"#/components/parameters/AnySourceId"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRun"}}},"description":"Queued; follow status_url"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No such source or feed in your account"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"run_in_progress (details.run is the run on its way), paused, needs_mapping, no_sources or confirm_size (the first sync of a store larger than the plan's room is confirmed in the panel)"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"nothing_to_sync: a Product API source receives products, it isn't synced"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"rate_limited: too soon after the last manual or API run, or the account's request budget is used up \u2014 see Retry-After"}},"security":[{"bearer":["runs:write"]}],"summary":"Sync a source now"}},"/v1/tags":{"get":{"operationId":"listTags","parameters":[{"in":"query","name":"kind","schema":{"enum":["static","dynamic"],"type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Tag"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["tags:read"]}],"summary":"Your tags with their product counts"}},"/v1/tags/{tag_id}":{"get":{"operationId":"getTag","parameters":[{"$ref":"#/components/parameters/TagId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag"}}},"description":"The tag"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No tag with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["tags:read"]}],"summary":"One tag"}},"/v1/tags/{tag_id}/evaluate":{"post":{"description":"Queues a pass like the panel's Run now button: once per 5 minutes per account. A pass of the account that is still queued takes the tag in.","operationId":"evaluateTag","parameters":[{"$ref":"#/components/parameters/TagId"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagRun"}}},"description":"Queued; follow status_url"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No tag with this id in your account"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"not_dynamic (a static tag has no rule) or paused"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"rate_limited: too soon after the last manual or API run \u2014 see Retry-After"}},"security":[{"bearer":["runs:write"]}],"summary":"Run a dynamic tag's rule now"}},"/v1/tags/{tag_id}/products":{"get":{"description":"Active products, ordered by id then source, up to 1,000 per page; next_cursor gives the next page. fields adds product fields to each row.","operationId":"listTagProducts","parameters":[{"$ref":"#/components/parameters/TagId"},{"in":"query","name":"source_id","schema":{"type":"integer"}},{"description":"Comma-separated: title, link, image_link, price, sale_price, currency, availability, quantity, brand, sku, gtin, item_group_id","in":"query","name":"fields","schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer"}},{"in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"additionalProperties":true,"properties":{"id":{"type":"string"},"source_id":{"type":"integer"}},"type":"object"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page of products"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No tag with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["tags:read","products:read"]}],"summary":"The products carrying a tag"}},"/v1/tags/{tag_id}/runs":{"get":{"operationId":"listTagRuns","parameters":[{"$ref":"#/components/parameters/TagId"},{"in":"query","name":"status","schema":{"enum":["queued","running","success","failed"],"type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"next_cursor of the previous page","in":"query","name":"cursor","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TagRun"},"type":"array"},"next_cursor":{"type":["string","null"]}},"type":"object"}}},"description":"A page, newest or lowest id first"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No tag with this id in your account"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["tags:read"]}],"summary":"The passes that evaluated a dynamic tag, newest first"}},"/v1/tags/{tag_id}/runs/{run_id}":{"get":{"operationId":"getTagRun","parameters":[{"$ref":"#/components/parameters/TagId"},{"$ref":"#/components/parameters/RunId"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagRun"}}},"description":"The pass"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing, invalid, revoked or expired API key"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Scope missing, IP not allowed, account inactive or plan without the API"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No such pass"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit or queue limit reached \u2014 see Retry-After"}},"security":[{"bearer":["tags:read"]}],"summary":"One pass of a dynamic tag"}}},"security":[{"bearer":[]}],"servers":[{"url":"https://api.feedmanager.org"}],"webhooks":{"alert.opened":{"post":{"operationId":"on_alert_opened","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"alert.opened"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"alert":{"$ref":"#/components/schemas/Alert"}},"type":"object"},"type":{"const":"alert.opened"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"An alert opened"}},"alert.resolved":{"post":{"operationId":"on_alert_resolved","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"alert.resolved"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"alert":{"$ref":"#/components/schemas/Alert"}},"type":"object"},"type":{"const":"alert.resolved"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"An alert was resolved"}},"batch.completed":{"post":{"operationId":"on_batch_completed","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"batch.completed"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"batch":{"$ref":"#/components/schemas/Batch"}},"type":"object"},"type":{"const":"batch.completed"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A Product API batch was applied (or failed)"}},"creatives.rendered":{"post":{"operationId":"on_creatives_rendered","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"creatives.rendered"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"creative_set":{"properties":{"id":{"type":"integer"},"key":{"type":"string"},"name":{"type":"string"}},"type":"object"},"run":{"$ref":"#/components/schemas/CreativeRun"}},"type":"object"},"type":{"const":"creatives.rendered"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A creative set's run drew or removed images, or ended partial or failed (runs that changed nothing send nothing)"}},"feed.built":{"post":{"operationId":"on_feed_built","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"feed.built"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"feed":{"$ref":"#/components/schemas/FeedBrief"},"run":{"$ref":"#/components/schemas/FeedRun"}},"type":"object"},"type":{"const":"feed.built"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A feed file was built and published"}},"feed.failed":{"post":{"operationId":"on_feed_failed","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"feed.failed"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"feed":{"$ref":"#/components/schemas/FeedBrief"},"run":{"$ref":"#/components/schemas/FeedRun"}},"type":"object"},"type":{"const":"feed.failed"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A feed build failed"}},"feed.held":{"post":{"operationId":"on_feed_held","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"feed.held"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"feed":{"$ref":"#/components/schemas/FeedBrief"},"run":{"$ref":"#/components/schemas/FeedRun"}},"type":"object"},"type":{"const":"feed.held"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A build was held back by the drop monitor (nothing published)"}},"feed.upload_failed":{"post":{"operationId":"on_feed_upload_failed","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"feed.upload_failed"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"feed":{"$ref":"#/components/schemas/FeedBrief"},"upload":{"$ref":"#/components/schemas/Upload"}},"type":"object"},"type":{"const":"feed.upload_failed"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"An upload failed after its retries"}},"feed.uploaded":{"post":{"operationId":"on_feed_uploaded","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"feed.uploaded"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"feed":{"$ref":"#/components/schemas/FeedBrief"},"upload":{"$ref":"#/components/schemas/Upload"}},"type":"object"},"type":{"const":"feed.uploaded"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A feed file was uploaded to an SFTP / FTP address"}},"report.made":{"post":{"operationId":"on_report_made","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"report.made"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"report":{"$ref":"#/components/schemas/Report"}},"type":"object"},"type":{"const":"report.made"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A scheduled report was made (also when it was sent by hand)"}},"sync.completed":{"post":{"operationId":"on_sync_completed","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"sync.completed"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"run":{"$ref":"#/components/schemas/SyncRun"},"source":{"$ref":"#/components/schemas/SourceBrief"}},"type":"object"},"type":{"const":"sync.completed"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A sync finished (success or partial)"}},"sync.failed":{"post":{"operationId":"on_sync_failed","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"sync.failed"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"run":{"$ref":"#/components/schemas/SyncRun"},"source":{"$ref":"#/components/schemas/SourceBrief"}},"type":"object"},"type":{"const":"sync.failed"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A sync failed"}},"tags.updated":{"post":{"operationId":"on_tags_updated","parameters":[{"description":"t=<unix time>,v1=<hex HMAC-SHA256(signing secret, \"<t>.<raw body>\")>","in":"header","name":"X-FM-Signature","required":true,"schema":{"type":"string"}},{"in":"header","name":"X-FM-Event","required":true,"schema":{"const":"tags.updated"}},{"description":"The event id; the same on every retry","in":"header","name":"X-FM-Delivery","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Event"},{"properties":{"data":{"properties":{"run":{"$ref":"#/components/schemas/TagRun"},"tags":{"items":{"properties":{"added":{"type":"integer"},"id":{"type":"integer"},"name":{"type":"string"},"products":{"type":"integer"},"removed":{"type":"integer"},"skipped":{"type":"integer"}},"type":"object"},"type":"array"}},"type":"object"},"type":{"const":"tags.updated"}},"type":"object"}]}}},"required":true},"responses":{"2XX":{"description":"Received. Anything else is retried after 1, 5 and 30 minutes, 2 and 6 hours."}},"summary":"A dynamic tag pass added or removed products (counts only; read the products from /v1/tags/{id}/products)"}}}}
