Layers
A Data Enrichment job is built from layers. Each layer adds a group of columns to your output, and you pay per row for each layer you select. This page explains what every layer does, which layers you can combine, and how to fetch the current prices.
If you only want to check whether contacts are still at their company or have moved on, use the dedicated Career Monitor API. It is a simpler, single-purpose API with Lite and Full tiers. Use Data Enrichment when you also want company addresses, new-company details or mobile numbers in the same job.
At a glance
| Code | Layer | Answers the question | Runs on |
|---|---|---|---|
L1 | Career Monitor | Is this person still at this company? What is their current title and email? | Every row that passes the input check |
L2 | Company Location | Where is the company headquartered, and what is its main phone number? | Every row that passes the input check |
L3 | New Company | If they left, where did they go, and what is their new title and email? | Only rows where L1 found the contact left the company |
L4 | New Company Location | Where is the new company headquartered? | Only rows where L3 found a new company name and website |
MPA | Mobile Phone Append | What is this person's mobile or direct phone number? | Rows with first name, last name and company |
Choosing layers
Layers build on each other, so they must be selected in order:
| Valid selection | What you get |
|---|---|
["L1"] | Employment check only |
["L1", "L2"] | Employment check + current company HQ |
["L1", "L2", "L3"] | Above + where job-changers went |
["L1", "L2", "L3", "L4"] | Above + the new company's HQ |
"full" | Every active layer, including MPA |
You can add "MPA" to any of the selections above, for example ["L1", "MPA"].
These selections are rejected with 400:
MPAon its own. It must be paired with at least one other layer.- Skipping a layer, for example
["L1", "L3"](L3 needs L2) or["L2"](L2 needs L1). - Unknown layer codes.
Input requirements
Each row must contain enough information to identify the person. A row qualifies if it has a company name or company website, plus either:
- a LinkedIn URL, or
- a first name and last name.
Rows that don't qualify are kept in your output in their original position, but no layer runs on them. Their enrichment columns are empty, the row status is skipped, and they are not billed.
Use field_mapping on Submit to map your column names to linkedin_url, first_name, last_name, company_name and email.
Layer details
The column names below are the keys you get in enriched_fields on Result, and the headers in the CSV download. A column is empty when the layer ran but found no value.
L1 — Career Monitor
The foundation layer, required for every job. It confirms who the person is, finds their LinkedIn profile, and checks whether they are still employed at the company you supplied. For people who are still there, it returns their current title, a verified work email and their location.
How it works:
- Cleans and normalizes the name, company name, website and LinkedIn URL you sent.
- Finds the person's LinkedIn profile if you didn't provide one.
- Compares their current employer against the company on your row.
- When the profile is ambiguous, it looks for other public evidence of employment before deciding.
- Generates and verifies a work email, and classifies the title into a job level and job function.
| Column | Description |
|---|---|
Employment status | The outcome of the check, for example Still in the company, Left the company or Uncertain. |
First name / Last name | The matched person's name, cleaned. |
Name Match Confidence Score | How closely the matched profile's name matches your input. |
Linkedin URL | The person's LinkedIn profile. |
Other proof of employment | A public URL used as evidence when LinkedIn alone was not conclusive. |
Current company name | The cleaned company name. |
Website | The company website. |
Current title | The person's current job title. |
Job level / Job function | The title classified into seniority (for example VP or Manager) and department (for example Sales or Engineering). |
Email | A verified work email at the current company. |
Tenure end date | When the person left, if they left the company. |
Contact city / Contact state / Contact state abbreviation | The person's location. |
Contact country / Contact country abbreviation | The person's country. |
L1 does the same job as the standalone Career Monitor API. If L1 is all you need, the Career Monitor API is the simpler choice.
L2 — Company Location
Adds the headquarters address and main phone number for the contact's current company (from L1). The address is validated, and city, state and country are normalized to consistent casing and standard abbreviations.
Requires: L1.
| Column | Description |
|---|---|
Company address | The full HQ address on one line. |
Company street | Street line. |
Company city | City. |
Company State / Company State abbreviation | State or region, full and abbreviated (for example California / CA). |
Company country / Company country abbreviation | Country, full and abbreviated. |
Company postal code | Postal or ZIP code. |
Company HQ phone | The headquarters switchboard number, formatted. |
L3 — New Company
For people who have left the company on your row, this layer finds where they work now: the new employer, their new title and start date, and a verified email at the new company.
Requires: L1 and L2. It runs only on rows where L1 reported the person left the company. Every other row is not processed by L3 and is not billed for it.
| Column | Description |
|---|---|
New Company | The new employer's name. |
New company website | The new employer's website domain. |
New title | The person's title at the new company. |
New company job level / New company job function | The new title classified into seniority and department. |
New Company start date | When they started at the new company. |
New company email | A generated and verified work email at the new company. |
L4 — New Company Location
The L2 equivalent for the new employer found by L3: headquarters address and phone number.
Requires: L1, L2 and L3. It runs only on rows where L3 found both a new company name and a website.
| Column | Description |
|---|---|
New Company Address | The full HQ address on one line. |
New Company Street | Street line. |
New Company City | City. |
New Company State / New Company State Abbreviation | State or region, full and abbreviated. |
New Company Country / New Company Country Abbreviation | Country, full and abbreviated. |
New Company Postal Code | Postal or ZIP code. |
New Company HQ Phone | The new company's headquarters number, formatted. |
MPA — Mobile Phone Append
Looks up personal contact numbers for the person. MPA runs in parallel with the other layers rather than after them, so it doesn't add time to the job.
Requires: at least one other layer (it cannot run alone). It runs only on rows with a first name, last name and company name.
| Column | Description |
|---|---|
Mobile phone | The person's mobile number. |
Contact phone | A direct-dial or other contact number, formatted. |
Billing per layer
- The price per row is the sum of the prices of the layers you selected. Get current prices from the endpoint below, or estimate a whole job with Estimate.
- A row is billed only if at least one requested layer returned data (row
status: enriched). Skipped and failed rows are refunded. - Check
layer_statuson each Result row to see which layers returned data for that row, for example{ "L1": "enriched", "L2": "enriched" }.
Endpoint
Returns the layer catalog with the current per-row price for each layer. Prices can differ per account, so call this endpoint rather than hard-coding them.
Method: GET
Path: /data-enrichment/layers/
Full URL: https://backend.ecoreservice.com/api/v1/data-enrichment/layers/
Auth: Authorization: Token YOUR_API_TOKEN (or Bearer) — see Authentication
Example Request
curl "https://backend.ecoreservice.com/api/v1/data-enrichment/layers/" \
-H "Authorization: Token YOUR_API_TOKEN"
Successful Response — 200 OK
{
"success": true,
"data": {
"layers": [
{ "layer_code": "L1", "label": "Career Monitor", "credits_per_row": "0.5000", "is_active": true, "configured": true },
{ "layer_code": "L2", "label": "Company Location", "credits_per_row": "0.2500", "is_active": true, "configured": true },
{ "layer_code": "L3", "label": "New Company", "credits_per_row": "0.3500", "is_active": true, "configured": true },
{ "layer_code": "L4", "label": "New Company Location", "credits_per_row": "0.2500", "is_active": true, "configured": true },
{ "layer_code": "MPA", "label": "Mobile Phone Append", "credits_per_row": "1.0000", "is_active": true, "configured": true }
]
}
}
| Field | Type | Description |
|---|---|---|
layer_code | string | The code to pass in selected_layers. |
label | string | Human-readable layer name. |
credits_per_row | string (decimal) | Credits charged per enriched row for this layer. |
is_active | boolean | Whether the layer can currently be selected. "full" includes only active layers. |
configured | boolean | Whether pricing has been set up for your account. |