.xlsx); map source columns to phone, email, name, and custom fields, then inspect the background import result.POST /api/v1/contacts requires contacts:write. Convert normalizes valid phones to E.164 and emails to lowercase. Matching normalized email, phone, or external customer ID can enrich an existing record rather than create a duplicate.12345678{ "phone_number": "+2348012345678", "email": "[email protected]", "external_customer_id": "customer-1042", "first_name": "Ada", "tags": ["customer"], "custom_fields": {"tier": "gold", "order_id": "ORD-1042"} }
POST /api/v1/contact_lists/:contact_list_id/contacts. The list controls placement and matching within that list. Custom field keys must be configured in the workspace, and this flow does not change consent or suppression state. Its optional idempotency key prevents conflicting replays.PATCH /api/v1/contacts/:id is a partial update. Omitted fields keep their values. Send explicit null only when clearing a supported field intentionally. Use the numeric ID returned for the workspace contact.custom_fields stores persistent profile attributes, such as tier or order number. These can become merge fields and segment inputs. Template variables are request-specific; OTPs are not automatically persisted as custom fields by the single-message API.DELETE /api/v1/contacts/:id returns 204 No Content. Deletion is permanent and also removes dependent recipient delivery records. Use opt-out/preferences when you need to stop messaging while retaining customer history.