---
title: "Propose pairs of records that look like the same record"
method: GET
path: "/v1/duplicates"
tags: ["companies"]
---

# Propose pairs of records that look like the same record

`GET /v1/duplicates`

## Request

- Base URL: `https://api.indraft.io`
- URL: `https://api.indraft.io/v1/duplicates`
- Auth: HTTP bearer

Propose pairs of records that look like the same record, ranked by how alike their names are and whether they share a relationship. Works on companies, contacts, and a type this workspace defined. It PROPOSES only: nothing here merges anything, and the merge tools still require you to name both ids. Use it on a type with a declared identity too: the key cannot collide, so what is left to find is one person entered twice under two different keys. Walks the workspace a page at a time; pass the returned cursor to continue.

## Query parameters

- `objectType` string, required: What is being surveyed: a canonical type (company, contact), or the key of a type this workspace defined. A workspace's own type is surveyed on its first indexed text field, which is the name the search index holds for it.
- `limit` integer: How many to return. The page bound is published in the schema call, and asking for more is refused rather than quietly truncated.
- `cursor` string: The opaque marker from the previous page. Store it and hand it back; do not parse it. A cursor is only ever emitted when another row really exists, so a page you were given is never empty.

## Response `200`

Success

- object
  - `candidates` object[], required
    - `objectType` 'company' | 'contact', required
    - `left` object, required
      - `id` string, required
      - `label` string, required
    - `right` object, required
      - `id` string, required
      - `label` string, required
    - `similarity` integer, required
    - `reasons` string[], required
  - `nextCursor` string, required
  - `examined` integer, required
  - `requestId` string, required

## Other responses

- `401`: No credential, or one that has been revoked.
- `403`: Authenticated, and this capability is not held.
- `422`: The request does not satisfy the schema on this page.
- `429`: Infrastructure protection tripped. This is not a product quota.
- `500`: A defect on our side. The hint says so, and carries an incident id.

---

[API](https://skmtc.dev/indraft/apis/indraft-api.md) · [All operations](https://skmtc.dev/indraft/apis/indraft-api/llms.txt) · [OpenAPI document](https://skmtc.dev/indraft/apis/indraft-api/revisions/d9bb05346d66?raw)
