Fsome Data API v1
Access 76M+ verified B2B contacts, organizations, funding rounds, acquisitions, investments, events, and press data via a simple REST API.
https://fsome.com/v1/data/ — All requests require an API key.Authentication
Include your API key in every request using either method:
# Header method (recommended)
curl -H "X-API-Key: fs_your_api_key_here" \
https://fsome.com/v1/data/searches/contacts
# Bearer token method
curl -H "Authorization: Bearer fs_your_api_key_here" \
https://fsome.com/v1/data/searches/contacts
import requests
API_KEY = "fs_your_api_key_here"
BASE_URL = "https://fsome.com/v1/data"
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
# Example: search contacts
response = requests.post(
f"{BASE_URL}/searches/contacts",
headers=headers,
json={"limit": 25, "query": []}
)
data = response.json()
print(data)
const API_KEY = 'fs_your_api_key_here';
const BASE_URL = 'https://fsome.com/v1/data';
// Using fetch (Node 18+ / Browser)
const response = await fetch(`${BASE_URL}/searches/contacts`, {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({ limit: 25, query: [] })
});
const data = await response.json();
console.log(data);
<?php
$apiKey = 'fs_your_api_key_here';
$baseUrl = 'https://fsome.com/v1/data';
$payload = json_encode(['limit' => 25, 'query' => []]);
$ch = curl_init("$baseUrl/searches/contacts");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
"X-API-Key: $apiKey",
'Content-Type: application/json',
],
]);
$body = curl_exec($ch);
curl_close($ch);
$data = json_decode($body, true);
print_r($data);
require 'net/http'
require 'json'
API_KEY = 'fs_your_api_key_here'
BASE_URL = 'https://fsome.com/v1/data'
uri = URI("#{BASE_URL}/searches/contacts")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-API-Key'] = API_KEY
request['Content-Type'] = 'application/json'
request.body = { limit: 25, query: [] }.to_json
response = http.request(request)
data = JSON.parse(response.body)
p data
Generate API keys from your Account page. API access requires a paid plan. Free trial users will receive a 403 error with an upgrade link.
Rate Limits
| Limit Type | Value | Scope |
|---|---|---|
| Requests per second | 400 | Per account |
| Daily request limit | Set by admin | Per account, resets at UTC midnight |
| Records per page | Max 1000 | Per request |
When you exceed a limit, the API returns 429 Too Many Requests with a Retry-After header.
Pagination
All search endpoints accept limit (1–1000, default 100) and offset (default 0).
{
"limit": 500,
"offset": 1000,
"query": [...]
}
The response includes a count field with the total matching records, so you can calculate total pages.
limit=1000 and increment offset by 1000 each request to export large datasets efficiently.Error Handling
| Code | Error | Description |
|---|---|---|
401 | missing_api_key | No API key provided |
401 | invalid_api_key | Key is invalid or revoked |
403 | free_plan | API requires paid plan |
403 | api_not_enabled | Admin hasn't enabled API for this account |
429 | rate_limit_exceeded | 400 req/s limit hit |
429 | daily_limit_exceeded | Daily request quota exhausted |
Search Contacts
POST /v1/data/searches/contacts
Search 76M+ verified B2B contacts with email, phone, job title, company, and more.
Query Fields
| field_id | Type | Description |
|---|---|---|
name | string | Contact full name (prefix match) |
email | string | Email address (prefix match) |
title | string | Job title (prefix match) |
company_name | string | Company name (prefix match) |
location | string | Contact location |
department | string | Job department |
seniority_level | string | Seniority level |
industry | string | Company industry |
company_size | string | Company size range |
skills | string | Skills (contains match) |
has_email | boolean | Only contacts with email |
has_phone | boolean | Only contacts with phone |
Response Fields
| Field | Type | Description |
|---|---|---|
contact_id | int | Unique contact ID |
unique_id | string | External unique identifier |
full_name | string | Contact full name |
email | string | Verified email address |
email_score | string | Email verification confidence score |
direct_phone | string | Personal / direct phone |
work_phone | string | Work / office phone |
job_title | string | Current job title |
location | string | Contact location |
linkedin_url | string | LinkedIn profile URL |
skills | string | Skills (comma-separated) |
past_companies | string | Previous companies worked at |
department | string | Job department / division |
seniority_level | string | Seniority level (C-Suite, VP, Director, etc.) |
decision_making_power | string | Decision-making power level |
company_id | int | Associated company ID |
company_name | string | Company name |
company_industry | string | Company industry |
company_size | string | Company employee count range |
company_website | string | Company website URL |
company_location | string | Company HQ location |
company_phone | string | Company phone numbers |
company_logo_url | string | Company profile image URL |
company_description | string | Company description |
company_linkedin | string | Company LinkedIn page |
company_facebook | string | Company Facebook page |
company_twitter | string | Company Twitter page |
Example
curl -X POST https://fsome.com/v1/data/searches/contacts \
-H "X-API-Key: fs_your_key" \
-H "Content-Type: application/json" \
-d '{
"limit": 25,
"query": [
{"field_id": "title", "value": "VP Sales"},
{"field_id": "industry", "value": "Software"},
{"field_id": "has_email", "value": "true"}
]
}'
import requests
response = requests.post(
"https://fsome.com/v1/data/searches/contacts",
headers={"X-API-Key": "fs_your_key"},
json={
"limit": 25,
"query": [
{"field_id": "title", "value": "VP Sales"},
{"field_id": "industry", "value": "Software"},
{"field_id": "has_email", "value": "true"},
]
}
)
results = response.json()
for contact in results.get("data", []):
print(contact["full_name"], contact.get("email"))
const res = await fetch('https://fsome.com/v1/data/searches/contacts', {
method: 'POST',
headers: { 'X-API-Key': 'fs_your_key', 'Content-Type': 'application/json' },
body: JSON.stringify({
limit: 25,
query: [
{ field_id: 'title', value: 'VP Sales' },
{ field_id: 'industry', value: 'Software' },
{ field_id: 'has_email', value: 'true' },
]
})
});
const { data, count } = await res.json();
console.log(`Found ${count} contacts`);
data.forEach(c => console.log(c.full_name, c.email));
<?php
$payload = json_encode([
'limit' => 25,
'query' => [
['field_id' => 'title', 'value' => 'VP Sales'],
['field_id' => 'industry', 'value' => 'Software'],
['field_id' => 'has_email', 'value' => 'true'],
],
]);
$ch = curl_init('https://fsome.com/v1/data/searches/contacts');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['X-API-Key: fs_your_key', 'Content-Type: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($data['data'] as $contact) {
echo $contact['full_name'] . ' <' . $contact['email'] . ">\n";
}
require 'net/http'; require 'json'
uri = URI('https://fsome.com/v1/data/searches/contacts')
http = Net::HTTP.new(uri.host, uri.port); http.use_ssl = true
req = Net::HTTP::Post.new(uri, 'X-API-Key' => 'fs_your_key', 'Content-Type' => 'application/json')
req.body = {
limit: 25,
query: [
{ field_id: 'title', value: 'VP Sales' },
{ field_id: 'industry', value: 'Software' },
{ field_id: 'has_email', value: 'true' },
]
}.to_json
result = JSON.parse(http.request(req).body)
result['data'].each { |c| puts "#{c['full_name']} <#{c['email']}>" }
Search Organizations
POST /v1/data/searches/organizations
Search millions of organizations with funding, revenue, employee, and industry data.
Query Fields
| field_id | Type | Description |
|---|---|---|
name | string | Organization name |
location | string | HQ location (contains) |
industry | string | Industry category |
operating_status | string | active, closed |
funding_stage | string | early_stage_venture, late_stage_venture, etc. |
company_type | string | for_profit, non_profit |
ipo_status | string | public, private, delisted |
founded_after | date | Founded on or after (YYYY-MM-DD) |
founded_before | date | Founded on or before |
num_employees_min | integer | Min employees |
num_employees_max | integer | Max employees |
Response Fields
| Field | Type | Description |
|---|---|---|
organization_id | int | Internal entity ID |
permalink | string | URL-friendly slug |
name | string | Display name |
legal_name | string | Legal / registered name |
short_description | string | One-line description |
full_description | string | Full description |
image_url | string | Logo / profile image URL |
website_url | string | Company website |
linkedin | string | LinkedIn URL |
twitter | string | Twitter URL |
facebook | string | Facebook URL |
aliases | json | Alternative names (JSON array) |
headquarters_location | string | Full HQ location string |
location_city | string | HQ city |
location_region | string | HQ state/region |
location_country | string | HQ country |
location_country_code | string | ISO country code |
postal_code | string | HQ postal/zip code |
operating_status | string | active, closed |
company_type | string | for_profit, non_profit |
funding_stage | string | early_stage_venture, late_stage_venture, etc. |
ipo_status | string | public, private, delisted |
revenue_range | string | Revenue range code |
num_employees_enum | string | Employee count range code |
contact_email | string | Public contact email |
phone_number | string | Public phone number |
stock_symbol | string | Stock ticker symbol |
stock_exchange_symbol | string | Stock exchange (NYSE, NASDAQ) |
founded_on | date | Founded date (YYYY-MM-DD) |
closed_on | date | Closed date |
exited_on | date | Exit date (acquisition completion) |
funding_total_usd | decimal | Total funding raised (USD) |
last_funding_type | string | Most recent funding round type |
last_funding_at | date | Most recent funding date |
num_investments | int | Number of investments made |
num_exits | int | Number of exits |
num_exits_ipo | int | Number of IPO exits |
num_portfolio_organizations | int | Portfolio org count |
num_lead_investments | int | Lead investments count |
investor_type | string | Investor type (VC, PE, Angel, etc.) |
valuation_usd | decimal | Latest valuation (USD) |
num_articles | int | Number of press articles |
rank | int | Global rank |
rank_org | int | Organization-specific rank |
rank_delta_7d | int | Rank change (7 days) |
rank_delta_30d | int | Rank change (30 days) |
created_at | datetime | Record creation timestamp |
updated_at | datetime | Last update timestamp |
Example
curl -X POST https://fsome.com/v1/data/searches/organizations \
-H "X-API-Key: fs_your_key" \
-H "Content-Type: application/json" \
-d '{
"limit": 50,
"query": [
{"field_id": "industry", "value": "Artificial Intelligence"},
{"field_id": "num_employees_min", "value": "51"},
{"field_id": "operating_status", "value": "active"}
]
}'
import requests
response = requests.post(
"https://fsome.com/v1/data/searches/organizations",
headers={"X-API-Key": "fs_your_key"},
json={
"limit": 50,
"query": [
{"field_id": "industry", "value": "Artificial Intelligence"},
{"field_id": "num_employees_min", "value": "51"},
{"field_id": "operating_status", "value": "active"},
]
}
)
for org in response.json().get("data", []):
print(org["name"], org.get("headquarters_location"))
const res = await fetch('https://fsome.com/v1/data/searches/organizations', {
method: 'POST',
headers: { 'X-API-Key': 'fs_your_key', 'Content-Type': 'application/json' },
body: JSON.stringify({
limit: 50,
query: [
{ field_id: 'industry', value: 'Artificial Intelligence' },
{ field_id: 'num_employees_min', value: '51' },
{ field_id: 'operating_status', value: 'active' },
]
})
});
const { data } = await res.json();
data.forEach(o => console.log(o.name, o.headquarters_location));
<?php
$ch = curl_init('https://fsome.com/v1/data/searches/organizations');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'limit' => 50,
'query' => [
['field_id' => 'industry', 'value' => 'Artificial Intelligence'],
['field_id' => 'num_employees_min', 'value' => '51'],
['field_id' => 'operating_status', 'value' => 'active'],
],
]),
CURLOPT_HTTPHEADER => ['X-API-Key: fs_your_key', 'Content-Type: application/json'],
]);
$data = json_decode(curl_exec($ch), true)['data'];
curl_close($ch);
foreach ($data as $org) echo $org['name'] . "\n";
require 'net/http'; require 'json'
uri = URI('https://fsome.com/v1/data/searches/organizations')
http = Net::HTTP.new(uri.host, uri.port); http.use_ssl = true
req = Net::HTTP::Post.new(uri, 'X-API-Key' => 'fs_your_key', 'Content-Type' => 'application/json')
req.body = {
limit: 50,
query: [
{ field_id: 'industry', value: 'Artificial Intelligence' },
{ field_id: 'num_employees_min', value: '51' },
{ field_id: 'operating_status', value: 'active' },
]
}.to_json
JSON.parse(http.request(req).body)['data'].each { |o| puts o['name'] }
Search People
POST /v1/data/searches/people
Query Fields
| field_id | Type | Description |
|---|---|---|
name | string | Person name |
title | string | Primary job title |
organization | string | Primary organization name |
gender | string | male, female, non_binary |
location | string | Location (contains) |
Response Fields
| Field | Type | Description |
|---|---|---|
person_id | int | Internal entity ID |
permalink | string | URL-friendly slug |
name | string | Full display name |
first_name | string | First name |
middle_name | string | Middle name |
last_name | string | Last name |
short_description | string | One-line bio |
full_description | string | Full biography |
image_url | string | Profile photo URL |
gender | string | Gender |
born_on | date | Date of birth |
died_on | date | Date of death |
primary_job_title | string | Current primary job title |
primary_organization_id | int | Current employer entity ID |
primary_organization_name | string | Current employer name |
primary_organization_permalink | string | Current employer permalink |
website_url | string | Personal website |
linkedin | string | LinkedIn URL |
twitter | string | Twitter URL |
facebook | string | Facebook URL |
location_city | string | City |
location_region | string | State / region |
location_country | string | Country |
rank | int | Global rank |
rank_delta_7d | int | Rank change (7 days) |
num_articles | int | Press article count |
created_at | datetime | Record creation timestamp |
updated_at | datetime | Last update timestamp |
Search Funding Rounds
POST /v1/data/searches/funding-rounds
Query Fields
| field_id | Type | Description |
|---|---|---|
organization_name | string | Funded org name |
investment_type | string | series_a, seed, etc. |
funding_stage | string | Funding stage |
announced_after | date | YYYY-MM-DD |
announced_before | date | YYYY-MM-DD |
money_raised_min | number | Min amount (USD) |
money_raised_max | number | Max amount (USD) |
Response Fields
funding_round_id, round_name, organization_name, funded_organization_id, announced_on, closed_on, funding_stage, investment_type, money_raised_usd, target_money_raised_usd, pre_money_valuation_usd, num_investors, num_lead_investors
Search Acquisitions
POST /v1/data/searches/acquisitions
Query Fields
| field_id | Type | Description |
|---|---|---|
acquiree_name | string | Acquired company name |
acquirer_name | string | Acquiring company name |
acquisition_type | string | acquihire, lbo, merge |
status | string | pending, complete |
announced_after | date | YYYY-MM-DD |
announced_before | date | YYYY-MM-DD |
price_min | number | Min price (USD) |
price_max | number | Max price (USD) |
Response Fields
acquisition_id, acquiree_name, acquiree_organization_id, acquirer_name, acquirer_organization_id, acquisition_type, announced_on, completed_on, price_usd, status, disposition
Search Investments
POST /v1/data/searches/investments
Query Fields
| field_id | Type | Description |
|---|---|---|
investor_name | string | Investor name |
funded_organization_name | string | Funded org name |
investment_type | string | series_a, seed, etc. |
is_lead_investor | boolean | Only lead investors |
announced_after | date | YYYY-MM-DD |
announced_before | date | YYYY-MM-DD |
Response Fields
investment_id, investor_name, investor_id, funded_organization_name, funded_organization_id, investment_type, is_lead_investor, announced_on, money_raised_usd, num_investors
Search Events
POST /v1/data/searches/events
Query Fields
| field_id | Type | Description |
|---|---|---|
name | string | Event name |
location | string | Event location |
starts_after | date | YYYY-MM-DD |
starts_before | date | YYYY-MM-DD |
Response Fields
event_id, name, short_description, starts_on, ends_on, location, event_type, event_format, event_status, registration_url
Search Press / News
POST /v1/data/searches/press
Query Fields
| field_id | Type | Description |
|---|---|---|
title | string | Article title (contains) |
author | string | Author name |
published_after | date | YYYY-MM-DD |
published_before | date | YYYY-MM-DD |
Response Fields
press_id, title, author, publisher, published_on, url
Check API Usage
GET /v1/data/usage
Returns your current API usage for today.
curl -H "X-API-Key: fs_your_key" https://fsome.com/v1/data/usage
{
"user_id": 42,
"daily_limit": "10000",
"requests_today": 234,
"records_today": 11500,
"reset_at_utc": "2026-03-28T00:00:00.0000000+00:00",
"rate_limit_per_second": 400
}