# 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 PATCH \
--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 '{
"metadata": {
"lastDunningRun": "2026-10-12",
"obsolete": null
}
}'{
"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"
}
}Patch a contact
Update only supplied contact fields. Metadata shallow-merges atomically under a row lock; null metadata values delete keys. Omitted fields remain unchanged. Requires contacts:write and an Idempotency-Key. PUT retains replacement semantics.
# 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 PATCH \
--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 '{
"metadata": {
"lastDunningRun": "2026-10-12",
"obsolete": null
}
}'{
"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
Required. Omitting this header returns 400 idempotency_key_required and changes nothing; a value outside the pattern returns 400 idempotency_key_invalid. 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
Omitted fields stay unchanged. Stable contact ID from your CRM or source system, unique within this workspace. Reuse it on POST to update an existing contact.
1 - 200Omitted fields stay unchanged. ID of an active PowerDialer workspace member allowed by this key. Personal keys must use their own ownerId from GET /me.
1 - 100Omitted fields stay unchanged. Contact display name.
500Omitted fields stay unchanged. Primary number in E.164 format, including + and country code.
^\+[1-9]\d{6,14}$Replaces the array only when supplied; omission preserves it.
10^\+[1-9]\d{6,14}$Shallow merge: supplied keys replace values, absent keys stay unchanged, null deletes a key. The merged object is limited to 16,000 UTF-16 code units. Top-level timezone fields take precedence; the resulting timezone/source pair must be valid.
When supplied, overwrites metadata.timeZone. Omitted fields stay unchanged. The merged timezone/source pair must remain valid.
100When supplied, overwrites metadata.timeZoneSource. Omitted fields stay unchanged. A non-null zone requires provided or phone_estimate; no zone requires unknown.
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.