Skip to main content

POST /api/v1/partner/events

Fires a lifecycle event for a contact. Events are the primary way to trigger review campaigns — when something meaningful happens in your system (a loan closes, a matter resolves, an appointment completes), you fire an event and eEndorsements handles the rest. The event is queued immediately and the review campaign logic runs asynchronously. A contact must already exist, or you can identify one by email and let the API create it on the fly.

Authentication

x-api-key header — see Authentication.

Request body

FieldTypeRequiredDescription
contact_idUUIDOne of contact_id or emailThe eEndorsements contact ID returned from the Contacts API.
emailstringOne of contact_id or emailEmail address of the contact. If no contact with this email exists, one is created automatically.
event_typestringYesThe lifecycle event that occurred. Can be any string — see Event types for conventions.
professional_idUUIDNoThe eEndorsements professional to associate with this review request. Overrides any professional_id set on the contact.
metadataobjectNoArbitrary key/value pairs attached to the event. Useful for passing context (loan number, matter ID, appointment date) into campaign templates or for filtering in reporting.

Example request — by contact ID

curl -X POST https://app.eendorsements.com/api/v1/partner/events \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contact_id": "7c3e1a2b-4d5f-6789-bcde-f01234567890",
    "event_type": "loan.funded",
    "professional_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "metadata": {
      "loan_number": "LN-20260427-001",
      "close_date": "2026-04-27"
    }
  }'

Example request — by email

If you have not yet created a contact explicitly, you can identify by email. A contact is created automatically if one does not already exist.
curl -X POST https://app.eendorsements.com/api/v1/partner/events \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "alex.johnson@example.com",
    "event_type": "matter.closed"
  }'

Example response

{
  "id": "9f4d2e3a-1b5c-7890-cdef-012345678901",
  "status": "queued"
}
FieldTypeDescription
idUUIDUnique identifier for this event record.
statusstringAlways "queued" on success. Campaign processing happens asynchronously.

Event types

event_type is a free-form string. Use dot-separated namespaces to keep things readable. Common conventions:
Example valueWhen to fire
loan.fundedMortgage or lending workflow — loan closes and funds.
loan.closedLoan process completes (use when “funded” isn’t the right milestone).
matter.closedLegal or professional services — case or matter is resolved.
appointment.completedHealthcare, wellness, or services — appointment or visit finishes.
transaction.closedReal estate — transaction closes.
custom.eventAny other milestone you define.
The value you send is recorded as-is. Your eEndorsements campaign configuration determines which event types trigger which campaigns.

Metadata

The metadata object accepts any flat or nested JSON. It is attached to the event record and can be referenced in campaign templates and reporting filters. There is no enforced schema.
{
  "metadata": {
    "loan_number": "LN-20260427-001",
    "close_date": "2026-04-27",
    "loan_type": "Conventional",
    "branch": "Denver"
  }
}

Idempotency

Events are not deduplicated by default — each call creates a new event record. If you need to prevent duplicate campaigns, use the Contacts API with a stable external_id to manage contacts, and design your integration to fire events only once per milestone.