Quickstart

Make your first Emelia API call in two minutes, then create a list and add a contact to it.

By the end of this page you will have an API key, a working request, a list, and a contact in that list.

Get your API key

Open Settings, API & Webhooks in the Emelia app and create a key.

Store it in an environment variable rather than in your code:

export EMELIA_API_KEY="your_48_character_api_key"

Check that the key works

List your campaigns. This call changes nothing.

GET/advanced/campaigns
curl https://api.emelia.io/advanced/campaigns \
  -H "Authorization: $EMELIA_API_KEY"

A 200 with a campaigns array means you are in. A 401 means the key is wrong or disabled: see Authentication.

Create a list

Contacts live in lists. Create one:

POST/lists/list
curl -X POST https://api.emelia.io/lists/list \
  -H "Authorization: $EMELIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Q4 SaaS founders"}'

The response is a 201:

{ "success": true, "listId": "66f1c0ffee5a7d3b2c4e8a10", "name": "Q4 SaaS founders" }

Add a contact

Send a flat object: one key per field. Emelia recognises the standard fields (firstName, email, companyName...) and turns any other key into a custom variable you can use in your messages.

POST/lists/list/{listId}/contacts
curl -X POST https://api.emelia.io/lists/list/66f1c0ffee5a7d3b2c4e8a10/contacts \
  -H "Authorization: $EMELIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Claire",
    "lastName": "Fontaine",
    "email": "claire.fontaine@nexora.io",
    "companyName": "Nexora",
    "icebreaker": "your move to Postgres 16 last month"
  }'
Response
{
  "success": true,
  "leadId": "66f2a1b2c3d4e5f6a7b8c9d0",
  "companyId": "66f2a1b2c3d4e5f6a7b8c9e0",
  "duplicate": false,
  "updated": false,
  "createdCustomVariables": [{ "technicalName": "icebreaker", "displayName": "icebreaker", "schema": "lead" }]
}

Send the same contact again and nothing is created: the response carries the existing leadId with duplicate: true. The match is on the exact email, then on the exact LinkedIn URL. A contact with neither is created again on every call, so give each contact an email or a LinkedIn URL before you retry.

Attach the list to a campaign

In the app, open a campaign and select the list as its recipients, or do it by API:

PATCH/advanced/campaigns/{campaignId}/recipients

From then on, every contact you add to the list enters the campaign on its own, even while it runs.

Next steps

On this page