---
title: "Finalize Contact Import"
method: POST
path: "/api/contacts/import-finalize"
tags: ["Client Enrichment"]
---

# Finalize Contact Import

`POST /api/contacts/import-finalize`

Finalize an imported contact batch and trigger guarded auto-enrichment.

Trust boundary: LinkedIn/Google browser import modals currently insert
contacts directly through Supabase, so the backend cannot write a receipt in
the same commit. For a receipt not already written by a server import path,
this endpoint creates it only after proving every supplied contact belongs
to the authenticated organization. Newly inserted IDs must have
``created_at`` within the last 24 hours; matched existing IDs must carry a
current-user ``contact_known_by`` edge for the claimed Google/LinkedIn
import source. Those checks limit which direct-client writes may be claimed
as an import; they are not proof that the client performed the original write.

## Query parameters

- `user_id` string
- `org_id` string

## Request body

- ImportFinalizeRequest
  - `import_batch_id` string, uuid, nullable
  - `source` string, required
  - `contact_ids` string[]
  - `matched_contact_ids` string[]

## Response `200`

Successful Response

- ImportFinalizeResponse
  - `receipt_id` string, required
  - `status` string, required
  - `job_id` string, nullable
  - `created` boolean, nullable
  - `reason` string, nullable
  - `requested_count` integer, required
  - `granted_count` integer, required

## Other responses

- `422` — Validation Error

## Changes

> 23 revisions in range; 20 could not be searched.

- **2026-07-26** `13940b6986a4` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/every/apis/every-api/changes/api/contacts/import-finalize/post.md)

---

[API](https://skmtc.dev/every/apis/every-api.md) · [All operations](https://skmtc.dev/every/apis/every-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/every/every-api/revisions/88bb31b8dace/schema)
