---
title: "Get a contact import"
method: GET
path: "/imports/{id}"
tags: ["Imports"]
---

# Get a contact import

`GET /imports/{id}`

## Request

- Base URL: `https://api.privy.com/v1`
- URL: `https://api.privy.com/v1/imports/{id}`
- Auth: HTTP bearer

Retrieve a single contact import — the same row `/v1/imports` lists for it.

**Required scope:** `contacts_read`

## Path parameters

- `id` string, required

## Headers

- `Privy-Account-Id` string

## Response `200`

The import.

- object
  - `data` object: A contact import that created or updated contacts in bulk. Two channels share this shape: `email` (CSV uploads and connected-provider syncs) and `sms` (SMS consent imports, a separate review pipeline). Email imports create their contacts when the import is processed — shortly after `created_at`, before review — and approving the import then applies the pending consent (e.g. `never_subscribed` to `subscribed`). The base row is deliberately slim — the same facts the Privy dashboard's import history shows (`id`, `channel`, `source`, `status`, `review_status`, `requested_by`, `counts`, `created_at`).
    - `id` string: Stable prefixed identifier (`im_…` email, `sim_…` sms). Use this value in `/v1/imports/{id}`; contacts reference email imports in `import_ids`.
    - `channel` 'email' | 'sms': Which import pipeline the row belongs to.
    - `source` string, nullable: The import mechanism, lowercased (`csv`, `shopify`, `mailchimp`, …). SMS consent imports are always `csv`.
    - `status` string, nullable: Processing outcome. Email values: `pending`, `partial`, `successful`, `failed`. Omitted on SMS rows for merchant tokens (the dashboard's SMS import history has no status column).
    - `review_status` string: Approval state. Email values: `NA` (review not required), `exempt`, `pending`, `approving`, `approved`, `auto_approved`, `partially_approved`, `rejected`. SMS values: `pending`, `approved`, `rejected`.
    - `requested_by` string, nullable: Display name of the merchant user who requested the import (for SMS consent imports, the TCPA compliance signer).
    - `counts` object, nullable: Outcome counts. Email keys: `imported`, `new_contacts`. SMS keys: `imported`, `rejected`, `ignored` (all audiences). Null on SMS rows until processing has produced real counts (pending/rejected imports) — never read null as zero.
      - `imported` integer: Contacts processed by the import, including ones that already existed.
      - `new_contacts` integer: Contacts newly created by the import (email only).
      - `rejected` integer
      - `ignored` integer
    - `created_at` string, date-time

## Other responses

- `401`: Missing or invalid bearer token.
- `403`: `insufficient_scope` when the token lacks the required scope for this endpoint.
- `404`: The requested resource does not exist or does not belong to your account.
- `429`: Rate limit exceeded. Retry after the specified time.

## Changes

- **2026-11-05** `cf0885e90d5a`: 8 warning
  - added the new `forbidden` enum value to the `error/code` response property for the response status `401`
  - added the new `forbidden` enum value to the `error/code` response property for the response status `403`
  - added the new `forbidden` enum value to the `error/code` response property for the response status `404`
  - added the new `forbidden` enum value to the `error/code` response property for the response status `429`
  - …4 more
- **2026-11-03** `fe500ab59b3b`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/privy/apis/privy-api/changes/imports/:id/get.md)

---

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