Skip to main content
The Mindcase Python SDK wraps the REST API into a clean Python interface. Handle authentication, polling, and error handling with a few lines of code.

Installation

pip install mindcase

Quick Start

from mindcase import MindcaseClient

client = MindcaseClient(api_key="mk_live_abc123def456")

# Check credits
credits = client.get_credits()
print(f"Credits remaining: {credits}")

# Run an agent and wait for results
results = client.run_and_wait(
    "instagram", "profile-scraper",
    params={"usernames": ["nike", "adidas"]}
)

for row in results["data"]:
    print(f"{row['username']}: {row['followersCount']} followers")

Client Reference

Initialize

from mindcase import MindcaseClient

client = MindcaseClient(
    api_key="mk_live_abc123def456",
    base_url="https://api.mindcase.co/api/v1",  # default
    timeout=30  # request timeout in seconds
)

Discover Agents

# List all agent groups
groups = client.list_groups()
# ["instagram", "linkedin", "youtube", ...]

# List agents in a group
agents = client.list_agents("instagram")
# [{"slug": "profile-scraper", "name": "...", "credits_per_row": 1}, ...]

# Get agent details with parameters
agent = client.get_agent("instagram", "profile-scraper")

Run an Agent

# Fire and forget — returns job info immediately
job = client.run("instagram", "profile-scraper",
    usernames=["nike", "adidas"]
)
print(job["job_id"])  # "job_7f3a2b1c"
print(job["status"])  # "queued"

Run and Wait for Results

# Blocks until the job completes (polls automatically)
results = client.run_and_wait(
    "instagram", "profile-scraper",
    params={"usernames": ["nike", "adidas"]},
    poll_interval=3,   # seconds between polls (default: 3)
    timeout=300,       # max wait time in seconds (default: 300)
    on_status=lambda s: print(f"Status: {s}")  # optional callback
)

print(f"Got {results['row_count']} rows")
for row in results["data"]:
    print(row)

Manage Jobs

# Get job status
job = client.get_job("job_7f3a2b1c")
print(job["status"])  # "completed"

# Get results for a completed job
results = client.get_results("job_7f3a2b1c")

# List all jobs
jobs = client.list_jobs(status="completed", limit=20)

# Cancel a running job
client.cancel_job("job_7f3a2b1c")

# Wait for a specific job
results = client.wait_for_results(
    "job_7f3a2b1c",
    poll_interval=5,
    timeout=300
)

Check Credits

credits = client.get_credits()
print(credits)  # 4850

Error Handling

The SDK raises typed exceptions for different error conditions:
from mindcase import (
    MindcaseClient,
    AuthenticationError,
    InsufficientCreditsError,
    NotFoundError,
    RateLimitError,
    ValidationError,
)

client = MindcaseClient(api_key="mk_live_abc123def456")

try:
    results = client.run_and_wait(
        "instagram", "profile-scraper",
        params={"usernames": ["nike"]}
    )
except AuthenticationError:
    print("Invalid API key")
except InsufficientCreditsError as e:
    print(f"Need more credits: {e}")
except RateLimitError:
    print("Too many requests, slow down")
except ValidationError as e:
    print(f"Bad parameters: {e}")
except NotFoundError:
    print("Agent not found")
ExceptionHTTP CodeWhen
AuthenticationError401Invalid or missing API key
InsufficientCreditsError402Not enough credits
NotFoundError404Agent or job doesn’t exist
ValidationError422Missing or invalid parameters
RateLimitError429Exceeded 60 requests/minute

Full Example

from mindcase import MindcaseClient

client = MindcaseClient(api_key="mk_live_abc123def456")

# 1. Check credits
credits = client.get_credits()
print(f"Credits available: {credits}")

# 2. Discover agents
agents = client.list_agents("google-maps")
for a in agents:
    print(f"  {a['slug']}: {a['name']} ({a['credits_per_row']} credits/row)")

# 3. Run Google Maps search
results = client.run_and_wait(
    "google-maps", "business-scraper",
    params={
        "searchStringsArray": ["coffee shop"],
        "locationQuery": "Mumbai, India",
        "maxCrawledPlacesPerSearch": 20
    },
    on_status=lambda s: print(f"Status: {s}")
)

# 4. Process results
print(f"\nFound {results['row_count']} coffee shops:")
for place in results["data"]:
    name = place.get("title", "Unknown")
    rating = place.get("totalScore", "N/A")
    reviews = place.get("reviewsCount", 0)
    print(f"  {name}{rating} stars ({reviews} reviews)")