โ— Live

Data Fetching API Reference

Programmatic access to Doott's lead intelligence platform โ€” search, filter, and export millions of verified company and people records.

โšก REST / JSON
๐Ÿ—„๏ธ Cloud SQL (PostgreSQL)
๐Ÿš€ Vector Search Enabled
๐Ÿ”’ JWT Bearer Auth
๐Ÿš€ Getting Started
Everything you need to make your first API call in under 2 minutes.
PRODUCTIONhttps://doott.jaqyi.com/api
LOCAL DEVhttp://localhost:3000/api
QUICK START ยท cURL
# 1. Login to get Bearer token
curl -X POST https://doott.jaqyi.com/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"yourpassword"}'

# 2. Query companies with the returned token
curl -G https://doott.jaqyi.com/api/final-companies \
  -H "Authorization: Bearer <TOKEN>" \
  --data-urlencode "f_city=Mumbai" \
  --data-urlencode "f_has_email=true" \
  --data-urlencode "limit=25"
๐Ÿ” Authentication
All data endpoints require a Bearer JWT token in the Authorization header.

Bearer Token (JWT)

Obtain a token via POST /api/auth/login. Attach it to every data request:

HEADER
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
โš ๏ธ
Tokens are org-scoped. Never expose them in client-side code or public repos.
๐Ÿ” Filter System
All data APIs share a unified filter system. Use f_ prefix + column name + optional operator suffix as query params.

Operator Suffixes

(none)Contains โ€” case-insensitive. Multi-word matches all tokens. e.g. f_industry=Food
_eqExact match e.g. f_state_eq=Maharashtra
_swStarts with e.g. f_city_sw=Mum
_ewEnds with e.g. f_website_ew=.com
_nonemptyField is not null/empty e.g. f_emails_nonempty=true
_emptyField is null/empty e.g. f_phone_empty=true
โ„น๏ธ
Filter keys are validated against live DB schema. Unknown columns are silently ignored โ€” SQL injection is not possible.
๐Ÿข Companies Database
Query final.companies โ€” millions of verified business records with contact details, location, and industry.
GET/api/final-companies Paginated company list with filtersโ–ถ
Parameters
Example
Response
ParameterTypeStatusDescription
pageintegerOptionalPage number (default: 1)
limitintegerOptionalRecords per page, max 200 (default: 50)
searchstringOptionalSemantic / full-text search on business_name using vector embeddings
sort_bystringOptionalColumn name to sort by
sort_dirstringOptionalasc or desc (default: asc)
f_business_namestringOptionalBusiness name contains filter
f_citystringOptionalCity filter (BTree indexed, fast prefix match)
f_statestringOptionalState / region filter
f_pincodestringOptionalExact pincode / ZIP code match
f_industrystringOptionalIndustry category contains filter
f_domainstringOptionalExact domain match (e.g. acme.com)
f_websitestringOptionalWebsite URL contains filter
f_has_emailbooleanOptionaltrue = only records with emails; false = without
f_has_phonebooleanOptionaltrue = only records with phone numbers
countrystringOptionalindia or usa โ€” geographic pre-filter
cURL
# Mumbai food companies with verified emails
curl -G https://doott.jaqyi.com/api/final-companies \
  -H "Authorization: Bearer <TOKEN>" \
  --data-urlencode "f_city=Mumbai" \
  --data-urlencode "f_industry=Food" \
  --data-urlencode "f_has_email=true" \
  --data-urlencode "limit=50"
JavaScript ยท fetch
const res = await fetch(
  `https://doott.jaqyi.com/api/final-companies?${new URLSearchParams({
    f_city:'Mumbai', f_industry:'Food', f_has_email:'true', limit:'50'
  })}`,
  { headers: { Authorization: `Bearer ${token}` } }
);
const { records, total, pages } = await res.json();
recordsarrayCompany objects โ€” all non-hidden DB columns returned
totalintegerTotal matching count (capped at 100,001 for filtered queries)
pageintegerCurrent page
pagesintegerTotal pages
sourcestringAlways "cloud_sql"
200 OK ยท JSON
{
  "records": [{
    "business_name": "Quirch Foods",
    "industry":      "Manufacturing",
    "phone":         "+13056913535",
    "emails":        "{brian.rumble@quirchfoods.com,john@quirchfoods.com}",
    "website":       "www.quirchfoods.com",
    "city":          "Medley", "state": "FL"
  }],
  "total": 12847, "page": 1, "pages": 257, "source": "cloud_sql"
}
GET/api/final-companies/statsTotal record count (Redis cached 5 min)โ–ถ
Response
200 OK ยท JSON
{ "total": 5820000, "source": "cloud_sql", "table": "companies" }
GET/api/final-companies/categoriesTop 100 industries with counts (cached 24h)โ–ถ
Response
200 OK ยท JSON
[
  { "name": "Manufacturing", "count": 420000 },
  { "name": "Food Production", "count": 318000 }
]
GET/api/final-companies/citiesTop 500 cities with business counts (cached 6h)โ–ถ
Response
200 OK ยท JSON
{ "cities": [{ "name": "Mumbai", "state": "MH", "count": 84200 }], "total": 500 }
GET/api/final-companies/columnsList all queryable columnsโ–ถ
Response
200 OK ยท JSON
{ "columns": ["business_name", "industry", "phone", "emails", "website", "city", "state", "address", "pincode", ...], "table": "companies" }
GET/api/final-companies/healthDatabase connectivity checkโ–ถ
Response
200 OK ยท JSON
{ "ok": true, "source": "cloud_sql", "serverTime": "2026-09-23T08:23:11Z", "totalRecords": 5820000 }
๐Ÿ‘ค People Database
Query final.people โ€” 43M+ individual contacts with job titles, emails, phones, and location.
GET/api/final-peoplePaginated people list with filtersโ–ถ
Parameters
Example
Response
ParameterTypeStatusDescription
pageintegerOptionalPage (default: 1)
limitintegerOptionalMax 200, default 50
searchstringOptionalSemantic search on full_name via vector embeddings
sort_by / sort_dirstringOptionalColumn + asc/desc
f_citystringOptionalCity (BTree indexed)
f_statestringOptionalState / region
f_pincodestringOptionalExact ZIP / pincode
f_job_titlestringOptionalJob title contains (e.g. CEO, Founder, HR Manager)
f_locationstringOptionalFree-text location contains
f_has_emailbooleanOptionaltrue = only people with emails
f_has_phonebooleanOptionaltrue = only people with phone numbers
countrystringOptionalindia or usa
cURL
# CEOs in Bangalore with verified emails
curl -G https://doott.jaqyi.com/api/final-people \
  -H "Authorization: Bearer <TOKEN>" \
  --data-urlencode "f_job_title=CEO" \
  --data-urlencode "f_city=Bangalore" \
  --data-urlencode "f_has_email=true" \
  --data-urlencode "country=india" \
  --data-urlencode "limit=100"
200 OK ยท JSON
{
  "records": [{
    "full_name":  "Rahul Sharma",
    "first_name": "Rahul",
    "last_name":  "Sharma",
    "job_title":  "CEO",
    "emails":     "{rahul@startup.in}",
    "phone":      "+919812345678",
    "city":       "Bangalore", "state": "Karnataka"
  }],
  "total": 43200000, "page": 1, "pages": 864000
}
โ„น๏ธ
first_name / last_name are auto-derived from full_name when not stored separately.
GET/api/final-people/statsTotal people countโ–ถ
Response
200 OK
{ "total": 43200000, "source": "cloud_sql", "table": "people" }
GET/api/final-people/categoriesTop 100 job titles with counts (cached 24h)โ–ถ
Response
200 OK
[
  { "name": "CEO", "count": 1240000 },
  { "name": "Founder", "count": 980000 }
]
GET/api/final-people/citiesTop 500 cities by people count (cached 6h)โ–ถ
Response
200 OK
{ "cities": [{ "name": "New York", "state": "NY", "count": 2400000 }], "total": 500 }
๐Ÿ“ง People โ€” Email Filtered
Identical to /api/final-people but pre-filtered โ€” every record is guaranteed to have an email. Same params, same pagination.
โœ…
Every record returned has at least one non-empty verified email column.
GET/api/final-people-emailPeople with verified email โ€” paginatedโ–ถ
Example
Response
cURL
# India Founders with emails
curl -G https://doott.jaqyi.com/api/final-people-email \
  -H "Authorization: Bearer <TOKEN>" \
  --data-urlencode "f_job_title=Founder" \
  --data-urlencode "country=india" \
  --data-urlencode "limit=100"
200 OK ยท JSON
{ "records": [{ "full_name": "Priya Mehta", "emails": "{priya@startup.in}", ... }], "total": 8200000 }
๐Ÿ“ž People โ€” Phone Filtered
Identical to /api/final-people but pre-filtered โ€” every record is guaranteed to have a phone number.
โœ…
Every record returned has at least one non-empty phone number column.
GET/api/final-people-numberPeople with phone number โ€” paginatedโ–ถ
Example
cURL
curl -G https://doott.jaqyi.com/api/final-people-number \
  -H "Authorization: Bearer <TOKEN>" \
  --data-urlencode "f_job_title=HR Manager" \
  --data-urlencode "f_city=Delhi" \
  --data-urlencode "limit=50"
โœ… Email Verification
Real-time email validation with 90-day Redis+Postgres caching. Supports single and bulk CSV verification.
POST/api/verify-emailVerify a single email addressโ–ถ
Body
Example
Response
FieldTypeStatusDescription
emailstringRequiredEmail address to verify
force_refreshbooleanOptionalBypass 90-day cache and re-verify (default: false)
skip_smtpbooleanOptionalSkip SMTP handshake โ€” faster but less thorough
cURL
curl -X POST https://doott.jaqyi.com/api/verify-email \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"email":"john@example.com"}'
200 OK ยท JSON
{
  "email":       "john@example.com",
  "valid":       true,
  "deliverable": true,
  "disposable":  false,
  "mx_found":    true,
  "smtp_check":  true,
  "cached":      false
}
POST/api/verify-email/batchBulk verify โ€” CSV upload or JSON list (async job)โ–ถ
Body
Example
Response
FieldTypeStatusDescription
fileFileOption ACSV file upload via multipart/form-data (max 25 MB)
emailsarrayOption BJSON array of email strings
csvstringOption CRaw CSV content as string in request body
force_refreshbooleanOptionalBypass cache for all emails in batch
cURL ยท JSON Array
curl -X POST https://doott.jaqyi.com/api/verify-email/batch \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"emails":["a@example.com","b@test.org","c@domain.com"]}'
cURL ยท CSV File Upload
curl -X POST https://doott.jaqyi.com/api/verify-email/batch \
  -H "Authorization: Bearer <TOKEN>" \
  -F "file=@/path/to/emails.csv"
โ„น๏ธ
Batch jobs are asynchronous. Poll GET /api/verify-email/batch/:jobId until status === "done".
202 Accepted ยท JSON
{ "success": true, "jobId": "job_a1b2c3d4", "status": "pending", "total": 250 }
GET/api/verify-email/batch/:jobIdPoll batch job status & resultsโ–ถ
Response
200 OK ยท JSON (completed)
{
  "jobId":       "job_a1b2c3d4",
  "status":      "done",
  "total":       250, "processed": 250,
  "valid":       198, "invalid": 52,
  "downloadUrl": "/api/verify-email/batch/job_a1b2c3d4/download"
}
๐Ÿ”‘ Authentication API
Register, login, and manage user sessions.
POST/api/auth/registerCreate new accountโ–ถ
Body
Example
FieldTypeStatusDescription
namestringRequiredFull name
emailstringRequiredEmail address
passwordstringRequiredMinimum 8 characters
orgNamestringOptionalOrganization / company name
cURL
curl -X POST https://doott.jaqyi.com/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{"name":"Jane Doe","email":"jane@company.com","password":"secure123","orgName":"Acme Corp"}'
POST/api/auth/loginLogin and receive Bearer tokenโ–ถ
Example
Response
cURL
curl -X POST https://doott.jaqyi.com/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"jane@company.com","password":"secure123"}'
200 OK ยท JSON
{
  "success": true,
  "token":   "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "user": { "id": "usr_xxx", "name": "Jane Doe", "email": "jane@company.com" },
  "org":  { "id": "org_yyy", "name": "Acme Corp" }
}
๐Ÿ“‹ HTTP Status Codes
Standard HTTP codes used across all endpoints.
CodeMeaningWhen to Expect
200 OKSuccessRequest completed, data returned
201 CreatedCreatedNew resource created (e.g. user account)
202 AcceptedAsync StartedJob accepted (e.g. batch email verification)
400 Bad RequestInvalid InputMissing required fields or validation error
401 UnauthorizedAuth RequiredMissing or invalid Bearer token
403 ForbiddenAccess DeniedToken valid but lacks permissions
429 Too Many RequestsRate LimitedRequest quota exceeded โ€” implement back-off
500 Server ErrorInternal ErrorUnexpected server-side failure
503 UnavailableDB UnreachableDatabase connection failed
โšก Rate Limits
Per-IP rate limits protect the platform and ensure fair usage for all users.
Endpoint GroupLimitWindow
/api/final-companies, /api/final-people*300 requestsper 15 minutes per IP
/api/verify-email (single)100 requestsper 15 minutes per IP
/api/verify-email/batch10 requestsper 15 minutes per IP
/api/auth/register, /api/auth/login20 requestsper 15 minutes per IP
All other /api/* endpoints500 requestsper 15 minutes per IP
โš ๏ธ
When rate limited you'll receive 429 Too Many Requests. Use exponential back-off before retrying.