# Import Members from CSV

**POST** `/v1/lists/{{list_id}}/import`

Imports members from a publicly accessible CSV file. The CSV must contain an `email` column (case-insensitive). Duplicate emails are silently ignored.

## Upload Flow

CSV files must be uploaded to S3 first using the Upload API, then the returned URL is passed to this endpoint.

**Step 1 — Get a presigned upload URL**

```
POST /v1/utils/upload
{
  "files": [{ "name": "contacts.csv", "type": "text/csv", "size": 1024 }]
}
```

Response includes:
- `signed_url` — PUT this URL directly from the client with the CSV file as the request body
- `file_path` — the public URL to use in the import call

**Step 2 — Upload the CSV to S3**

```
PUT {signed_url}
Content-Type: text/csv
[raw CSV file body]
```

**Step 3 — Import**

```
POST /v1/lists/{{list_id}}/import
{ "file_path": "{file_path from step 1}" }
```

### CSV format

The file must have a header row with at minimum an `email` column. Additional columns are ignored.

```
email,first_name,last_name
jane@example.com,Jane,Doe
john@example.com,John,Smith
```

### Request fields

**file_path** `string` `required` — Public URL of the uploaded CSV file (returned from `POST /v1/utils/upload`).

### Response fields

**total_rows** Total rows found in the CSV.  
**added** Number of valid email addresses imported.  
**member_count** Total members in the list after import.
