Skip to main content

Enrichment Results

Once an enrichment job reaches completed or paused (see Status), use the Results endpoint to fetch enriched records — either as paginated JSON or as a downloadable CSV.

Overview​

Base URL​

EnvironmentURL
Productionhttps://backend.ecoreservice.com/api/v1/enrichment/result/<job_id>/
Staginghttps://test.ecoreservice.com/backend/api/v1/enrichment/result/<job_id>/

Authentication​

Bearer API token in the Authorization header — same as Submit. The job must belong to the authenticated user.

Authorization: Bearer <your_token>

Results Endpoint​

Endpoint: /api/v1/enrichment/result/<job_id>/ Method: GET Description: Returns enriched records for a completed (or paused) job. Supports JSON pagination and CSV download via the report_type query parameter.

Query Parameters​

ParameterTypeDefaultNotes
report_typestringjsonjson for paginated JSON, csv for downloadable CSV
pageinteger1Page number (≥ 1). JSON only.
page_sizeinteger50Page size (1–200). JSON only.

Fetching Results as JSON​

Example cURL Request​

curl --location --request GET 'https://backend.ecoreservice.com/api/v1/enrichment/result/9f3e7a2b-7c1d-4f12-8c9a-1b2c3d4e5f60/?page=1&page_size=50' \
--header 'Authorization: Bearer YOUR_API_TOKEN'

Successful Response​

{
"job_id": "9f3e7a2b-7c1d-4f12-8c9a-1b2c3d4e5f60",
"total_records": 123,
"page": 1,
"page_size": 50,
"data": [
{
"imported_first_name": "Jane",
"imported_last_name": "Doe",
"imported_company_name": "Acme Corp",
"first_name": "Jane",
"last_name": "Doe",
"contact_email": "jane.doe@acme.com",
"contact_mobile_phone": "+1 415 555 0123",
"job_title": "VP of Engineering",
"enrichment_source": "datacore",
"name_match_status": "matched",
"still_in_company_status": "current"
}
]
}
FieldTypeDescription
job_idUUID stringThe job whose results are being returned
total_recordsintegerTotal enriched record count after pipeline completion
pageintegerThe requested page number
page_sizeintegerThe requested page size
dataarrayEnriched records (page slice)

Downloading Results as CSV​

Pass report_type=csv to receive a CSV download instead of JSON.

Example cURL Request​

curl --location --request GET 'https://backend.ecoreservice.com/api/v1/enrichment/result/9f3e7a2b-7c1d-4f12-8c9a-1b2c3d4e5f60/?report_type=csv' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--output enrichment_results.csv

CSV Column Order​

The column order matches the platform's standard download:

  1. All imported_* columns (alphabetically sorted) — preserve the original input fields.
  2. The canonical enrichment columns in a fixed order — account fields followed by contact fields.
  3. Any remaining columns observed in the data.

Internal columns (see Internal Fields Stripped From Output) are excluded.

Output Columns Returned​

Each enriched record contains:

  • All original input fields, prefixed with imported_ — a frozen snapshot of what the caller sent.
  • Every requested field in fields_to_enrich with its enriched value (or empty string when the pipeline could not find a match).
  • enrichment_status — one of enriched, partially_enriched, not_enriched.
  • enrichment_source — which eCore data source produced the data (e.g., datacore). Empty when nothing was matched.
  • name_match_status — outcome of the name-match verification step (Standard/Pro contact only).
  • still_in_company_status — outcome of the still-in-company verification step (Standard/Pro contact only).

Note: enrichment_status is stripped from the JSON API response but is included in the CSV download.

Internal Fields Stripped From Output​

These fields exist on internal records to drive the pipeline but are removed before responses and CSV downloads:

  • uuid — per-row internal identifier used for resume row-matching.
  • email_validation_status — used internally for charging decisions; not exposed.
  • _original_index — internal ordering helper.

Any field beginning with an underscore (_originals, _credits_charged, _audit_trail, _field_sources, etc.) is internal and never leaks out.

Pipeline Behaviors That Affect Output​

Email Validation​

Email validation runs only when contact_email is in fields_to_enrich.

  • If contact_email is not requested (e.g., phone-only enrichment), no email validation occurs and no email-validation cost is incurred.
  • Validation outcomes can drop the email value from the row, reverse that row's email charge, and downgrade enrichment_status.
  • The email_validation_status field is internal and stripped from API responses and CSV downloads.

Name-Match & Still-In-Company Verification​

Both checks run only for Standard and Pro contact jobs (not Account, not Quick).

Name-Match compares the input first/last name against the enriched name (exact-match short-circuit, fuzzy fallback via the name-match service). On mismatch, the row's status drops to not_enriched and credits charged for that row are reversed.

Still-in-Company queries the still-in-company service with the contact's job history. If the response says the person left the company / has no current employment, the row is marked not_enriched and credits are reversed.

Audit-trail entries are written for both checks: the request payload, the response, and any error or skipped reason. Skip reasons are surfaced in the row-level audit so admins can see exactly why a check did not produce a result. When a check is skipped (no input name to compare, no enriched name to compare, or the service returned no result), this is recorded explicitly — the audit will not show a misleading "not performed".

Audit Trail (Internal Only)​

Each enriched row carries an audit trail describing every external/internal call made on its behalf — DataCore lookup, extended dataset lookup, Pro enrichment, email validation, name-match, still-in-company, etc. The audit trail is visible in the platform admin and includes the request payload sent to each service, the response received (or error), a skipped_reason when a check was deliberately bypassed, and an error field with exception type and a truncated message when a service call raised.

The audit trail is internal — it is not returned in the public API result body.

Error Responses​

HTTPWhenBody
400Status is not yet completed or paused{ "error": "Results not ready." }
401Missing or invalid Bearer token{ "message": "Invalid or expired token" }
404job_id not found for the caller, or no results stored yetStandard DRF error envelope
500Unexpected server-side failureStandard DRF/Django error envelope

Try It Out​

Explore the Results endpoint in the API Playground.