Pricing Docs MCP

Reference

Complete technical specification for Runhuman. Integration guides link here for shared details.


Job Lifecycle

Every test follows this sequence:

StatusDescriptionTerminal
pendingJob created, queued for posting to testersNo
waitingPosted to Slack, awaiting tester claimNo
workingTester claimed and is actively testingNo
completedTest finished, results extractedYes
incompleteTest finished but missing required dataYes
abandonedTester abandoned before completingYes
rejectedTester determined instructions were invalid or impossibleYes
errorSystem error occurredYes

Terminal statuses will not change. Non-terminal statuses should be polled until resolution.


Output Schema

Define the structure of data you want extracted from the tester’s response.

Format

{
  [fieldName: string]: {
    type: "boolean" | "string" | "number" | "array" | "object";
    description: string;
    example?: any;
  }
}

Example

{
  "loginWorks": {
    "type": "boolean",
    "description": "Does login work with valid credentials?"
  },
  "errorMessage": {
    "type": "string",
    "description": "What error appears for invalid password?"
  },
  "issuesFound": {
    "type": "array",
    "description": "List of any UI/UX issues discovered"
  }
}

Keep schemas simple. Testers describe findings in natural language, and GPT-4o extracts structured data matching your schema.


Cost

Tests are billed per second at $0.0018/second.

DurationCost
60 seconds$0.108
120 seconds$0.216
300 seconds (5 min)$0.54
600 seconds (10 min)$1.08

Duration is rounded up using Math.ceil(). A test lasting 61 seconds costs the same as 62 seconds. Cost is stored at full precision, not rounded to cents.


Request Parameters

These parameters apply to all job creation endpoints.

ParameterTypeRequiredDescription
urlstringYesURL for the tester to visit
descriptionstringYesInstructions for the tester
outputSchemaobjectNoSchema defining data to extract. If omitted, only success/explanation returned
targetDurationMinutesnumberNoTime limit in minutes. Default: 5. Range: 1-60
allowDurationExtensionbooleanNoAllow tester to request more time. Default: true
maxExtensionMinutesnumber or falseNoMaximum extension allowed. Default: false (unlimited)
additionalValidationInstructionsstringNoCustom instructions for AI result validation
screenSizestring or objectNoScreen size: “desktop”, “laptop”, “tablet”, “mobile”, or custom dimensions
repoNamestringNoGitHub repo (“owner/repo”) for context. Fetches README.md and CLAUDE.md
canCreateGithubIssuesbooleanNoAuto-create GitHub issues from bugs. Requires repoName. Default: false

additionalValidationInstructions

Use this parameter to guide how GPT-4o interprets results:

{
  "additionalValidationInstructions": "Ignore minor UI glitches in the header. Focus only on whether the order was placed and confirmation number displayed."
}

screenSize

Control the browser viewport for testing different devices:

PresetDimensions
desktop1920x1080
laptop1366x768
tablet768x1024
mobile375x667

Or specify custom dimensions:

{
  "screenSize": { "width": 1440, "height": 900 }
}

Response Fields

Completed jobs return these fields:

FieldTypeDescription
statusstringJob status (see Job Lifecycle)
resultobjectExtracted data matching your outputSchema
result.successbooleanWhether extraction succeeded
result.explanationstringGPT-4o’s interpretation of the test
result.dataobjectStructured data matching your schema
costUsdnumberTotal cost in USD
testDurationSecondsnumberTime the tester spent
testerResponsestringRaw natural language feedback before extraction
testerAliasstringAnonymized tester name (e.g., “Tester Alpha”)
testerAvatarUrlstringAvatar image URL for UI display
testerColorstringHex color for tester identity (e.g., “#4A90E2”)
testerDataobjectCaptured testing artifacts

Tester Data

The testerData object contains artifacts captured during the test session:

{
  testDurationSeconds: number;
  consoleMessages: Array<{
    type: string;       // "log", "error", "warn", etc.
    message: string;
    timestamp: string;
  }>;
  networkRequests: Array<{
    url: string;
    method: string;     // "GET", "POST", etc.
    status?: number;    // HTTP status code
    timestamp: string;
  }>;
  clicks: Array<{
    x: number;
    y: number;
    timestamp: string;
    element?: string;   // Element selector if available
  }>;
  screenshots: string[];  // URLs to captured screenshots
  videoUrl?: string;      // URL to session recording
}

API Endpoints

POST /api/run

Synchronous endpoint. Creates a job and waits for completion, blocking up to 10 minutes.

Request:

{
  "url": "https://example.com",
  "description": "Test the checkout flow",
  "outputSchema": {
    "checkoutWorks": { "type": "boolean", "description": "Order placed successfully?" }
  }
}

Response (200):

{
  "status": "completed",
  "result": {
    "success": true,
    "explanation": "Checkout completed successfully",
    "data": { "checkoutWorks": true }
  },
  "costUsd": 0.396,
  "testDurationSeconds": 220,
  "testerResponse": "I completed the checkout...",
  "testerAlias": "Tester Alpha",
  "testerData": { ... }
}

Response (408): Test did not complete within 10 minutes.

POST /api/jobs

Asynchronous endpoint. Creates a job and returns immediately.

Response (201):

{
  "jobId": "job_abc123",
  "message": "Job created successfully. Use GET /api/job/:id to check status."
}

GET /api/job/:jobId

Retrieves job status and results.

Response:

{
  "id": "job_abc123",
  "status": "completed",
  "result": { ... },
  "costUsd": 0.54,
  "testDurationSeconds": 300,
  "testerResponse": "...",
  "testerData": { ... }
}

Fields like result, costUsd, and testerResponse only appear when status is completed.


MCP Tools

create_job

Creates a QA job and returns immediately.

Parameters:

ParameterTypeRequiredDescription
urlstringYesURL to test
descriptionstringYesInstructions for tester
outputSchemaobjectNoJSON Schema for result extraction
targetDurationMinutesnumberNoTime limit. Default: 5
allowDurationExtensionbooleanNoAllow extra time. Default: true
maxExtensionMinutesnumber or falseNoMax extension. Default: false
additionalValidationInstructionsstringNoCustom AI validation instructions
screenSizestring or objectNoBrowser viewport size
repoNamestringNoGitHub repo for context
canCreateGithubIssuesbooleanNoAuto-create issues from bugs

Returns: Job ID and status message.

wait_for_result

Polls job status and returns results when complete.

Parameters:

ParameterTypeRequiredDescription
jobIdstringYesJob ID from create_job
waitSecondsnumberNoHow long to wait. Default: 30. Range: 1-300

Behavior:

  1. Checks status before waiting (returns immediately if already complete)
  2. Polls every 5 seconds during the wait period
  3. Returns results when job completes or suggests retrying with longer wait

Recommended pattern: Start with 30 seconds, then 45, then 60, increasing on each retry.


Error Codes

HTTP StatusMeaning
400Bad request. Invalid parameters.
401Unauthorized. Invalid or missing API key.
404Not found. Job does not exist.
408Timeout. Synchronous request exceeded 10 minutes.
500Server error.

All errors return this format:

{
  "error": "Error type",
  "message": "Detailed description"
}

Authentication

Include your API key in the Authorization header:

Authorization: Bearer YOUR_API_KEY

Get your key from the API Keys dashboard.