---
title: "List contact imports"
method: GET
path: "/imports"
tags: ["Imports"]
---

# List contact imports

`GET /imports`

## Request

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

Retrieve a paginated list of your contact imports — CSV uploads and connected-provider
syncs — most recently requested first. Each row mirrors the dashboard's import history:
type, processing status, contact counts, who requested it, when, and its review status.

`channel` selects which universe is listed: `email` (the default — contact imports and
provider syncs) or `sms` (SMS consent imports, a separate review pipeline). The two are
different record types with per-channel `status`/`review_status` vocabularies and count
keys; rows state their `channel`.

**Required scope:** `contacts_read`

## Query parameters

- `page` integer
- `per_page` integer
- `channel` 'email' | 'sms'
- `status` string
- `review_status` string

## Headers

- `Privy-Account-Id` string

## Response `200`

A paginated list of imports.

- object
  - `data` Import[]
    - `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
  - `pagination` PaginationEnvelope
    - `page` integer
    - `per_page` integer
    - `total_count` integer
    - `total_pages` integer

## Other responses

- `401`: Missing or invalid bearer token.
- `403`: `insufficient_scope` when the token lacks the required scope for this endpoint.
- `422`: One or more fields failed validation.
- `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 `422`
  - 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/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)
