One for every tool
Apollo, ZoomInfo, Harmonic, Harvest API and more behind a single request and response. Pick any provider per call, bring your own keys or pay as you go.
Your request
POST /v1/people/enrich{"provider": "apollo","linkedin_url": "linkedin.com/in/eglyman","fields": ["email", "phone"]}
Bearer jl_live_••••Billing: Jooli credits
jooli
Apolloselected
ZoomInfoavailable
Lushaavailable
People Data Labsavailable
Harmonicavailable
Harvest APIavailable
One response200 OK
{"provider": "apollo",Apollo"name": "Eric Glyman","title": "Co-founder & Co-CEO","email": "e•••@ramp.com","email_status": "verified","phone": null,"company": { "domain": "ramp.com" }}
apollo · 118 ms · 1 credit
Works with


One schema, no matter who answers
Every provider names the same field differently. Jooli maps them all onto one request and one response, so switching from Apollo to ZoomInfo is a one-word change, not a new integration.

first_nameorganization_namesanitized_phonefirstNamecompanyNamedirectPhoneNumberfull_namejob_company_namemobile_phoneJooli schemaalways
{"name": "Dylan Field""company": { "name": "Figma" }"phone": "+1 ••• ••• ••••"}
Bring your own keys, or run on credits
Already have a ZoomInfo contract? Plug the key in and keep your rates. No contract with Harmonic? Use Jooli credits and pay per record. Mix both, provider by provider.

ProvidersBalance $182.40
ZoomInfoYour keyCredits
ApolloYour keyCredits
HarmonicYour keyCredits
Harvest APIYour keyCredits
Add a provider without writing a line of code
New sources land behind the same endpoints. When a better dataset shows up, you point a request at it and ship, with no SDK to learn and no response parser to rewrite.

Why Jooli
The routing layer your GTM stack has been missing
Switch in one line
Change the provider string and nothing else. Compare match rates across sources on real traffic before you commit to any of them.
No lock-in, either way
No subscription to Jooli and no forced contract with a provider. Your keys stay yours, and credits only move when a record comes back.
Fallbacks built in
Pass a list instead of a name and Jooli tries each provider in order, handling retries and rate limits for you.
Three endpoints cover the whole outbound motion
People, companies and search. The same three calls work against every provider you turn on.
People enrichment
Turn a LinkedIn URL or an email into a verified contact.

POST /v1/people/enrich200 OK
{"provider": "apollo""linkedin_url": "linkedin.com/in/karimatiyeh""email": "k•••@ramp.com""email_status": "verified""phone": "+1 ••• ••• ••••"}
Company intelligence
Headcount, funding and tech stack from a single domain.

POST /v1/companies/enrich200 OK
{"provider": "harmonic""domain": "ramp.com""name": "Ramp""founded": 2019"hq": "New York, NY""last_round": { "stage": "Series F", "usd": 750000000 }"valuation_usd": 44000000000}
Prospect search
Describe your ICP once and query any provider with it.

POST /v1/people/search250 results
"provider": ["zoominfo", "pdl"]"title": ["CEO", "Founder"], "industry": "software"
Who it’s for
Built for the teams that wire GTM together
See every provider’s usage and spend in one place
Stop reconciling five invoices and five dashboards. Jooli shows what each source returned and what it cost, whether it ran on your key or on credits.
Usage this weekOne invoice
Apollopeople/enrich1,204$36.12
Harmoniccompanies/enrich310your key
Lushapeople/enrich188$9.40
ZoomInfopeople/search2,500your key
Give your agent one tool instead of a dozen
One predictable schema means one tool definition. Your agent asks for a person or a company and never needs to know which vendor answered.
tools/enrich_person.json
{"name": "enrich_person""endpoint": "/v1/people/enrich""provider": ["apollo", "pdl", "lusha"]"returns": "jooli.person.v1"}
Ship the enrichment feature this sprint, not this quarter
Skip the vendor SDKs, auth quirks and pagination styles. Integrate once and let sales ask for a new source without it becoming an engineering project.
Load clean, comparable records into the warehouse
Every record arrives in the same shape with its provider attached, so you can benchmark sources against each other and keep lineage without custom parsers.
first_nameorganization_namesanitized_phonefirstNamecompanyNamedirectPhoneNumberfull_namejob_company_namemobile_phoneJooli schemaalways
{"name": "Dylan Field""company": { "name": "Figma" }"phone": "+1 ••• ••• ••••"}
Before and after
The integration work you get to skip
Without Jooli
- A separate integration, SDK and auth flow per provider
- A different response shape to parse for each one
- Annual contracts signed before you know the match rate
- Custom retry, rate limit and fallback logic
- One invoice and one dashboard per vendor
With Jooli
- One endpoint, one key, one schema
- Switch or compare providers by changing a string
- Pay as you go with credits, or plug in keys you already own
- Ordered fallbacks and retries handled for you
- One usage view across every source
Frequently asked questions
What exactly does Jooli do?
Jooli sits between your product and the GTM data providers you would otherwise integrate one by one. You send one request in one format and name the provider you want. Jooli translates the call, and you get back the same normalized response shape whichever provider answered.
How do I choose which provider answers?
Set the provider field on the request, for example "apollo" or "zoominfo". To switch, change that one string. If you pass an ordered list instead, Jooli tries each provider in turn until one returns a match.
Do I need my own contracts with Apollo, ZoomInfo and the rest?
No. With Jooli credits, one key is enough to query any supported provider. If you already have a contract with a provider, connect that key and those calls run on your own account. You can mix both, provider by provider.
How does pricing work?
Pay as you go. There is no subscription, no seat licence and no minimum commitment. Write to [email protected] for current rates.
What happens when a provider is down or rate limits me?
If you passed a list of providers, Jooli retries and moves on to the next one, and the response tells you which providers were tried. With a single provider you get a clear, consistent error instead of a vendor-specific one.
The provider I need is not listed. Can you add it?
Yes. New providers slot in behind the same schema, so nothing changes in your code when one is added. Tell us which one at [email protected].