Skip to main content
POST /api/v1/import/jobs stages a batch of past jobs (or customers) for a reactivation campaign. Mailr geocodes every address and stages the batch — nothing is mailed and no campaign is created. The campaign wizard reads the staged batch later, in the exact shape a CSV upload produces. Required scope: import:write · Limits: 500 rows / request, 1 MB body, 10 batches / org / UTC day
Geocoding runs before any write, so a geocoder outage never leaves a half-written batch and never burns one of your 10 daily slots. One request is one batch; there is no cross-batch dedup, and duplicate addresses within a batch are geocoded independently (the wizard’s selection step is where an operator prunes).
Retry-safe imports. Pass an optional Idempotency-Key request header (any string ≤255 chars — a UUID or hash) to make retries safe. A retry carrying a key Mailr has already seen returns the existing batch and its stored counts with 200 (not 201) — nothing is re-geocoded and no extra daily slot is spent. A retry that lands while the original request is still processing (geocoding can run for minutes) gets a 409 import_in_progress with a Retry-After header — keep retrying with the same key until you get the finished batch. A key longer than 255 chars is a 422. Keyless imports never dedup: each request stages a fresh batch. (This is replay-safety only — addresses are still never deduplicated, within a batch or across batches.)

Request

string
Optional replay key (≤255 chars). A repeat with the same key returns the existing batch (200) instead of staging a new one, or 409 while the original request is still processing; keyless requests never dedup.
string
required
jobs or customers.
array
required
1–500 rows.
string
Full mailing address (≤500 chars). A row with no address is skipped (not an error). A non-string address is an error.
string
Your id for this job/customer (≤128 chars). Optional.
string
Optional (≤200 chars).
string (ISO-8601 date)
YYYY-MM-DD (a datetime’s time part is dropped). Garbage is rejected with the offending row named. Optional.

Response

201 Created
The three counts are exact and sum to the number of rows you sent:
integer
Rows geocoded and staged.
integer
Rows with no address.
integer
Rows whose address couldn’t be geocoded.
Take import_id into the campaign wizard to build a reactivation campaign from the staged rows.

Status codes

On 429, 502, or 503, nothing was staged and no daily slot was consumed — retry the whole batch later.