Provider-specific requirements
Consumer skip-trace API (Galaxy) for finding an individual’s personal contact info — personal emails and mobile phones — from name + city/state. Tool quick-pick:- Reverse phone lookup →
enformion_reverse_phone_search(ReversePhone. Returns everyone associated with a number, including historical associations). Treat results as candidates, not proof of current ownership. - LinkedIn profile lookup →
enformion_linkedin_id(LinkedinID. resolves a LinkedIn profile URL to a person record). - Property/address lookup →
enformion_property_v2_search(PropertyV2. supports free-form, TahoeId, and structured address searches). - Personal email →
enformion_person_search(Person database. ReturnsemailAddresses[]flaggednonBusiness:1). Do NOT useenformion_workplace_searchfor personal email — it returns other-employer work emails. - Personal mobile (phone-first) →
enformion_contact_enrich(skip-trace, ~53% mobile hit rate). - Officers of a business →
enformion_business_search→ officertahoeId→enformion_person_searchby tahoeId.
When to use
Useenformion_contact_enrich when you need to find the personal mobile of a small business owner (restaurant, retail, local services) who has:
- No LinkedIn profile
- No company domain email
- No B2B database presence
Critical gotchas — read before calling
1. Strip middle initials from last_name (automatic)
The integration automatically strips middle initials. You do NOT need to pre-process — just pass the raw last name. But be aware:"K Tarzai"→ bare last ="Tarzai"✓"De La Cruz Castillo"→ bare last ="Castillo"✓"Smith Jr."→ bare last ="Smith"✓
2. FL SOS officer names (use reverseFlOfficerName helper)
Florida SOS returns officer names as"LASTNAME, FIRSTNAME MIDDLE". You must reverse these before calling:
"SMITH, JOHN EDWARD"→"John Smith"✓"DE LA CRUZ, MARIA"→"Maria De La Cruz"✓
reverseFlOfficerName() is exported from actions/enformion-shared.ts.
3. Rate limits
No documented rate limit, but runs degrade with >200 concurrent requests. The Deepline rate limiter caps at 10 req/s which is safe for all batch sizes.4. No-result interpretation
identityScore: 0= no match found (not billed)identityScore: 75–100= high confidence matchperson.phones[]empty = found the person but no phone on record
Response structure
person.phones.find(p => p.type === "mobile" && p.isConnected === true)?.number
Validation
After finding a phone via EnformionGO, validate it withtrestle_phone_validation:
line_type: "Mobile"+activity_score >= 60= confirmed owner mobileline_type: "Landline"orline_type: "FixedVOIP"= store/office phone — discard
Credentials
Requires two custom headers set from stored credentials:galaxy-ap-name: your API key namegalaxy-ap-password: your API key password
ENFORMION_KEY_NAME + ENFORMION_KEY_PASSWORD environment variables.
API endpoint: https://devapi.enformion.com/Contact/Enrich
enformion_reverse_phone_search
API endpoint:https://devapi.enformion.com/ReversePhoneSearch (galaxy-search-type: ReversePhone).
Pass phone. optional pagination is supported. Reverse Phone returns all people associated with
the number, which can include old owners, employees, or prior residents.
enformion_property_v2_search
API endpoint:https://devapi.enformion.com/PropertyV2Search (galaxy-search-type: PropertyV2).
Use free_form_search, tahoe_id, or structured address fields.
enformion_person_search — PERSONAL emails (use this, not workplace_search)
When to use
Useenformion_person_search to look for personal email addresses or phone numbers. It uses Galaxy Person Search (galaxy-search-type: Person). Personal addresses carry nonBusiness: 1. Workplace Search can return email addresses for another employer. Do not treat those addresses as the target business’s contact details.
Two lookup modes:
- By name + city/state — the common path.
enformion_person_search({ first_name, last_name, city_state }). - By tahoe_id — exact-person lookup. Pass
{ tahoe_id }to pin one identity (e.g. an officer tahoeId returned byenformion_business_search). Whentahoe_idis set, the name/location fields are ignored.
Recommended flow for business officers (vendor-recommended)
To get the personal contact info of a business’s officers/agents:enformion_business_search({ name, city_state })→ business record withofficers[]/ agents, each carrying atahoeId.- For each officer,
enformion_person_search({ tahoe_id })→ that person’semailAddresses[]+phoneNumbers[].
isError: true with “Access Profile does not permit client to call Business Search.” If you already have a verified officer name, consider Person Search by name. Check that your account supports Person Search first. It can return personal contact data, but a match is not guaranteed.
Response structure (Person Search)
persons[0].emailAddresses[0].emailAddress (prefer entries with isPremium: true). No result: persons is an empty array.
Billing
Billed per match (post_deduct) only when the top match has a personal email or a connected phone. No charge on empty / no-match.
API endpoint: https://devapi.enformion.com/PersonSearch (galaxy-search-type: Person).
Business Search endpoint: https://api.galaxysearchapi.com/BusinessV2Search (galaxy-search-type: BusinessV2, body uses camelCase businessName + addressLine2). Note the different host from the other endpoints — Business Search is served from api.galaxysearchapi.com, not devapi.enformion.com.
enformion_workplace_search
When to use
Useenformion_workplace_search as a fallback when enformion_contact_enrich returns identityScore: 0 or an empty phones array. It queries a separate B2B employment profile database and has a different rate-limit bucket, so it does not compete with Contact/Enrich capacity.
city_state is optional here (unlike Contact/Enrich where it is required). Omitting it broadens the match at the cost of potentially more ambiguous results.
Critical warning: emailAddresses[]
emailAddresses[] in Workplace Search results are almost always the owner’s OTHER employer (a corporate day job, a franchise group, etc.) and NOT the restaurant’s email. In practice:
- A returned email address can belong to another employer. Verify the domain against the intended business.
- Only use an email address if the domain matches the target restaurant’s domain (e.g.,
gary@lincolnautogroup.comis useless if you wantgary@lincolndiner.com).
Rate-limit bucket
Workplace Search uses a separate rate-limit bucket from Contact/Enrich. Both can run concurrently without reducing each other’s throughput. The Deepline rate limiter treats them as independent pools.Response structure
workplaceRecords[0]?.phoneNumbers?.[0]
No result: workplaceRecords will be an empty array [].
Billing
Billed per match (post_deduct) only when a workplace record with a phone or email is returned. No charge on empty / no-match.
Find an applicable action
Confirm your effective workspace, then search the live catalog:Inspect the selected contract
Replace<returned-tool-id> with the identifier returned by discovery:
Prepare one reviewed input
Use one authorized record that matches the inspected schema. Preserve its source identity and define the result you will accept. Open the action reference for its payload and response shape. Provider-backed execution can incur usage or external effects. For reusable logic, follow Write Plays. For direct-call recovery, use Tool execution recovery.Continue only when the workspace, provider, required fields, acceptance rule, and applicable price are understood. Keep unavailable access separate from no-result evidence.