SSpiderIQ
SSpiderIQ

Docs / api-reference/jobs

Jobs

26 endpoints from the published OpenAPI import.

POST/api/v1/jobs/submit

Submit Job

Submit a new scraping job to SpiderIQ distributed scraping platform

Supported Job Types

1. SpiderMaps (type: "spiderMaps")

Scrape business listings from maps services.

  • Required: Either url OR search_query in payload
  • AI Usage: None (0 tokens)
  • Processing Time: 30-90 seconds for 20 results
  • Features: Reviews, photos, multi-language support

2. SpiderSite (type: "spiderSite")

Intelligent website crawling with AI-powered lead generation.

  • Required: url in payload
  • AI Usage: Opt-in (0 tokens by default, ~500-3,800 tokens if AI enabled)
  • Processing Time: 5-60 seconds depending on pages and AI features
  • Features:
    • v2.7.0: AI Context Engine (smart markdown compendiums + R2 storage)
    • v2.4.0: SPA auto-detection with Playwright
    • v2.3.0: Sitemap-first crawling
    • v2.2.1: AI opt-in defaults (zero cost unless enabled)
    • v2.1.0: Multilingual (36+ European languages)

SpiderIQ Features

  • Automatic deduplication: Returns cached job if submitted within 24 hours
  • Distributed processing: Jobs queued to RabbitMQ, processed by workers across multiple VPS servers
  • Priority support: 0-10 (higher number = processed first)
  • Async processing: Returns job ID immediately (<100ms), poll for results

Authentication

Requires Bearer token: Authorization: Bearer <client_id>:<api_key>:<api_secret>

Contact admin to register a client and receive credentials.

Queue Limits

  • SpiderMaps queue: 10,000 jobs maximum
  • SpiderSite queue: 5,000 jobs maximum

Returns

Job ID and initial status. Use /jobs/{job_id}/status to check progress.

YAML Input (v2.60.0): Accepts Content-Type: text/yaml for AI agent submissions.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "spiderMaps",
  "payload": {},
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"type": "spiderMaps", "payload": {}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"type": "spiderMaps", "payload": {}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"type": "spiderMaps", "payload": {}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Successful Response
422Validation Error
GET/api/v1/jobs/{job_id}/status

Get status of a single job

Retrieve queue/processing/completion status for a job owned by the authenticated client. Does NOT return results — use /jobs/{job_id}/results for completed data. Supports ?format=json|yaml|md|llm for AI-agent-friendly output.

Parameters

NameInTypeRequiredDescription
job_idpathstringtrue
formatqueryanyfalseResponse format. json (default) and llm return JSON; yaml returns text/yaml; md returns text/markdown. Any other value is a 422.
Try it
Query

Examples

cURL
curl -X GET 'https://spideriq.ai/api/v1/jobs/{job_id}/status' \
  -H 'Authorization: Bearer <token>'
Python
import httpx

resp = httpx.get(
    "https://spideriq.ai/api/v1/jobs/{job_id}/status",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/{job_id}/status", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/jobs/{job_id}/status", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
200Job status retrieved successfully
400Invalid job ID format
401Authentication failed
403Client account is inactive
404Job not found, or it doesn't belong to the authenticated client. If the id you sent is this client's INTERNAL jobs.id rather than the public jobs.job_id, the response names the public id in error.public_job_id -- the internal id is never accepted on a client route. A job belonging to another client returns the plain form, with no hint.
422Validation error in query parameters
429Rate limit exceeded
GET/api/v1/jobs/{job_id}/results

Get results for a completed job

Retrieve the results payload for a job owned by the authenticated client. Returns 200 with data when the job is completed, 202 while queued/processing (poll again), 410 when failed or cancelled. Response shape is flat (v2.7.6+) — social platforms live at data.linkedin, data.twitter, etc. Supports ?format=json|yaml|md|llm for AI-agent-friendly output.

Parameters

NameInTypeRequiredDescription
job_idpathstringtrue
formatqueryanyfalseResponse format. json (default) and llm return JSON; yaml returns text/yaml; md returns text/markdown. Any other value is a 422.
Try it
Query

Examples

cURL
curl -X GET 'https://spideriq.ai/api/v1/jobs/{job_id}/results' \
  -H 'Authorization: Bearer <token>'
Python
import httpx

resp = httpx.get(
    "https://spideriq.ai/api/v1/jobs/{job_id}/results",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/{job_id}/results", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/jobs/{job_id}/results", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
200Job completed successfully - results are available
202Job is queued or processing - results not ready yet. Poll this endpoint to check for completion.
400Invalid job ID format
401Authentication failed
403Client account is inactive
404Job not found, or it doesn't belong to the authenticated client. If the id you sent is this client's INTERNAL jobs.id rather than the public jobs.job_id, the response names the public id in error.public_job_id -- the internal id is never accepted on a client route. A job belonging to another client returns the plain form, with no hint.
410Job failed or was cancelled - no results available
422Internal validation error - Response serialization failed. This should NOT occur in normal operation. If you encounter this error, please contact support as it indicates a bug in the API.
429Rate limit exceeded
GET/api/v1/jobs/{job_id}/workflow-results

Get workflow results for SpiderMaps job

Get complete workflow results for a SpiderMaps job submitted with workflow configuration.

Returns aggregated data from SpiderMaps → SpiderSite → SpiderVerify chain.

Query Parameters:

  • wait=true (default): Block until all businesses complete or timeout
  • wait=false: Return current status immediately (for polling)

Note: Only works for SpiderMaps jobs submitted with workflow configuration. For jobs without workflow, use the regular /jobs/{job_id}/results endpoint.

Timeouts:

  • SpiderSite: 5 minutes per business
  • SpiderVerify: 2 minutes per business
  • Maximum total: 10 minutes

Formats: ?format=json (default) / llm -> JSON; yaml -> text/yaml; md -> text/markdown. Any other value is a 422. Before SDS-26 this route declared no format at all, so FastAPI DROPPED it silently.

Parameters

NameInTypeRequiredDescription
job_idpathstringtrue
waitquerybooleanfalseWait for completion (blocking). If false, returns current state immediately.
formatqueryanyfalseResponse format. json (default) and llm return JSON; yaml returns text/yaml; md returns text/markdown. Any other value is a 422.
Try it
Query

Examples

cURL
curl -X GET 'https://spideriq.ai/api/v1/jobs/{job_id}/workflow-results' \
  -H 'Authorization: Bearer <token>'
Python
import httpx

resp = httpx.get(
    "https://spideriq.ai/api/v1/jobs/{job_id}/workflow-results",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/{job_id}/workflow-results", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/jobs/{job_id}/workflow-results", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
200Successful Response
422Validation Error
GET/api/v1/jobs/list

List jobs for the authenticated client

Return a paginated list of jobs belonging to the authenticated client. Filter by status_filter (queued/processing/completed/failed/cancelled) and/or type_filter (spiderMaps/spiderSite/...). Supports ?format=json|yaml|md|llm for AI-agent-friendly output. status / type / per_page are accepted as DEPRECATED aliases of status_filter / type_filter / page_size — see the handler docstring.

Parameters

NameInTypeRequiredDescription
status_filterqueryanyfalseFilter by job status
type_filterqueryanyfalseFilter by job type
pagequeryintegerfalsePage number
page_sizequeryanyfalseItems per page (default 50)
formatqueryanyfalseResponse format. json (default) and llm return JSON; yaml returns text/yaml; md returns text/markdown. Any other value is a 422.
statusqueryanyfalseDEPRECATED alias of status_filter.
typequeryanyfalseDEPRECATED alias of type_filter.
per_pagequeryanyfalseDEPRECATED alias of page_size.
Try it
Query

Examples

cURL
curl -X GET 'https://spideriq.ai/api/v1/jobs/list' \
  -H 'Authorization: Bearer <token>'
Python
import httpx

resp = httpx.get(
    "https://spideriq.ai/api/v1/jobs/list",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/list", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/jobs/list", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
200Paginated list of jobs for the authenticated client
401Authentication failed
403Client account is inactive
422Invalid query parameters (status, type, page, page_size, format)
429Rate limit exceeded
DELETE/api/v1/jobs/{job_id}

Cancel a queued or processing job

Cancel a job owned by the authenticated client. Only jobs in queued or processing state can be cancelled; completed, failed, or already-cancelled jobs return 400. Cancellation is best-effort — a worker that has already claimed the job may still complete it before seeing the flag.

Parameters

NameInTypeRequiredDescription
job_idpathstringtrue
Try it
Query

Examples

cURL
curl -X DELETE 'https://spideriq.ai/api/v1/jobs/{job_id}' \
  -H 'Authorization: Bearer <token>'
Python
import httpx

resp = httpx.delete(
    "https://spideriq.ai/api/v1/jobs/{job_id}",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/{job_id}", {
  method: "DELETE",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("DELETE", "https://spideriq.ai/api/v1/jobs/{job_id}", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
200Job cancelled successfully
400Invalid job ID format or job cannot be cancelled in its current state
401Authentication failed
403Client account is inactive
404Job not found, or it doesn't belong to the authenticated client. If the id you sent is this client's INTERNAL jobs.id rather than the public jobs.job_id, the response names the public id in error.public_job_id -- the internal id is never accepted on a client route. A job belonging to another client returns the plain form, with no hint.
429Rate limit exceeded
422Validation Error
POST/api/v1/jobs/spiderCompanyData/submit

Submit company registry lookup job

Look up company records in US (SEC EDGAR), UK (Companies House), and EU business registries. Returns officers, filings, registered address, and structured metadata. Returns a job_id — poll /api/v1/jobs/{job_id}/results for the aggregated registry payload.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderCompanyData/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "mode": "search",
    "name": "Apple Inc",
    "identifier": "0000320193",
    "country": "US",
    "vat_number": "GB123456789",
    "limit": 10,
    "include_financials": false,
    "financials_mode": "url_only",
    "test": false
  },
  "priority": 5
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderCompanyData/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"mode": "search", "name": "Apple Inc", "identifier": "0000320193", "country": "US", "vat_number": "GB123456789", "limit": 10, "include_financials": false, "financials_mode": "url_only", "test": false}, "priority": 5},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderCompanyData/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"mode": "search", "name": "Apple Inc", "identifier": "0000320193", "country": "US", "vat_number": "GB123456789", "limit": 10, "include_financials": false, "financials_mode": "url_only", "test": false}, "priority": 5})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"mode": "search", "name": "Apple Inc", "identifier": "0000320193", "country": "US", "vat_number": "GB123456789", "limit": 10, "include_financials": false, "financials_mode": "url_only", "test": false}, "priority": 5}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderCompanyData/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderVayapin/submit

Submit VayaPin profile / outreach job

Create or update VayaPin business profiles from extracted leads. Triggers the VayaPin automation stack (profile enrichment, outreach scheduling). Returns a job_id — poll /api/v1/jobs/{job_id}/results for per-profile outcomes.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderVayapin/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "business_name": "Restaurant Tight",
    "country_code": "DK",
    "gmaps_coordinates": {
      "latitude": 0.0,
      "longitude": 0.0
    },
    "place_id": "string",
    "markdown_url": "https://media.spideriq.ai/crawls/abc123.md",
    "markdown_compendium": "# Company Name\n\nDescription of the business...",
    "business_phone": "+4533116996",
    "business_address": "string",
    "original_website": "https://restauranttight.dk",
    "domain": "restauranttight.dk",
    "street": "string",
    "city": "string",
    "postal_code": "string",
    "state": "string",
    "country": "string",
    "emails_verified": [
      {
        "email": {},
        "status": {},
        "is_deliverable": {}
      }
    ],
    "facebook": "string",
    "instagram": "string",
    "linkedin": "string",
    "twitter": "string"
  },
  "priority": 5
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderVayapin/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"business_name": "Restaurant Tight", "country_code": "DK", "gmaps_coordinates": {"latitude": 0.0, "longitude": 0.0}, "place_id": "string", "markdown_url": "https://media.spideriq.ai/crawls/abc123.md", "markdown_compendium": "# Company Name\n\nDescription of the business...", "business_phone": "+4533116996", "business_address": "string", "original_website": "https://restauranttight.dk", "domain": "restauranttight.dk", "street": "string", "city": "string", "postal_code": "string", "state": "string", "country": "string", "emails_verified": [{"email": {}, "status": {}, "is_deliverable": {}}], "facebook": "string", "instagram": "string", "linkedin": "string", "twitter": "string"}, "priority": 5},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderVayapin/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"business_name": "Restaurant Tight", "country_code": "DK", "gmaps_coordinates": {"latitude": 0.0, "longitude": 0.0}, "place_id": "string", "markdown_url": "https://media.spideriq.ai/crawls/abc123.md", "markdown_compendium": "# Company Name\n\nDescription of the business...", "business_phone": "+4533116996", "business_address": "string", "original_website": "https://restauranttight.dk", "domain": "restauranttight.dk", "street": "string", "city": "string", "postal_code": "string", "state": "string", "country": "string", "emails_verified": [{"email": {}, "status": {}, "is_deliverable": {}}], "facebook": "string", "instagram": "string", "linkedin": "string", "twitter": "string"}, "priority": 5})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"business_name": "Restaurant Tight", "country_code": "DK", "gmaps_coordinates": {"latitude": 0.0, "longitude": 0.0}, "place_id": "string", "markdown_url": "https://media.spideriq.ai/crawls/abc123.md", "markdown_compendium": "# Company Name\n\nDescription of the business...", "business_phone": "+4533116996", "business_address": "string", "original_website": "https://restauranttight.dk", "domain": "restauranttight.dk", "street": "string", "city": "string", "postal_code": "string", "state": "string", "country": "string", "emails_verified": [{"email": {}, "status": {}, "is_deliverable": {}}], "facebook": "string", "instagram": "string", "linkedin": "string", "twitter": "string"}, "priority": 5}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderVayapin/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderMail/submit

Submit mail send / reply job

Send an email or reply to an existing thread through the SpiderMail worker. Delivery goes through the client's configured mailbox (SMTP or provider API). Returns a job_id — poll /api/v1/jobs/{job_id}/results for the delivery outcome and message ID.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderMail/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "action": "send",
    "from_email": "alice@company.com",
    "to": [
      "bob@prospect.com"
    ],
    "cc": [
      "string"
    ],
    "subject": "Quick question about your services",
    "body_text": "string",
    "body_html": "string",
    "attachments": [
      {
        "filename": {},
        "content_base64": {},
        "mime_type": {}
      }
    ],
    "reply_to_message_id": 0,
    "reply_all": false,
    "test": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderMail/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"action": "send", "from_email": "alice@company.com", "to": ["bob@prospect.com"], "cc": ["string"], "subject": "Quick question about your services", "body_text": "string", "body_html": "string", "attachments": [{"filename": {}, "content_base64": {}, "mime_type": {}}], "reply_to_message_id": 0, "reply_all": false, "test": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderMail/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"action": "send", "from_email": "alice@company.com", "to": ["bob@prospect.com"], "cc": ["string"], "subject": "Quick question about your services", "body_text": "string", "body_html": "string", "attachments": [{"filename": {}, "content_base64": {}, "mime_type": {}}], "reply_to_message_id": 0, "reply_all": false, "test": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"action": "send", "from_email": "alice@company.com", "to": ["bob@prospect.com"], "cc": ["string"], "subject": "Quick question about your services", "body_text": "string", "body_html": "string", "attachments": [{"filename": {}, "content_base64": {}, "mime_type": {}}], "reply_to_message_id": 0, "reply_all": false, "test": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderMail/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderMaps/submit

Submit Google Maps scraping job

Scrape Google Maps business listings by search query or direct Maps URL. Optionally enrich via an attached workflow (chain SpiderSite + SpiderVerify). Returns a job_id — poll /api/v1/jobs/{job_id}/results for the flat response. Per-VPS rate limit applies (10 jobs/min).

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderMaps/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "url": "https://www.google.com/maps/place/...",
    "search_query": "coffee shops in San Francisco",
    "max_results": 20,
    "extract_reviews": false,
    "extract_photos": false,
    "lang": "en",
    "country": "string",
    "headless": true,
    "test": false,
    "store_images": true,
    "validate_phones": true,
    "fuzziq_enabled": true,
    "fuzziq_unique_only": true,
    "skip_proxy": false,
    "maps_source": "maps",
    "workflow": {
      "spidersite": {},
      "spiderverify": {},
      "vayapin": {},
      "social_media_enrichment": {},
      "smartlead": {},
      "filter_social_media": {},
      "filter_review_sites": {},
      "filter_directories": {},
      "filter_maps": {}
    }
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderMaps/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"url": "https://www.google.com/maps/place/...", "search_query": "coffee shops in San Francisco", "max_results": 20, "extract_reviews": false, "extract_photos": false, "lang": "en", "country": "string", "headless": true, "test": false, "store_images": true, "validate_phones": true, "fuzziq_enabled": true, "fuzziq_unique_only": true, "skip_proxy": false, "maps_source": "maps", "workflow": {"spidersite": {}, "spiderverify": {}, "vayapin": {}, "social_media_enrichment": {}, "smartlead": {}, "filter_social_media": {}, "filter_review_sites": {}, "filter_directories": {}, "filter_maps": {}}}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderMaps/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"url": "https://www.google.com/maps/place/...", "search_query": "coffee shops in San Francisco", "max_results": 20, "extract_reviews": false, "extract_photos": false, "lang": "en", "country": "string", "headless": true, "test": false, "store_images": true, "validate_phones": true, "fuzziq_enabled": true, "fuzziq_unique_only": true, "skip_proxy": false, "maps_source": "maps", "workflow": {"spidersite": {}, "spiderverify": {}, "vayapin": {}, "social_media_enrichment": {}, "smartlead": {}, "filter_social_media": {}, "filter_review_sites": {}, "filter_directories": {}, "filter_maps": {}}}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"url": "https://www.google.com/maps/place/...", "search_query": "coffee shops in San Francisco", "max_results": 20, "extract_reviews": false, "extract_photos": false, "lang": "en", "country": "string", "headless": true, "test": false, "store_images": true, "validate_phones": true, "fuzziq_enabled": true, "fuzziq_unique_only": true, "skip_proxy": false, "maps_source": "maps", "workflow": {"spidersite": {}, "spiderverify": {}, "vayapin": {}, "social_media_enrichment": {}, "smartlead": {}, "filter_social_media": {}, "filter_review_sites": {}, "filter_directories": {}, "filter_maps": {}}}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderMaps/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderSite/submit

Submit website crawl job

Crawl a website and extract contact information, company vitals, social links, and AI-enriched lead data. Supports single-URL and multi-page crawls (best-first / BFS / DFS). Returns a job_id — poll /api/v1/jobs/{job_id}/results for the flat (v2.7.6+) response.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderSite/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "url": "https://example.com",
    "mode": "contacts",
    "overrides": {},
    "max_pages": 10,
    "crawl_strategy": "bestfirst",
    "target_pages": [
      "contact",
      "about",
      "team",
      "news",
      "blog"
    ],
    "enable_spa": true,
    "spa_timeout": 30,
    "extract_team": false,
    "extract_company_info": false,
    "extract_pain_points": false,
    "product_description": "string",
    "icp_description": "string",
    "timeout": 30,
    "compendium": {
      "enabled": {},
      "max_chars": {},
      "cleanup_level": {},
      "separator": {},
      "include_in_response": {},
      "remove_duplicates": {},
      "priority_sections": {}
    },
    "custom_ai_prompt": {
      "enabled": {},
      "system_prompt": {},
      "user_prompt": {},
      "json_schema": {},
      "output_field_name": {},
      "model": {},
      "temperature": {},
      "max_tokens": {}
    },
    "test": false,
    "fuzziq_enabled": true,
    "fuzziq_unique_only": true,
    "extraction": {}
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderSite/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"url": "https://example.com", "mode": "contacts", "overrides": {}, "max_pages": 10, "crawl_strategy": "bestfirst", "target_pages": ["contact", "about", "team", "news", "blog"], "enable_spa": true, "spa_timeout": 30, "extract_team": false, "extract_company_info": false, "extract_pain_points": false, "product_description": "string", "icp_description": "string", "timeout": 30, "compendium": {"enabled": {}, "max_chars": {}, "cleanup_level": {}, "separator": {}, "include_in_response": {}, "remove_duplicates": {}, "priority_sections": {}}, "custom_ai_prompt": {"enabled": {}, "system_prompt": {}, "user_prompt": {}, "json_schema": {}, "output_field_name": {}, "model": {}, "temperature": {}, "max_tokens": {}}, "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true, "extraction": {}}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderSite/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"url": "https://example.com", "mode": "contacts", "overrides": {}, "max_pages": 10, "crawl_strategy": "bestfirst", "target_pages": ["contact", "about", "team", "news", "blog"], "enable_spa": true, "spa_timeout": 30, "extract_team": false, "extract_company_info": false, "extract_pain_points": false, "product_description": "string", "icp_description": "string", "timeout": 30, "compendium": {"enabled": {}, "max_chars": {}, "cleanup_level": {}, "separator": {}, "include_in_response": {}, "remove_duplicates": {}, "priority_sections": {}}, "custom_ai_prompt": {"enabled": {}, "system_prompt": {}, "user_prompt": {}, "json_schema": {}, "output_field_name": {}, "model": {}, "temperature": {}, "max_tokens": {}}, "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true, "extraction": {}}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"url": "https://example.com", "mode": "contacts", "overrides": {}, "max_pages": 10, "crawl_strategy": "bestfirst", "target_pages": ["contact", "about", "team", "news", "blog"], "enable_spa": true, "spa_timeout": 30, "extract_team": false, "extract_company_info": false, "extract_pain_points": false, "product_description": "string", "icp_description": "string", "timeout": 30, "compendium": {"enabled": {}, "max_chars": {}, "cleanup_level": {}, "separator": {}, "include_in_response": {}, "remove_duplicates": {}, "priority_sections": {}}, "custom_ai_prompt": {"enabled": {}, "system_prompt": {}, "user_prompt": {}, "json_schema": {}, "output_field_name": {}, "model": {}, "temperature": {}, "max_tokens": {}}, "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true, "extraction": {}}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderSite/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderVerify/submit

Submit email verification job

Verify one or more email addresses against SMTP, MX, DNSBL, disposable-domain, catch-all, and Gravatar checks. Accepts email (single) or emails (bulk, up to payload limit). Returns a job_id — poll /api/v1/jobs/{job_id}/results for per-address verdicts.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderVerify/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "email": "john@example.com",
    "emails": [
      "john@example.com",
      "jane@example.com"
    ],
    "from_email": "string",
    "hello_name": "string",
    "check_gravatar": false,
    "smtp_timeout_secs": 45,
    "check_dnsbl": false,
    "test": false,
    "fuzziq_enabled": true,
    "fuzziq_unique_only": true
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderVerify/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"email": "john@example.com", "emails": ["john@example.com", "jane@example.com"], "from_email": "string", "hello_name": "string", "check_gravatar": false, "smtp_timeout_secs": 45, "check_dnsbl": false, "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderVerify/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"email": "john@example.com", "emails": ["john@example.com", "jane@example.com"], "from_email": "string", "hello_name": "string", "check_gravatar": false, "smtp_timeout_secs": 45, "check_dnsbl": false, "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"email": "john@example.com", "emails": ["john@example.com", "jane@example.com"], "from_email": "string", "hello_name": "string", "check_gravatar": false, "smtp_timeout_secs": 45, "check_dnsbl": false, "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderVerify/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderPeople/submit

Submit people-search / enrichment job

Search for people by name, title, or company, or enrich an existing lead with email/phone/social. Operates in search or enrich mode depending on the payload. Returns a job_id — poll /api/v1/jobs/{job_id}/results for aggregated people records.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderPeople/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "mode": "profile",
    "linkedin_url": "https://www.linkedin.com/in/john-doe",
    "search_query": "5 AI engineers in Israel",
    "search_limit": 10,
    "country_code": "string",
    "company_url": "https://www.linkedin.com/company/pleo",
    "max_employees": 100,
    "profile_mode": "short",
    "person_name": "string",
    "test": false,
    "fuzziq_enabled": true,
    "fuzziq_unique_only": true
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderPeople/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"mode": "profile", "linkedin_url": "https://www.linkedin.com/in/john-doe", "search_query": "5 AI engineers in Israel", "search_limit": 10, "country_code": "string", "company_url": "https://www.linkedin.com/company/pleo", "max_employees": 100, "profile_mode": "short", "person_name": "string", "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderPeople/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"mode": "profile", "linkedin_url": "https://www.linkedin.com/in/john-doe", "search_query": "5 AI engineers in Israel", "search_limit": 10, "country_code": "string", "company_url": "https://www.linkedin.com/company/pleo", "max_employees": 100, "profile_mode": "short", "person_name": "string", "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"mode": "profile", "linkedin_url": "https://www.linkedin.com/in/john-doe", "search_query": "5 AI engineers in Israel", "search_limit": 10, "country_code": "string", "company_url": "https://www.linkedin.com/company/pleo", "max_employees": 100, "profile_mode": "short", "person_name": "string", "test": false, "fuzziq_enabled": true, "fuzziq_unique_only": true}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderPeople/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderPhone/submit

Submit phone lookup / outreach job

Look up phone numbers from Google Maps listings or trigger phone-based outreach actions via the iPhone bridge. platform and action in the payload select the behaviour. Returns a job_id — poll /api/v1/jobs/{job_id}/results for the result set.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderPhone/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "platform": "linkedin",
    "action": "string",
    "params": {},
    "config": {
      "action_timeout": 30.0,
      "max_retries": 3,
      "max_items": 100,
      "capture_screenshots": true,
      "behavior": {}
    },
    "test": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderPhone/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"platform": "linkedin", "action": "string", "params": {}, "config": {"action_timeout": 30.0, "max_retries": 3, "max_items": 100, "capture_screenshots": true, "behavior": {}}, "test": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderPhone/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"platform": "linkedin", "action": "string", "params": {}, "config": {"action_timeout": 30.0, "max_retries": 3, "max_items": 100, "capture_screenshots": true, "behavior": {}}, "test": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"platform": "linkedin", "action": "string", "params": {}, "config": {"action_timeout": 30.0, "max_retries": 3, "max_items": 100, "capture_screenshots": true, "behavior": {}}, "test": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderPhone/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderMapsEnrich/submit

Submit Google Maps business-data enrichment job

Enrich an existing Google Maps business (by place_id or search) with reviews, photos, opening hours, and extended attributes. Use when /spiderMaps results need deeper detail. Returns a job_id — poll /api/v1/jobs/{job_id}/results for the enriched record.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderMapsEnrich/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "google_place_id": "string",
    "google_cid": "string",
    "place_url": "string",
    "original_data": {},
    "exclude_vps": [
      "string"
    ],
    "use_proxy": true,
    "enrich_options": {
      "reviews": {},
      "photos": {},
      "popular_times": true,
      "store_images": true
    },
    "snowball": {
      "enabled": false,
      "max_depth": 2,
      "max_places_per_seed": 10
    },
    "test": false
  },
  "priority": 5
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderMapsEnrich/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"google_place_id": "string", "google_cid": "string", "place_url": "string", "original_data": {}, "exclude_vps": ["string"], "use_proxy": true, "enrich_options": {"reviews": {}, "photos": {}, "popular_times": true, "store_images": true}, "snowball": {"enabled": false, "max_depth": 2, "max_places_per_seed": 10}, "test": false}, "priority": 5},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderMapsEnrich/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"google_place_id": "string", "google_cid": "string", "place_url": "string", "original_data": {}, "exclude_vps": ["string"], "use_proxy": true, "enrich_options": {"reviews": {}, "photos": {}, "popular_times": true, "store_images": true}, "snowball": {"enabled": false, "max_depth": 2, "max_places_per_seed": 10}, "test": false}, "priority": 5})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"google_place_id": "string", "google_cid": "string", "place_url": "string", "original_data": {}, "exclude_vps": ["string"], "use_proxy": true, "enrich_options": {"reviews": {}, "photos": {}, "popular_times": true, "store_images": true}, "snowball": {"enabled": false, "max_depth": 2, "max_places_per_seed": 10}, "test": false}, "priority": 5}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderMapsEnrich/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderFacebookPage/submit

Submit Facebook page scraping job

Scrape a public Facebook Page for posts, about info, contact details, and engagement metadata. Accepts the page URL or numeric page ID. Returns a job_id — poll /api/v1/jobs/{job_id}/results for the structured page payload.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderFacebookPage/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "url": "https://www.facebook.com/instagram",
    "test": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderFacebookPage/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"url": "https://www.facebook.com/instagram", "test": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderFacebookPage/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"url": "https://www.facebook.com/instagram", "test": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"url": "https://www.facebook.com/instagram", "test": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderFacebookPage/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderPublicInstagram/submit

Submit Instagram profile scraping job

Scrape a public Instagram profile for bio, recent posts, follower counts, and contact fields exposed via the business_contact schema. Accepts the profile URL or handle. Returns a job_id — poll /api/v1/jobs/{job_id}/results for the structured profile payload.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderPublicInstagram/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "username": "natgeo",
    "instagram_url": "https://www.instagram.com/natgeo/",
    "extract_contact_from_bio": true,
    "store_profile_image": true,
    "test": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderPublicInstagram/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"username": "natgeo", "instagram_url": "https://www.instagram.com/natgeo/", "extract_contact_from_bio": true, "store_profile_image": true, "test": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderPublicInstagram/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"username": "natgeo", "instagram_url": "https://www.instagram.com/natgeo/", "extract_contact_from_bio": true, "store_profile_image": true, "test": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"username": "natgeo", "instagram_url": "https://www.instagram.com/natgeo/", "extract_contact_from_bio": true, "store_profile_image": true, "test": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderPublicInstagram/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderPublicLinkedin/submit

Submit LinkedIn scraping job

Scrape LinkedIn profiles and companies using Voyager API. Requires mobile proxy.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderPublicLinkedin/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "mode": "get_company",
    "public_id": "microsoft",
    "linkedin_url": "https://www.linkedin.com/company/microsoft/",
    "keywords": "AI startup funding",
    "max_results": 10,
    "location": "string",
    "company": "string",
    "title": "string",
    "industry": "string",
    "store_logo": true,
    "include_posts": false,
    "test": false,
    "skip_proxy": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderPublicLinkedin/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"mode": "get_company", "public_id": "microsoft", "linkedin_url": "https://www.linkedin.com/company/microsoft/", "keywords": "AI startup funding", "max_results": 10, "location": "string", "company": "string", "title": "string", "industry": "string", "store_logo": true, "include_posts": false, "test": false, "skip_proxy": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderPublicLinkedin/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"mode": "get_company", "public_id": "microsoft", "linkedin_url": "https://www.linkedin.com/company/microsoft/", "keywords": "AI startup funding", "max_results": 10, "location": "string", "company": "string", "title": "string", "industry": "string", "store_logo": true, "include_posts": false, "test": false, "skip_proxy": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"mode": "get_company", "public_id": "microsoft", "linkedin_url": "https://www.linkedin.com/company/microsoft/", "keywords": "AI startup funding", "max_results": 10, "location": "string", "company": "string", "title": "string", "industry": "string", "store_logo": true, "include_posts": false, "test": false, "skip_proxy": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderPublicLinkedin/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderLanding/submit

Submit landing page capture job

Capture landing pages with screenshots, HTML bundles, and AI-extracted marketing content.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderLanding/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "url": "https://tracking.example.com/redirect?ad_id=123",
    "ad_id": "string",
    "options": {
      "capture_screenshot": true,
      "capture_full_page": true,
      "capture_html_bundle": true,
      "extract_content": true,
      "dismiss_popups": true,
      "scroll_for_lazy_load": true,
      "viewport": {},
      "timeout_seconds": 60,
      "max_redirects": 10
    },
    "test": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderLanding/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"url": "https://tracking.example.com/redirect?ad_id=123", "ad_id": "string", "options": {"capture_screenshot": true, "capture_full_page": true, "capture_html_bundle": true, "extract_content": true, "dismiss_popups": true, "scroll_for_lazy_load": true, "viewport": {}, "timeout_seconds": 60, "max_redirects": 10}, "test": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderLanding/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"url": "https://tracking.example.com/redirect?ad_id=123", "ad_id": "string", "options": {"capture_screenshot": true, "capture_full_page": true, "capture_html_bundle": true, "extract_content": true, "dismiss_popups": true, "scroll_for_lazy_load": true, "viewport": {}, "timeout_seconds": 60, "max_redirects": 10}, "test": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"url": "https://tracking.example.com/redirect?ad_id=123", "ad_id": "string", "options": {"capture_screenshot": true, "capture_full_page": true, "capture_html_bundle": true, "extract_content": true, "dismiss_popups": true, "scroll_for_lazy_load": true, "viewport": {}, "timeout_seconds": 60, "max_redirects": 10}, "test": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderLanding/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderVideo/submit

Submit video stitching job

Stitch AI-generated video scenes into final video using Remotion.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderVideo/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "projectName": "string",
    "aspectRatio": "9:16",
    "scenes": [
      {
        "videoUrl": "string",
        "durationInSeconds": 0.0
      }
    ],
    "transitionDurationInFrames": 15,
    "musicUrl": "string",
    "musicVolume": 0.3,
    "preprocess": {
      "enabled": false
    },
    "upload": {
      "enabled": false
    },
    "test": false
  },
  "priority": 5
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderVideo/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"projectName": "string", "aspectRatio": "9:16", "scenes": [{"videoUrl": "string", "durationInSeconds": 0.0}], "transitionDurationInFrames": 15, "musicUrl": "string", "musicVolume": 0.3, "preprocess": {"enabled": false}, "upload": {"enabled": false}, "test": false}, "priority": 5},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderVideo/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"projectName": "string", "aspectRatio": "9:16", "scenes": [{"videoUrl": "string", "durationInSeconds": 0.0}], "transitionDurationInFrames": 15, "musicUrl": "string", "musicVolume": 0.3, "preprocess": {"enabled": false}, "upload": {"enabled": false}, "test": false}, "priority": 5})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"projectName": "string", "aspectRatio": "9:16", "scenes": [{"videoUrl": "string", "durationInSeconds": 0.0}], "transitionDurationInFrames": 15, "musicUrl": "string", "musicVolume": 0.3, "preprocess": {"enabled": false}, "upload": {"enabled": false}, "test": false}, "priority": 5}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderVideo/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderVideo/extract-frames/submit

Extract numbered image sequence from a video (scroll-sequence pipeline)

Run ffmpeg against a source video to produce a numbered sequence of web-optimized WebP/JPEG frames suitable for canvas + GSAP ScrollTrigger scroll-linked image sequences. Output manifest plugs directly into the sys-scroll-sequence system component as {base_url, pattern, count}.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderVideo/extract-frames/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "aspectRatio": "9:16",
    "musicUrl": "https://example.com/music.mp3",
    "musicVolume": 0.3,
    "projectName": "my-video",
    "scenes": [
      {
        "durationInSeconds": 5,
        "videoUrl": "https://example.com/scene1.mp4"
      },
      {
        "durationInSeconds": 3,
        "videoUrl": "https://example.com/scene2.mp4"
      }
    ],
    "transitionDurationInFrames": 15,
    "upload": {
      "enabled": true
    }
  },
  "priority": 5
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderVideo/extract-frames/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"aspectRatio": "9:16", "musicUrl": "https://example.com/music.mp3", "musicVolume": 0.3, "projectName": "my-video", "scenes": [{"durationInSeconds": 5, "videoUrl": "https://example.com/scene1.mp4"}, {"durationInSeconds": 3, "videoUrl": "https://example.com/scene2.mp4"}], "transitionDurationInFrames": 15, "upload": {"enabled": true}}, "priority": 5},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderVideo/extract-frames/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"aspectRatio": "9:16", "musicUrl": "https://example.com/music.mp3", "musicVolume": 0.3, "projectName": "my-video", "scenes": [{"durationInSeconds": 5, "videoUrl": "https://example.com/scene1.mp4"}, {"durationInSeconds": 3, "videoUrl": "https://example.com/scene2.mp4"}], "transitionDurationInFrames": 15, "upload": {"enabled": true}}, "priority": 5})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"aspectRatio": "9:16", "musicUrl": "https://example.com/music.mp3", "musicVolume": 0.3, "projectName": "my-video", "scenes": [{"durationInSeconds": 5, "videoUrl": "https://example.com/scene1.mp4"}, {"durationInSeconds": 3, "videoUrl": "https://example.com/scene2.mp4"}], "transitionDurationInFrames": 15, "upload": {"enabled": true}}, "priority": 5}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderVideo/extract-frames/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderSocial/submit

Submit a Social Media Enrichment (contact recovery) job

Recover a missing email, phone, real website, or social links for ONE business from its known social handles. If the business already has a usable email, the job self-skips. Returns a job_id — poll /api/v1/jobs/{job_id}/results for the recovered fields (or the skip reason). Access is entitlement-gated (Social Media Enrichment plan).

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderSocial/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "social_media": {},
    "website": "string",
    "email": "string",
    "phone": "string",
    "place_id": "string",
    "campaign_id": "string",
    "business_name": "string",
    "country_code": "string",
    "test": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderSocial/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"social_media": {}, "website": "string", "email": "string", "phone": "string", "place_id": "string", "campaign_id": "string", "business_name": "string", "country_code": "string", "test": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderSocial/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"social_media": {}, "website": "string", "email": "string", "phone": "string", "place_id": "string", "campaign_id": "string", "business_name": "string", "country_code": "string", "test": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"social_media": {}, "website": "string", "email": "string", "phone": "string", "place_id": "string", "campaign_id": "string", "business_name": "string", "country_code": "string", "test": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderSocial/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderPR/submit

Submit a press-release wire-distribution job

Distribute a press release over the newswire. Submit a release (title + body, plus optional summary/category/tags/contact); returns a job_id — poll /api/v1/jobs/{job_id}/results for the published URL and wire report once the release goes live.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderPR/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "title": "Acme Corp launches AI-powered widget",
    "body": "string",
    "summary": "string",
    "category": "string",
    "tags": [
      "string"
    ],
    "contact": {
      "name": "Jane Doe",
      "email": "press@example.com",
      "phone": "+1-555-123-4567"
    },
    "provider": "prnow",
    "scheduled_release_at": "2026-01-01T00:00:00Z",
    "test": false
  },
  "priority": 5
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderPR/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"title": "Acme Corp launches AI-powered widget", "body": "string", "summary": "string", "category": "string", "tags": ["string"], "contact": {"name": "Jane Doe", "email": "press@example.com", "phone": "+1-555-123-4567"}, "provider": "prnow", "scheduled_release_at": "2026-01-01T00:00:00Z", "test": false}, "priority": 5},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderPR/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"title": "Acme Corp launches AI-powered widget", "body": "string", "summary": "string", "category": "string", "tags": ["string"], "contact": {"name": "Jane Doe", "email": "press@example.com", "phone": "+1-555-123-4567"}, "provider": "prnow", "scheduled_release_at": "2026-01-01T00:00:00Z", "test": false}, "priority": 5})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"title": "Acme Corp launches AI-powered widget", "body": "string", "summary": "string", "category": "string", "tags": ["string"], "contact": {"name": "Jane Doe", "email": "press@example.com", "phone": "+1-555-123-4567"}, "provider": "prnow", "scheduled_release_at": "2026-01-01T00:00:00Z", "test": false}, "priority": 5}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderPR/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderConvert/submit

Convert a document to markdown (async)

Convert PDF / DOCX / XLSX / PPTX / CSV / HTML / image documents to markdown. Returns 202 + a job_id — poll GET /api/v1/jobs/{job_id}/results for the conversion.

This endpoint is asynchronous by design. Extraction runs OCR and office-suite conversion that can take minutes on large scanned documents; it is not a request-cycle operation. Submit, then poll.

Supply exactly one of media_id (a SpiderMedia upload) or content_base64 (inline, small files). To POST a file directly, use /api/v1/jobs/spiderConvert/upload.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderConvert/submit' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "payload": {
    "media_id": "med_01J9X2QK7B8",
    "content_base64": "string",
    "filename": "safety-data-sheet.pdf",
    "mime_type": "application/pdf",
    "full_text": false,
    "ocr": "auto",
    "test": false
  },
  "priority": 0
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderConvert/submit",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"payload": {"media_id": "med_01J9X2QK7B8", "content_base64": "string", "filename": "safety-data-sheet.pdf", "mime_type": "application/pdf", "full_text": false, "ocr": "auto", "test": false}, "priority": 0},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderConvert/submit", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"payload": {"media_id": "med_01J9X2QK7B8", "content_base64": "string", "filename": "safety-data-sheet.pdf", "mime_type": "application/pdf", "full_text": false, "ocr": "auto", "test": false}, "priority": 0})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"payload": {"media_id": "med_01J9X2QK7B8", "content_base64": "string", "filename": "safety-data-sheet.pdf", "mime_type": "application/pdf", "full_text": false, "ocr": "auto", "test": false}, "priority": 0}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderConvert/submit", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
202Successful Response
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
POST/api/v1/jobs/spiderConvert/upload

Upload a document for markdown conversion (async, multipart)

Multipart variant of /spiderConvert/submit — POST the file itself. Returns 202 + a job_id.

Maximum 10 MB. This is the nginx client_max_body_size for /api/v1/, not an arbitrary application choice; a larger body is rejected by the proxy before it reaches the API. For bigger documents, upload to SpiderMedia and submit the media_id instead.

Try it

Examples

cURL
curl -X POST 'https://spideriq.ai/api/v1/jobs/spiderConvert/upload' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "file": "string",
  "full_text": false,
  "ocr": "auto",
  "test": false
}'
Python
import httpx

resp = httpx.post(
    "https://spideriq.ai/api/v1/jobs/spiderConvert/upload",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"file": "string", "full_text": false, "ocr": "auto", "test": false},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderConvert/upload", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"file": "string", "full_text": false, "ocr": "auto", "test": false})
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"file": "string", "full_text": false, "ocr": "auto", "test": false}`)
	req, _ := http.NewRequest("POST", "https://spideriq.ai/api/v1/jobs/spiderConvert/upload", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
202Successful Response
201Job created and queued successfully
401Authentication failed
403Client account is inactive
422Validation error - Invalid payload
429Rate limit exceeded
500Internal server error
503Queue service unavailable
GET/api/v1/jobs/spiderConvert/{job_id}/content

Fetch the full markdown of a conversion stored in object storage

When a conversion's markdown exceeds the inline threshold (256 KB by default — DOCUMENT_STORAGE_THRESHOLD_KB) it is written to object storage and the job result carries a storage_key instead of a body (SpiderMail LEARNINGS §11). This is where you follow that key.

🔑 There is only a key to follow if the conversion was submitted with full_text=true. That flag is evaluated before the size threshold, so an over-threshold document requested without it is never stored and this route 404s — correctly. Check truncation_notice on the result before reading a 404 here as a storage failure.

Returns text/markdown, not JSON — the payload is by definition large and wrapping it in a JSON string helps nobody.

This is not a way around extraction_truncated. If that flag is true the missing text was never extracted, so it is not here either.

Parameters

NameInTypeRequiredDescription
job_idpathstringtrue
Try it
Query

Examples

cURL
curl -X GET 'https://spideriq.ai/api/v1/jobs/spiderConvert/{job_id}/content' \
  -H 'Authorization: Bearer <token>'
Python
import httpx

resp = httpx.get(
    "https://spideriq.ai/api/v1/jobs/spiderConvert/{job_id}/content",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
JavaScript
const resp = await fetch("https://spideriq.ai/api/v1/jobs/spiderConvert/{job_id}/content", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
Go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://spideriq.ai/api/v1/jobs/spiderConvert/{job_id}/content", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}

Responses

StatusDescription
200The complete markdown.
404No such job for this client, or it has no stored content.
503Object storage is unreachable.
422Validation Error