Get Workflow Results
/api/v1/jobs/spiderMaps/campaigns/{campaign_id}/workflow-resultsOverview
Retrieve aggregated results from an orchestrated campaign. This endpoint combines data from all three services in the workflow chain, providing a complete view of each business including:
- SpiderMaps data: Business name, address, phone, rating, categories
- SpiderSite data: Emails found, team members, company info, lead scoring
- SpiderVerify data: Email verification results with deliverability status
v2.15.0 Feature: This endpoint is only available for campaigns created with workflow orchestration enabled.
Path Parameters
campaign_idstringrequiredThe campaign ID returned from the submit endpoint (e.g., "camp_fr_restaurants_20251223_a1b2c3d4")
Query Parameters
include_pendingbooleandefault: falseInclude businesses still being processed in the workflow
min_valid_emailsintegerFilter to only include businesses with at least this many valid emails
pageintegerdefault: 1Page number for pagination
page_sizeintegerdefault: 50Results per page (max 100)
Response
campaign_idstringThe campaign identifier
statusstringCampaign status: active, completed, stopped
querystringThe original search query
country_codestringISO country code
progressobjectCampaign location progress
workflow_progressobjectWorkflow chain progress statistics
total_locationsintegerTotal locations in the campaign
total_businessesintegerTotal businesses found across all locations
total_with_domainsintegerBusinesses with valid website domains
total_domains_filteredintegerDomains filtered out (social media, review sites, etc.)
total_emails_foundintegerTotal emails extracted from websites
total_emails_verifiedintegerTotal emails that completed verification
total_valid_emailsintegerTotal emails confirmed as valid/deliverable
locationsarrayDetailed results by location
Business Result Object
Each business in the locations[].businesses array contains:
business_namestringBusiness name from Google Maps
business_place_idstringGoogle Maps place ID
business_addressstringFull address
business_phonestringPhone number
business_ratingnumberGoogle Maps rating (1-5)
business_reviews_countintegerNumber of Google reviews
business_categoriesarrayBusiness category tags
original_websitestringOriginal website URL from Google Maps
domainstringCleaned domain (null if filtered)
domain_filteredbooleanWhether the domain was filtered out
filter_reasonstringWhy domain was filtered: social_media, review_site, directory, maps, no_website
spidersite_statusstringSpiderSite job status: completed, failed, skipped, pending
pages_crawledintegerNumber of pages crawled by SpiderSite
emails_foundarrayEmail addresses extracted from website
phones_foundarrayAdditional phone numbers from website
social_mediaobjectSocial media links found (linkedin, twitter, facebook, etc.)
company_infoobjectAI-extracted company information (if extract_company_info enabled)
team_membersarrayAI-extracted team members (if extract_team enabled)
lead_scoringobjectCHAMP lead scoring results (if product_description and icp_description provided)
spiderverify_statusstringSpiderVerify job status: completed, failed, skipped, pending
emails_verifiedarrayEmail verification results
valid_emails_countintegerCount of verified valid emails for this business
workflow_stagestringCurrent workflow stage: maps, site, verify, complete, failed
Example
- cURL
- Python
curl -X GET "https://spideriq.ai/api/v1/jobs/spiderMaps/campaigns/camp_fr_restaurants_20251223_a1b2c3d4/workflow-results" \
-H "Authorization: Bearer <your_token>"
import requests
response = requests.get(
"https://spideriq.ai/api/v1/jobs/spiderMaps/campaigns/camp_fr_restaurants_20251223_a1b2c3d4/workflow-results",
headers={"Authorization": "Bearer <your_token>"}
)
results = response.json()
print(f"Total businesses: {results['total_businesses']}")
print(f"Valid emails found: {results['total_valid_emails']}")
# Iterate through locations and businesses
for location in results['locations']:
print(f"\n{location['display_name']}:")
for business in location['businesses']:
valid_emails = [e['email'] for e in business['emails_verified'] if e['status'] == 'valid']
if valid_emails:
print(f" {business['business_name']}: {', '.join(valid_emails)}")
Response:
{
"campaign_id": "camp_fr_restaurants_20251223_a1b2c3d4",
"status": "completed",
"query": "restaurants",
"country_code": "FR",
"progress": {
"completed": 42,
"failed": 0,
"pending": 0,
"total": 42,
"percentage": 100.0
},
"workflow_progress": {
"businesses_total": 520,
"sites_queued": 0,
"sites_completed": 485,
"sites_failed": 35,
"verifies_queued": 0,
"verifies_completed": 485,
"verifies_failed": 0,
"emails_found": 1250,
"emails_verified": 1250
},
"total_locations": 42,
"total_businesses": 840,
"total_with_domains": 520,
"total_domains_filtered": 320,
"total_emails_found": 1250,
"total_emails_verified": 1250,
"total_valid_emails": 892,
"locations": [
{
"location_id": 15201,
"search_string": "restaurants in Paris, France",
"display_name": "Paris",
"status": "completed",
"businesses_count": 20,
"businesses": [
{
"business_name": "Le Petit Bistro",
"business_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"business_address": "123 Rue de Rivoli, 75001 Paris, France",
"business_phone": "+33 1 42 96 12 34",
"business_rating": 4.5,
"business_reviews_count": 234,
"business_categories": ["French restaurant", "Bistro"],
"original_website": "https://lepetitbistro.fr",
"domain": "lepetitbistro.fr",
"domain_filtered": false,
"filter_reason": null,
"spidersite_status": "completed",
"pages_crawled": 8,
"emails_found": ["contact@lepetitbistro.fr", "reservations@lepetitbistro.fr"],
"phones_found": ["+33 1 42 96 12 34", "+33 1 42 96 12 35"],
"social_media": {
"instagram": "https://instagram.com/lepetitbistro",
"facebook": "https://facebook.com/lepetitbistroparis"
},
"company_info": {
"description": "Traditional French bistro serving classic dishes since 1985",
"founded": "1985",
"employees": "10-20"
},
"team_members": [],
"lead_scoring": {
"champ_score": 78,
"challenges": ["Managing reservations manually", "Limited online presence"],
"authority": "Owner-operated",
"money": "Medium",
"priority": "High"
},
"spiderverify_status": "completed",
"emails_verified": [
{
"email": "contact@lepetitbistro.fr",
"status": "valid",
"score": 95,
"is_deliverable": true,
"is_free_email": false,
"is_disposable": false,
"is_role_account": true
},
{
"email": "reservations@lepetitbistro.fr",
"status": "valid",
"score": 92,
"is_deliverable": true,
"is_free_email": false,
"is_disposable": false,
"is_role_account": true
}
],
"valid_emails_count": 2,
"workflow_stage": "complete"
}
]
}
],
"created_at": "2025-12-23T10:30:00Z",
"updated_at": "2025-12-23T14:45:00Z",
"completed_at": "2025-12-23T14:45:00Z"
}
Error Responses
Campaign Not Found
{
"detail": "Campaign not found: camp_invalid_id"
}
No Workflow Configured
{
"detail": "Campaign does not have workflow orchestration enabled"
}
Export to CSV
Here's a Python example to export workflow results to CSV:
import requests
import csv
# Fetch results
response = requests.get(
f"https://spideriq.ai/api/v1/jobs/spiderMaps/campaigns/{campaign_id}/workflow-results",
headers={"Authorization": f"Bearer {token}"}
)
results = response.json()
# Write to CSV
with open('leads.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow([
'Business Name', 'Phone', 'Address', 'Rating', 'Reviews',
'Domain', 'Email', 'Email Status', 'Lead Score'
])
for location in results['locations']:
for business in location['businesses']:
for email in business.get('emails_verified', []):
if email['status'] == 'valid':
writer.writerow([
business['business_name'],
business['business_phone'],
business['business_address'],
business['business_rating'],
business['business_reviews_count'],
business['domain'],
email['email'],
email['status'],
business.get('lead_scoring', {}).get('champ_score', '')
])
print(f"Exported {results['total_valid_emails']} valid emails")