API Documentation
Welcome to the Bullio API. You can use this API to verify email addresses, find emails by name and domain, process bulk requests, look up phone numbers, and manage customers programmatically.
The API is organized around REST. All requests should be made over HTTPS. All request and response bodies, including errors, are encoded in JSON.
Base URL
https://bullio.co/api/v1
Authentication
Authenticate your API requests by including your API key as a query parameter on every request. You can find your API key in your Dashboard.
Example
GET /api/v1/email/verify?api_key=YOUR_API_KEY&email=test@example.com
Response Format
All responses are returned as JSON. Successful responses include a state or
status field set to true.
{
"state": true,
"result": { ... },
"remain_credits": 9500,
"credits_consumed": 1
}
Error Codes
| HTTP Status | Meaning |
|---|---|
| 200 | Success |
| 201 | Resource created |
| 400 | Bad request — invalid parameters |
| 403 | Forbidden — invalid or missing API key |
| 429 | Too many requests — insufficient credits |
Credit System
Every API call consumes credits from your account balance. The number of credits varies by operation:
| Operation | Credits |
|---|---|
| Find email (unverified) | 1 |
| Find email + verify | 2 |
| Single email verification | 2 |
Remaining credits are returned in the remain_credits field of most responses.
Email Verification API
/email/verify
Submit a single email address for verification. Returns an ID that you can use to poll for the result via /email/status.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| string | Yes | The email address to verify | |
| webhook | string | No | URL to receive a callback when verification completes |
Response
{
"state": true,
"id": 12345
}
Errors
// 403 — Invalid API key
{
"result": "failed",
"errors": ["Wrong API key"]
}
// 429 — Insufficient credits
{
"result": "failed",
"errors": ["Not enough credits"]
}
/email/status
Retrieve the result of a previously submitted email verification by its ID.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| id | integer | Yes | The verification ID returned by /email/verify |
Response
{
"state": true,
"result": {
"id": 12345,
"email": "john@example.com",
"result": "deliverable",
"verify_at": {
"date": "2025-01-15 10:30:00.000000",
"timezone_type": 3,
"timezone": "Europe/Helsinki"
}
},
"remain_credits": 9500,
"credits_consumed": 2
}
/email/bulk/verify
Submit a list of email addresses for bulk verification. Send a JSON array of emails in the request body.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key (query parameter) |
| emails | array | Yes | Array of email addresses (JSON body) |
| webhook | string | No | URL to receive a callback when processing completes |
Request
POST /api/v1/email/bulk/verify?api_key=YOUR_API_KEY
Content-Type: application/json
{
"emails": [
"alice@example.com",
"bob@company.org",
"carol@startup.io"
],
"webhook": "https://yourserver.com/webhook"
}
Response
{
"state": true,
"id": 789
}
Errors
// 400 — Invalid input
{
"result": "failed",
"errors": ["Emails must be an array"]
}
// 429 — Insufficient credits
{
"result": "failed",
"errors": ["Not enough credits"]
}
Email Finder API
/email/get
Find an email address by first name, last name, and company domain. Returns instantly from the database without deliverability verification. Costs 1 credit.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| first_name | string | Yes | Contact's first name |
| last_name | string | Yes | Contact's last name |
| domain | string | Yes | Company domain name |
Response
{
"email": "john@apple.com",
"remain_credits": 9500,
"credits_consumed": 1
}
Returns an empty array if no email is found.
/email/get/verified
Find an email address and verify its deliverability. This is an asynchronous operation — use the returned ID with /email/status to retrieve the result. Costs 2 credits.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| first_name | string | Yes | Contact's first name |
| last_name | string | Yes | Contact's last name |
| domain | string | Yes | Company domain name |
Response
{
"state": true,
"id": 12345
}
Poll /email/status with the returned id to get the final result.
Bulk Email Finder API
/email/bulk
Submit up to 1,000 contacts for bulk email lookup. Each contact should include a name and one or more domains.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key (query parameter) |
| contacts | array | Yes | Array of contact objects (JSON body, max 1000) |
| mode | string | No | "regular" (default) or "deep" |
| webhook | string | No | URL to receive a callback when processing completes |
Request
POST /api/v1/email/bulk?api_key=YOUR_API_KEY
Content-Type: application/json
{
"contacts": [
{
"id": "c1",
"first_name": "John",
"last_name": "Doe",
"domains": ["apple.com"]
},
{
"id": "c2",
"first_name": "Jane",
"last_name": "Smith",
"domains": ["google.com", "alphabet.com"]
}
],
"mode": "regular",
"webhook": "https://yourserver.com/webhook"
}
Response
{
"status": true,
"process": 456
}
Errors
// 403 — Contacts empty or exceeds 1000
{
"result": "failed",
"errors": ["Too many contacts. Maximum is 1000"]
}
/email/bulk/process
Check the processing status of a bulk email finder request.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| id | integer | Yes | The process ID returned by /email/bulk |
Response
{
"status": true,
"worker": {
"id": 456,
"status": "completed",
"total": 2,
"processed": 2
}
}
/email/bulk/results
Retrieve the results of a completed bulk email finder process.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| process | integer | Yes | The process ID returned by /email/bulk |
Response
{
"status": true,
"results": [
{
"id": "c1",
"email": "john@apple.com",
"result": "deliverable"
},
{
"id": "c2",
"email": "jane@google.com",
"result": "deliverable"
}
]
}
Phone Finder API
/phone/bulk
Submit up to 1,000 contacts for bulk phone number lookup.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key (query parameter) |
| items | array | Yes | Array of contact objects (JSON body, max 1000) |
| webhook | string | No | URL to receive a callback when processing completes |
Request
POST /api/v1/phone/bulk?api_key=YOUR_API_KEY
Content-Type: application/json
{
"items": [
{
"id": "p1",
"full_name": "John Doe",
"position": "CEO"
},
{
"id": "p2",
"full_name": "Jane Smith",
"position": "CTO"
}
],
"webhook": "https://yourserver.com/webhook"
}
Response
{
"status": true,
"process": 789
}
Errors
// 403 — Items empty or exceeds 1000
{
"result": "failed",
"errors": ["Too many items. Maximum is 1000"]
}
Customer API
/customer/list
Retrieve a paginated list of your customers.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key |
| page | integer | No | Page number (defaults to 1) |
Response
{
"result": [
{
"id": 1,
"email": "customer@example.com",
"active": true
}
],
"pages": 5,
"page": 1
}
/customer/create
Create a new customer or update an existing one. If a customer with the given email already exists, the record is updated.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | string | Yes | Your API key (query parameter) |
| data | object | Yes | Customer data object (JSON body) |
Request
POST /api/v1/customer/create?api_key=YOUR_API_KEY
Content-Type: application/json
{
"data": {
"email": "newcustomer@example.com"
}
}
Response
{
"id": 42,
"active": true
}
Errors
// 403 — Invalid API key
{
"result": "failed",
"errors": ["Wrong API key"]
}