Create a contact
tenantKeybearerAuthX-Tenant-Key<token>The public store key (pk_live_…). Required on every call.
AuthorizationBearer <token>A customer token from POST /v1/auth/login, or a merchant API key, on routes that need one.
X-Client-IP?stringOptional. IP address of the shopper (one IPv4/IPv6, no port, no list). Honoured only together with a valid X-Tenant-Secret; ignored otherwise. Used for rate limits and recorded with form submissions.
X-Tenant-Secret?stringOptional here. Server secret of the store: server-to-server only, never from a browser. Enables X-Client-IP.
Idempotency-Key?stringOptional; recommended (a UUID made once per user action, reused only to retry that action). Only a success is stored (24 hours): the same key with the same body, URI and credentials (Authorization, X-Cart-Token, X-Chat-Token) replays it (Idempotent-Replayed: true); anything else under that key is 422 IDEMPOTENCY_KEY_REUSED. An error is never stored: after a 4xx or 5xx, retrying with the same key runs the request again.
application/json- body
POST merchant/crm/contacts and PATCH merchant/crm/contacts/{id}. The shape only: the CRM writer validates the values themselves — the
stage key, the owner and company, the email and phone, every custom field through
CustomFieldValidator — and answers 422 with the field named.
first_name, last_name, title, email, phone the contact's own fields; null or "" clears job_title the job title (at most 150 characters); null or "" clears lifecycle_stage a stage key, or null owner_id a staff id, or null company_id the primary company's id, or null tags the WHOLE set (replaces); or add_tags / remove_tags to change some custom_fields {key: value}; null clears one
first_name?|length <= 255last_name?|length <= 255title?|length <= 255job_title?|length <= 150email?|length <= 254phone?|length <= 32lifecycle_stage?|length <= 64owner_id?|1 <= valuecompany_id?|1 <= valuetags?array<>items <= 100add_tags?array<>items <= 100remove_tags?array<>items <= 100custom_fields?array<string>Success.
application/json- response
data*curl -X POST 'https://api.elaraone.app/api/v1/merchant/crm/contacts' \ -H 'X-Tenant-Key: pk_live_…' \ -H 'X-Tenant-Secret: your-server-secret' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": { "id": 0, "first_name": "string", "last_name": "string", "title": "string", "job_title": "string", "email": "string", "phone": "string", "lifecycle_stage": "string", "owner_id": 0, "company_id": 0, "tags": [ null ], "custom_fields": {}, "first_source": "string", "first_source_detail": "string", "first_seen_at": "string", "last_activity_at": "string", "created_at": "string", "updated_at": "string" }}