Competitor Trends Graph
Competitor publish rate for keyword over the same last-90-days window
as /trends — 13 weekly buckets of how many semantically matching products
the caller's SUBSCRIBED watched stores listed. Aggregates only (no product
ids); no subscription → an all-zero response, never an error.
HTTPBearerAuthorizationBearer <token>keyword*KeywordSearch keyword.
1 <= lengthband?BandRelevance band: cosine-distance width past the best hit that still counts as a match for the weekly trend counts.
0.01 <= value <= 0.150.06Successful Response
application/json- response
GET /product-research/competitor-trends — how fast the competitor
corpus is publishing products semantically close to one keyword.
Aggregates ONLY: no internal_product_id ever leaves this router (the
universe router stays the single deliberate internal-id endpoint). Scoped to
the caller's live watched-store subscriptions — no subscription, no data.
Every number is bounded to the chart's 13-week window (the former all-time
total_matches/total_stores forced an O(corpus) scan and were
REMOVED, not deprecated) and EXACT — a request whose numbers cannot be
computed exactly fails with a 503 rather than answering approximately.
keyword*Keywordcorpus_size?Corpus Size0match_distance?number|nullpoints?array<>curl -X GET 'https://app.copyhero.app/api/v1/product-research/competitor-trends?keyword=string'{ "keyword": "string", "corpus_size": 0, "match_distance": 0, "points": [ { "date_from": "string", "date_to": "string", "timestamp": 0, "products": 0, "stores": 0 } ]}Competitor Products Gallery For Agent GET
Bounded agent page over subscribed competitor products; the UI route keeps its larger ``page_size`` range.
Dedupe Check POST
Resolve the dedupe verdict of up to 60 cards inline, in one request. Owner-scoped (owner = active organization). Returns matches only: ``already_imported`` (exact source id, score 1.0) and ``duplicate`` (the card's image has exactly the perceptual hashes of one of the owner's revision-1 images, score 0.995). Unmatched cards are absent. At most 60 cards per call; 503 when the match exceeds its statement timeout. No job, no polling.