Ocrspace email verification with BillionVerify
OCR.space is a developer-friendly API that converts images and scanned documents into machine-readable text. When your OCR pipeline extracts email addresses from documents, BillionVerify ensures those addresses are valid before they flow into any downstream system, saving you from storing and mailing bad data.
Why verify before the send
Text extracted from scans and images is inherently noisy โ OCR errors, legacy data, and informal document formats all produce malformed or outdated email addresses. Verifying every extracted address with BillionVerify before storage or outreach prevents bounces, protects sender reputation, and keeps your database clean.
Ready-to-use n8n workflow
Import this workflow into n8n โ it verifies every address with BillionVerify before Ocrspace sends, so only deliverable contacts are emailed. Install the BillionVerify community node first, then add your API key. Adapted from this n8n template
{
"name": "Extract text from Google Drive images with OCR.space, OpenRouter AI summary to sheets & Gmail + BillionVerify",
"nodes": [
{
"id": "14484c3d-1f78-45b1-a778-48b9d7ac1eee",
"name": "OpenRouter Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
880,
336
],
"parameters": {
"options": {}
},
"credentials": {
"openRouterApi": {
"id": "credential-id",
"name": "openRouterApi Credential"
}
},
"typeVersion": 1
},
{
"id": "b8538a4f-9319-46b6-be09-5e343850d1dc",
"name": "Append row in sheet1",
"type": "n8n-nodes-base.googleSheets",
"position": [
1312,
160
],
"parameters": {
"columns": {
"value": {
"ๅฆ็ๆฅ": "={{ $now.toISO().split('T')[0] }}",
"่ฆ็ด็ตๆ": "={{ $('Generate Summary with OpenRouter AI1').first().json.output }}",
"ใใกใคใซๅ": "={{ $('Format OCR Result & Check for Empty1').first().json.fileName }}"
},
"schema": [
{
"id": "ใใกใคใซๅ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ใใกใคใซๅ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "่ฆ็ด็ตๆ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "่ฆ็ด็ตๆ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ๅฆ็ๆฅ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ๅฆ็ๆฅ",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/11BmQnKfY4MmCD4iwlvOFUZPAM6kGMWdny8MefHzE2_0/edit#gid=0",
"cachedResultName": "่ฆ็ด"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "11BmQnKfY4MmCD4iwlvOFUZPAM6kGMWdny8MefHzE2_0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/11BmQnKfY4MmCD4iwlvOFUZPAM6kGMWdny8MefHzE2_0/edit?usp=drivesdk",
"cachedResultName": "็ปๅ่ฆ็ด่จ้ฒ"
}
},
"typeVersion": 4.7
},
{
"id": "11238230-9772-4fce-a3b9-b1c3a3cfffd1",
"name": "Google Drive New File Trigger1",
"type": "n8n-nodes-base.googleDriveTrigger",
"position": [
-48,
160
],
"parameters": {
"event": "fileCreated",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerOn": "specificFolder",
"folderToWatch": {
"__rl": true,
"mode": "list",
"value": "1jTs0NNXMFTcChRq0C1KEoARVdIOOjQ1r",
"cachedResultUrl": "https://drive.google.com/drive/folders/1jTs0NNXMFTcChRq0C1KEoARVdIOOjQ1r",
"cachedResultName": "ใคใกใผใธใใกใคใซ"
}
},
"typeVersion": 1
},
{
"id": "b31e181b-5ee1-4008-b3c9-541f3b3e65b8",
"name": "Download Image File1",
"type": "n8n-nodes-base.googleDrive",
"position": [
224,
160
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {
"binaryPropertyName": "data"
},
"operation": "download"
},
"typeVersion": 3
},
{
"id": "dd60b9e0-1bfc-4ce3-9e2a-86a5582b1dac",
"name": "Extract Text with OCR.space1",
"type": "n8n-nodes-base.httpRequest",
"position": [
496,
160
],
"parameters": {
"url": "https://api.ocr.space/parse/image",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"name": "apikey",
"value": "*****APIKEY*****"
},
{
"name": "language",
"value": "jpn"
},
{
"name": "isOverlayRequired",
"value": "false"
},
{
"name": "file",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "74bc17b2-2556-4a8e-b331-fe5fee94a711",
"name": "Format OCR Result & Check for Empty1",
"type": "n8n-nodes-base.code",
"position": [
752,
160
],
"parameters": {
"jsCode": "const raw = $input.first()?.json?.ParsedResults?.[0]?.ParsedText || '';\nconst text = String(raw).replace(/\\r/g, ' ').replace(/\\n+/g, ' ').replace(/\\s{2,}/g, ' ').trim();\nconst fileName = $('Download Image File1').first()?.json?.name || 'unknown';\nreturn [{ json: { extractedText: text, fileName: fileName, hasText: text.length > 0 } }];"
},
"typeVersion": 2
},
{
"id": "82e9b60c-eaba-434e-ba0d-3f41ed0bbcf8",
"name": "Generate Summary with OpenRouter AI1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
960,
160
],
"parameters": {
"text": "=ไปฅไธใฎๆ็ซ ใ็ฐกๆฝใซ่ฆ็ดใใฆใใ ใใ๏ผ\n{{ \n $if(\n $('Format OCR Result & Check for Empty1').first()?.json?.extractedText, \n $('Format OCR Result & Check for Empty1').first().json.extractedText, \n \"๏ผใใญในใใ่ฆใคใใใพใใใงใใ๏ผ\"\n ) \n}}",
"options": {},
"promptType": "define"
},
"typeVersion": 3
},
{
"id": "bba8e569-d625-476f-869d-e3c5c39f166b",
"name": "Send Completion Notification via Gmail1",
"type": "n8n-nodes-base.gmail",
"position": [
1584,
160
],
"webhookId": "66c7ac47-8411-437c-8132-f89b024f7e09",
"parameters": {
"sendTo": " user@example.com",
"message": "=็ปๅใใกใคใซใ{{ $('Format OCR Result & Check for Empty1').first().json.fileName }}ใใฎOCRๅฆ็ใๅฎไบใใพใใใ\n\nใ่ฆ็ดใ\n{{ $('Generate Summary with OpenRouter AI1').first().json.message.content }}\n\nใGoogle Docsใ\nๆฐ่ฆใใญใฅใกใณใใไฝๆใใพใใใ\nใใญใฅใกใณใID: {{ $('Google Docs ใธ่ฆ็ดใ่ฟฝ่จ').first().json.documentId }}",
"options": {},
"subject": "=OCRๅฆ็ๅฎไบ: {{ $('Format OCR Result & Check for Empty1').first().json.fileName }}"
},
"typeVersion": 2.1
},
{
"id": "d0cacb65-5059-4def-bb53-9f0026938075",
"name": "Process Completed1",
"type": "n8n-nodes-base.noOp",
"position": [
1872,
160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "7c8f33d6-080b-4a16-b7df-d389c1b65b37",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-608,
-496
],
"parameters": {
"width": 480,
"height": 640,
"content": "## Overview: Auto OCR โ AI Summary โ Google Sheets & Gmail\n\n## How it works\n\nThis workflow automatically processes any new image uploaded to a specific Google Drive folder.\nIt extracts text using OCR.space, summarizes the content with OpenRouter AI, and logs the result to Google Sheets.\nFinally, it sends a completion email via Gmail including the file name, summary, and document link.\nThis automation is ideal for digitizing book pages, lecture notes, or printed reports with minimal manual effort.\n\n## Setup steps\n\nConnect your Google Drive, OpenRouter, Google Sheets, and Gmail credentials.\n\nSet the target folder in Google Drive Trigger (where new images are uploaded).\n\nInsert your OCR.space API key in the HTTP Request node.\n\nUpdate the destination Google Sheets document and sheet name.\n\nAdjust the recipient email address in the Gmail notification node.ใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใใ"
},
"typeVersion": 1
},
{
"id": "6a7a6bfa-3a55-4348-b87c-303ef20a91ee",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
-160
],
"parameters": {
"color": 7,
"height": 304,
"content": "### Section 1 ? Detect & Download Image\n\n Google Drive Trigger โ Download Image File\n\nMonitors a Drive folder and downloads new image files for OCR processing. (?40 words)"
},
"typeVersion": 1
},
{
"id": "e8596db6-7332-4257-9863-1d4099879c61",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
-160
],
"parameters": {
"color": 7,
"height": 304,
"content": "### Section 2 ? Extract & Clean Text\n\n OCR.space API โ Format OCR Result\n\nExtracts Japanese text from the image and removes unnecessary line breaks or spaces. (?35 words)"
},
"typeVersion": 1
},
{
"id": "58a38290-9e3a-41c2-9a1b-b3c026eb9c00",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
-160
],
"parameters": {
"color": 7,
"height": 304,
"content": "### Section 3 ? Summarize with AI\n\n Generate Summary (OpenRouter AI)\n\nUses AI to summarize extracted text in concise Japanese for efficient reading. (?30 words)"
},
"typeVersion": 1
},
{
"id": "696b9c8a-05e3-44bf-aff0-693d969178de",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
704,
-160
],
"parameters": {
"color": 7,
"height": 304,
"content": "### Section 4 ? Save to Google Sheets\n\n Append row in sheet\n\nLogs the filename, AI-generated summary, and current date into a Google Sheet. (?25 words)"
},
"typeVersion": 1
},
{
"id": "6b0c9994-a22f-41aa-968e-36a9adca53bd",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
960,
-160
],
"parameters": {
"color": 7,
"height": 304,
"content": "### Section 5 ? Notify via Gmail\n\n?? Send Completion Notification โ Process Completed\n\nEmails the user with the OCR summary and Google Docs/Sheets information. (?25 words)"
},
"typeVersion": 1
},
{
"parameters": {
"operation": "verify",
"email": "={{ $json.email || $json.Email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
1224,
160
],
"name": "Verify Email (BillionVerify)",
"credentials": {
"billionVerifyApi": {
"id": "",
"name": "BillionVerify account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "is-deliverable",
"leftValue": "={{ $json.is_deliverable }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1404,
160
],
"name": "IF deliverable"
}
],
"connections": {
"Append row in sheet1": {
"main": [
[
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
]
]
},
"Download Image File1": {
"main": [
[
{
"node": "Extract Text with OCR.space1",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model1": {
"ai_languageModel": [
[
{
"node": "Generate Summary with OpenRouter AI1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Extract Text with OCR.space1": {
"main": [
[
{
"node": "Format OCR Result & Check for Empty1",
"type": "main",
"index": 0
}
]
]
},
"Google Drive New File Trigger1": {
"main": [
[
{
"node": "Download Image File1",
"type": "main",
"index": 0
}
]
]
},
"Format OCR Result & Check for Empty1": {
"main": [
[
{
"node": "Generate Summary with OpenRouter AI1",
"type": "main",
"index": 0
}
]
]
},
"Generate Summary with OpenRouter AI1": {
"main": [
[
{
"node": "Append row in sheet1",
"type": "main",
"index": 0
}
]
]
},
"Send Completion Notification via Gmail1": {
"main": [
[
{
"node": "Process Completed1",
"type": "main",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": "Send Completion Notification via Gmail1",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {
"executionOrder": "v1"
}
}Workflow templates with Ocrspace
Ready-to-use workflows that verify emails before Ocrspace sends.
How it works
- 1
Integrate BillionVerify after your OCR.space API call using the n8n community node, Integrately, or the REST API.
- 2
After OCR.space returns extracted text, parse out email-shaped strings and send each to BillionVerify.
- 3
BillionVerify performs SMTP-level checks, disposable domain detection, and syntax validation.
- 4
Suppress or flag any address that fails verification before writing to your database or triggering outreach.
- 5
Log verification results alongside OCR confidence scores for auditing and quality control.
When to use this
Validate emails parsed from scanned business cards
Business-card scanning pipelines often feed CRMs directly. Running each OCR-extracted address through BillionVerify before the CRM write catches misprints and typos so sales teams only work verified contacts.
Sanitise emails extracted from uploaded forms
Paper forms digitised via OCR.space may contain handwritten or faded addresses. BillionVerify validates each one before it enters your email platform, cutting bounce rates on follow-up campaigns.
FAQ
Can I verify multiple emails extracted from a single document?
Absolutely. Send each extracted address to BillionVerify individually via the REST API, or batch them in a single bulk request โ results come back per address so you can handle each one appropriately.
How does BillionVerify handle addresses with OCR-induced typos?
BillionVerify checks whether the domain exists and the mailbox accepts mail. A typo that produces a non-existent domain or mailbox will be marked invalid, preventing it from polluting your contact list.
Is there a free tier to test the integration?
BillionVerify offers a free trial so you can verify a batch of OCR-extracted addresses and confirm accuracy before committing to a paid plan.
Verify emails in Ocrspace
Create a free account, grab your API key, and stop bounces before they happen.
Get started free