Instant lookup of companies from a database of millions of records using keyword filters or semantic search. Keywords are automatically matched - no need to look up IDs first. Consumes 1 instant lookup from your plan limits.
POST/v1/companies/lookup
Request Body
Field
Type
Required
Description
query
string
No
Semantic search query (e.g., "B2B SaaS for developers"). Min 3 chars.
broaden_search
boolean
No
Include less similar matches in semantic search (default false)
industries
array
No
Industry keywords (e.g., ["software", "fintech"])
countries
array
No
Country names (e.g., ["united states", "canada"])
regions
array
No
Region/state names (e.g., ["california", "new york"])
Semantic similarity score (0-1, only present for semantic searches)
total
integer
Number of results returned
saved_count
integer
Companies saved (only if save=true)
quota_limited
integer
Companies not saved due to plan limits
Start Company Deep Search
Start an AI-powered web search to find companies matching a semantic query. Uses multi-tier search including Google Places, web search, and internal database. Companies are automatically saved with an AI-generated tag. Consumes 1 deep search from your plan limits.
POST/v1/companies/deep-search
Request Body
Field
Type
Required
Description
query
string
Yes
Semantic search query (e.g., "AI startups in healthcare"). Min 3 chars, max 1000.
max_results
integer
No
Target number of companies (default 20, max 100)
Response
application/json
{
"job_id": 456,
"status": "pending",
"query": "AI startups in healthcare",
"target_count": 20,
"created_at": "2024-01-15T10:30:00.000Z",
"message": "Company deep search started. Poll GET /v1/companies/deep-search/:job_id for status."
}
Poll the status of a company deep search job. When status is "completed", companies are automatically saved to your list with an AI-generated tag. Poll every 5-10 seconds until complete.
Start a contact search job for a company. Uses web research to find decision-makers, champions, and influencers at the target company. Returns a job_id for polling status. Consumes 1 deep search from your plan limits.
Poll the status of a contact search job. When status is "completed", the contacts array contains the found contacts. Poll every 5-10 seconds until complete.
Add selected contacts from a completed search job to your permanent contacts list. Only works for completed jobs. Consumes contact capacity from your plan limits.
POST/v1/contacts/search/:job_id/add
Path Parameters
Parameter
Type
Description
job_id
integer
Job ID of completed search
Request Body
Field
Type
Required
Description
contact_ids
array
Yes
Array of contact IDs to add (from search results)
Examples
Add all decision-makers from search
{
"contact_ids": [1, 2, 3, 5, 8]
}
Add just the CEO
{
"contact_ids": [1]
}
Response
application/json
{
"success": true,
"added": 2,
"skipped": 1
}
application/json
{ "error": "Job must be completed before adding contacts" }
application/json
{ "error": "Job not found" }
Response Fields
Field
Type
Description
success
boolean
Whether operation succeeded
added
integer
Number of contacts added
skipped
integer
Number skipped (duplicates or limit reached)
List Research Templates
Returns all research templates for your organization. Research templates define what data points to extract when researching companies.
GET/v1/research/templates
Response Fields
Field
Type
Description
id
string
Unique template identifier (UUID)
name
string
Template name
description
string | null
Template description
fields
array
Array of data point definitions with key, name, and type
Start a research job to analyze companies using a template. Specify the template by ID or name. Returns a run_id for polling. Consumes 1 company enrichment per company from your plan limits.
POST/v1/research/run
Request Body
Parameter
Type
Required
Description
template_id
string
No*
Template ID (UUID). Either template_id or template_name is required.
template_name
string
No*
Template name (case-insensitive). Either template_id or template_name is required.
company_ids
array
Yes
Array of company IDs to research (1-100 companies per request)
Poll the status of a research run. When status is "completed", the research results are saved to each company's custom fields. Poll every 5-10 seconds until complete.
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
Response Fields
Field
Type
Description
id
integer
Unique lead identifier
company_id
integer
Associated company ID
company_name
string
Company name
lead_status
string
Lead status: cold or warm
warming_score
integer
Current warming score (0-100)
activity_count
integer
Total number of logged activities
recommendation_count
integer
Number of active recommendations
monitoring_active
boolean
Whether signal monitoring is enabled
last_activity_at
string | null
ISO 8601 timestamp of last activity
Get Outreach Lead
Returns full details for an outreach lead including company info, warming score, monitoring pages, contacts, competitors, touchpoints, and recommendations.
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Response Fields
Field
Type
Description
id
integer
Unique lead identifier
lead_status
string
Lead status: cold or warm
warming_score
integer
Current warming score (0-100)
monitoring_pages
array
Discovered monitoring sources with scores and selection status
contacts
array
Key contacts associated with this lead
competitors
array
Competitors being tracked
touchpoints
array
Recent activity log entries
recommendations
array
Active engagement recommendations
deal_value
number | null
Deal value (warm leads)
deal_won
boolean
Whether the deal has been won
Add to Outreach
Add one or more saved companies to the outreach pipeline. Companies can be added as cold leads (for social warming) or warm leads (for active nurturing).
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Update Target Score
Update the target warming score for a lead. When the warming score reaches the target, the lead is considered ready for direct outreach.
PATCH/v1/outreach/leads/:id/target-score
Path Parameters
Parameter
Type
Description
id
integer
The lead ID
Request Body
Field
Type
Required
Description
target_score
integer
Yes
Target warming score (1-100)
Response
application/json
{
"success": true,
"id": 1,
"target_score": 80
}
application/json
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Start Signal Scan
Start an AI-powered signal scan for an outreach lead. Discovers company web pages (blog, careers, press), social profiles, and key contacts' social accounts. Each source is scored 1-10 for monitoring value. Occupies 1 site signal slot (capacity-based -- slot is freed when lead is removed).
{
"status": "none",
"message": "No signal scan has been started for this lead"
}
application/json
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
Toggle Monitoring Page
Enable or disable a specific monitoring source discovered by a signal scan. Enabled sources are monitored for new content and used to generate engagement recommendations.
Get AI-generated engagement recommendations for a lead. For cold leads: social warming actions (comment on posts, follow, like). For warm leads: nurturing actions (share content, check in, congratulate). Each includes a target URL, suggested comment, priority, and engagement reason.
GET/v1/outreach/leads/:id/recommendations
Path Parameters
Parameter
Type
Description
id
integer
The lead ID
Response
application/json
{
"recommendations": [
{
"id": 1,
"action_type": "comment",
"target_url": "https://acme.com/blog/ai-trends",
"suggested_comment": "Great insights on AI adoption...",
"priority": "high",
"engagement_reason": "Recent blog post relevant to your offering",
"source_page_label": "Company Blog",
"created_at": "2024-01-18T10:00:00.000Z"
}
],
"count": 1,
"progress": { "completed": 3, "dismissed": 1, "total": 5 }
}
application/json
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Generate Recommendations
Trigger AI generation of new engagement recommendations based on the lead's enabled monitoring sources. Recommendations are generated asynchronously -- poll with Get Recommendations to see results.
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Complete Recommendation
Mark a recommendation as completed. Completing a recommendation awards warming score points and auto-dismisses other recommendations targeting the same post.
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Recommendation not found or already dismissed",
"errors": null
}
Log Activity
Log a sales or engagement activity. Describe what happened in natural language -- the AI automatically detects the activity type (email, call, meeting, LinkedIn message, comment, like, follow, etc.) and any dates mentioned. Activities contribute to the warming score with context-aware bonus points.
POST/v1/outreach/leads/:id/touchpoints
Path Parameters
Parameter
Type
Description
id
integer
The lead ID
Request Body
Field
Type
Required
Description
description
string
Yes
Natural language description of the activity (1-5000 chars)
contact_id
integer | null
No
Optional contact ID this activity is about
Response
application/json
{
"success": true,
"touchpoint": {
"id": 15,
"description": "Commented on their LinkedIn post about AI trends",
"detected_type": "comment",
"contact_id": null,
"bonus_points": 3,
"created_at": "2024-01-18T14:20:00.000Z"
},
"detected_type": "comment",
"bonus_info": {
"base_points": 2,
"multiplier": 1.5,
"total": 3,
"reason": "First engagement with this company"
}
}
application/json
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Get Lead Notes
Get all notes for an outreach lead, ordered by creation date (newest first).
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Add Lead Note
Add a note to an outreach lead. Notes are free-form text for recording observations, strategy, or context about the lead.
POST/v1/outreach/leads/:id/notes
Path Parameters
Parameter
Type
Description
id
integer
The lead ID
Request Body
Field
Type
Required
Description
content
string
Yes
Note content (1-10000 chars)
Response
application/json
{
"success": true,
"note": {
"id": 5,
"content": "CEO mentioned they're evaluating new solutions in Q2",
"created_at": "2024-01-18T14:20:00.000Z"
}
}
application/json
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Toggle Key Contact
Pin or unpin a contact as a key contact for this lead. Key contacts appear in the lead dashboard and their social profiles can be monitored for engagement opportunities.
PATCH/v1/outreach/leads/:id/contacts/:contactId
Path Parameters
Parameter
Type
Description
id
integer
The lead ID
contactId
integer
The contact ID
Request Body
Field
Type
Required
Description
is_selected
boolean
Yes
Whether to pin (true) or unpin (false) the contact
{
"success": false,
"message": "Invalid or missing API key",
"errors": null
}
application/json
{
"success": false,
"message": "Outreach lead not found",
"errors": null
}
Update Deal
Update deal tracking information for a warm lead. Set the deal value, currency, and mark deals as won. All fields are optional -- only provided fields are updated.