GET
https://spideriq.di-atomic.com
/
api
/
v1
/
jobs
/
spiderMaps
/
campaigns
/
{campaign_id}
/
workflow-results
Get Workflow Results
curl --request GET \
  --url https://spideriq.di-atomic.com/api/v1/jobs/spiderMaps/campaigns/{campaign_id}/workflow-results \
  --header 'Authorization: Bearer <token>'
{
  "campaign_id": "<string>",
  "status": "<string>",
  "query": "<string>",
  "country_code": "<string>",
  "progress": {
    "completed": 123,
    "failed": 123,
    "pending": 123,
    "total": 123,
    "percentage": 123
  },
  "workflow_progress": {
    "businesses_total": 123,
    "sites_queued": 123,
    "sites_completed": 123,
    "sites_failed": 123,
    "verifies_queued": 123,
    "verifies_completed": 123,
    "verifies_failed": 123,
    "emails_found": 123,
    "emails_verified": 123
  },
  "total_locations": 123,
  "total_businesses": 123,
  "total_with_domains": 123,
  "total_domains_filtered": 123,
  "total_emails_found": 123,
  "total_emails_verified": 123,
  "total_valid_emails": 123,
  "locations": [
    {
      "location_id": 123,
      "search_string": "<string>",
      "display_name": "<string>",
      "status": "<string>",
      "businesses_count": 123,
      "businesses": [
        {}
      ]
    }
  ],
  "business_name": "<string>",
  "business_place_id": "<string>",
  "business_address": "<string>",
  "business_phone": "<string>",
  "business_rating": 123,
  "business_reviews_count": 123,
  "business_categories": [
    {}
  ],
  "original_website": "<string>",
  "domain": "<string>",
  "domain_filtered": true,
  "filter_reason": "<string>",
  "spidersite_status": "<string>",
  "pages_crawled": 123,
  "emails_found": [
    {}
  ],
  "phones_found": [
    {}
  ],
  "social_media": {},
  "company_info": {},
  "team_members": [
    {}
  ],
  "lead_scoring": {},
  "spiderverify_status": "<string>",
  "emails_verified": [
    {
      "email": "<string>",
      "status": "<string>",
      "score": 123,
      "is_deliverable": true,
      "is_free_email": true,
      "is_disposable": true,
      "is_role_account": true
    }
  ],
  "valid_emails_count": 123,
  "workflow_stage": "<string>"
}

Overview

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_id
string
required
The campaign ID returned from the submit endpoint (e.g., “camp_fr_restaurants_20251223_a1b2c3d4”)

Query Parameters

include_pending
boolean
default:"false"
Include businesses still being processed in the workflow
min_valid_emails
integer
Filter to only include businesses with at least this many valid emails
page
integer
default:"1"
Page number for pagination
page_size
integer
default:"50"
Results per page (max 100)

Response

campaign_id
string
The campaign identifier
status
string
Campaign status: active, completed, stopped
query
string
The original search query
country_code
string
ISO country code
progress
object
Campaign location progress
workflow_progress
object
Workflow chain progress statistics
total_locations
integer
Total locations in the campaign
total_businesses
integer
Total businesses found across all locations
total_with_domains
integer
Businesses with valid website domains
total_domains_filtered
integer
Domains filtered out (social media, review sites, etc.)
total_emails_found
integer
Total emails extracted from websites
total_emails_verified
integer
Total emails that completed verification
total_valid_emails
integer
Total emails confirmed as valid/deliverable
locations
array
Detailed results by location

Business Result Object

Each business in the locations[].businesses array contains:
business_name
string
Business name from Google Maps
business_place_id
string
Google Maps place ID
business_address
string
Full address
business_phone
string
Phone number
business_rating
number
Google Maps rating (1-5)
business_reviews_count
integer
Number of Google reviews
business_categories
array
Business category tags
original_website
string
Original website URL from Google Maps
domain
string
Cleaned domain (null if filtered)
domain_filtered
boolean
Whether the domain was filtered out
filter_reason
string
Why domain was filtered: social_media, review_site, directory, maps, no_website
spidersite_status
string
SpiderSite job status: completed, failed, skipped, pending
pages_crawled
integer
Number of pages crawled by SpiderSite
emails_found
array
Email addresses extracted from website
phones_found
array
Additional phone numbers from website
social_media
object
Social media links found (linkedin, twitter, facebook, etc.)
company_info
object
AI-extracted company information (if extract_company_info enabled)
team_members
array
AI-extracted team members (if extract_team enabled)
lead_scoring
object
CHAMP lead scoring results (if product_description and icp_description provided)
spiderverify_status
string
SpiderVerify job status: completed, failed, skipped, pending
emails_verified
array
Email verification results
valid_emails_count
integer
Count of verified valid emails for this business
workflow_stage
string
Current workflow stage: maps, site, verify, complete, failed

Example

curl -X GET "https://spideriq.di-atomic.com/api/v1/jobs/spiderMaps/campaigns/camp_fr_restaurants_20251223_a1b2c3d4/workflow-results" \
  -H "Authorization: Bearer <your_token>"
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.di-atomic.com/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")