Skip to main content
The Mindcase Node.js SDK wraps the REST API into a clean TypeScript interface. Full type safety, async/await, and automatic error handling.

Installation

npm install mindcase

Quick Start

import { Mindcase } from 'mindcase';

const client = new Mindcase({ apiKey: 'mk_live_abc123def456' });

// Check credits
const balance = await client.credits();
console.log(`Credits: ${balance}`);

// Run an agent and get results (awaits until done)
const results = await client.run('instagram/profiles', {
  params: { usernames: ['nike', 'adidas'] }
});

console.log(`Got ${results.rowCount} profiles`);
for (const row of results) {
  console.log(`${row.Username}: ${row.Followers} followers`);
}

Client Setup

import { Mindcase } from 'mindcase';

const client = new Mindcase({
  apiKey: 'mk_live_abc123def456',   // or set MINDCASE_API_KEY env var
  baseUrl: 'https://api.mindcase.co/api/v1',  // default
  timeout: 30000,       // HTTP request timeout in ms
  pollInterval: 3000,   // ms between status polls (for run())
  runTimeout: 300000,   // max ms run() will wait
});

// Or just set the env var and omit apiKey
// process.env.MINDCASE_API_KEY = 'mk_live_...'
const client2 = new Mindcase();

Discover Agents

// List all agents across all platforms
const allAgents = await client.agents.list();
for (const a of allAgents) {
  console.log(`${a.path}: ${a.name} (${a.creditsPerRow} credits/row)`);
}

// Filter to a specific platform
const igAgents = await client.agents.list('instagram');

// Get full details + parameters for a specific agent
const agent = await client.agents.get('instagram/profiles');
console.log(agent.name);            // "Instagram Profiles"
console.log(agent.requiredParams);  // { usernames: Parameter }
console.log(agent.creditsPerRow);   // 1

Run an Agent (Sync)

Awaits until the job completes and returns results directly.
const results = await client.run('instagram/profiles', {
  params: { usernames: ['nike', 'adidas'] }
});

console.log(`Got ${results.rowCount} rows`);
console.log(`Columns: ${results.columns}`);

for (const row of results) {
  console.log(row);
}

// Override timeout per-call
const places = await client.run('google-maps/businesses', {
  params: {
    searchStringsArray: ['gym'],
    locationQuery: 'Delhi, India',
    maxCrawledPlacesPerSearch: 50
  },
  timeout: 120000,
  pollInterval: 5000,
  onStatus: (job) => console.log(`Status: ${job.status}`)
});

Run an Agent (Async)

Returns immediately with a Job object. Use client.jobs.* to manage it.
const job = await client.runAsync('instagram/profiles', {
  params: { usernames: ['nike', 'adidas'] }
});

console.log(job.id);       // "job_abc123"
console.log(job.status);   // "queued"

// ... do other work ...

// Check status later
const updated = await client.jobs.get(job.id);
if (updated.isDone) {
  const results = await client.jobs.results(job.id);
  console.log(results.data);
}

Manage Jobs

// List all jobs
const jobs = await client.jobs.list();

// Filter by status
const completed = await client.jobs.list({ status: 'completed', limit: 10 });

// Get status
const job = await client.jobs.get('job_abc123');
console.log(job.status);      // "completed"
console.log(job.rowCount);    // 3
console.log(job.creditsUsed); // 3

// Get results
const results = await client.jobs.results('job_abc123');
console.log(results.columns);              // ['Username', 'Followers', ...]
console.log(results.toList('Username'));    // ['nike', 'adidas']
console.log(results.data[0]);              // first row as object

// Cancel a running job
await client.jobs.cancel('job_abc123');

Check Credits

const balance = await client.credits();
console.log(`Credits remaining: ${balance}`);

Error Handling

import {
  Mindcase,
  AuthenticationError,
  InsufficientCreditsError,
  NotFoundError,
  RateLimitError,
  ValidationError,
} from 'mindcase';

const client = new Mindcase({ apiKey: 'mk_live_abc123def456' });

try {
  const results = await client.run('instagram/profiles', {
    params: { usernames: ['nike'] }
  });
} catch (err) {
  if (err instanceof AuthenticationError) {
    console.log('Invalid API key');
  } else if (err instanceof InsufficientCreditsError) {
    console.log(`Need more credits: ${err.message}`);
  } else if (err instanceof RateLimitError) {
    console.log('Too many requests, slow down');
  } else if (err instanceof ValidationError) {
    console.log(`Bad parameters: ${err.message}`);
  } else if (err instanceof NotFoundError) {
    console.log('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

import { Mindcase } from 'mindcase';

const client = new Mindcase({ apiKey: 'mk_live_abc123def456' });

// 1. Check credits
const balance = await client.credits();
console.log(`Credits: ${balance}`);

// 2. Browse agents
const agents = await client.agents.list('google-maps');
for (const a of agents) {
  console.log(`  ${a.path}: ${a.name} (${a.creditsPerRow} credits/row)`);
}

// 3. Run a search
const results = await client.run('google-maps/businesses', {
  params: {
    searchStringsArray: ['coffee shop'],
    locationQuery: 'Mumbai, India',
    maxCrawledPlacesPerSearch: 20
  },
  onStatus: (job) => console.log(`Status: ${job.status}`)
});

// 4. Process results
console.log(`\nFound ${results.rowCount} coffee shops:`);
for (const place of results) {
  const name = place.title ?? 'Unknown';
  const rating = place.totalScore ?? 'N/A';
  const reviews = place.reviewsCount ?? 0;
  console.log(`  ${name}${rating} stars (${reviews} reviews)`);
}