# Base URLs

> Where to send each request, the request format, the body size limits and the identifiers used by the Emelia API.

Source: https://docs.emelia.io/docs/base-urls

All requests go over HTTPS, with JSON bodies.

| Use                                                                                                | Base URL                      | Example                                        |
| -------------------------------------------------------------------------------------------------- | ----------------------------- | ---------------------------------------------- |
| Emelia API: campaigns, enrichment, replies, blacklist, webhooks, email providers, LinkedIn scraper | `https://api.emelia.io`       | `GET https://api.emelia.io/advanced/campaigns` |
| Lists and contacts                                                                                 | `https://api.emelia.io/lists` | `POST https://api.emelia.io/lists/list`        |
| MCP server, for AI assistants                                                                      | `https://mcp.emelia.io/mcp`   | See [MCP server](https://docs.emelia.io/docs/ai/mcp.md)                 |

The paths in this documentation are complete: `/lists/list` means `https://api.emelia.io/lists/list`. There is no version prefix in the paths.

## One host, two services

The lists and contacts routes (`/lists/...`) are served by a separate service behind the same host. You use the same key, but a few rules differ, and each page says so:

|                  | Main API                                  | Lists and contacts (`/lists/...`) |
| ---------------- | ----------------------------------------- | --------------------------------- |
| Error body       | `{ "error", "code"?, "params"? }`         | `{ "message", "code"? }`          |
| "Not found"      | HTTP 400                                  | HTTP 404                          |
| Body size limit  | 30 MB                                     | 5 MB, then `413`                  |
| Per minute quota | Yes, see [Rate limits](https://docs.emelia.io/docs/rate-limits.md) | Not counted                       |

## Current and legacy campaign routes

Campaigns are served under `/advanced/...`. This is the current campaign system, the one of the Emelia app: every campaign is multichannel. Use it for all new work, whatever the channels.

The `/emails/...` and `/linkedin/...` campaign routes belong to the previous system, where a campaign was either email only or LinkedIn only. They keep working for existing integrations and are documented under [Campaigns, Legacy](https://docs.emelia.io/docs/campaigns/legacy.md). The [blacklist](https://docs.emelia.io/docs/blacklist.md) routes also start with `/emails/` for historical reasons: they are current and apply to every campaign.

## Request format

* Bodies are JSON: send `Content-Type: application/json`. File uploads use `multipart/form-data` and say so on their page.
* Responses are JSON, except file downloads (CSV).
* Dates are ISO 8601 strings in UTC, for example `2026-10-15T08:00:00.000Z`.
* Emelia ids (campaigns, lists, contacts, steps, jobs) are MongoDB ObjectIds: 24 lowercase hexadecimal characters, for example `6650f1a2b839d80011c5a0f1`. The export jobs of lists are the exception: their `jobId` is a UUID.
* A request that runs longer than 120 seconds is cut by the load balancer. Long work (enrichment, exports, extractions) runs as background jobs instead.
* An unknown path answers an HTML 404 page, not JSON. If you get HTML back, check the path and the method.

## Test environment

There is no separate test environment: every request acts on your real account. To experiment, create a list and a draft campaign named "Test", and delete them afterwards. A draft campaign never sends anything until you start it.
