CopyHero

Dedupe Check

POST
/api/v1/product-research/dedupe-check

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.

Authorization

HTTPBearer
headerAuthorizationBearer <token>

Request Body

application/json
  1. body

POST /product-research/dedupe-check — up to 60 cards per request.

max_length bounds one request's inline work (exact source ids + concurrent image hashing + the owned match); send more cards as several requests of at most 60.

items?array<>
Itemsitems <= 60

Response Body

Successful Response

application/json
  1. response

POST /product-research/dedupe-check — the full verdict in one response.

results folds the exact source-id hits (already_imported, score 1.0) and the perceptual-hash duplicate matches (score 0.995) into one per-card list holding matches only, keyed by product_id. There is no job handle and no polling — the whole page resolves in this single request.

intra_list_duplicates is the orthogonal within-page dedup: cards that match an earlier card in the same page (not the catalogue). A card can appear in both lists.

results?array<>
intra_list_duplicates?array<>
Example Request
curl -X POST 'https://app.copyhero.app/api/v1/product-research/dedupe-check' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "results": [    {      "product_id": "string",      "band": "already_imported",      "matched_internal_product_id": "8bd3f9b9-2404-487c-86f5-b16763986167",      "score": 0    }  ],  "intra_list_duplicates": [    {      "product_id": "string",      "duplicate_of_product_id": "string",      "score": 0,      "reason": "source_id"    }  ]}