Appearance
Workflows Fresh
Workflows combine multiple API sections into automated pipelines. Where SOPs teach you one procedure, workflows show you how to chain them together at scale.
Available Workflows
| Workflow | APIs Used | Output |
|---|---|---|
| Full SEO Audit Pipeline | Backlinks, On-Page, SERP, Keywords | Comprehensive site audit report |
| Competitor Analysis | SERP, Backlinks, Labs | Competitor comparison matrix |
| AI Search Visibility | AI Optimization, AI Mode SERP, SERP | AI mention tracking dashboard |
When to Use Workflows vs. SOPs
- SOPs — Single procedure, one data type, one API section. Run when you need a specific answer.
- Workflows — Multiple procedures chained together, multiple API sections, automated output. Run on a schedule or triggered by a client onboarding event.
Workflow Design Principles
1. Task-based over Live All workflows use task-based endpoints. The 5–120 second delay is worth the significant cost savings at scale.
2. Parallel where possible Backlink crawls and on-page crawls can run simultaneously. Keywords data and SERP tasks can run simultaneously. Structure your code to fire independent tasks in parallel.
3. Rate limit awareness DataForSEO enforces rate limits per account. If you're running multiple workflows concurrently, add delays between task_post calls and stagger by API section.
4. Result persistence Always write results to disk or a database before processing. If parsing fails, you can re-parse without re-fetching.
5. Error handling Tasks can fail. Always check status_code on each task in the response. Log failures and retry before giving up.
Shared Python Client
All workflows use this shared auth client:
python
import os
import requests
from requests.auth import HTTPBasicAuth
class DataForSEOClient:
BASE_URL = "https://api.dataforseo.com/v3"
def __init__(self):
self.auth = HTTPBasicAuth(
os.environ["DATAFORSEO_LOGIN"],
os.environ["DATAFORSEO_PASSWORD"]
)
def post(self, endpoint, payload):
response = requests.post(
f"{self.BASE_URL}/{endpoint}",
auth=self.auth,
json=payload
)
response.raise_for_status()
return response.json()
def get(self, endpoint):
response = requests.get(
f"{self.BASE_URL}/{endpoint}",
auth=self.auth
)
response.raise_for_status()
return response.json()
client = DataForSEOClient()