Create or update a contact

POST/v1/contacts

Secret key — sk_… or sk_test_… · Base URL https://api.volanea.com

Upsert by email (addresses are lowercased). Only the provided fields are changed on update.

Body

Required · application/json

  • emailemailrequired
  • firstNamestring
  • lastNamestring
  • subscribedboolean
  • dataobject

    Arbitrary custom fields (replaces the stored object).

Response

200 · Contact

  • contactIdstringrequired
  • projectIdstring
  • emailemailrequired
  • firstNamestring | null
  • lastNamestring | null
  • subscribedbooleanrequired
  • dataobject | null

    Arbitrary custom fields.

  • localestring | null
  • createdAtdate-timerequired
  • updatedAtdate-timerequired

Errors

Every failure returns the standard envelope — branch on `code`, never on the wording of `error`.

  • 401Missing or invalid API key.
  • 422Request validation failed (code `validation_error`, 422).

Request

curl https://api.volanea.com/v1/contacts \
  -X POST \
  -H "Authorization: Bearer sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "email": "ada@example.com",
    "firstName": "Ada",
    "lastName": "Lovelace"
  }'

Response

200 · application/json

{
  "success": true,
  "data": {
    "contactId": "con_5e90",
    "projectId": "<projectId>",
    "email": "ada@example.com",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "subscribed": true,
    "data": {},
    "locale": "en",
    "createdAt": "2026-01-01T09:00:00.000Z",
    "updatedAt": "2026-01-01T09:00:00.000Z"
  }
}

92 endpoints · OpenAPI document