Skip to main content

Incubate API

The Incubate API enables async/deferred prompt execution with built-in concurrency limiting. Unlike the synchronous /prompt endpoint, incubate queues prompts for background execution with status tracking.
Use Incubate for background jobs, scheduled tasks, or when you need concurrency control per developer.

Concurrency Limits

Each developer gets a concurrency limit based on their subscription tier:
TierConcurrent TasksPlan Seconds
Hobby/Free2< 3.5M
Starter5>= 3.5M
Pro10>= 15M
Concurrency is enforced per-developer across all their projects using concurrencyKey.

Endpoints

Queue a Prompt

POST https://conjure.chucky.cloud/incubate
Queue a prompt for deferred execution.

Request Body

{
  "message": "Generate a report from yesterday's data",
  "idempotencyKey": "report-2024-01-08",
  "options": {
    "token": "your-jwt-token",
    "model": "claude-sonnet-4-5-20250929",
    "maxTurns": 10
  },
  "ttl": 60,
  "callback": {
    "url": "https://your-server.com/webhook",
    "secret": "whsec_xxx"
  }
}

Parameters

FieldTypeRequiredDescription
messagestringYesThe prompt message
idempotencyKeystringYesUnique key to prevent duplicates (per project)
optionsobjectYesSDK options including token
ttlnumberNoDelay in seconds before execution
executeAtstringNoISO 8601 timestamp for scheduled execution
callbackobjectNoWebhook for result delivery

Response

{
  "vesselId": "run_abc123xyz",
  "idempotencyKey": "report-2024-01-08",
  "status": "queued",
  "scheduledFor": "2024-01-08T10:00:00.000Z"
}

Check Status

GET https://conjure.chucky.cloud/incubate/vessel/{vesselId}
Poll the status of a queued prompt.

Response - Pending

{
  "vesselId": "run_abc123xyz",
  "status": "QUEUED",
  "taskIdentifier": "chucky-incubate",
  "isCompleted": false,
  "isSuccess": false,
  "isFailed": false,
  "createdAt": "2024-01-08T10:00:00.000Z",
  "updatedAt": "2024-01-08T10:00:01.000Z"
}

Response - Completed

{
  "vesselId": "run_abc123xyz",
  "status": "COMPLETED",
  "taskIdentifier": "chucky-incubate",
  "isCompleted": true,
  "isSuccess": true,
  "isFailed": false,
  "createdAt": "2024-01-08T10:00:00.000Z",
  "updatedAt": "2024-01-08T10:00:30.000Z",
  "startedAt": "2024-01-08T10:00:01.000Z",
  "completedAt": "2024-01-08T10:00:30.000Z",
  "output": {
    "success": true,
    "text": "Here is your generated report...",
    "result": {
      "type": "result",
      "subtype": "success",
      "total_cost_usd": 0.015
    }
  }
}

Response Fields

FieldDescription
vesselIdUnique run ID for tracking
statusCurrent execution status
isCompletedtrue when execution is complete (success or failure)
isSuccesstrue if completed successfully
isFailedtrue if execution failed
completedAtTimestamp when execution completed
outputResult payload (only when isCompleted: true)

Status Values

StatusDescription
PENDINGWaiting to be processed
QUEUEDIn queue, waiting for capacity
EXECUTINGCurrently running
COMPLETEDFinished successfully (isCompleted: true, isSuccess: true)
FAILEDExecution failed (isCompleted: true, isFailed: true)
CANCELEDCanceled by user

Batch Queue

POST https://conjure.chucky.cloud/incubate/batch
Queue multiple prompts at once (max 100 items).

Request Body

{
  "items": [
    {
      "message": "Analyze document 1",
      "idempotencyKey": "doc-1-analysis"
    },
    {
      "message": "Analyze document 2",
      "idempotencyKey": "doc-2-analysis"
    }
  ],
  "options": {
    "token": "your-jwt-token",
    "model": "claude-sonnet-4-5-20250929"
  },
  "callback": {
    "url": "https://your-server.com/webhook"
  }
}

Response

{
  "total": 2,
  "queued": 2,
  "failed": 0,
  "items": [
    {
      "index": 0,
      "idempotencyKey": "doc-1-analysis",
      "status": "queued",
      "vesselId": "run_abc123"
    },
    {
      "index": 1,
      "idempotencyKey": "doc-2-analysis",
      "status": "queued",
      "vesselId": "run_def456"
    }
  ]
}

Callback Webhooks

When a callback is configured, results are POSTed to your URL upon completion.

Callback Request

{
  "success": true,
  "text": "Generated response text...",
  "result": {
    "type": "result",
    "subtype": "success",
    "total_cost_usd": 0.015,
    "usage": {
      "input_tokens": 500,
      "output_tokens": 200
    }
  }
}

HMAC Verification

If you provide a secret in the callback config, the response includes an HMAC signature:
X-Chucky-Signature: <hmac-sha256-hex>
Verify the signature:
const crypto = require('crypto');

function verifySignature(body, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(body)
    .digest('hex');
  return signature === expected;
}

Error Responses

Missing Idempotency Key

{
  "error": "missing_idempotency_key",
  "message": "Request body must include \"idempotencyKey\" field"
}
Status: 400 Bad Request

Token Expired

{
  "error": "token_expired"
}
Status: 401 Unauthorized

Developer Budget Exhausted

{
  "error": "developer_budget_exhausted"
}
Status: 402 Payment Required

Trigger Failed

{
  "error": "trigger_failed",
  "message": "Task queue unavailable"
}
Status: 503 Service Unavailable

Examples

cURL - Queue Prompt

curl -X POST https://conjure.chucky.cloud/incubate \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Generate weekly report",
    "idempotencyKey": "weekly-report-2024-w02",
    "options": {
      "token": "your-jwt-token",
      "model": "claude-sonnet-4-5-20250929",
      "maxTurns": 10
    }
  }'

cURL - Check Status

curl https://conjure.chucky.cloud/incubate/vessel/run_abc123xyz

JavaScript - Queue and Poll

// Queue the prompt
const queueResponse = await fetch('https://conjure.chucky.cloud/incubate', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    message: 'Analyze this dataset',
    idempotencyKey: `analysis-${Date.now()}`,
    options: { token: 'your-jwt-token' },
  }),
});

const { vesselId } = await queueResponse.json();

// Poll for completion
async function waitForCompletion(vesselId, maxWaitMs = 300000) {
  const startTime = Date.now();

  while (Date.now() - startTime < maxWaitMs) {
    const response = await fetch(
      `https://conjure.chucky.cloud/incubate/vessel/${vesselId}`
    );
    const status = await response.json();

    if (status.isCompleted) {
      return status;
    }

    await new Promise(resolve => setTimeout(resolve, 2000));
  }

  throw new Error('Timeout waiting for completion');
}

const result = await waitForCompletion(vesselId);
console.log(result.output.text);

Python - With Callback

import requests
import hmac
import hashlib

# Queue with callback
response = requests.post(
    'https://conjure.chucky.cloud/incubate',
    json={
        'message': 'Generate summary',
        'idempotencyKey': 'summary-001',
        'options': {'token': 'your-jwt-token'},
        'callback': {
            'url': 'https://your-server.com/webhook',
            'secret': 'your-webhook-secret',
        },
    },
)

print(response.json())

# In your webhook handler:
def verify_webhook(body: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(
        secret.encode(),
        body,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(signature, expected)

Comparison: /prompt vs /incubate

Feature/prompt/incubate
ExecutionSynchronousAsync/deferred
ResponseImmediate resultVessel ID for polling
Concurrency controlPer-developer limitPer-developer queue
SchedulingNoYes (ttl, executeAt)
WebhooksNoYes
Batch supportNoYes (up to 100)
Best forReal-time interactionsBackground jobs, scheduled tasks