setDomain(e.target.value)} placeholder="Enter company domain (e.g., tomba.io)" className="domain-input" />
{error &&
{error}
} {results.length > 0 && (
Found {results.length} emails:
{results.map((email, index) => (
{email.email} {email.first_name} {email.last_name}
{email.position}
Confidence: {email.confidence}%
))}
)}
); }; export default EmailFinder;``
### 2\. API Client with Error Handling[](https://docs.tomba.io/llm/editor/cursor#2-api-client-with-error-handling)
**Prompt:**
Code
`@docs Create a robust Tomba API client class with: - Rate limiting - Retry logic - Comprehensive error handling - TypeScript support - All major endpoints`
### 3\. Integration with Form Validation[](https://docs.tomba.io/llm/editor/cursor#3-integration-with-form-validation)
**Prompt:**
Code
`@docs Create a form validation hook that uses Tomba email verifier to validate email addresses in real-time`
Advanced Features[](https://docs.tomba.io/llm/editor/cursor#advanced-features)
-------------------------------------------------------------------------------
### 1\. Custom Commands[](https://docs.tomba.io/llm/editor/cursor#1-custom-commands)
Create custom Cursor commands for Tomba API:
Code
`{ "commands": [ { "name": "Generate Tomba Email Finder", "command": "@docs Create an email finder function using Tomba API for the selected domain variable" }, { "name": "Add Tomba Verification", "command": "@docs Add Tomba email verification to the selected email input field" } ] }`
### 2\. Code Actions[](https://docs.tomba.io/llm/editor/cursor#2-code-actions)
Set up code actions for common Tomba API patterns:
Code
`{ "codeActions": { "tomba.addEmailVerification": { "title": "Add Tomba Email Verification", "kind": "refactor" } } }`
Best Practices[](https://docs.tomba.io/llm/editor/cursor#best-practices)
-------------------------------------------------------------------------
### 1\. Use Contextual Prompts[](https://docs.tomba.io/llm/editor/cursor#1-use-contextual-prompts)
Instead of generic requests, provide context:
Code
`@docs In my user registration form, add Tomba email verification before allowing signup`
### 2\. Leverage Cursor's Understanding[](https://docs.tomba.io/llm/editor/cursor#2-leverage-cursors-understanding)
Let Cursor understand your project structure:
Code
`@codebase @docs Integrate Tomba email finder into my existing user management system`
### 3\. Iterative Development[](https://docs.tomba.io/llm/editor/cursor#3-iterative-development)
Build incrementally:
Code
`@docs Start with a basic Tomba email verification function`
Then enhance:
Code
`@docs Add caching and rate limiting to the previous email verification function`
Troubleshooting[](https://docs.tomba.io/llm/editor/cursor#troubleshooting)
---------------------------------------------------------------------------
### Documentation Not Loading[](https://docs.tomba.io/llm/editor/cursor#documentation-not-loading)
1. Check your internet connection
2. Verify the URL: `https://docs.tomba.io/llms.txt`
3. Try refreshing the documentation panel
### API Code Not Working[](https://docs.tomba.io/llm/editor/cursor#api-code-not-working)
1. Ensure your API keys are properly set
2. Check the generated endpoint URLs
3. Verify authentication headers are included
### Context Issues[](https://docs.tomba.io/llm/editor/cursor#context-issues)
1. Make sure `.cursorrules` is in your project root
2. Check that custom instructions are properly formatted
3. Try restarting Cursor after configuration changes
Additional Resources[](https://docs.tomba.io/llm/editor/cursor#additional-resources)
-------------------------------------------------------------------------------------
* [Cursor Documentation](https://docs.cursor.com/)
* [Tomba API Reference](https://docs.tomba.io/api)
* [Authentication Guide](https://docs.tomba.io/authentication)
* [Rate Limits](https://docs.tomba.io/rate-limits)
Last modified on October 3, 2025
[VSCode Setup](https://docs.tomba.io/llm/editor/vscode)
[Zed Editor Setup](https://docs.tomba.io/llm/editor/zed)
JSON
JSON
TypeScript
JSON
JSON
---
# Pipedream Integration | Tomba Documentation
Menu
Overview[](https://docs.tomba.io/integrations/pipedream#overview)
------------------------------------------------------------------
Connect Tomba.io with 2,000+ apps on Pipedream to build serverless workflows with code-level control. Pipedream is a developer-first integration platform that lets you build powerful automations with Node.js code or pre-built actions.
Prerequisites[](https://docs.tomba.io/integrations/pipedream#prerequisites)
----------------------------------------------------------------------------
* Active Tomba.io account with API credentials
* Pipedream account (free or paid)
Setup & Authentication[](https://docs.tomba.io/integrations/pipedream#setup--authentication)
---------------------------------------------------------------------------------------------
### Connecting Tomba.io to Pipedream[](https://docs.tomba.io/integrations/pipedream#connecting-tombaio-to-pipedream)
1. In your workflow, search for **Tomba** in the action/trigger selector
2. Click **Connect Account**
3. Enter your Tomba.io credentials:
* **API Key**: Your Tomba.io API key
* **Secret Key**: Your Tomba.io secret key
4. Click **Save**
**Getting Your API Credentials:**
1. Log in to your [Tomba.io dashboard](https://app.tomba.io/)
2. Navigate to [API Keys](https://app.tomba.io/api)
3. Copy your API Key and Secret Key
Available Actions[](https://docs.tomba.io/integrations/pipedream#available-actions)
------------------------------------------------------------------------------------
### Email Finder[](https://docs.tomba.io/integrations/pipedream#email-finder)
Find professional email addresses using a person's name and company domain.
**Input:**
* **Domain** (required) - Company domain (e.g., `tomba.io`)
* **First Name** (required) - Person's first name
* **Last Name** (required) - Person's last name
**Output:**
* Email address
* Verification status
* Score (accuracy confidence)
* Position
* Department
* Social profiles
**Example Code:**
Code
``import { axios } from "@pipedream/platform"; export default defineComponent({ props: { tomba: { type: "app", app: "tomba", }, }, async run({ steps, $ }) { return await axios($, { url: `https://api.tomba.io/v1/email-finder`, params: { domain: "tomba.io", first_name: "Mohamed", last_name: "Ben rebia", }, headers: { "X-Tomba-Key": `${this.tomba.$auth.api_key}`, "X-Tomba-Secret": `${this.tomba.$auth.secret_key}`, }, }); }, });``
### Email Verifier[](https://docs.tomba.io/integrations/pipedream#email-verifier)
Verify if an email address is valid and deliverable.
**Input:**
* **Email** (required) - Email address to verify
**Output:**
* Email status (valid/invalid)
* Result (deliverable/undeliverable/risky)
* Score (0-100)
* SMTP check results
* Accept-all detection
* Disposable email detection
**Example Code:**
Code
``import { axios } from "@pipedream/platform"; export default defineComponent({ props: { tomba: { type: "app", app: "tomba", }, }, async run({ steps, $ }) { return await axios($, { url: `https://api.tomba.io/v1/email-verifier`, params: { email: "mohamed@tomba.io", }, headers: { "X-Tomba-Key": `${this.tomba.$auth.api_key}`, "X-Tomba-Secret": `${this.tomba.$auth.secret_key}`, }, }); }, });``
### Domain Search[](https://docs.tomba.io/integrations/pipedream#domain-search)
Search for all email addresses associated with a domain.
**Input:**
* **Domain** (required) - Company domain
* **Page** (optional) - Page number for pagination
* **Limit** (optional) - Results per page (max: 100)
* **Department** (optional) - Filter by department
**Output:**
* Array of email addresses
* Full names and positions
* Departments
* Social profiles
* Total count
**Example Code:**
Code
``import { axios } from "@pipedream/platform"; export default defineComponent({ props: { tomba: { type: "app", app: "tomba", }, }, async run({ steps, $ }) { return await axios($, { url: `https://api.tomba.io/v1/domain-search`, params: { domain: "tomba.io", page: 1, limit: 10, }, headers: { "X-Tomba-Key": `${this.tomba.$auth.api_key}`, "X-Tomba-Secret": `${this.tomba.$auth.secret_key}`, }, }); }, });``
### Email Count[](https://docs.tomba.io/integrations/pipedream#email-count)
Get the total number of email addresses for a domain.
**Input:**
* **Domain** (required) - Company domain
**Output:**
* Total email count
* Personal emails count
* Generic emails count
### LinkedIn Email Finder[](https://docs.tomba.io/integrations/pipedream#linkedin-email-finder)
Find email addresses from LinkedIn profile URLs.
**Input:**
* **LinkedIn URL** (required) - LinkedIn profile URL
**Output:**
* Email address
* Full name
* Position
* Company
* Verification status
### Enrichment[](https://docs.tomba.io/integrations/pipedream#enrichment)
Enrich company or contact data using email or domain.
**Input:**
* **Email** (optional) - Email address to enrich
* **Domain** (optional) - Domain to enrich
**Output:**
* Full profile data
* Company information
* Social profiles
* Technologies used
* Employee count
### Phone Finder[](https://docs.tomba.io/integrations/pipedream#phone-finder)
Find phone numbers associated with a domain, email, or LinkedIn URL.
**Input:**
* **Domain** (optional) - Company domain
* **Email** (optional) - Email address
* **LinkedIn URL** (optional) - LinkedIn profile URL
**Output:**
* Phone number(s)
* Phone type (mobile/work)
* Country code
* Verified status
Example Workflows[](https://docs.tomba.io/integrations/pipedream#example-workflows)
------------------------------------------------------------------------------------
### Lead Enrichment Pipeline[](https://docs.tomba.io/integrations/pipedream#lead-enrichment-pipeline)
**Trigger:** HTTP Webhook (receives lead data)
**Steps:**
1. **Parse webhook data** - Extract name, company, domain
2. **Tomba - Email Finder** - Find email using name + domain
3. **Tomba - Email Verifier** - Verify the found email
4. **Tomba - Enrichment** - Get additional profile data
5. **Filter** - Only continue if email is deliverable
6. **Send to CRM** - Create lead in Salesforce/HubSpot
7. **Slack notification** - Alert sales team
**Code Example:**
Code
``export default defineComponent({ async run({ steps, $ }) { const lead = steps.trigger.event.body; // Find email const emailResult = await axios($, { url: `https://api.tomba.io/v1/email-finder`, params: { domain: lead.domain, first_name: lead.firstName, last_name: lead.lastName, }, headers: { "X-Tomba-Key": this.tomba.$auth.api_key, "X-Tomba-Secret": this.tomba.$auth.secret_key, }, }); // Verify email const verifyResult = await axios($, { url: `https://api.tomba.io/v1/email-verifier`, params: { email: emailResult.data.email, }, headers: { "X-Tomba-Key": this.tomba.$auth.api_key, "X-Tomba-Secret": this.tomba.$auth.secret_key, }, }); // Return enriched lead data return { ...lead, email: emailResult.data.email, verification: verifyResult.data, }; }, });``
### Email Validation Service[](https://docs.tomba.io/integrations/pipedream#email-validation-service)
**Trigger:** New row in Google Sheets
**Steps:**
1. **For each row** - Iterate through email list
2. **Tomba - Email Verifier** - Verify each email
3. **Transform data** - Format verification results
4. **Update Google Sheets** - Write verification status
5. **Filter invalid** - Separate invalid emails
6. **Send summary email** - Report validation results
### Company Research Automation[](https://docs.tomba.io/integrations/pipedream#company-research-automation)
**Trigger:** New company added to CRM
**Steps:**
1. **Extract domain** - Get company website domain
2. **Tomba - Domain Search** - Find all company emails
3. **Tomba - Email Count** - Get total email count
4. **Loop through emails** - Process each found email
5. **Tomba - Enrichment** - Enrich each contact
6. **Store in Database** - Save to PostgreSQL/Airtable
7. **Generate report** - Create company research document
Advanced Features[](https://docs.tomba.io/integrations/pipedream#advanced-features)
------------------------------------------------------------------------------------
### Custom Code Steps[](https://docs.tomba.io/integrations/pipedream#custom-code-steps)
Pipedream allows you to write custom Node.js code for complex logic:
Code
`export default defineComponent({ async run({ steps, $ }) { const tombaResults = steps.tomba_email_finder.$return_value; // Custom validation logic if (tombaResults.data.score > 90) { // High confidence - proceed with outreach return { action: "send_email", email: tombaResults.data.email }; } else if (tombaResults.data.score > 70) { // Medium confidence - manual review return { action: "review", email: tombaResults.data.email }; } else { // Low confidence - skip return { action: "skip" }; } }, });`
### Error Handling[](https://docs.tomba.io/integrations/pipedream#error-handling)
Add try-catch blocks for robust workflows:
Code
``export default defineComponent({ async run({ steps, $ }) { try { const result = await axios($, { url: `https://api.tomba.io/v1/email-finder`, params: steps.trigger.event.body, headers: { "X-Tomba-Key": this.tomba.$auth.api_key, "X-Tomba-Secret": this.tomba.$auth.secret_key, }, }); return result; } catch (error) { // Log error and return gracefully console.error("Tomba API Error:", error); return { error: error.message, status: "failed" }; } }, });``
### Batch Processing[](https://docs.tomba.io/integrations/pipedream#batch-processing)
Process multiple items efficiently:
Code
``export default defineComponent({ async run({ steps, $ }) { const leads = steps.trigger.event.body.leads; // Process in batches of 10 const batchSize = 10; const results = []; for (let i = 0; i < leads.length; i += batchSize) { const batch = leads.slice(i, i + batchSize); const promises = batch.map((lead) => axios($, { url: `https://api.tomba.io/v1/email-finder`, params: { domain: lead.domain, first_name: lead.firstName, last_name: lead.lastName, }, headers: { "X-Tomba-Key": this.tomba.$auth.api_key, "X-Tomba-Secret": this.tomba.$auth.secret_key, }, }), ); const batchResults = await Promise.all(promises); results.push(...batchResults); // Rate limiting - wait between batches await new Promise((resolve) => setTimeout(resolve, 1000)); } return results; }, });``
Troubleshooting[](https://docs.tomba.io/integrations/pipedream#troubleshooting)
--------------------------------------------------------------------------------
### Authentication Issues[](https://docs.tomba.io/integrations/pipedream#authentication-issues)
**Problem:** "Authentication failed" or 401 errors
**Solutions:**
* Verify API credentials in [Tomba.io dashboard](https://app.tomba.io/api)
* Reconnect the Tomba account in Pipedream
* Check that your Tomba.io account is active
* Ensure API keys haven't been regenerated
### Rate Limiting[](https://docs.tomba.io/integrations/pipedream#rate-limiting)
**Problem:** 429 "Too Many Requests" errors
**Solutions:**
* Add delays between API calls using `setTimeout`
* Implement exponential backoff
* Check your [Tomba.io plan limits](https://tomba.io/pricing)
* Use batch processing with rate limiting
**Example with delay:**
Code
`// Add delay between requests await new Promise((resolve) => setTimeout(resolve, 1000));`
### No Data Returned[](https://docs.tomba.io/integrations/pipedream#no-data-returned)
**Problem:** Empty results from Tomba API
**Solutions:**
* Verify input parameters are correct
* Check that the email/domain exists in Tomba's database
* Review workflow execution logs in Pipedream
* Test the API call directly using curl or Postman
### Workflow Execution Errors[](https://docs.tomba.io/integrations/pipedream#workflow-execution-errors)
**Problem:** Workflow fails mid-execution
**Solutions:**
* Add error handling with try-catch blocks
* Use conditional steps to handle missing data
* Enable "Continue on error" for non-critical steps
* Check Pipedream's execution history for detailed logs
Best Practices[](https://docs.tomba.io/integrations/pipedream#best-practices)
------------------------------------------------------------------------------
1. **Use Environment Variables** - Store sensitive data in Pipedream secrets
2. **Implement Retries** - Add retry logic for failed API calls
3. **Validate Inputs** - Check data before sending to Tomba API
4. **Log Important Events** - Use `console.log()` for debugging
5. **Test Workflows** - Use Pipedream's testing feature before deploying
6. **Monitor Usage** - Track your Tomba.io API usage regularly
7. **Handle Edge Cases** - Account for missing or invalid data
8. **Optimize Performance** - Use parallel processing where possible
Pipedream Features[](https://docs.tomba.io/integrations/pipedream#pipedream-features)
--------------------------------------------------------------------------------------
### Event Sources[](https://docs.tomba.io/integrations/pipedream#event-sources)
Pipedream can listen to events from various sources:
* HTTP webhooks
* Cron schedules
* Email (incoming)
* RSS feeds
* App events (new row in sheets, new email, etc.)
### Data Stores[](https://docs.tomba.io/integrations/pipedream#data-stores)
Store data between workflow runs:
Code
`// Store email verification results await require("@pipedream/platform").axios($, { method: "POST", url: this.$checkpoint, data: { email: steps.tomba_verify.$return_value.data.email, status: steps.tomba_verify.$return_value.data.result, timestamp: Date.now(), }, });`
### SQL Queries[](https://docs.tomba.io/integrations/pipedream#sql-queries)
Query databases directly in workflows:
Code
`import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); await prisma.lead.create({ data: { email: steps.tomba_finder.$return_value.data.email, verified: true, }, });`
API Rate Limits[](https://docs.tomba.io/integrations/pipedream#api-rate-limits)
--------------------------------------------------------------------------------
Tomba.io API limits vary by plan:
* **Free**: 50 requests/month
* **Starter**: 1,000 requests/month
* **Growth**: 5,000 requests/month
* **Business**: 25,000 requests/month
* **Enterprise**: Custom limits
[View detailed pricing](https://tomba.io/pricing)
Pipedream Pricing[](https://docs.tomba.io/integrations/pipedream#pipedream-pricing)
------------------------------------------------------------------------------------
* **Free**: 100 workflow executions/day
* **Basic**: $19/month - 1,000 executions/day
* **Advanced**: $49/month - 5,000 executions/day
* **Business**: Custom pricing
[View Pipedream pricing](https://pipedream.com/pricing)
Resources[](https://docs.tomba.io/integrations/pipedream#resources)
--------------------------------------------------------------------
* [Tomba.io API Documentation](https://docs.tomba.io/)
* [Pipedream Documentation](https://pipedream.com/docs)
* [Tomba on Pipedream](https://pipedream.com/apps/tomba)
* [Pipedream Community](https://pipedream.com/community)
* [API Status](https://status.tomba.io/)
Support[](https://docs.tomba.io/integrations/pipedream#support)
----------------------------------------------------------------
### Tomba.io Support[](https://docs.tomba.io/integrations/pipedream#tombaio-support)
* Email: [support@tomba.io](mailto:support@tomba.io)
* Dashboard: [app.tomba.io](https://app.tomba.io/)
### Pipedream Support[](https://docs.tomba.io/integrations/pipedream#pipedream-support)
* Community: [pipedream.com/community](https://pipedream.com/community)
* Documentation: [pipedream.com/docs](https://pipedream.com/docs)
* Twitter: [@PipedreamHQ](https://twitter.com/PipedreamHQ)
FAQs[](https://docs.tomba.io/integrations/pipedream#faqs)
----------------------------------------------------------
**Q: Can I use Tomba.io in scheduled workflows?** A: Yes, create a Cron trigger and connect Tomba actions to run on a schedule.
**Q: How do I handle pagination in Domain Search?** A: Use a loop step to iterate through pages, incrementing the page parameter.
**Q: Can I export Tomba data to a database?** A: Yes, use Pipedream's database integrations (PostgreSQL, MySQL, etc.) after Tomba steps.
**Q: Is it possible to combine multiple Tomba actions?** A: Absolutely! Chain multiple Tomba actions together in a single workflow.
**Q: How do I test my workflow without consuming API credits?** A: Use Pipedream's test mode with sample data before deploying to production.
Version History[](https://docs.tomba.io/integrations/pipedream#version-history)
--------------------------------------------------------------------------------
**v1.0.0** - Initial Pipedream integration
* Email Finder action
* Email Verifier action
* Domain Search action
* LinkedIn Finder action
* Enrichment action
* Phone Finder action
* Full Node.js SDK support
Last modified on February 11, 2026
[Make (Integromat) Integration](https://docs.tomba.io/integrations/make)
[Integrate Tomba Finder with n8n](https://docs.tomba.io/integrations/n8n)
Javascript
Javascript
Javascript
Javascript
Javascript
Javascript
Javascript
Javascript
Javascript
Javascript
---
# Integrate Tomba Finder with MyBB | Tomba Documentation
Menu
Overview[](https://docs.tomba.io/integrations/mybb#overview)
-------------------------------------------------------------
The **MyBB Disposable Email Blocker** is an indispensable security tool that provides a superior line of defense for your forum registration process. This plugin enhances security and reliability by preventing users from registering with disposable, temporary, or invalid email addresses.
### Why Use This Plugin?[](https://docs.tomba.io/integrations/mybb#why-use-this-plugin)
* 🛡️ **Enhanced Security**: Prevents spam registrations and fake accounts
* 📧 **Email Quality**: Ensures only legitimate email addresses are used
* 🚫 **Spam Reduction**: Significantly reduces spam and bot registrations
* **User Experience**: Provides real-time validation feedback
* 📊 **Data Integrity**: Maintains clean and reliable user database
* ⚡ **JavaScript-Based**: Fast, client-side validation with instant feedback
### Key Benefits[](https://docs.tomba.io/integrations/mybb#key-benefits)
* **Real-time Validation**: Instant feedback during registration
* **Always Up-to-Date**: Daily updates of disposable email domains
* **Fully Customizable**: Custom error messages and settings
* **Lightweight**: JavaScript-based solution with minimal server load
* **User-Friendly**: Clear error messages guide users to valid emails
* **Comprehensive Protection**: Blocks disposable, invalid, and webmail addresses
Features[](https://docs.tomba.io/integrations/mybb#features)
-------------------------------------------------------------
### Core Protection Features[](https://docs.tomba.io/integrations/mybb#core-protection-features)
* **Invalid Email Detection**: Identifies malformed email addresses
* **Invalid Domain Detection**: Blocks emails from non-existent domains
* **Disposable Email Blocking**: Prevents temporary/throwaway email services
* **Webmail Blocking**: Optional blocking of free webmail providers
* **Real-time Validation**: Instant feedback during typing
* **Custom Error Messages**: Personalized validation messages
### 🔄 Advanced Features[](https://docs.tomba.io/integrations/mybb#-advanced-features)
* **Daily Domain Updates**: Automatically updated disposable email database
* **Pattern Recognition**: Advanced detection algorithms
* **Whitelist Support**: Allow specific domains despite general rules
* **Multiple Validation Levels**: Different strictness levels available
* **API Integration**: Powered by Tomba.io's email intelligence
* **Browser Compatibility**: Works across all modern browsers
### 📋 Supported Detection Types[](https://docs.tomba.io/integrations/mybb#-supported-detection-types)
| Detection Type | Description | Customizable |
| --- | --- | --- |
| **Invalid Format** | Malformed email addresses | Yes |
| **Invalid Domains** | Non-existent or invalid domains | Yes |
| **Disposable Emails** | Temporary/throwaway email services | Yes |
| **Webmail Services** | Free email providers (Gmail, Yahoo, etc.) | Yes |
| **Spam Domains** | Known spam and abuse domains | Yes |
Installation[](https://docs.tomba.io/integrations/mybb#installation)
---------------------------------------------------------------------
### Prerequisites[](https://docs.tomba.io/integrations/mybb#prerequisites)
* MyBB 1.8.x or higher
* Administrator access to your MyBB forum
* Web server with JavaScript support
### Step 1: Download the Plugin[](https://docs.tomba.io/integrations/mybb#step-1-download-the-plugin)
1. **Download** the latest release from [GitHub](https://github.com/tomba-io/mybb-disposable-email-blocker)
2. **Extract** the downloaded ZIP file
3. **Locate** the `inc` folder in the extracted files
### Step 2: Upload Files[](https://docs.tomba.io/integrations/mybb#step-2-upload-files)
1. **Connect** to your server via FTP or file manager
2. **Navigate** to your MyBB forum root directory
3. **Upload** the contents of the `inc` folder to your forum's `inc` folder
4. **Ensure** all files are properly uploaded and permissions are correct
### Step 3: Activate the Plugin[](https://docs.tomba.io/integrations/mybb#step-3-activate-the-plugin)
1. **Log in** to your MyBB Admin Control Panel (ACP)
2. **Navigate** to `Configuration` → `Plugins`
3. **Find** "Disposable Email Blocker" in the inactive plugins list
4. **Click** "Activate" to enable the plugin
5. **Verify** the plugin appears in the active plugins list
### File Structure After Installation[](https://docs.tomba.io/integrations/mybb#file-structure-after-installation)
Code
`inc/ ├── plugins/ │ └── disposable_email_blocker.php ├── languages/ │ └── english/ │ └── disposable_email_blocker.lang.php └── jscripts/ └── disposable-email-blocker.min.js`
Configuration[](https://docs.tomba.io/integrations/mybb#configuration)
-----------------------------------------------------------------------
### Access Plugin Settings[](https://docs.tomba.io/integrations/mybb#access-plugin-settings)
1. **Navigate** to MyBB Admin Control Panel
2. **Go to** `Configuration` → `Settings`
3. **Find** "Disposable Email Blocker" settings group
4. **Configure** options according to your needs
### Available Settings[](https://docs.tomba.io/integrations/mybb#available-settings)
#### General Settings[](https://docs.tomba.io/integrations/mybb#general-settings)
| Setting | Description | Default | Options |
| --- | --- | --- | --- |
| **Enable Plugin** | Enable/disable the blocker | Enabled | On/Off |
| **Validation Mode** | When to validate emails | Real-time | Real-time, On Submit |
| **API Endpoint** | Custom API URL for validation | Tomba.io | Custom URL |
| **Debug Mode** | Show debug information | Disabled | On/Off |
#### Disposable Email Settings[](https://docs.tomba.io/integrations/mybb#disposable-email-settings)
| Setting | Description | Default |
| --- | --- | --- |
| **Block Disposable** | Block disposable email services | Enabled |
| **Disposable Message** | Custom error message | "Disposable emails are not allowed" |
| **Update Frequency** | How often to update domain list | Daily |
| **Custom Domains** | Additional domains to block | Empty |
#### Webmail Settings[](https://docs.tomba.io/integrations/mybb#webmail-settings)
| Setting | Description | Default |
| --- | --- | --- |
| **Block Webmail** | Block webmail providers | Disabled |
| **Webmail Message** | Warning/error message | "Professional email recommended" |
| **Webmail Action** | Block or warn | Warn |
| **Allowed Webmail** | Whitelist specific webmail | Empty |
#### Error Display Settings[](https://docs.tomba.io/integrations/mybb#error-display-settings)
| Setting | Description | Default |
| --- | --- | --- |
| **Error Style** | CSS styling for error messages | Red text |
| **Error Position** | Where to show errors | Below field |
| **Animation** | Error message animation | Fade in |
| **Icon Display** | Show warning/error icons | Enabled |
### Sample Configuration[](https://docs.tomba.io/integrations/mybb#sample-configuration)
Code
`// Example settings in MyBB ACP 'disposable_email_blocker_enabled' => '1', 'disposable_email_blocker_block_webmail' => '0', 'disposable_email_blocker_disposable_message' => 'Disposable emails are not allowed. Please use a permanent email address.', 'disposable_email_blocker_webmail_message' => 'Warning: Professional email addresses are recommended for better account security.', 'disposable_email_blocker_debug' => '0'`
Usage[](https://docs.tomba.io/integrations/mybb#usage)
-------------------------------------------------------
### For Forum Administrators[](https://docs.tomba.io/integrations/mybb#for-forum-administrators)
#### Basic Setup[](https://docs.tomba.io/integrations/mybb#basic-setup)
1. **Install and activate** the plugin
2. **Configure settings** in the ACP
3. **Test registration** with disposable emails
4. **Monitor** registration attempts and spam reduction
5. **Adjust settings** based on your community needs
#### Advanced Configuration[](https://docs.tomba.io/integrations/mybb#advanced-configuration)
Code
`// Custom JavaScript configuration (optional) `
### For Users (Registration Experience)[](https://docs.tomba.io/integrations/mybb#for-users-registration-experience)
#### Valid Email Registration[](https://docs.tomba.io/integrations/mybb#valid-email-registration)
Code
`User enters: john.doe@company.com Result: Email accepted, registration proceeds`
#### Disposable Email Attempt[](https://docs.tomba.io/integrations/mybb#disposable-email-attempt)
Code
`User enters: temp123@10minutemail.com ❌ Result: Error message appears "Disposable emails are not allowed. Please use a permanent email address."`
#### Webmail Warning (If Configured)[](https://docs.tomba.io/integrations/mybb#webmail-warning-if-configured)
Code
`User enters: john.doe@gmail.com ⚠️ Result: Warning message (registration still allowed) "Professional email addresses are recommended for better account security."`
Technical Details[](https://docs.tomba.io/integrations/mybb#technical-details)
-------------------------------------------------------------------------------
### How It Works[](https://docs.tomba.io/integrations/mybb#how-it-works)
1. **JavaScript Integration**: Plugin integrates with MyBB registration forms
2. **Real-time Validation**: Validates emails as users type
3. **API Communication**: Checks emails against Tomba.io database
4. **Domain Database**: Maintains updated list of disposable domains
5. **Client-side Processing**: Fast validation without server round-trips
6. **Fallback Protection**: Server-side validation as backup
### Validation Process[](https://docs.tomba.io/integrations/mybb#validation-process)
Code
`graph TD A[User Types Email] --> B[JavaScript Validation] B --> C{Email Format Valid?} C -->|No| D[Show Format Error] C -->|Yes| E[Check Domain] E --> F{Domain Valid?} F -->|No| G[Show Domain Error] F -->|Yes| H[Check Disposable] H --> I{Is Disposable?} I -->|Yes| J[Show Disposable Error] I -->|No| K[Check Webmail] K --> L{Is Webmail?} L -->|Yes & Blocked| M[Show Webmail Error] L -->|Yes & Warning| N[Show Warning] L -->|No| O[Email Approved]`
### JavaScript API[](https://docs.tomba.io/integrations/mybb#javascript-api)
The plugin provides a JavaScript API for advanced customization:
Code
`// Initialize with custom settings new Disposable.Blocker({ disposable: { message: "Custom disposable email error message", }, webmail: { message: "Custom webmail warning message", block: false, }, }); // Event listeners disposableBlocker.on("invalid", function (email, reason) { console.log("Invalid email:", email, "Reason:", reason); }); disposableBlocker.on("valid", function (email) { console.log("Valid email:", email); });`
Troubleshooting[](https://docs.tomba.io/integrations/mybb#troubleshooting)
---------------------------------------------------------------------------
### Common Issues[](https://docs.tomba.io/integrations/mybb#common-issues)
#### Issue: False Positives (Valid Emails Blocked)[](https://docs.tomba.io/integrations/mybb#issue-false-positives-valid-emails-blocked)
**Symptoms:**
* Legitimate emails being rejected
* Users can't register with business emails
* Over-aggressive blocking
**Solutions:**
1. **Adjust settings** - reduce strictness level
2. **Add to whitelist** - allow specific domains
3. **Check domain status** - verify domain isn't miscategorized
4. **Update plugin** - ensure latest domain database
#### Issue: Disposable Emails Still Getting Through[](https://docs.tomba.io/integrations/mybb#issue-disposable-emails-still-getting-through)
**Symptoms:**
* Spam registrations continuing
* Known disposable domains not blocked
* Plugin seems ineffective
**Solutions:**
1. **Update domain database** - ensure latest disposable domain list
2. **Check plugin settings** - verify disposable blocking is enabled
3. **Monitor new domains** - add newly discovered disposable services
4. **Enable server-side validation** - add backup validation
#### Issue: Performance Problems[](https://docs.tomba.io/integrations/mybb#issue-performance-problems)
**Symptoms:**
* Slow page loading
* Registration form lag
* High server load
**Solutions:**
1. **Enable caching** - cache domain lookups locally
2. **Optimize settings** - reduce API calls frequency
3. **Use CDN** - load JavaScript from CDN
4. **Check server resources** - ensure adequate server capacity
### Debug Mode[](https://docs.tomba.io/integrations/mybb#debug-mode)
Enable debug mode to troubleshoot issues:
1. **Access** plugin settings in ACP
2. **Enable** debug mode
3. **Check** browser console for detailed logs
4. **Review** validation process step-by-step
Code
`// Debug output example Disposable Blocker Debug: - Email: test@10minutemail.com - Domain: 10minutemail.com - Type: disposable - Action: block - Message: Disposable emails are not allowed`
### Log File Analysis[](https://docs.tomba.io/integrations/mybb#log-file-analysis)
Check MyBB error logs for plugin-related issues:
TerminalCode
`# Common log locations tail -f /path/to/mybb/inc/logs/error.log tail -f /var/log/apache2/error.log tail -f /var/log/nginx/error.log`
Support[](https://docs.tomba.io/integrations/mybb#support)
-----------------------------------------------------------
### Getting Help[](https://docs.tomba.io/integrations/mybb#getting-help)
#### Documentation & Resources[](https://docs.tomba.io/integrations/mybb#documentation--resources)
* 📚 [Plugin Documentation](https://github.com/tomba-io/mybb-disposable-email-blocker/wiki)
* 🔧 [MyBB Community Forums](https://community.mybb.com/)
* 🌐 [Tomba.io API Documentation](https://docs.tomba.io/)
* 💡 [MyBB Plugin Development Guide](https://docs.mybb.com/1.8/development/)
#### Support Channels[](https://docs.tomba.io/integrations/mybb#support-channels)
* 🐛 **Bug Reports**: [GitHub Issues](https://github.com/tomba-io/mybb-disposable-email-blocker/issues)
* 💬 **Feature Requests**: [GitHub Discussions](https://github.com/tomba-io/mybb-disposable-email-blocker/discussions)
* 📧 **Email Support**: [support@tomba.io](mailto:support@tomba.io)
* 🏛️ **MyBB Community**: [MyBB Forum Thread](https://community.mybb.com/mods.php?action=view&pid=1571)
### Frequently Asked Questions[](https://docs.tomba.io/integrations/mybb#frequently-asked-questions)
#### Q: Is this plugin free?[](https://docs.tomba.io/integrations/mybb#q-is-this-plugin-free)
**A:** Yes, the Disposable Email Blocker plugin is completely free to use.
#### Q: Does it work with custom MyBB themes?[](https://docs.tomba.io/integrations/mybb#q-does-it-work-with-custom-mybb-themes)
**A:** Yes, the plugin is designed to work with all MyBB themes. The JavaScript integrates automatically with registration forms.
#### Q: Can I customize the error messages?[](https://docs.tomba.io/integrations/mybb#q-can-i-customize-the-error-messages)
**A:** Yes, all error messages are fully customizable through the plugin settings in your MyBB Admin Control Panel.
#### Q: How often is the disposable domain list updated?[](https://docs.tomba.io/integrations/mybb#q-how-often-is-the-disposable-domain-list-updated)
**A:** The domain database is updated daily to include new disposable email services and remove inactive ones.
#### Q: Can I block specific domains manually?[](https://docs.tomba.io/integrations/mybb#q-can-i-block-specific-domains-manually)
**A:** Yes, you can add custom domains to the blocklist through the plugin settings.
#### Q: Does it affect forum performance?[](https://docs.tomba.io/integrations/mybb#q-does-it-affect-forum-performance)
**A:** No, the plugin uses client-side JavaScript validation, which doesn't impact server performance.
#### Q: Can users bypass the validation?[](https://docs.tomba.io/integrations/mybb#q-can-users-bypass-the-validation)
**A:** The plugin includes both client-side and server-side validation to prevent bypassing.
Last modified on April 27, 2026
[Orthogonal Integration](https://docs.tomba.io/integrations/orthogonal)
[Integrate Tomba Finder with Maltego](https://docs.tomba.io/integrations/maltego)
PHP
Javascript
Javascript
Javascript
---
# Phone Finder Bulk | Tomba Documentation
Menu
Overview[](https://docs.tomba.io/bulks/phone-finder#overview)
--------------------------------------------------------------
[Bulks Phone Finder](https://tomba.io/bulks/phone-finder)
enables you to discover phone numbers associated with email addresses, company websites, and LinkedIn profiles. Expand your contact methods and enable multi-channel outreach strategies with comprehensive phone number discovery.
### Key Features[](https://docs.tomba.io/bulks/phone-finder#key-features)
* **Multi-Source Discovery**: Find phone numbers from emails, websites, and LinkedIn URLs
* **Bulk Processing**: Process up to 2,500 contacts per operation
* **Contact Expansion**: Add phone numbers to existing contact databases
* **Multi-Channel Outreach**: Enable phone-based sales and marketing activities
* **Quality Filtering**: Filter out invalid and non-business phone numbers
### How Phone Finder Bulk Works[](https://docs.tomba.io/bulks/phone-finder#how-phone-finder-bulk-works)
1. **Prepare Contact List**: Compile emails, website URLs, or LinkedIn profile URLs
2. **Upload Data**: Provide contact information for phone number discovery
3. **Process Discovery**: Launch phone number search algorithms
4. **Review Results**: Examine discovered phone numbers with source context
5. **Export Contacts**: Download enriched contact lists with phone numbers
### Limitations[](https://docs.tomba.io/bulks/phone-finder#limitations)
* Each Bulk is limited to 2,500 email addresses, websites, or LinkedIn profile URLs
* Webmail addresses (Gmail, Outlook, etc.) and disposable emails are skipped
* Special or unexpected characters may be removed from your file
* Duplicate and invalid lines will not be imported
Go SDK Integration[](https://docs.tomba.io/bulks/phone-finder#go-sdk-integration)
----------------------------------------------------------------------------------
### Installation[](https://docs.tomba.io/bulks/phone-finder#installation)
TerminalCode
`go get github.com/tomba-io/go`
### Basic Setup[](https://docs.tomba.io/bulks/phone-finder#basic-setup)
Code
`package main import ( "fmt" "log" "time" "strings" "github.com/tomba-io/go/tomba" "github.com/tomba-io/go/tomba/models" ) func main() { // Initialize Tomba client client := tomba.NewTomba("your-api-key", "your-secret-key") // Your phone finder code here }`
### Finding Phone Numbers from Email List[](https://docs.tomba.io/bulks/phone-finder#finding-phone-numbers-from-email-list)
Code
`// Email addresses for phone number discovery emailList := []string{ "contact@techcorp.com", "sales@startup.io", "info@enterprise.com", "support@business.net", "hello@company.org", } params := &models.BulkCreateParams{ Name: "Phone Discovery - Email Sources", List: strings.Join(emailList, "\n"), Sources: true, // Include sources for context Notifie: true, // Notify when complete } // Create phone finder bulk operation response, err := client.CreateBulk(models.BulkTypePhoneFinder, params) if err != nil { log.Fatal("Failed to create phone finder bulk:", err) } bulkID := *response.Data.ID fmt.Printf("Created phone finder bulk with ID: %d\n", bulkID)`
### Finding Phone Numbers from Website URLs[](https://docs.tomba.io/bulks/phone-finder#finding-phone-numbers-from-website-urls)
Code
`// Company websites for phone discovery websites := []string{ "https://techcorp.com", "https://startup.io", "https://enterprise.com", "https://business.net", "https://company.org", } params := &models.BulkCreateParams{ Name: "Phone Discovery - Company Websites", List: strings.Join(websites, "\n"), Sources: true, Notifie: true, } response, err := client.CreateBulk(models.BulkTypePhoneFinder, params) if err != nil { log.Fatal("Failed to create phone finder bulk:", err) } bulkID := *response.Data.ID fmt.Printf("Created website phone finder bulk: %d\n", bulkID)`
### Creating Phone Finder from CSV File[](https://docs.tomba.io/bulks/phone-finder#creating-phone-finder-from-csv-file)
Code
`// Create phone finder from CSV with mixed sources params := &models.BulkCreateParams{ Name: "Multi-Channel Phone Discovery", Delimiter: ",", Column: 2, // Source column (email/website/linkedin URL) Sources: true, Notifie: true, } // CSV can contain emails, websites, or LinkedIn URLs response, err := client.CreateBulkWithFile( models.BulkTypePhoneFinder, params, "/path/to/contact-sources.csv", ) if err != nil { log.Fatal("Failed to create bulk with file:", err) } bulkID := *response.Data.ID fmt.Printf("Created phone finder bulk: %d\n", bulkID)`
### Launching and Monitoring Phone Discovery[](https://docs.tomba.io/bulks/phone-finder#launching-and-monitoring-phone-discovery)
Code
`// Launch the phone discovery process launchResponse, err := client.LaunchBulk(models.BulkTypePhoneFinder, bulkID) if err != nil { log.Fatal("Failed to launch phone finder:", err) } fmt.Println("Phone number discovery started!") // Monitor progress startTime := time.Now() for { progress, err := client.GetBulkProgress(models.BulkTypePhoneFinder, bulkID) if err != nil { log.Printf("Error checking progress: %v", err) time.Sleep(30 * time.Second) continue } elapsed := time.Since(startTime).Round(time.Second) fmt.Printf("Phone discovery: %d%% (%d processed) - %v elapsed\n", progress.Progress, progress.Processed, elapsed, ) if progress.Status { fmt.Println("Phone number discovery completed!") break } // Check every 45 seconds (phone discovery can be slower) time.Sleep(45 * time.Second) }`
### Retrieving Phone Discovery Results[](https://docs.tomba.io/bulks/phone-finder#retrieving-phone-discovery-results)
Code
`// Get detailed results bulk, err := client.GetBulk(models.BulkTypePhoneFinder, bulkID) if err != nil { log.Fatal("Failed to get bulk details:", err) } bulkInfo := bulk.Data[0] fmt.Printf("Phone Discovery Results:\n") fmt.Printf("- Campaign: %s\n", bulkInfo.Name) fmt.Printf("- Status: %v\n", bulkInfo.Status) fmt.Printf("- Sources Processed: %d\n", bulkInfo.Processed) // Download results with phone numbers err = client.SaveBulkResults( models.BulkTypePhoneFinder, bulkID, "phone-numbers.csv", "full", ) if err != nil { log.Fatal("Failed to download results:", err) } fmt.Println("Phone numbers saved to phone-numbers.csv") // Download only records where phones were found err = client.SaveBulkResults( models.BulkTypePhoneFinder, bulkID, "found-phones.csv", "valid", ) if err != nil { log.Printf("Warning: Could not save found phones: %v", err) } else { fmt.Println("Found phone numbers saved to found-phones.csv") }`
### Managing Phone Finder Operations[](https://docs.tomba.io/bulks/phone-finder#managing-phone-finder-operations)
Code
`// List all phone finder bulks params := &models.BulkGetParams{ Page: 1, Limit: 15, Direction: "desc", Filter: "all", } bulks, err := client.GetAllPhoneFinderBulks(params) if err != nil { log.Fatal("Failed to get phone finder bulks:", err) } fmt.Printf("Phone Finder Operations:\n") for _, bulk := range bulks.Data { status := "In Progress" if bulk.Status { status = "Completed" } fmt.Printf("- %s (ID: %d)\n", bulk.Name, bulk.BulkID) fmt.Printf(" Status: %s | Progress: %d%% | Processed: %d\n", status, bulk.Progress, bulk.Processed) created := bulk.CreatedAt.Format("2006-01-02 15:04") fmt.Printf(" Created: %s\n", created) fmt.Println() } // Archive old completed operations for _, bulk := range bulks.Data { if bulk.Status && time.Since(bulk.CreatedAt) > 7*24*time.Hour { // 7 days old _, err := client.ArchiveBulk(models.BulkTypePhoneFinder, bulk.BulkID) if err != nil { log.Printf("Failed to archive bulk %d: %v", bulk.BulkID, err) } else { fmt.Printf("Archived old phone finder: %s\n", bulk.Name) } } }`
### Advanced Phone Discovery Workflow[](https://docs.tomba.io/bulks/phone-finder#advanced-phone-discovery-workflow)
Code
``type PhoneDiscoveryResult struct { Source string SourceType string // "email", "website", "linkedin" PhoneNumber string Found bool Country string Type string // "mobile", "landline", etc. } func discoverPhonesFromMixedSources(client *tomba.Tomba, sources []string) ([]PhoneDiscoveryResult, error) { // Step 1: Categorize sources var emails, websites, linkedinURLs []string for _, source := range sources { source = strings.TrimSpace(source) if strings.Contains(source, "@") { emails = append(emails, source) } else if strings.Contains(source, "linkedin.com") { linkedinURLs = append(linkedinURLs, source) } else if strings.HasPrefix(source, "http") { websites = append(websites, source) } } log.Printf("Categorized sources: %d emails, %d websites, %d LinkedIn profiles", len(emails), len(websites), len(linkedinURLs)) var allResults []PhoneDiscoveryResult // Step 2: Process each category separately for better tracking if len(emails) > 0 { results, err := processPhoneDiscoveryBatch(client, emails, "email") if err != nil { log.Printf("Email phone discovery failed: %v", err) } else { allResults = append(allResults, results...) } } if len(websites) > 0 { results, err := processPhoneDiscoveryBatch(client, websites, "website") if err != nil { log.Printf("Website phone discovery failed: %v", err) } else { allResults = append(allResults, results...) } } if len(linkedinURLs) > 0 { results, err := processPhoneDiscoveryBatch(client, linkedinURLs, "linkedin") if err != nil { log.Printf("LinkedIn phone discovery failed: %v", err) } else { allResults = append(allResults, results...) } } return allResults, nil } func processPhoneDiscoveryBatch(client *tomba.Tomba, sources []string, sourceType string) ([]PhoneDiscoveryResult, error) { // Respect the 2,500 limit if len(sources) > 2500 { log.Printf("Warning: Truncating %s sources from %d to 2,500", sourceType, len(sources)) sources = sources[:2500] } // Create batch operation params := &models.BulkCreateParams{ Name: fmt.Sprintf("Phone Discovery - %s sources - %s", strings.Title(sourceType), time.Now().Format("15:04:05")), List: strings.Join(sources, "\n"), Sources: true, Notifie: false, } response, err := client.CreateBulk(models.BulkTypePhoneFinder, params) if err != nil { return nil, fmt.Errorf("failed to create phone finder bulk: %w", err) } bulkID := *response.Data.ID log.Printf("Created %s phone discovery bulk: %d", sourceType, bulkID) // Launch and monitor _, err = client.LaunchBulk(models.BulkTypePhoneFinder, bulkID) if err != nil { return nil, fmt.Errorf("failed to launch bulk: %w", err) } // Wait for completion with timeout timeout := time.After(45 * time.Minute) ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for { select { case <-timeout: return nil, fmt.Errorf("phone discovery timed out for %s sources", sourceType) case <-ticker.C: progress, err := client.GetBulkProgress(models.BulkTypePhoneFinder, bulkID) if err != nil { log.Printf("Error checking progress: %v", err) continue } if progress.Progress%25 == 0 || progress.Status { log.Printf("%s phone discovery: %d%% (%d processed)", strings.Title(sourceType), progress.Progress, progress.Processed) } if progress.Status { // Parse results return parsePhoneResults(client, bulkID, sourceType) } } } } func parsePhoneResults(client *tomba.Tomba, bulkID int64, sourceType string) ([]PhoneDiscoveryResult, error) { // Download results data, err := client.DownloadBulk(models.BulkTypePhoneFinder, bulkID, &models.BulkDownloadParams{Type: "full"}) if err != nil { return nil, fmt.Errorf("failed to download results: %w", err) } // Parse CSV results (simplified parsing) var results []PhoneDiscoveryResult lines := strings.Split(string(data), "\n") for i, line := range lines { if i == 0 || strings.TrimSpace(line) == "" { continue // Skip header and empty lines } // Simple CSV parsing - use proper CSV parser in production parts := strings.Split(line, ",") if len(parts) >= 2 { result := PhoneDiscoveryResult{ Source: strings.Trim(parts[0], `"`), SourceType: sourceType, Found: false, } if len(parts) > 1 && strings.TrimSpace(parts[1]) != "" { result.PhoneNumber = strings.Trim(parts[1], `"`) result.Found = true } // Extract additional metadata if available if len(parts) > 2 { result.Country = strings.Trim(parts[2], `"`) } if len(parts) > 3 { result.Type = strings.Trim(parts[3], `"`) } results = append(results, result) } } log.Printf("Parsed %d %s phone results (%d found)", len(results), sourceType, countFoundPhones(results)) return results, nil } func countFoundPhones(results []PhoneDiscoveryResult) int { count := 0 for _, result := range results { if result.Found { count++ } } return count } // Complete workflow example func runPhoneDiscoveryCampaign(client *tomba.Tomba, csvPath string) error { // Read sources from CSV file, err := os.Open(csvPath) if err != nil { return fmt.Errorf("failed to open CSV: %w", err) } defer file.Close() reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { return fmt.Errorf("failed to read CSV: %w", err) } var sources []string for i, record := range records { if i == 0 || len(record) == 0 { // Skip header and empty rows continue } sources = append(sources, record[0]) } log.Printf("Processing phone discovery for %d sources", len(sources)) // Discover phones results, err := discoverPhonesFromMixedSources(client, sources) if err != nil { return fmt.Errorf("phone discovery failed: %w", err) } // Analyze results totalSources := len(results) phonesFound := countFoundPhones(results) // Group by source type typeStats := make(map[string]struct{ Total, Found int }) for _, result := range results { stats := typeStats[result.SourceType] stats.Total++ if result.Found { stats.Found++ } typeStats[result.SourceType] = stats } // Report results fmt.Printf("\nPhone Discovery Campaign Results:\n") fmt.Printf("Total Sources: %d\n", totalSources) fmt.Printf("Phones Found: %d\n", phonesFound) fmt.Printf("Success Rate: %.1f%%\n", float64(phonesFound)/float64(totalSources)*100) fmt.Printf("\nBreakdown by Source Type:\n") for sourceType, stats := range typeStats { successRate := float64(stats.Found) / float64(stats.Total) * 100 fmt.Printf("- %s: %d/%d (%.1f%%)\n", strings.Title(sourceType), stats.Found, stats.Total, successRate) } // Save consolidated results timestamp := time.Now().Format("20060102-150405") outputFile := fmt.Sprintf("phone-discovery-results-%s.csv", timestamp) return savePhoneResults(results, outputFile) } func savePhoneResults(results []PhoneDiscoveryResult, filename string) error { file, err := os.Create(filename) if err != nil { return err } defer file.Close() writer := csv.NewWriter(file) defer writer.Flush() // Write header writer.Write([]string{"Source", "Source_Type", "Phone_Number", "Found", "Country", "Type"}) // Write results for _, result := range results { writer.Write([]string{ result.Source, result.SourceType, result.PhoneNumber, fmt.Sprintf("%v", result.Found), result.Country, result.Type, }) } log.Printf("Saved phone discovery results to: %s", filename) return nil } // Usage example func main() { client := tomba.NewTomba("your-api-key", "your-secret-key") err := runPhoneDiscoveryCampaign(client, "mixed-sources.csv") if err != nil { log.Fatal("Phone discovery campaign failed:", err) } }``
### CSV File Format Examples[](https://docs.tomba.io/bulks/phone-finder#csv-file-format-examples)
**Mixed Sources**
Code
`source john.doe@example.com https://techcorp.com https://www.linkedin.com/in/jane-smith contact@startup.io https://business.net support@company.org`
**With Source Type Labels**
Code
`source,notes john.doe@example.com,Sales contact https://techcorp.com,website,Company https://www.linkedin.com/in/jane-smith,linkedin,CTO profile contact@startup.io,General inquiry https://business.net/contact,Contact page`
Best Practices[](https://docs.tomba.io/bulks/phone-finder#best-practices)
--------------------------------------------------------------------------
* **Business Focus**: Prioritize business contacts over personal ones
* **Data Quality**: Use verified email addresses and legitimate websites as sources
* **Compliance**: Ensure compliance with telecommunications regulations and privacy laws
* **Multi-Channel Strategy**: Integrate phone data with email and social outreach
* **Regular Updates**: Refresh phone data as contact information changes
* **Source Validation**: Validate input sources before processing
* **Batch Management**: Process sources in manageable batches under 2,500 limit
* **Result Analysis**: Track success rates by source type to optimize strategies
* **Privacy Respect**: Use discovered phone numbers responsibly and ethically
* **Quality Control**: Verify phone numbers before using for outreach campaigns
Last modified on April 27, 2026
[LinkedIn Finder Bulk](https://docs.tomba.io/bulks/linkedin-finder)
[Phone Validator Bulk](https://docs.tomba.io/bulks/phone-validator)
Go
Go
Go
Go
Go
Go
Go
Go
---
# LinkedIn Finder Bulk | Tomba Documentation
Menu
Overview[](https://docs.tomba.io/bulks/linkedin-finder#overview)
-----------------------------------------------------------------
[Bulk Linkedin Finder](https://tomba.io/bulks/linkedin-finder)
allows you to extract email addresses from LinkedIn profile URLs at scale. Transform your LinkedIn prospecting efforts by converting profile links into actionable contact information for direct outreach.
### Key Features[](https://docs.tomba.io/bulks/linkedin-finder#key-features)
* **LinkedIn Integration**: Process LinkedIn profile URLs to find email addresses
* **Bulk Processing**: Handle up to 10,000 LinkedIn URLs per operation
* **Professional Context**: Maintain connection between LinkedIn profiles and email contacts
* **Pattern Matching**: Use LinkedIn data to improve email accuracy
* **Export Capabilities**: Download results with LinkedIn profile associations
### How LinkedIn Finder Bulk Works[](https://docs.tomba.io/bulks/linkedin-finder#how-linkedin-finder-bulk-works)
1. **Collect LinkedIn URLs**: Gather LinkedIn profile URLs from your prospecting activities
2. **Upload URL List**: Provide LinkedIn URLs via text input or file upload
3. **Process Profiles**: Launch the email discovery process
4. **Review Results**: Examine found email addresses with LinkedIn context
5. **Export Data**: Download email addresses linked to LinkedIn profiles
### Limitations[](https://docs.tomba.io/bulks/linkedin-finder#limitations)
* Each Bulk is limited to 10,000 URLs
* Additional rows will be skipped
* Some special or unexpected characters may be deleted in the file
* Invalid URLs won't be imported
* Duplicate URLs won't be imported
Go SDK Integration[](https://docs.tomba.io/bulks/linkedin-finder#go-sdk-integration)
-------------------------------------------------------------------------------------
### Installation[](https://docs.tomba.io/bulks/linkedin-finder#installation)
TerminalCode
`go get github.com/tomba-io/go`
#### Basic Setup[](https://docs.tomba.io/bulks/linkedin-finder#basic-setup)
Code
`package main import ( "fmt" "log" "time" "strings" "github.com/tomba-io/go/tomba" "github.com/tomba-io/go/tomba/models" ) func main() { // Initialize Tomba client client := tomba.NewTomba("your-api-key", "your-secret-key") // Your LinkedIn finder code here }`
### Creating LinkedIn Finder Bulk with URL List[](https://docs.tomba.io/bulks/linkedin-finder#creating-linkedin-finder-bulk-with-url-list)
Code
`// LinkedIn URLs collected from prospecting linkedinURLs := []string{ "https://www.linkedin.com/in/johndoe", "https://www.linkedin.com/in/janesmith", "https://www.linkedin.com/in/mikejohnson", "https://linkedin.com/in/sarahwilson", "https://www.linkedin.com/in/company-ceo", } // Join URLs with newlines for the bulk operation urlList := strings.Join(linkedinURLs, "\n") params := &models.BulkCreateParams{ Name: "LinkedIn Prospects - Tech Industry Q1", List: urlList, Sources: true, // Include sources for context Verify: false, // Skip verification for LinkedIn findings Notifie: true, // Notify when complete } // Create the LinkedIn finder bulk response, err := client.CreateBulk(models.BulkTypeLinkedIn, params) if err != nil { log.Fatal("Failed to create LinkedIn finder bulk:", err) } bulkID := *response.Data.ID fmt.Printf("Created LinkedIn finder bulk with ID: %d\n", bulkID)`
### Creating LinkedIn Finder Bulk from CSV File[](https://docs.tomba.io/bulks/linkedin-finder#creating-linkedin-finder-bulk-from-csv-file)
Code
`// Create LinkedIn finder from CSV containing URLs params := &models.BulkCreateParams{ Name: "Sales Prospects - LinkedIn Discovery", Delimiter: ",", Column: 1, // LinkedIn URL column (1-based index) Sources: true, Notifie: true, } // Upload CSV file with LinkedIn URLs response, err := client.CreateBulkWithFile( models.BulkTypeLinkedIn, params, "/path/to/linkedin-profiles.csv", ) if err != nil { log.Fatal("Failed to create bulk with file:", err) } bulkID := *response.Data.ID fmt.Printf("Created LinkedIn finder bulk: %d\n", bulkID)`
### Single LinkedIn Profile Processing (for comparison)[](https://docs.tomba.io/bulks/linkedin-finder#single-linkedin-profile-processing-for-comparison)
Code
`// Process a single LinkedIn profile linkedinURL := "https://www.linkedin.com/in/example-profile" result, err := client.LinkedinFinder(linkedinURL) if err != nil { log.Printf("Failed to find email for %s: %v", linkedinURL, err) } else { fmt.Printf("LinkedIn Profile: %s\n", linkedinURL) if result.Data.Email != nil { fmt.Printf("Found Email: %s\n", *result.Data.Email) fmt.Printf("Name: %s %s\n", result.Data.FirstName, result.Data.LastName) if result.Data.Position != nil { fmt.Printf("Position: %s\n", *result.Data.Position) } } else { fmt.Println("No email found for this profile") } }`
### Launching and Monitoring LinkedIn Processing[](https://docs.tomba.io/bulks/linkedin-finder#launching-and-monitoring-linkedin-processing)
Code
`// Launch the LinkedIn email discovery launchResponse, err := client.LaunchBulk(models.BulkTypeLinkedIn, bulkID) if err != nil { log.Fatal("Failed to launch LinkedIn finder:", err) } fmt.Println("LinkedIn email discovery started!") // Monitor progress with detailed logging startTime := time.Now() ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for { progress, err := client.GetBulkProgress(models.BulkTypeLinkedIn, bulkID) if err != nil { log.Printf("Error checking progress: %v", err) time.Sleep(30 * time.Second) continue } elapsed := time.Since(startTime).Round(time.Second) fmt.Printf("LinkedIn processing: %d%% (%d profiles processed) - %v elapsed\n", progress.Progress, progress.Processed, elapsed, ) if progress.Status { fmt.Println("LinkedIn email discovery completed!") break } // LinkedIn processing can be slower, check every 30 seconds time.Sleep(30 * time.Second) }`
### Retrieving LinkedIn Discovery Results[](https://docs.tomba.io/bulks/linkedin-finder#retrieving-linkedin-discovery-results)
Code
`// Get detailed results bulk, err := client.GetBulk(models.BulkTypeLinkedIn, bulkID) if err != nil { log.Fatal("Failed to get bulk details:", err) } bulkInfo := bulk.Data[0] fmt.Printf("LinkedIn Discovery Results:\n") fmt.Printf("- Campaign: %s\n", bulkInfo.Name) fmt.Printf("- Status: %v\n", bulkInfo.Status) fmt.Printf("- Profiles Processed: %d\n", bulkInfo.Processed) if bulkInfo.TotalEmails != nil { fmt.Printf("- Emails Found: %d\n", *bulkInfo.TotalEmails) successRate := float64(*bulkInfo.TotalEmails) / float64(bulkInfo.Processed) * 100 fmt.Printf("- Success Rate: %.1f%%\n", successRate) } // Download all results with LinkedIn context err = client.SaveBulkResults( models.BulkTypeLinkedIn, bulkID, "linkedin-emails.csv", "full", ) if err != nil { log.Fatal("Failed to download results:", err) } fmt.Println("LinkedIn results saved to linkedin-emails.csv")`
### Advanced Processing with URL Validation[](https://docs.tomba.io/bulks/linkedin-finder#advanced-processing-with-url-validation)
Code
`// Validate and process LinkedIn URLs func validateLinkedInURL(url string) bool { url = strings.ToLower(strings.TrimSpace(url)) return strings.Contains(url, "linkedin.com/in/") || strings.Contains(url, "linkedin.com/pub/") } func processLinkedInProspects(client *tomba.Tomba, urls []string) error { // Step 1: Validate URLs var validURLs []string for _, url := range urls { if validateLinkedInURL(url) { validURLs = append(validURLs, url) } else { log.Printf("Skipping invalid URL: %s", url) } } if len(validURLs) == 0 { return fmt.Errorf("no valid LinkedIn URLs found") } fmt.Printf("Processing %d valid LinkedIn URLs\n", len(validURLs)) // Step 2: Create bulk operation params := &models.BulkCreateParams{ Name: fmt.Sprintf("LinkedIn Discovery - %s", time.Now().Format("2006-01-02")), List: strings.Join(validURLs, "\n"), Sources: true, Notifie: true, } response, err := client.CreateBulk(models.BulkTypeLinkedIn, params) if err != nil { return fmt.Errorf("failed to create LinkedIn bulk: %w", err) } bulkID := *response.Data.ID log.Printf("Created LinkedIn bulk: %d", bulkID) // Step 3: Launch and monitor _, err = client.LaunchBulk(models.BulkTypeLinkedIn, bulkID) if err != nil { return fmt.Errorf("failed to launch bulk: %w", err) } // Monitor with timeout and progress tracking timeout := time.After(60 * time.Minute) // LinkedIn processing can take longer ticker := time.NewTicker(45 * time.Second) defer ticker.Stop() startTime := time.Now() for { select { case <-timeout: return fmt.Errorf("LinkedIn processing timed out after 60 minutes") case <-ticker.C: progress, err := client.GetBulkProgress(models.BulkTypeLinkedIn, bulkID) if err != nil { log.Printf("Error checking progress: %v", err) continue } if progress.Progress%25 == 0 || progress.Status { elapsed := time.Since(startTime).Round(time.Second) log.Printf("LinkedIn progress: %d%% (%d/%d) - %v", progress.Progress, progress.Processed, len(validURLs), elapsed) } if progress.Status { // Download and analyze results bulk, err := client.GetBulk(models.BulkTypeLinkedIn, bulkID) if err != nil { return fmt.Errorf("failed to get final results: %w", err) } info := bulk.Data[0] log.Printf("LinkedIn discovery completed!") log.Printf("Total processed: %d", info.Processed) if info.TotalEmails != nil { successRate := float64(*info.TotalEmails) / float64(info.Processed) * 100 log.Printf("Emails found: %d (%.1f%% success rate)", *info.TotalEmails, successRate) } // Save results timestamp := time.Now().Format("20060102-150405") outputFile := fmt.Sprintf("linkedin-results-%s.csv", timestamp) err = client.SaveBulkResults(models.BulkTypeLinkedIn, bulkID, outputFile, "full") if err != nil { return fmt.Errorf("failed to save results: %w", err) } log.Printf("Results saved to: %s", outputFile) return nil } } } }`
### Managing LinkedIn Finder Operations[](https://docs.tomba.io/bulks/linkedin-finder#managing-linkedin-finder-operations)
Code
`// List all LinkedIn finder bulks params := &models.BulkGetParams{ Page: 1, Limit: 10, Direction: "desc", Filter: "all", } bulks, err := client.GetAllLinkedInBulks(params) if err != nil { log.Fatal("Failed to get LinkedIn bulks:", err) } fmt.Printf("LinkedIn Finder Operations:\n") for _, bulk := range bulks.Data { status := "In Progress" if bulk.Status { status = "Completed" } fmt.Printf("- %s (ID: %d)\n", bulk.Name, bulk.BulkID) fmt.Printf(" Status: %s | Progress: %d%% | Processed: %d\n", status, bulk.Progress, bulk.Processed) if bulk.TotalEmails != nil { fmt.Printf(" Emails Found: %d\n", *bulk.TotalEmails) } fmt.Println() } // Clean up old operations for _, bulk := range bulks.Data { if bulk.Status && time.Since(bulk.CreatedAt) > 30*24*time.Hour { // 30 days old _, err := client.ArchiveBulk(models.BulkTypeLinkedIn, bulk.BulkID) if err != nil { log.Printf("Failed to archive bulk %d: %v", bulk.BulkID, err) } else { fmt.Printf("Archived old bulk: %s\n", bulk.Name) } } }`
### Complete LinkedIn Prospecting Workflow[](https://docs.tomba.io/bulks/linkedin-finder#complete-linkedin-prospecting-workflow)
Code
`type LinkedInProspect struct { URL string Email string Name string Position string Company string Found bool } func runLinkedInCampaign(client *tomba.Tomba, csvPath string) ([]LinkedInProspect, error) { // Step 1: Read and validate LinkedIn URLs from CSV file, err := os.Open(csvPath) if err != nil { return nil, fmt.Errorf("failed to open CSV: %w", err) } defer file.Close() reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { return nil, fmt.Errorf("failed to read CSV: %w", err) } var validURLs []string for i, record := range records { if i == 0 { // Skip header continue } if len(record) > 0 && validateLinkedInURL(record[0]) { validURLs = append(validURLs, record[0]) } } log.Printf("Found %d valid LinkedIn URLs", len(validURLs)) // Step 2: Process URLs in batches if needed batchSize := 5000 // Process in smaller batches for better management var allResults []LinkedInProspect for i := 0; i < len(validURLs); i += batchSize { end := i + batchSize if end > len(validURLs) { end = len(validURLs) } batchURLs := validURLs[i:end] log.Printf("Processing batch %d/%d (%d URLs)", i/batchSize+1, (len(validURLs)+batchSize-1)/batchSize, len(batchURLs)) batchResults, err := processLinkedInBatch(client, batchURLs) if err != nil { log.Printf("Batch processing failed: %v", err) continue } allResults = append(allResults, batchResults...) // Small delay between batches if end < len(validURLs) { time.Sleep(5 * time.Second) } } return allResults, nil } func processLinkedInBatch(client *tomba.Tomba, urls []string) ([]LinkedInProspect, error) { // Create and process batch params := &models.BulkCreateParams{ Name: fmt.Sprintf("LinkedIn Batch - %s", time.Now().Format("15:04:05")), List: strings.Join(urls, "\n"), Sources: true, Notifie: false, // Don't notify for batches } response, err := client.CreateBulk(models.BulkTypeLinkedIn, params) if err != nil { return nil, err } bulkID := *response.Data.ID // Launch and wait for completion _, err = client.LaunchBulk(models.BulkTypeLinkedIn, bulkID) if err != nil { return nil, err } // Wait for completion for { progress, err := client.GetBulkProgress(models.BulkTypeLinkedIn, bulkID) if err != nil { time.Sleep(30 * time.Second) continue } if progress.Status { break } time.Sleep(30 * time.Second) } // Parse results data, err := client.DownloadBulk(models.BulkTypeLinkedIn, bulkID, &models.BulkDownloadParams{Type: "full"}) if err != nil { return nil, err } // Parse CSV results (simplified - would need proper CSV parsing) var results []LinkedInProspect lines := strings.Split(string(data), "\n") for _, line := range lines[1:] { // Skip header if strings.TrimSpace(line) == "" { continue } // Parse CSV line and create LinkedInProspect // This is simplified - use proper CSV parsing library parts := strings.Split(line, ",") if len(parts) >= 2 { prospect := LinkedInProspect{ URL: parts[0], Email: parts[1], Found: parts[1] != "", } results = append(results, prospect) } } return results, nil } // Usage example func main() { client := tomba.NewTomba("your-api-key", "your-secret-key") results, err := runLinkedInCampaign(client, "linkedin-prospects.csv") if err != nil { log.Fatal("LinkedIn campaign failed:", err) } // Analyze results totalProspects := len(results) emailsFound := 0 for _, prospect := range results { if prospect.Found { emailsFound++ } } fmt.Printf("\nLinkedIn Campaign Summary:\n") fmt.Printf("Total Prospects: %d\n", totalProspects) fmt.Printf("Emails Found: %d\n", emailsFound) fmt.Printf("Success Rate: %.1f%%\n", float64(emailsFound)/float64(totalProspects)*100) }`
### CSV File Format Examples[](https://docs.tomba.io/bulks/linkedin-finder#csv-file-format-examples)
**Simple LinkedIn URL List**
Code
`linkedin_url https://www.linkedin.com/in/johndoe https://www.linkedin.com/in/janesmith https://linkedin.com/in/mikejohnson https://www.linkedin.com/in/sarahconnor`
**With Additional Context**
Code
`linkedin_url,name,company,notes https://www.linkedin.com/in/johndoe,John Doe,Tech Corp,CEO prospect https://www.linkedin.com/in/janesmith,Jane Smith,StartupXYZ,CTO contact https://linkedin.com/in/mikejohnson,Mike Johnson,Enterprise Co,Decision maker`
Best Practices[](https://docs.tomba.io/bulks/linkedin-finder#best-practices)
-----------------------------------------------------------------------------
* **Valid LinkedIn URLs**: Ensure URLs are properly formatted and accessible
* **Profile Quality**: Use complete, professional LinkedIn profiles for better results
* **Compliance**: Respect LinkedIn's terms of service and privacy policies
* **Data Integration**: Connect LinkedIn insights with email outreach strategies
* **Regular Updates**: Refresh data as LinkedIn profiles change
* **Batch Processing**: Process large lists in manageable batches
* **Rate Limiting**: Be mindful of processing limits and API quotas
* **Result Analysis**: Track success rates to optimize prospecting strategies
* **Privacy Considerations**: Ensure compliance with data privacy regulations
* **Quality Control**: Validate found emails before using for outreach
Last modified on April 27, 2026
[Email Verifier Bulk](https://docs.tomba.io/bulks/email-verifier)
[Phone Finder Bulk](https://docs.tomba.io/bulks/phone-finder)
Go
Go
Go
Go
Go
Go
Go
Go
Go
---
# Phone Validator Bulk | Tomba Documentation
Menu
Overview[](https://docs.tomba.io/bulks/phone-validator#overview)
-----------------------------------------------------------------
[Bulks Phone Validator](https://tomba.io/bulks/phone-validator)
verifies phone numbers at scale to ensure accuracy and validity for SMS campaigns, sales calling, and customer communication. Improve contact rates and reduce wasted outreach efforts with comprehensive phone validation.
### Key Features[](https://docs.tomba.io/bulks/phone-validator#key-features)
* **Number Validation**: Verify phone number format, validity, and carrier information
* **Bulk Processing**: Validate up to 2,500 phone numbers per operation
* **Carrier Detection**: Identify mobile vs. landline numbers for appropriate outreach
* **Geographic Information**: Determine location and timezone data for numbers
* **Quality Scoring**: Get detailed validation status for each phone number
* **Export Options**: Download validated numbers with detailed metadata
### How Phone Validator Bulk Works[](https://docs.tomba.io/bulks/phone-validator#how-phone-validator-bulk-works)
1. **Prepare Phone List**: Compile phone numbers requiring validation
2. **Upload Numbers**: Provide phone numbers via CSV file with country information
3. **Configure Validation**: Set validation parameters and quality requirements
4. **Process Validation**: Launch comprehensive phone number verification
5. **Export Results**: Download validated phone lists with quality scores
### Limitations[](https://docs.tomba.io/bulks/phone-validator#limitations)
* Each Bulk is limited to 2,500 phone numbers
* Special or unexpected characters may be removed from your file
* Duplicate and invalid lines will not be imported
Go SDK Integration[](https://docs.tomba.io/bulks/phone-validator#go-sdk-integration)
-------------------------------------------------------------------------------------
### Installation[](https://docs.tomba.io/bulks/phone-validator#installation)
TerminalCode
`go get github.com/tomba-io/go`
### Basic Setup[](https://docs.tomba.io/bulks/phone-validator#basic-setup)
Code
`package main import ( "fmt" "log" "time" "encoding/csv" "os" "github.com/tomba-io/go/tomba" "github.com/tomba-io/go/tomba/models" ) func main() { // Initialize Tomba client client := tomba.NewTomba("your-api-key", "your-secret-key") // Your phone validation code here }`
### Creating Phone Validator Bulk from CSV[](https://docs.tomba.io/bulks/phone-validator#creating-phone-validator-bulk-from-csv)
Code
`// Create phone validator bulk with column mapping params := &models.BulkPhoneValidatorCreateParams{ BulkCreateParams: models.BulkCreateParams{ Name: "Phone Validation - Customer Database", Delimiter: ",", }, BulkPhoneValidatorParams: models.BulkPhoneValidatorParams{ ColumnPhone: 2, // Phone number column (1-based) ColumnCountry: 3, // Country code column (optional but recommended) }, } // Upload CSV and create validation bulk response, err := client.CreatePhoneValidatorBulk(params, "/path/to/phone-list.csv") if err != nil { log.Fatal("Failed to create phone validator bulk:", err) } bulkID := *response.Data.ID fmt.Printf("Created phone validator bulk: %d\n", bulkID)`
### Alternative: Phone Numbers Only CSV[](https://docs.tomba.io/bulks/phone-validator#alternative-phone-numbers-only-csv)
Code
`// When CSV contains only phone numbers without country codes params := &models.BulkPhoneValidatorCreateParams{ BulkCreateParams: models.BulkCreateParams{ Name: "Phone Validation - Simple List", Delimiter: ",", }, BulkPhoneValidatorParams: models.BulkPhoneValidatorParams{ ColumnPhone: 1, // Phone number in first column ColumnCountry: 0, // No country column }, } response, err := client.CreatePhoneValidatorBulk(params, "simple-phone-list.csv") if err != nil { log.Fatal("Failed to create validation bulk:", err) }`
### Launching and Monitoring Validation[](https://docs.tomba.io/bulks/phone-validator#launching-and-monitoring-validation)
Code
`// Launch the validation process launchResponse, err := client.LaunchBulk(models.BulkTypePhoneValidator, bulkID) if err != nil { log.Fatal("Failed to launch phone validation:", err) } fmt.Println("Phone validation started!") // Monitor progress with detailed status startTime := time.Now() for { progress, err := client.GetBulkProgress(models.BulkTypePhoneValidator, bulkID) if err != nil { log.Printf("Error checking progress: %v", err) time.Sleep(20 * time.Second) continue } elapsed := time.Since(startTime).Round(time.Second) fmt.Printf("Validation: %d%% complete (%d processed) - %v elapsed\n", progress.Progress, progress.Processed, elapsed, ) if progress.Status { fmt.Println("Phone validation completed!") break } // Check every 20 seconds (validation is typically faster) time.Sleep(20 * time.Second) }`
### Retrieving Validation Results[](https://docs.tomba.io/bulks/phone-validator#retrieving-validation-results)
Code
`// Get detailed validation results bulk, err := client.GetBulk(models.BulkTypePhoneValidator, bulkID) if err != nil { log.Fatal("Failed to get bulk details:", err) } bulkInfo := bulk.Data[0] fmt.Printf("Validation Summary:\n") fmt.Printf("- Campaign: %s\n", bulkInfo.Name) fmt.Printf("- Status: %v\n", bulkInfo.Status) fmt.Printf("- Numbers Processed: %d\n", bulkInfo.Processed) // Download all validation results err = client.SaveBulkResults( models.BulkTypePhoneValidator, bulkID, "validation-results.csv", "full", ) if err != nil { log.Fatal("Failed to download results:", err) } fmt.Println("Validation results saved to validation-results.csv")`
### Downloading Segmented Results[](https://docs.tomba.io/bulks/phone-validator#downloading-segmented-results)
Code
`// Download only valid phone numbers err = client.SaveBulkResults( models.BulkTypePhoneValidator, bulkID, "valid-phones.csv", "valid", ) if err != nil { log.Printf("Error downloading valid phones: %v", err) } else { fmt.Println("Valid phone numbers saved to valid-phones.csv") } // Download invalid or unverifiable phone numbers err = client.SaveBulkResults( models.BulkTypePhoneValidator, bulkID, "invalid-phones.csv", "not_found", ) if err != nil { log.Printf("Error downloading invalid phones: %v", err) } else { fmt.Println("Invalid phone numbers saved to invalid-phones.csv") }`
### Managing Phone Validator Operations[](https://docs.tomba.io/bulks/phone-validator#managing-phone-validator-operations)
Code
`// List all phone validator bulks params := &models.BulkGetParams{ Page: 1, Limit: 10, Direction: "desc", Filter: "all", } bulks, err := client.GetAllPhoneValidatorBulks(params) if err != nil { log.Fatal("Failed to get phone validator bulks:", err) } fmt.Printf("Phone Validator Operations:\n") for _, bulk := range bulks.Data { status := "In Progress" if bulk.Status { status = "Completed" } fmt.Printf("- %s (ID: %d)\n", bulk.Name, bulk.BulkID) fmt.Printf(" Status: %s | Progress: %d%% | Processed: %d\n", status, bulk.Progress, bulk.Processed) created := bulk.CreatedAt.Format("2006-01-02 15:04") fmt.Printf(" Created: %s\n", created) fmt.Println() } // Rename a validation bulk renameParams := &models.BulkRenameParams{ Name: "Updated Phone Validation Campaign", } _, err = client.RenameBulk(models.BulkTypePhoneValidator, bulkID, renameParams) if err != nil { log.Fatal("Failed to rename bulk:", err) } // Archive completed validation _, err = client.ArchiveBulk(models.BulkTypePhoneValidator, bulkID) if err != nil { log.Fatal("Failed to archive bulk:", err) }`
### Advanced Validation Workflow with Analysis[](https://docs.tomba.io/bulks/phone-validator#advanced-validation-workflow-with-analysis)
Code
``type PhoneValidationResult struct { OriginalNumber string FormattedNumber string Valid bool LineType string // "mobile", "landline", "voip", etc. Carrier string Country string CountryCode string Region string Timezone string Risk string // "low", "medium", "high" } func validatePhoneDatabase(client *tomba.Tomba, csvPath string, phoneCol, countryCol int) (*ValidationSummary, error) { // Step 1: Create validation bulk params := &models.BulkPhoneValidatorCreateParams{ BulkCreateParams: models.BulkCreateParams{ Name: fmt.Sprintf("Phone Validation - %s", time.Now().Format("2006-01-02")), Delimiter: ",", }, BulkPhoneValidatorParams: models.BulkPhoneValidatorParams{ ColumnPhone: phoneCol, ColumnCountry: countryCol, }, } response, err := client.CreatePhoneValidatorBulk(params, csvPath) if err != nil { return nil, fmt.Errorf("failed to create validation bulk: %w", err) } bulkID := *response.Data.ID log.Printf("Created phone validation bulk: %d", bulkID) // Step 2: Launch validation _, err = client.LaunchBulk(models.BulkTypePhoneValidator, bulkID) if err != nil { return nil, fmt.Errorf("failed to launch validation: %w", err) } log.Println("Phone validation in progress...") // Step 3: Monitor with progress tracking timeout := time.After(30 * time.Minute) ticker := time.NewTicker(15 * time.Second) defer ticker.Stop() startTime := time.Now() for { select { case <-timeout: return nil, fmt.Errorf("validation timed out after 30 minutes") case <-ticker.C: progress, err := client.GetBulkProgress(models.BulkTypePhoneValidator, bulkID) if err != nil { log.Printf("Error checking progress: %v", err) continue } if progress.Progress%25 == 0 || progress.Status { elapsed := time.Since(startTime).Round(time.Second) log.Printf("Validation: %d%% (%d processed) - %v", progress.Progress, progress.Processed, elapsed) } if progress.Status { // Step 4: Analyze and download results summary, err := analyzeValidationResults(client, bulkID, startTime) if err != nil { return nil, fmt.Errorf("failed to analyze results: %w", err) } log.Printf("Phone validation completed! %d numbers processed in %v", summary.TotalNumbers, summary.Duration.Round(time.Second)) return summary, nil } } } } func analyzeValidationResults(client *tomba.Tomba, bulkID int64, startTime time.Time) (*ValidationSummary, error) { // Get bulk details bulk, err := client.GetBulk(models.BulkTypePhoneValidator, bulkID) if err != nil { return nil, err } info := bulk.Data[0] // Download and parse results timestamp := time.Now().Format("20060102-150405") allResultsFile := fmt.Sprintf("phone-validation-all-%s.csv", timestamp) validPhonesFile := fmt.Sprintf("phone-validation-valid-%s.csv", timestamp) // Download all results err = client.SaveBulkResults(models.BulkTypePhoneValidator, bulkID, allResultsFile, "full") if err != nil { log.Printf("Warning: Failed to save all results: %v", err) } // Download valid results err = client.SaveBulkResults(models.BulkTypePhoneValidator, bulkID, validPhonesFile, "valid") if err != nil { log.Printf("Warning: Failed to save valid results: %v", err) } // Parse results for analysis results, err := parseValidationResults(allResultsFile) if err != nil { log.Printf("Warning: Could not parse results for analysis: %v", err) results = []PhoneValidationResult{} // Continue with empty results } // Build summary summary := &ValidationSummary{ BulkID: bulkID, Name: info.Name, TotalNumbers: info.Processed, Duration: time.Since(startTime), AllResultsFile: allResultsFile, ValidPhonesFile: validPhonesFile, } // Analyze results if len(results) > 0 { summary.ValidNumbers = countValidNumbers(results) summary.LineTypes = analyzeLineTypes(results) summary.Countries = analyzeCountries(results) summary.Carriers = analyzeCarriers(results) } return summary, nil } func parseValidationResults(filename string) ([]PhoneValidationResult, error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { return nil, err } var results []PhoneValidationResult // Skip header row for i := 1; i < len(records); i++ { record := records[i] if len(record) < 3 { continue } result := PhoneValidationResult{ OriginalNumber: getCSVField(record, 0), Valid: getCSVField(record, 1) == "valid", LineType: getCSVField(record, 2), } // Parse additional fields if available if len(record) > 3 { result.FormattedNumber = getCSVField(record, 3) } if len(record) > 4 { result.Carrier = getCSVField(record, 4) } if len(record) > 5 { result.Country = getCSVField(record, 5) } if len(record) > 6 { result.CountryCode = getCSVField(record, 6) } results = append(results, result) } return results, nil } func getCSVField(record []string, index int) string { if index < len(record) { return strings.Trim(record[index], `"`) } return "" } func countValidNumbers(results []PhoneValidationResult) int { count := 0 for _, result := range results { if result.Valid { count++ } } return count } func analyzeLineTypes(results []PhoneValidationResult) map[string]int { types := make(map[string]int) for _, result := range results { if result.Valid && result.LineType != "" { types[result.LineType]++ } } return types } func analyzeCountries(results []PhoneValidationResult) map[string]int { countries := make(map[string]int) for _, result := range results { if result.Valid && result.Country != "" { countries[result.Country]++ } } return countries } func analyzeCarriers(results []PhoneValidationResult) map[string]int { carriers := make(map[string]int) for _, result := range results { if result.Valid && result.Carrier != "" { carriers[result.Carrier]++ } } return carriers } // Summary structure for validation results type ValidationSummary struct { BulkID int64 Name string TotalNumbers int ValidNumbers int Duration time.Duration AllResultsFile string ValidPhonesFile string LineTypes map[string]int Countries map[string]int Carriers map[string]int } func (s *ValidationSummary) String() string { validRate := float64(s.ValidNumbers) / float64(s.TotalNumbers) * 100 result := fmt.Sprintf(` Phone Validation Summary: - Bulk ID: %d - Name: %s - Total Numbers: %d - Valid Numbers: %d (%.1f%%) - Duration: %v - All Results: %s - Valid Only: %s`, s.BulkID, s.Name, s.TotalNumbers, s.ValidNumbers, validRate, s.Duration.Round(time.Second), s.AllResultsFile, s.ValidPhonesFile) if len(s.LineTypes) > 0 { result += "\n\nLine Type Distribution:" for lineType, count := range s.LineTypes { percent := float64(count) / float64(s.ValidNumbers) * 100 result += fmt.Sprintf("\n- %s: %d (%.1f%%)", lineType, count, percent) } } if len(s.Countries) > 0 { result += "\n\nTop Countries:" // Show top 5 countries type countryCount struct { country string count int } var sorted []countryCount for country, count := range s.Countries { sorted = append(sorted, countryCount{country, count}) } // Simple sort by count (descending) for i := 0; i < len(sorted)-1; i++ { for j := 0; j < len(sorted)-i-1; j++ { if sorted[j].count < sorted[j+1].count { sorted[j], sorted[j+1] = sorted[j+1], sorted[j] } } } for i, cc := range sorted { if i >= 5 { // Top 5 only break } percent := float64(cc.count) / float64(s.ValidNumbers) * 100 result += fmt.Sprintf("\n- %s: %d (%.1f%%)", cc.country, cc.count, percent) } } return result } // Usage example func main() { client := tomba.NewTomba("your-api-key", "your-secret-key") // Validate phone database summary, err := validatePhoneDatabase(client, "phone-database.csv", 2, 3) if err != nil { log.Fatal("Phone validation failed:", err) } fmt.Println(summary) }``
### CSV File Format Examples[](https://docs.tomba.io/bulks/phone-validator#csv-file-format-examples)
**With Country Codes**
Code
`name,phone,country John Doe,+1-555-0123,US Jane Smith,+44-20-7123-4567,GB Pierre Martin,+33-1-23-45-67-89,FR Maria Garcia,+34-91-123-4567,ES`
**Phone Numbers Only**
Code
`phone +1-555-0123 +44-20-7123-4567 +33-1-23-45-67-89 +34-91-123-4567 555-0123`
**With Additional Context**
Code
`customer_id,name,phone,country,source 12345,John Doe,+1-555-0123,US,Website 12346,Jane Smith,+44-20-7123-4567,GB,CRM Import 12347,Pierre Martin,+33-1-23-45-67-89,FR,Lead Gen`
Best Practices[](https://docs.tomba.io/bulks/phone-validator#best-practices)
-----------------------------------------------------------------------------
* **Consistent Formatting**: Use consistent international phone number formatting
* **Country Information**: Include country codes or country columns for accurate validation
* **Regular Validation**: Validate phone lists regularly to maintain quality
* **Campaign Optimization**: Use validation results to improve calling and SMS campaigns
* **Compliance Checking**: Verify numbers comply with local telecommunications regulations
* **Batch Processing**: Process large lists in batches under 2,500 limit
* **Result Segmentation**: Separate valid, invalid, and risky numbers for targeted use
* **Quality Thresholds**: Set validation quality standards based on use case
* **Data Privacy**: Ensure phone validation complies with privacy regulations
* **Cost Optimization**: Track validation costs and optimize processing efficiency
Last modified on April 27, 2026
[Phone Finder Bulk](https://docs.tomba.io/bulks/phone-finder)
[Similar Domain Bulk](https://docs.tomba.io/bulks/similar)
Go
Go
Go
Go
Go
Go
Go
Go
---
# 95% Delivery Guarantee - Email Finder | Tomba Documentation
Menu
Tomba.io stands behind the quality of our Email Finder service with a **95% Delivery Guarantee**. When you use our Email Finder to discover professional email addresses, we guarantee that 95% of the emails will be deliverable and reach their intended recipients.
* * *
What Our 95% Delivery Guarantee Covers[](https://docs.tomba.io/email-finder-delivery-guarantee#what-our-95-delivery-guarantee-covers)
--------------------------------------------------------------------------------------------------------------------------------------
### Scope of Guarantee[](https://docs.tomba.io/email-finder-delivery-guarantee#scope-of-guarantee)
Our 95% delivery guarantee applies to emails discovered through:
* **[Email Finder API](https://tomba.io/email-finder)
**: Direct email discovery using name and domain
* **[Domain Search](https://tomba.io/domain-search)
**: Company-wide email discovery
* **[Author Finder](https://tomba.io/author-finder)
**: Content author email discovery
* **[LinkedIn Finder](https://tomba.io/linkedin-finder)
**: Professional email discovery from LinkedIn profiles
### Quality Metrics[](https://docs.tomba.io/email-finder-delivery-guarantee#quality-metrics)
* **Deliverability Rate**: 95% of discovered emails will be deliverable
* **Validity Verification**: All emails pass basic format and domain validation
* **Active Mailbox**: Emails reach active, monitored mailboxes
* **Real-time Status**: Up-to-date deliverability information
* * *
How We Achieve 95% Deliverability[](https://docs.tomba.io/email-finder-delivery-guarantee#how-we-achieve-95-deliverability)
----------------------------------------------------------------------------------------------------------------------------
### Advanced Discovery Methods[](https://docs.tomba.io/email-finder-delivery-guarantee#advanced-discovery-methods)
#### 1\. **Multi-Source Verification**[](https://docs.tomba.io/email-finder-delivery-guarantee#1-multi-source-verification)
* Cross-reference emails from multiple public sources
* Validate against company websites and directories
* Verify through social media profiles and professional networks
* Confirm with business registration data
#### 2\. **Pattern Recognition**[](https://docs.tomba.io/email-finder-delivery-guarantee#2-pattern-recognition)
* Analyze company email patterns and formats
* Use machine learning to predict valid email structures
* Apply domain-specific formatting rules
* Validate against known corporate email schemes
#### 3\. **Real-time Validation**[](https://docs.tomba.io/email-finder-delivery-guarantee#3-real-time-validation)
* SMTP server verification for each discovered email
* MX record validation for domain authenticity
* Mailbox existence confirmation
* Bounce prediction algorithms
### Quality Assurance Process[](https://docs.tomba.io/email-finder-delivery-guarantee#quality-assurance-process)
#### Pre-Discovery Filtering[](https://docs.tomba.io/email-finder-delivery-guarantee#pre-discovery-filtering)
* Domain reputation analysis
* Company legitimacy verification
* Public data source validation
* Pattern reliability assessment
#### Post-Discovery Verification[](https://docs.tomba.io/email-finder-delivery-guarantee#post-discovery-verification)
* Comprehensive deliverability testing
* Format validation and standardization
* Duplicate detection and removal
* Confidence score calculation
* * *
Confidence Scoring System[](https://docs.tomba.io/email-finder-delivery-guarantee#confidence-scoring-system)
-------------------------------------------------------------------------------------------------------------
Every email discovered through our Email Finder includes a confidence score that indicates delivery probability:
### Score Ranges[](https://docs.tomba.io/email-finder-delivery-guarantee#score-ranges)
* **90-100**: Very High - Guaranteed deliverable
* **80-89**: High - Highly likely to deliver
* **70-79**: Good - Good delivery probability
* **60-69**: Medium - Moderate confidence
* **Below 60**: Lower confidence (not covered by guarantee)
### Factors Affecting Scores[](https://docs.tomba.io/email-finder-delivery-guarantee#factors-affecting-scores)
* **Source Quality**: Reliability of the discovery source
* **Verification Results**: SMTP and MX validation outcomes
* **Pattern Matching**: Accuracy of email format prediction
* **Historical Data**: Past performance of similar emails
* * *
Guarantee Terms and Conditions[](https://docs.tomba.io/email-finder-delivery-guarantee#guarantee-terms-and-conditions)
-----------------------------------------------------------------------------------------------------------------------
### Eligibility Requirements[](https://docs.tomba.io/email-finder-delivery-guarantee#eligibility-requirements)
#### Qualifying Usage[](https://docs.tomba.io/email-finder-delivery-guarantee#qualifying-usage)
* Emails discovered through official Tomba.io APIs or tools
* Confidence scores of 60 or higher
* Used within 30 days of discovery
* Proper email authentication and sending practices
#### Proper Implementation[](https://docs.tomba.io/email-finder-delivery-guarantee#proper-implementation)
* Follow email marketing best practices
* Use appropriate email authentication (SPF, DKIM, DMARC)
* Maintain good sender reputation
* Comply with anti-spam regulations
### Measurement Criteria[](https://docs.tomba.io/email-finder-delivery-guarantee#measurement-criteria)
#### Delivery Success Metrics[](https://docs.tomba.io/email-finder-delivery-guarantee#delivery-success-metrics)
* Email reaches recipient's mailbox (not spam folder)
* No hard bounces or permanent delivery failures
* Successful SMTP transaction completion
* Recipient server accepts the message
#### Exclusions[](https://docs.tomba.io/email-finder-delivery-guarantee#exclusions)
* Soft bounces due to temporary issues
* Spam folder placement (if email is delivered)
* Recipient-side filtering or blocking
* ISP throttling or rate limiting
* * *
Claim Process[](https://docs.tomba.io/email-finder-delivery-guarantee#claim-process)
-------------------------------------------------------------------------------------
### When to File a Claim[](https://docs.tomba.io/email-finder-delivery-guarantee#when-to-file-a-claim)
Submit a delivery guarantee claim if:
* Your delivery rate falls below 95% for qualifying emails
* You experience consistent hard bounces
* Email addresses are consistently invalid
* Systematic delivery failures occur
### Required Documentation[](https://docs.tomba.io/email-finder-delivery-guarantee#required-documentation)
* **Email List**: Complete list of discovered emails
* **Delivery Reports**: Detailed bounce and delivery logs
* **Confidence Scores**: Tomba.io provided confidence ratings
* **Timeline**: Dates of discovery and sending attempts
* **Technical Details**: SMTP logs and error messages
### Claim Submission Process[](https://docs.tomba.io/email-finder-delivery-guarantee#claim-submission-process)
#### Step 1: Gather Evidence[](https://docs.tomba.io/email-finder-delivery-guarantee#step-1-gather-evidence)
* Export your email discovery history from Tomba.io
* Compile delivery reports from your email service provider
* Document specific bounces and delivery failures
* Calculate your actual delivery rate
#### Step 2: Submit Claim[](https://docs.tomba.io/email-finder-delivery-guarantee#step-2-submit-claim)
* Contact our support team at [info@tomba.io](mailto:info@tomba.io)
* Provide all required documentation
* Include your account details and usage period
* Specify the delivery rate discrepancy
#### Step 3: Review Process[](https://docs.tomba.io/email-finder-delivery-guarantee#step-3-review-process)
* Our team reviews your claim within 5 business days
* We verify the discovery methods and confidence scores
* Technical analysis of delivery failures
* Assessment of compliance with guarantee terms
* * *
Remedies and Compensation[](https://docs.tomba.io/email-finder-delivery-guarantee#remedies-and-compensation)
-------------------------------------------------------------------------------------------------------------
### Available Remedies[](https://docs.tomba.io/email-finder-delivery-guarantee#available-remedies)
#### Service Credits[](https://docs.tomba.io/email-finder-delivery-guarantee#service-credits)
* Additional API credits equal to failed email discoveries
* Bonus credits for future email discovery services
* Extended service periods to compensate for poor performance
* Priority support for account optimization
#### Re-Discovery Services[](https://docs.tomba.io/email-finder-delivery-guarantee#re-discovery-services)
* Free re-discovery of failed email addresses
* Enhanced verification for problematic domains
* Alternative email discovery methods
* Updated contact information research
#### Account Optimization[](https://docs.tomba.io/email-finder-delivery-guarantee#account-optimization)
* Personal consultation on delivery best practices
* Email authentication setup assistance
* Sender reputation improvement guidance
* Custom integration support
### Credit Calculation[](https://docs.tomba.io/email-finder-delivery-guarantee#credit-calculation)
Service credits are calculated based on:
* Number of failed email discoveries
* Percentage below the 95% guarantee threshold
* Account tier and subscription level
* Historical account performance
* * *
Best Practices for Maximum Deliverability[](https://docs.tomba.io/email-finder-delivery-guarantee#best-practices-for-maximum-deliverability)
---------------------------------------------------------------------------------------------------------------------------------------------
### Email Discovery Optimization[](https://docs.tomba.io/email-finder-delivery-guarantee#email-discovery-optimization)
#### Target Quality Sources[](https://docs.tomba.io/email-finder-delivery-guarantee#target-quality-sources)
* Focus on high-confidence score emails (80+)
* Prioritize recently updated contact information
* Use multiple discovery methods for verification
* Cross-reference with existing contact databases
#### Timing Considerations[](https://docs.tomba.io/email-finder-delivery-guarantee#timing-considerations)
* Use discovered emails promptly (within 30 days)
* Verify emails before large campaigns
* Monitor delivery rates continuously
* Update contact lists regularly
### Sending Best Practices[](https://docs.tomba.io/email-finder-delivery-guarantee#sending-best-practices)
#### Technical Setup[](https://docs.tomba.io/email-finder-delivery-guarantee#technical-setup)
* Implement proper SPF, DKIM, and DMARC records
* Use dedicated IP addresses for high-volume sending
* Maintain consistent sending patterns
* Monitor sender reputation scores
#### Content and Compliance[](https://docs.tomba.io/email-finder-delivery-guarantee#content-and-compliance)
* Follow CAN-SPAM and GDPR requirements
* Provide clear unsubscribe mechanisms
* Personalize messages appropriately
* Avoid spam trigger words and phrases
* * *
Monitoring and Reporting[](https://docs.tomba.io/email-finder-delivery-guarantee#monitoring-and-reporting)
-----------------------------------------------------------------------------------------------------------
### Delivery Analytics[](https://docs.tomba.io/email-finder-delivery-guarantee#delivery-analytics)
We provide comprehensive analytics to help you track and optimize delivery performance:
* **Real-time Delivery Rates**: Monitor your current delivery performance
* **Confidence Score Trends**: Track the quality of discovered emails over time
* **Bounce Analysis**: Detailed breakdown of delivery failures
* **Historical Performance**: Long-term delivery rate trends
### Performance Alerts[](https://docs.tomba.io/email-finder-delivery-guarantee#performance-alerts)
* Automated notifications when delivery rates drop below thresholds
* Early warning system for potential delivery issues
* Recommendations for improvement actions
* Proactive support team outreach
* * *
Technical Support[](https://docs.tomba.io/email-finder-delivery-guarantee#technical-support)
---------------------------------------------------------------------------------------------
### Guarantee Support Team[](https://docs.tomba.io/email-finder-delivery-guarantee#guarantee-support-team)
Our specialized guarantee support team provides:
* **Technical Consultation**: Expert advice on delivery optimization
* **Integration Support**: Help with API implementation and best practices
* **Performance Analysis**: Detailed review of your delivery metrics
* **Custom Solutions**: Tailored approaches for specific use cases
### Contact Information[](https://docs.tomba.io/email-finder-delivery-guarantee#contact-information)
* **Guarantee Claims**: [info@tomba.io](mailto:info@tomba.io)
* **Technical Support**: [support@tomba.io](mailto:support@tomba.io)
* * *
Frequently Asked Questions[](https://docs.tomba.io/email-finder-delivery-guarantee#frequently-asked-questions)
---------------------------------------------------------------------------------------------------------------
### Q: What happens if my delivery rate is exactly 95%?[](https://docs.tomba.io/email-finder-delivery-guarantee#q-what-happens-if-my-delivery-rate-is-exactly-95)
A: You meet our guarantee threshold and no remedial action is required. Our guarantee covers delivery rates of 95% or higher.
### Q: Do temporary bounces count against the guarantee?[](https://docs.tomba.io/email-finder-delivery-guarantee#q-do-temporary-bounces-count-against-the-guarantee)
A: No, only permanent hard bounces count against the delivery guarantee. Temporary issues like full mailboxes or server downtime are excluded.
### Q: How quickly must I use discovered emails to maintain guarantee coverage?[](https://docs.tomba.io/email-finder-delivery-guarantee#q-how-quickly-must-i-use-discovered-emails-to-maintain-guarantee-coverage)
A: Emails must be used within 30 days of discovery to remain covered by our delivery guarantee.
### Q: Can I transfer guarantee coverage between different email campaigns?[](https://docs.tomba.io/email-finder-delivery-guarantee#q-can-i-transfer-guarantee-coverage-between-different-email-campaigns)
A: Yes, the guarantee applies to the emails themselves, not specific campaigns, as long as they meet our usage requirements.
* * *
This 95% Delivery Guarantee reflects our confidence in the Email Finder service and our commitment to providing you with the highest quality professional email addresses available.
Last modified on September 29, 2025
[Anti-Spam Policy](https://docs.tomba.io/anti-spam-policy)
[98% Delivery Guarantee - Email Verifier](https://docs.tomba.io/email-verifier-delivery-guarantee)
---
# Person Attributes | Tomba Documentation
Menu
These attributes represent personal and professional details for an individual, as returned by Tomba's enrichment services.
* * *
Basic Details[](https://docs.tomba.io/attributes/person#basic-details)
-----------------------------------------------------------------------
| Attribute | Description | Example |
| --- | --- | --- |
| `email` | The person's email address | [m@wordpress.org](mailto:m@wordpress.org) |
| `first_name` | The person’s first name | Matt |
| `last_name` | The person’s last name | Mullenweg |
| `full_name` | The complete name | Matt Mullenweg |
| `gender` | Gender of the individual | male |
| `phone_number` | Phone number if available (`false` if not) | false |
| `type` | Classification type (generic, personal) | generic |
| `country` | Country of the individual | US |
| `score` | Confidence score (0–100) | 99 |
* * *
Professional Role[](https://docs.tomba.io/attributes/person#professional-role)
-------------------------------------------------------------------------------
| Attribute | Description | Example |
| --- | --- | --- |
| `position` | Job title or role | CEO |
| `department` | Department the person belongs to | executive |
| `seniority` | Seniority level | senior |
* * *
Social Profiles[](https://docs.tomba.io/attributes/person#social-profiles)
---------------------------------------------------------------------------
| Attribute | Description | Example |
| --- | --- | --- |
| `linkedin` | LinkedIn profile URL | [https://www.linkedin.com/in/mattm](https://www.linkedin.com/in/mattm) |
| `twitter` | Twitter handle or URL | null |
* * *
Verification[](https://docs.tomba.io/attributes/person#verification)
---------------------------------------------------------------------
| Attribute | Description | Example |
| --- | --- | --- |
| `verification.date` | Date of last successful verification | 2021-05-25T00:00:00+02:00 |
| `verification.status` | Status of the most recent verification | valid |
* * *
Note: Fields may return `false` or `null` when data is unavailable.
Email Type Attribute[](https://docs.tomba.io/attributes/person#email-type-attribute)
-------------------------------------------------------------------------------------
The `type` field defines the nature of the email address based on the role or naming pattern used. It helps distinguish between direct contacts and role-based addresses.
* * *
### Available Values[](https://docs.tomba.io/attributes/person#available-values)
| Value | Description |
| --- | --- |
| `personal` | The email address belongs to a specific individual (for example, [john@company.com](mailto:john@company.com)