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
| Environment | URL |
|---|---|
| Production | https://<host>/api/v1/enrichment/result/<job_id>/ |
| Staging | https://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
| Parameter | Type | Default | Notes |
|---|---|---|---|
report_type | string | json | json for paginated JSON, csv for downloadable CSV |
page | integer | 1 | Page number (≥ 1). JSON only. |
page_size | integer | 50 | Page 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"
}
]
}
| Field | Type | Description |
|---|---|---|
job_id | UUID string | The job whose results are being returned |
total_records | integer | Total enriched record count after pipeline completion |
page | integer | The requested page number |
page_size | integer | The requested page size |
data | array | Enriched 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:
- All
imported_*columns (alphabetically sorted) — preserve the original input fields. - The canonical enrichment columns in a fixed order — account fields followed by contact fields.
- 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_enrichwith its enriched value (or empty string when the pipeline could not find a match). enrichment_status— one ofenriched,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_statusis 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_emailis 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_statusfield 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
| HTTP | When | Body |
|---|---|---|
| 400 | Status is not yet completed or paused | { "error": "Results not ready." } |
| 401 | Missing or invalid Bearer token | { "message": "Invalid or expired token" } |
| 404 | job_id not found for the caller, or no results stored yet | Standard DRF error envelope |
| 500 | Unexpected server-side failure | Standard DRF/Django error envelope |
Try It Out
Explore the Results endpoint in the API Playground (password: EluuEz0J).