---
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 and has ``created_at`` within the last 24
hours. That recency window limits which direct-client writes may be claimed
as an import; it is not proof that the browser performed the original insert.

## Query parameters

- `user_id` string
- `org_id` string

## Request body

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

## 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

---

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