# Replace example resource IDs and ownerId with values from your workspace.
: "${POWERDIALER_API_KEY:?Set POWERDIALER_API_KEY to your scoped API key}"
# Set this once per operation; reuse it with the same request after a timeout.
: "${POWERDIALER_REQUEST_ID:?Set POWERDIALER_REQUEST_ID to a new UUID for this operation}"
curl --request POST \
--url 'https://api.migration.powerdialer.ai/api/public/v2/imports' \
--header "Authorization: Bearer $POWERDIALER_API_KEY" \
--header "Idempotency-Key: $POWERDIALER_REQUEST_ID" \
--header 'Content-Type: application/json' \
--data '{
"listId": 456,
"ownerId": "user_example",
"rows": [
{
"externalId": "crm-contact-123",
"name": "Alex Morgan",
"phoneNumber": "+12125550100",
"timeZone": "America/New_York",
"timeZoneSource": "provided"
}
]
}'{
"id": "00000000-0000-4000-8000-000000000001",
"state": "pending",
"processed": 0
}{
"error": {
"code": "invalid_api_key",
"message": "API key is invalid, expired or revoked",
"requestId": "00000000-0000-4000-8000-000000000004"
}
}Import contacts into a list
Queue a batch of contacts for creation or update and attach successful rows to an existing list. Requires contacts:write and lists:write. Supply a visible listId, an allowed current workspace ownerId, and 1–10,000 rows. The parsed request, serialized as JSON, is limited to 10,000,000 UTF-16 code units; this is not a byte-exact file-upload limit. The job owner overrides owner values inside rows.
HTTP 202 returns an import ID, state and processed count. It means accepted for background work, not that every row is valid or complete. Rows use the contact write shape; stable external IDs update existing visible contacts. Poll the import with the same credential and inspect every row result.
Persist an Idempotency-Key; retry the identical submission after an uncertain response to recover the same job. 413 import_too_large requires smaller batches; 404 not_found means the list is missing or inaccessible. Correct 403 invalid_owner before submitting a new logical import.
See asynchronous imports.
# Replace example resource IDs and ownerId with values from your workspace.
: "${POWERDIALER_API_KEY:?Set POWERDIALER_API_KEY to your scoped API key}"
# Set this once per operation; reuse it with the same request after a timeout.
: "${POWERDIALER_REQUEST_ID:?Set POWERDIALER_REQUEST_ID to a new UUID for this operation}"
curl --request POST \
--url 'https://api.migration.powerdialer.ai/api/public/v2/imports' \
--header "Authorization: Bearer $POWERDIALER_API_KEY" \
--header "Idempotency-Key: $POWERDIALER_REQUEST_ID" \
--header 'Content-Type: application/json' \
--data '{
"listId": 456,
"ownerId": "user_example",
"rows": [
{
"externalId": "crm-contact-123",
"name": "Alex Morgan",
"phoneNumber": "+12125550100",
"timeZone": "America/New_York",
"timeZoneSource": "provided"
}
]
}'{
"id": "00000000-0000-4000-8000-000000000001",
"state": "pending",
"processed": 0
}{
"error": {
"code": "invalid_api_key",
"message": "API key is invalid, expired or revoked",
"requestId": "00000000-0000-4000-8000-000000000004"
}
}Authorizations
Issued in Developers. Workspace/owner/scopes come from credential, never acting-user headers. API keys cannot manage API credentials.
Headers
Persist one key for this logical operation before sending it. Reuse the same value only with the same method, path and body after a timeout. A changed request returns 409 idempotency_conflict; a matching retry returns the original response.
^[A-Za-z0-9._:-]{1,200}$Body
Accepts 1–10,000 rows for background processing. The serialized parsed request is limited to 10,000,000 UTF-16 code units (JavaScript string length). Rows are validated individually, using the job ownerId.
Existing calling list to receive successfully imported contacts.
1 <= x <= 2147483647Active workspace member assigned to every row. Overrides any ownerId supplied inside a row.
1 - 100Between 1 and 10,000 contact objects. Each row uses ContactWrite fields except that ownerId comes from the job. Invalid rows are reported separately during processing.
1 - 10000 elementsResponse
The import was queued. Use the returned ID to poll progress; row-level success is not yet established.
Import job ID. Poll GET /imports/{id} with the same API key.
A newly accepted job starts as pending. Acceptance does not mean the contacts have been imported.
pending Number of rows processed so far; zero in the initial response.