Create or update a contact
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Post, RequestUri = new Uri("https://dashboard.azimea.com/api/v1/contacts"), Headers = { { "Authorization", "Bearer <token>" }, }, Content = new StringContent("{ \"id\": null, \"externalId\": \"user_4821\", \"email\": \"ana.popescu@example.com\", \"firstName\": \"Ana\", \"lastName\": \"Popescu\", \"phone\": \"+40721000000\", \"city\": \"Cluj-Napoca\", \"countryCode\": \"RO\", \"language\": \"ro\", \"attributes\": { \"plan\": \"pro\", \"seats\": 12 }, \"consent\": { \"basis\": \"Subscribed\", \"proof\": { \"text\": \"Send me product news and offers from Notely.\", \"textVersion\": \"2\", \"locale\": \"ro_RO\", \"ipAddress\": \"203.0.113.7\", \"givenAt\": \"2026-10-05T09:30:00+00:00\" } }, \"topics\": { \"product_news\": true } }") { Headers = { ContentType = new MediaTypeHeaderValue("application/json") } }};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}const url = 'https://dashboard.azimea.com/api/v1/contacts';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"id":null,"externalId":"user_4821","email":"ana.popescu@example.com","firstName":"Ana","lastName":"Popescu","phone":"+40721000000","city":"Cluj-Napoca","countryCode":"RO","language":"ro","attributes":{"plan":"pro","seats":12},"consent":{"basis":"Subscribed","proof":{"text":"Send me product news and offers from Notely.","textVersion":"2","locale":"ro_RO","ipAddress":"203.0.113.7","givenAt":"2026-10-05T09:30:00+00:00"}},"topics":{"product_news":true}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://dashboard.azimea.com/api/v1/contacts \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "id": null, "externalId": "user_4821", "email": "ana.popescu@example.com", "firstName": "Ana", "lastName": "Popescu", "phone": "+40721000000", "city": "Cluj-Napoca", "countryCode": "RO", "language": "ro", "attributes": { "plan": "pro", "seats": 12 }, "consent": { "basis": "Subscribed", "proof": { "text": "Send me product news and offers from Notely.", "textVersion": "2", "locale": "ro_RO", "ipAddress": "203.0.113.7", "givenAt": "2026-10-05T09:30:00+00:00" } }, "topics": { "product_news": true } }'Writes one person from your own system. The contact is found by id, then externalId (your user id), then email, and created when none matches (an email is then required: audience.contact_email_required); a user id and an email that point at two different contacts are refused, never merged (409 audience.contact_identity_conflict). Fields left out stay as they are; attributes is a patch (a key sent is set, null removes it), and an unknown attribute key is created when the contact settings allow it, refused with audience.attribute_unknown otherwise. consent only moves up: Customer makes an existing customer, Subscribed needs proof.text (audience.consent_proof_required) and also brings back someone who unsubscribed, Unsubscribed stops marketing only; a bounce or a complaint is never lifted. topics turns topics on or off by key (topics.not_found, topics.archived). A store’s contact keeps the email, id and consent the store syncs (audience.contact_store_managed), except an unsubscribe, which is always honoured. A new contact counts toward the plan (audience.contact_limit_reached). Sending the same contact twice leaves it as the first call did, so retries are safe. Needs contacts:write.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Example
nullExample
user_4821Example
ana.popescu@example.comExample
AnaExample
PopescuExample
+40721000000Example
Cluj-NapocaExample
ROExample
roobject
Example
{ "plan": "pro", "seats": 12}object
Example
{ "product_news": true}Example
{ "id": null, "externalId": "user_4821", "email": "ana.popescu@example.com", "firstName": "Ana", "lastName": "Popescu", "phone": "+40721000000", "city": "Cluj-Napoca", "countryCode": "RO", "language": "ro", "attributes": { "plan": "pro", "seats": 12 }, "consent": { "basis": "Subscribed", "proof": { "text": "Send me product news and offers from Notely.", "textVersion": "2", "locale": "ro_RO", "ipAddress": "203.0.113.7", "givenAt": "2026-10-05T09:30:00+00:00" } }, "topics": { "product_news": true }}Responses
Section titled “Responses”The contact as stored, and whether it was created
object
object
object
object
object
object
object
object
object
Example
{ "isSuccess": true, "value": { "contact": { "id": "01a10a3c-5e2f-7b41-9c0d-4f7a2b6e1d90", "storeId": null, "email": "ana.popescu@example.com", "firstName": "Ana", "lastName": "Popescu", "phone": "+40721000000", "city": "Cluj-Napoca", "countryCode": "RO", "consentStatus": "Subscribed", "isPayingCustomer": false, "orderCount": 0, "totalSpent": 0, "lastOrderAt": null, "sourceCreatedAt": null, "lastSyncedAt": null, "fromOrders": false, "consentSource": "api", "consentUpdatedAt": "2026-10-05T09:30:00+00:00", "storeConsentMode": null, "marketingDeclared": false, "tags": [ "trial" ], "attributes": { "plan": "pro", "seats": 12 }, "lastOpenAt": null, "lastClickAt": null, "lastEmailedAt": null, "language": "ro", "addedAt": "2026-10-05T09:30:00+00:00", "lastConversionAt": null }, "created": true }, "status": 0, "errors": [], "fieldErrors": null}Validation failed: see errors[].code and fieldErrors
object
object
Example
{ "statusCode": 400, "message": "One or more errors occurred!"}Missing or invalid API key
The key lacks the contacts:write permission