Skip to main content
Already integrated with another data provider? Most concepts map directly onto Generect endpoints. Start here, then open the matching endpoint reference for request and response details.

Before you map endpoints

A few things work differently on Generect — knowing them up front makes the mapping obvious:
  • Authentication uses an Authorization: Token <your_token> header (the Token prefix is required). See Authentication.
  • Pricing is pay-as-you-go credits, not seats or monthly contact caps. You are billed per returned result, and no data is never charged.
  • Every search and enrich endpoint has two modesdatabase (cached, sub-second, cheaper) and realtime (live lookup, freshest, costs more). You choose per call by swapping databaserealtime in the path. See Database vs Real-time.
  • Counts are free in database mode and billable in real-time mode — size an audience with a free count before paying for results.

From Apollo

From Hunter

From ZoomInfo

Records carry a stable id across Preview, Search, and Enrich. Find leads with a cheap Preview or database search, then pass the id into Enrich or Email Finder instead of re-sending name and company.

Migrating from our legacy endpoints

This section maps all legacy api endpoints to their api/v1 replacements.
  • Base URL — unchanged: https://api.generect.com (only the path structure changed)
  • Auth — unchanged: header Authorization: Token <your_api_token>
The four legacy by_icp search endpoints are already marked deprecated in the API spec. They still work today, but migrate these first.
General changes across all endpoints:
  1. Old paths were under /api/.... New paths are versioned under /api/v1/... and grouped by resource (email, enrich, search, accounts).
  2. Every new response is wrapped in a top-level object:
    Previously the payload was returned flat (no data/meta wrapper). Update your response parsing to read from response.data and response.meta.
  3. Billing/pricing behavior is unchanged: you’re only charged when a valid result is found (meta.amount_charged = 0 otherwise).
  4. New endpoints accept multiple identifier types in one endpoint (send only ONE per request) instead of separate endpoints per identifier type.

Auth & Account

v1 has no login flow — every request authenticates with a static API key from account settings, sent as Authorization: Token <key>. Drop the login call and store the key directly.
Response field mapping:Example — before / after:
Full reference: Get Account
Response field mapping:Full reference: List Transactions
Response field mapping:Full reference: Usage

Search (ICP)

Request — most filters keep their name: locations, personas, company_locations, company_headcounts, company_types, limit_by, offset_by, exclude_names, exclude_ids, filter_empty_vars, company_link, company_id.New: job_titles, seniorities, exclude_locations, exclude_company_locations, exclude_company_industries, exclude_company_headcounts, strict, company_name (any mode) and keywords, functions (realtime mode only) — not required for a straight migration, but available if useful.Request field mapping:Response: item field names largely match Enrich lead (title, nested company object, etc.), but each item’s identifier is returned as lead_id, not id. amountmeta.amount_charged (positive now); status removed.Full reference: Search leads · Realtime
Same request filters as Search leads. results_count/statusdata.results_count. Database-mode counts are always free; realtime counts are billable.Full reference: Count leads · Realtime
Request — most filters keep their name: company_types, headcounts, industries, keywords, locations, num_of_followers, limit_by, offset_by. New: exclude_industries, exclude_locations, exclude_ids, exclude_domains, technologies, company_names, strict (any mode) and revenues_range, department_headcount, headcount_growth, hiring_on_linkedin, linkedins_links (realtime mode only).Request field mapping:Response: item field names largely match Enrich company, but each item’s identifier is returned as linkedin_id, not id. amountmeta.amount_charged (positive now); time_cached removed.Full reference: Search companies · Realtime
Same request filters as Search companies. results_countdata.results_count. Database-mode counts are always free; realtime counts are billable.Full reference: Count companies · Realtime

Enrich

Request — send exactly ONE identifier field (was: LinkedIn company URL / company website):The new endpoint also accepts id (Generect internal company ID) or name (fuzzy match) — extra options, not required for migration.Response: the v1 payload is much slimmer than the legacy one — only name, domain, industry carry over unchanged, plus two renames and one new field. Everything else legacy returned (website, description, headcount_range, founded_year, company_type, hq_city, hq_state, hq_country, and internal fields like hashtags, groups, tagline) is dropped.Example — before / after:
All fields stay top-level inside data — unlike the lead endpoint below, nothing here moves into a sub-object.Note: there’s also a /enrich/database/company/ variant (same request shape) that returns cached data instead of a fresh live lookup — cheaper/faster if slightly-stale data is acceptable. realtime is the direct successor to the old behavior.Full reference: Enrich company (realtime)
Request:
(unchanged input — LinkedIn profile URL). The new endpoint also accepts id (Generect lead ID) or email (reverse lookup) as alternative identifiers.Response: the v1 payload is slimmer than the legacy one — headline and location are dropped entirely, and only id/name/domain carry over into the new company object (company_industry is dropped, not nested).Example — before / after:
Note: there’s also a /enrich/database/lead/ variant (cached data, cheaper) — realtime is the direct successor to the old behavior.Full reference: Enrich lead (realtime)

Email

Request — same 3 fields, unchanged:
The new endpoint also supports finding an email by lead_id or linkedin_url instead of name + domain — not required for a straight migration, but available if useful.Response field mapping:Example — before / after:
Note: legacy accepted a batch array in one call; v1 is single-item — use the bulk endpoint for batches instead of looping.Full reference: Email Finder
Request — legacy took a bare array of email strings; v1 requires an object wrapper:
Response field mapping:Example — before / after:
Full reference: Email Validation

Quick reference

Error handling

Every v1 endpoint uses the same error envelope:

Migration checklist

1

Get a static API key

If you’re still calling /api/auth/token/login/, stop — grab a key from account settings and send it as Authorization: Token <key> on every request.
2

Swap paths

Replace each legacy path with its /api/v1/... equivalent from the Quick reference table above.
3

Update response parsing

Read results from data and cost from meta.amount_charged instead of a flat payload or a negative root-level amount.
4

Update nested field reads

Change flattened reads like lead.company_name to data.company.name — see each endpoint’s field mapping table above.
5

Prioritize the deprecated search endpoints

Migrate the four by_icp endpoints first — they’re already flagged deprecated in the API spec.
6

Test in database mode, then go live

Validate with a free database count, then read Limits and Errors before production.

A typical migration path

  1. Swap your auth to the Authorization: Token header.
  2. Replace your search call with database mode first — it’s the cheapest, fastest equivalent — and only move specific calls to realtime when you need live freshness or advanced filters.
  3. Replace enrichment and email/phone lookups with the endpoints above, and remove any “charged on no-match” handling — Generect doesn’t bill empty results.
  4. Read Limits and Errors before going to production.
Need a mapping for a provider not listed here? Contact support@generect.com.