# 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 PUT \
--url 'https://api.migration.powerdialer.ai/api/public/v2/contacts/123' \
--header "Authorization: Bearer $POWERDIALER_API_KEY" \
--header "Idempotency-Key: $POWERDIALER_REQUEST_ID" \
--header 'Content-Type: application/json' \
--data '{
"ownerId": "user_example",
"externalId": "crm-contact-123",
"name": "Alex Morgan",
"phoneNumber": "+12125550100",
"additionalNumbers": [],
"metadata": {
"source": "website"
},
"timeZone": "America/New_York",
"timeZoneSource": "provided"
}'{
"ownerId": "user_example",
"externalId": "crm-contact-123",
"name": "Alex Morgan",
"phoneNumber": "+12125550100",
"additionalNumbers": [],
"metadata": {
"source": "website",
"timeZone": "America/New_York",
"timeZoneSource": "provided"
},
"timeZone": "America/New_York",
"timeZoneSource": "provided",
"id": 123,
"createdAt": "2026-10-08T12:00:00.000Z",
"updatedAt": "2026-10-08T12:00:00.000Z"
}{
"error": {
"code": "invalid_api_key",
"message": "API key is invalid, expired or revoked",
"requestId": "00000000-0000-4000-8000-000000000004"
}
}Update a contact
Replace the writable details of a known contact while preserving its PowerDialer ID. Requires contacts:write. The existing contact and requested ownerId must both be permitted by the credential, and the new owner must be a current workspace member.
Send the full contact write shape, including owner and phone number. This is not a partial PATCH: omitted name, additional numbers, metadata and timezone fields take their documented defaults. An omitted externalId preserves the existing value; providing one changes the contact’s external mapping. Keep external IDs unique within the workspace. Updating a contact does not move its calling-list memberships.
Use a persisted Idempotency-Key; retry an uncertain response with the identical request. 404 not_found means the contact is missing or outside scope. For 403 invalid_owner, choose an allowed member. 409 idempotency_conflict requires the original request or a new key for a genuinely different operation.
# 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 PUT \
--url 'https://api.migration.powerdialer.ai/api/public/v2/contacts/123' \
--header "Authorization: Bearer $POWERDIALER_API_KEY" \
--header "Idempotency-Key: $POWERDIALER_REQUEST_ID" \
--header 'Content-Type: application/json' \
--data '{
"ownerId": "user_example",
"externalId": "crm-contact-123",
"name": "Alex Morgan",
"phoneNumber": "+12125550100",
"additionalNumbers": [],
"metadata": {
"source": "website"
},
"timeZone": "America/New_York",
"timeZoneSource": "provided"
}'{
"ownerId": "user_example",
"externalId": "crm-contact-123",
"name": "Alex Morgan",
"phoneNumber": "+12125550100",
"additionalNumbers": [],
"metadata": {
"source": "website",
"timeZone": "America/New_York",
"timeZoneSource": "provided"
},
"timeZone": "America/New_York",
"timeZoneSource": "provided",
"id": 123,
"createdAt": "2026-10-08T12:00:00.000Z",
"updatedAt": "2026-10-08T12:00:00.000Z"
}{
"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}$Path Parameters
Numeric PowerDialer contact ID, not your CRM externalId. The contact must be inside the credential’s workspace and owner scope.
1 <= x <= 2147483647Body
ID of an active PowerDialer workspace member allowed by this key. Personal keys must use their own ownerId from GET /me.
1 - 100Primary number in E.164 format, including + and country code.
^\+[1-9]\d{6,14}$Stable contact ID from your CRM or source system, unique within this workspace. Reuse it on POST to update an existing contact.
1 - 200Contact display name. Omitting this field on a write resets it to an empty string.
500Up to 10 additional E.164 numbers. Replaces the stored array; omitted means empty.
10^\+[1-9]\d{6,14}$Your JSON object. Its JSON.stringify output must fit within 16,000 UTF-16 code units. Replaces existing metadata. Top-level timezone fields overwrite the matching metadata keys.
IANA timezone such as America/New_York. A non-null value requires timeZoneSource provided or phone_estimate; null or omission requires unknown. The API does not infer a timezone.
100provided for a known timezone, phone_estimate for an estimate made by your integration, or unknown when timeZone is null.
provided, phone_estimate, unknown Response
The updated contact, or the saved response for an identical retry.
PowerDialer contact ID. Use this integer in contact URLs.
Stored contact name.
Stored primary phone number. V2 writes require E.164.
Stored additional phone numbers.
Stored JSON metadata. v2 writes use objects; legacy rows may contain other JSON values.
Attributed PowerDialer member ID.
Your source-system identifier, or null when no identifier was assigned.
Time the contact was created, in UTC.
Time the contact was last updated, in UTC.
Stored timezone metadata. V2 writes produce an IANA string or null; legacy metadata may contain another JSON value.
Stored timezone-source metadata. V2 writes use provided, phone_estimate, or unknown; legacy values may differ.