Partially updates a contact. Only fields included in the request body are changed. Requires editor role or higher.
Parameters
Updated email address. Triggers re-deduplication.
Updated phone number in international format.
Updated lifecycle status: ACTIVE, UNSUBSCRIBED, BOUNCED, or BLOCKED.Setting status to UNSUBSCRIBED or BLOCKED immediately suppresses the contact from future sends. Use this when syncing opt-out signals from an external source. For consent-based suppression, prefer the Consent API — it stores a timestamped audit trail.
Replaces the contact’s tag list entirely. To add a single tag without removing others, fetch the contact first, append the tag, then send the full updated array.
Key-value pairs merged into the existing custom_fields object. Existing keys not included in this call are preserved.
Request
curl -sS -X PATCH "https://api.arowana.app/v1/contacts/c_a1b2c3d4" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tags": ["vip", "germany", "newsletter"],
"custom_fields": { "loyalty_tier": "platinum" }
}'
Response
200 OK
400 Validation error
404 Not Found
{
"id": "c_a1b2c3d4",
"email": "jana@example.com",
"phone": "+4917612345678",
"first_name": "Jana",
"last_name": "Müller",
"status": "ACTIVE",
"tags": ["vip", "germany", "newsletter"],
"custom_fields": { "loyalty_tier": "platinum" },
"updated_at": "2026-03-28T10:00:00Z"
}
{
"error": "validation_error",
"message": "Request validation failed.",
"details": [{ "field": "status", "message": "Must be one of: ACTIVE, UNSUBSCRIBED, BOUNCED, BLOCKED" }]
}
{ "error": "not_found", "message": "Contact not found." }