Skip to content

List contact imports

Every import your team has run, newest first.

http
GET /v1/contacts/imports

Requires a Full access API key.

Query parameters

ParameterTypeDescription
limitnumberHow many to return. Default 20, min 1, max 100.
afterstringReturn imports after this id. Cannot be combined with before.
beforestringReturn imports before this id. Cannot be combined with after.
statusstringOnly imports with this status — queued, in_progress, completed or failed.

Cursor-paginated.

Example

bash
# imports still in flight
curl "https://api.sendgrail.com/v1/contacts/imports?status=in_progress" \
  -H "Authorization: Bearer $SENDGRAIL_API_KEY"
js
const res = await fetch(
  'https://api.sendgrail.com/v1/contacts/imports?status=completed',
  { headers: { Authorization: `Bearer ${process.env.SENDGRAIL_API_KEY}` } },
);

const { data, has_more } = await res.json();

Response

json
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "contact_import",
      "id": "479e3145-dd38-476b-932c-529ceb705947",
      "status": "completed",
      "created_at": "2026-05-15T18:32:37+00:00",
      "completed_at": "2026-05-15T18:33:42+00:00",
      "counts": {
        "total": 1200,
        "created": 800,
        "updated": 300,
        "skipped": 75,
        "failed": 25
      }
    }
  ]
}

Each row is the full import object — status and counts included, so a dashboard can render the list without a request per row.

Transactional email on your own domain.