Skip to main content

Submit

Kick off a job. Returns 202 Accepted with a job_id plus status_url and result_url. Credits are held at submit time and reconciled when the job finishes — unused rows are refunded automatically.

Endpoint​

Method: POST Path: /data-enrichment/submit/ Full URL: https://backend.ecoreservice.com/api/v1/data-enrichment/submit/ Auth: Authorization: Token YOUR_API_TOKEN (or Bearer) — see Authentication

Accepts either a JSON body (rows) or a multipart file upload (file + meta).

JSON submission​

POST /api/v1/data-enrichment/submit/
Authorization: Token sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{
"selected_layers": ["L1", "L2"],
"rows": [
{ "first_name": "Jane", "last_name": "Doe", "company_name": "Acme Corp", "email": "jane@acme.com" },
{ "first_name": "John", "last_name": "Smith", "company_name": "Globex", "email": "john@globex.com" }
],
"title": "Q1 renewal list",
"field_mapping": { "first_name": "First Name", "last_name": "Last Name", "company_name": "Company", "email": "Email" },
"import_columns": ["first_name", "last_name", "company_name", "email"]
}
FieldTypeRequiredNotes
selected_layers"full" or string[]yesLayer codes or "full". Must be an in-order prefix (["L1"], ["L1","L2"], …), optionally plus "MPA". See Choosing layers.
rowsobject[]yes (JSON path)One object per contact. Keys are your column names; use field_mapping to map them to the enrichment schema.
titlestringnoShown in your DataCore history.
file_namestringnoUsed as the download filename.
field_mapping{ src: dest }noMaps your column names to canonical fields (first_name, last_name, email, company_name, linkedin_url, title).
import_columnsstring[]noColumns to pass through verbatim onto the output.
suppression_list_iduuidnoSkip contacts that appear on this suppression list.
campaign_namestringnoOptional campaign tag.

Multipart (CSV) submission​

POST /api/v1/data-enrichment/submit/
Authorization: Token sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: multipart/form-data

Form parts:

PartTypeRequiredNotes
filefile (text/csv)yesThe contact CSV. First row = headers.
metastring (JSON)yesJSON with the same fields as the JSON body, minus rows.

Response (202 Accepted for both paths)

{
"success": true,
"data": {
"job_id": "6b4c9f70-5a2b-4a0e-9a1b-9c2a3d4e5f61",
"status": "queued",
"ready": false,
"row_count": 1500,
"credits_held": "1125.0000",
"estimated_credits": "1125.0000",
"status_url": "https://backend.ecoreservice.com/api/v1/data-enrichment/status/6b4c9f70-5a2b-4a0e-9a1b-9c2a3d4e5f61/",
"result_url": "https://backend.ecoreservice.com/api/v1/data-enrichment/result/6b4c9f70-5a2b-4a0e-9a1b-9c2a3d4e5f61/"
}
}

Submit errors

HTTPerrorWhen
400validation_errorBad selected_layers value (unknown code, skipped layer, or MPA alone) or empty payload.
400bad_meta / bad_layers / bad_rowsMultipart meta missing, not JSON, or selected_layers/rows missing.
402insufficient_creditsYour wallet can't cover the hold.
402upstream_insufficient_creditsDataForge rejected the submission. Credits are released.
502dataforge_errorTransient upstream failure. Credits are released. Safe to retry.