Reference
Management API
Create and control simulations from scripts, CI and your own tools. JSON in, JSON out.
Base URL and authentication
All endpoints live under https://api.slurry.io/v1. Authenticate with an account key in the Authorization header. Keys carry scopes (simulations:read, simulations:write), and can be restricted to IP ranges and given an expiry.
curl https://api.slurry.io/v1/simulations \
-H "Authorization: Bearer $SLURRY_ACCOUNT_KEY"Errors
Errors use conventional HTTP status codes and a consistent body.
{
"error": {
"code": "invalid_request",
"message": "hours: Too big: expected number to be <=720"
}
}| Status | Code | When |
|---|---|---|
| 400 | invalid_request | The body failed validation. |
| 400 | bad_request | The request made sense but cannot be done, for example an invalid CIDR range. |
| 400 | unsafe_url | A webhook URL points at a private or internal address. |
| 401 | unauthorised | Missing, invalid, revoked or expired key. |
| 402 | payment_required | No active subscription. |
| 402 | plan_limit | Creating this would exceed your plan. |
| 402 | no_credit | Not enough generation credit for the requested work. |
| 403 | unauthorised | Key lacks a scope, IP not allowed, or account suspended. |
| 404 | not_found | No such simulation or library entry in your account. |
| 422 | invalid_spec | The uploaded spec could not be parsed. |
Endpoints
/v1/librarySearch the library. Query: q, vertical, limit (max 200).
{
"data": [
{ "slug": "asana", "name": "Asana", "provider": "Asana",
"vertical": "project-management", "description": "...", "operations": 213 }
]
}/v1/simulationsList your simulations.
Scope simulations:read
{
"data": [
{ "id": "4f0c2a8e-...", "name": "Acme projects", "slug": "acme-projects",
"status": "running", "url": "https://acme-projects.slurry.io", ... }
]
}/v1/simulationsCreate a simulation from library (a slug) or spec (OpenAPI JSON or YAML as a string, up to 5 MB). Optional: name, slug, instructions (up to 2,000 characters), volume, seedRecords, ipAllowlist, ipRestrictionEnabled, useModel. The creating IP is added to the allow-list automatically.
Scope simulations:writeReturns 201
{
"library": "asana",
"slug": "acme-projects",
"volume": { "tasks": 400, "projects": 12 },
"ipAllowlist": ["203.0.113.0/24"]
}{
"id": "4f0c2a8e-...",
"slug": "acme-projects",
"url": "https://acme-projects.slurry.io",
"status": "queued",
"apiKey": "slurry_sim_...",
"note": "Store the apiKey now: it is shown once. ..."
}/v1/simulations/{id}Everything about one simulation: status, API summary, collections with record counts, events, behaviour plan, access settings, keys (prefixes only), rules and webhooks. {id} accepts the id or the slug.
{
"id": "4f0c2a8e-...", "slug": "acme-projects", "status": "running",
"api": { "title": "Asana", "version": "1.0", "basePath": "", "operations": 213 },
"collections": [ { "name": "tasks", "records": 400, "statusField": "status", ... } ],
"events": ["task.created", "task.updated", "task.deleted"],
"access": { "ipRestrictionEnabled": true, "ipAllowlist": ["203.0.113.0/24"] },
"keys": [...], "rules": [...], "webhooks": [...]
}/v1/simulations/{id}Delete a simulation and all of its data. Irreversible.
Scope simulations:writeReturns 204
/v1/simulations/{id}/pausePause: requests get 503 and the schedule stops.
Scope simulations:write
{ "ok": true }/v1/simulations/{id}/resumeResume a paused simulation.
Scope simulations:write
{ "ok": true }/v1/simulations/{id}/resetRegenerate the world from its original seed, in the background.
Scope simulations:write
{ "ok": true }/v1/simulations/{id}/fast-forwardRun the behaviour plan as if hours passed (0.25 to 720).
Scope simulations:write
{ "hours": 168 }{ "hours": 168, "changes": 412 }/v1/simulations/{id}/behaviourReplace the behaviour plan. The plan is validated against the data model and limits; invalid steps are dropped.
Scope simulations:write
{ "rules": [ { "id": "churn", "name": "Weekly churn", "everySeconds": 3600,
"enabled": true, "steps": [ { "kind": "delete", "collection": "tasks", "fraction": 0.01 } ] } ] }/v1/simulations/{id}/rulesAdd a response rule. See Rules.
Scope simulations:writeReturns 201
{
"name": "Slow search",
"kind": "latency",
"method": "GET",
"pathPattern": "/tasks*",
"config": { "latencyMs": 1500, "latencyJitterMs": 500 }
}/v1/simulations/{id}/rules/{ruleId}Remove a rule.
Scope simulations:writeReturns 204
/v1/simulations/{id}/webhooksRegister a public https endpoint. events accepts exact names, *, or prefixes such as task.*.
Scope simulations:writeReturns 201
{ "url": "https://example.com/hooks/slurry", "events": ["task.*"] }{
"id": "b7e1...",
"url": "https://example.com/hooks/slurry",
"events": ["task.*"],
"secret": "whsec_...",
"note": "Verify deliveries with the Slurry-Signature header: ..."
}/v1/simulations/{id}/accessChange the IP allow-list (up to 50 IPs or CIDR ranges) or switch restriction on or off.
Scope simulations:write
{ "ipRestrictionEnabled": true, "ipAllowlist": ["203.0.113.7", "198.51.100.0/24"] }{ "ok": true }/v1/simulations/{id}/keysIssue another simulation key, for example one per CI system.
Scope simulations:writeReturns 201
{ "name": "GitHub Actions" }{ "apiKey": "slurry_sim_...", "note": "Shown once." }/v1/simulations/{id}/records/{collection}Read records directly, bypassing the simulated API. Query: limit, offset.
/v1/simulations/{id}/eventsThe latest 100 data change events.
/v1/simulations/{id}/logsThe latest 100 requests: method, path, status, duration, source IP, operation.
/v1/usagePlan, subscription status, credit balance and this month’s usage.
{
"plan": "team", "status": "active", "creditUsd": 7.42,
"requestsThisMonth": 18230, "requestLimit": 500000,
"simulations": 4, "simulationLimit": 15
}