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://<host>/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://test.ecoreservice.com/backend/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://test.ecoreservice.com/backend/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 source produced the data (e.g., datacore, bigquery, netnut, zerobounce). 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, BigQuery lookup, Pro scraping, 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 (password: EluuEz0J).