Skip to main content

Squillify development is paused indefinitely. Read why, and discover what this experiment achieved. Read the story

REST API Reference

Everything you need to work with the Squillify REST API in one place — execute MicroSkills, browse the catalog, and keep an eye on your usage.

Base URL

https://api.squillify.com

Every endpoint below is relative to this base. How you authenticate depends on the endpoint you’re hitting — the Authentication docs have the details when you need them.

POST /v1/execute

This is your main endpoint for running a MicroSkill over REST — the one you’ll reach for most often.

Headers

HeaderRequiredDescription
X-API-Key or AuthorizationYesYour Squillify API key (X-API-Key: sq_live_... or Authorization: Bearer sq_live_...)
Content-TypeYesapplication/json

Request body

Schemajson
{
  "skillKey": "text.slugify",
  "input": {
    "text": "Hello World Example"
  },
  "version": "1.0.0"
}
FieldTypeRequiredDescription
skillKeystringYesThe MicroSkill to execute (e.g. text.slugify)
inputobjectNoMicroSkill-specific input. Defaults to empty object if omitted.
versionstringNoPin a specific MicroSkill version. Defaults to latest.

Response (200)

Success responsejson
{
  "output": {
    "slug": "hello-world-example"
  },
  "metadata": {
    "skill_key": "text.slugify",
    "latency_ms": 3,
    "request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "executed_at": "2026-06-03T07:21:00Z",
    "version_pinned": false
  }
}

On success, we hand you back your quota headers so you always know where you stand: X-Quota-Limit, X-Quota-Used, X-Quota-Remaining, and X-Quota-Reset.

Full example

cURLbash
curl -X POST https://api.squillify.com/v1/execute \
  -H "X-API-Key: sq_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "skillKey": "text.slugify",
    "input": { "text": "Quarterly Report: Europe / Q1 2026" }
  }'

Catalog endpoints (public)

The catalog is open to everyone — no authentication needed. To keep it healthy for all, it’s rate-limited to 60 requests per minute per IP.

GET /api/v1/catalog/skills

Browse the MicroSkills in the public catalog. You’ll get a paginated response so large catalogs stay easy to page through.

ParameterTypeDescription
qstringSearch query (natural language or keywords)
categorystringFilter by category (e.g. text, data, schema)
tagstringFilter by tag
limitintegerPage size (1–100, default 20)
cursorstringPagination cursor from a previous response
Responsejson
{
  "data": [
    {
      "name": "text.slugify",
      "version": "1.0.0",
      "category": "text",
      "categoryLabel": "Text Processing",
      "title": "Slugify text",
      "summary": "Converts text into a lowercase URL-safe slug.",
      "description": "Converts arbitrary text into a lowercase, hyphen-separated, URL-safe slug...",
      "deterministic": true,
      "mode": "strict",
      "latencyClass": "instant",
      "tags": ["text", "url", "slug"],
      "capabilities": ["DETERMINISTIC"],
      "inputSchema": [
        {
          "name": "text",
          "type": "string",
          "description": "The text to slugify.",
          "required": true
        }
      ],
      "outputSchema": [
        {
          "name": "slug",
          "type": "string",
          "description": "The generated slug.",
          "required": true
        }
      ],
      "costModel": {
        "meter": "calls",
        "creditWeight": 1,
        "description": "1 execution credit per call"
      },
      "relevance": 0.95,
      "deprecated": false
    }
  ],
  "limit": 20,
  "cursor": "20",
  "hasMore": true,
  "totalCount": 44,
  "schemaVersion": "1.0"
}

When you search (q), each result comes with a relevancescore so you can see how well it matched. Once you’ve reached the last page, the cursor field comes back as null.

GET /api/v1/catalog/skills/{name}

Get the full picture of a specific MicroSkill, including its complete input and output schemas and the embedded documentation that comes with it — examples, use cases, and related MicroSkills.

GET /api/v1/catalog/skills/{name}/{version}

Pin down and fetch a specific version of a MicroSkill.

GET /api/v1/catalog/skills/{name}/docs

Pull the documentation for a specific MicroSkill — everything you need to get going, including examples, recommended use cases, related MicroSkills, and agent guidance.

GET /api/v1/catalog/categories

List every MicroSkill category, each with its tool count.

Responsejson
[
  { "value": "text", "label": "Text Processing", "toolCount": 25 },
  { "value": "schema", "label": "Schema Validation", "toolCount": 7 },
  { "value": "platform", "label": "Platform Utilities", "toolCount": 5 },
  { "value": "data", "label": "Data Processing", "toolCount": 1 },
  { "value": "security", "label": "Security", "toolCount": 1 },
  { "value": "math", "label": "Mathematics", "toolCount": 1 }
]

GET /api/v1/catalog/sitemap

Grab sitemap data for all public MicroSkills — handy when you’re generating a static site.

Runtime skill discovery (API key)

Want to discover skills straight over REST, scoped to exactly what your API key can use? These three endpoints let you browse, search, and fetch contracts without loading the whole catalog into context. They’re authenticated with your API key, and they never run a skill, touch your quota, or count against billing.

Note
These need a standard API key with the skills:read scope. A scoped execution token (sq_exec_*) can’t be used here — you’ll get EXEC_TOKEN_FORBIDDEN_SURFACE.

GET /v1/runtime/skills

Browse the skills your key can use, in a stable order. This is a plain listing — it doesn’t rank, so it turns away search-only params like query and includeContract.

ParameterTypeDescription
limitintegerPage size (default 20, max 100)
cursorstringPagination cursor from a previous response
categorystringFilter by category
capabilitystringFilter by capability
includeDeprecatedbooleanInclude deprecated skills (default false)
categoryModestringHow we read your category: resolve (default) or exact

Ranked search across the skills your key can use. A non-blank queryis required — if you just want to list, use browse above. When exactly one skill matches, you can have us embed its full contract right in the result.

ParameterTypeRequiredDescription
querystringYesNatural language or keyword query. Max 200 characters.
limitintegerNoPage size (default 10, max 25)
cursorstringNoPagination cursor
categorystringNoFilter by category
capabilitystringNoFilter by capability
includeDeprecatedbooleanNoInclude deprecated skills (default false)
includeContractstringNoEmbed the contract when the match is unambiguous: if_exact or if_unique. Default none.
categoryModestringNoresolve (default) or exact
Search response (200)json
{
  "items": [
    {
      "skillKey": "identity.validate_email_syntax",
      "name": "identity.validate_email_syntax",
      "description": "Validate whether a string follows a valid email address syntax.",
      "latestVersion": "1.0.0",
      "deprecated": false,
      "executable": true,
      "contractUrl": "/v1/runtime/skills/identity.validate_email_syntax/contract",
      "matchType": "FUZZY",
      "relevanceScore": 0.94,
      "rank": 1
    }
  ],
  "nextCursor": null,
  "totalAvailable": 44,
  "totalMatches": 3,
  "queryUsed": "email validation",
  "contractExpanded": false,
  "contractExpansionMode": "none"
}

Send a categoryand we’ll also return a categoryResolution object telling you how we interpreted it (requested, resolved, mode, confidence, and taxonomyVersion). totalAvailable and totalMatches are always scoped to what your key can reach.

GET /v1/runtime/skills/{skillKey}/contract

Fetch the versioned input/output contract, limits, deprecation state, executability, and a contractDigest for one skill. Pass an optional versionto pin it. If the skill doesn’t exist or isn’t available to your key, you get a single, non-revealing 404 SKILL_NOT_FOUND either way.

MCP transport

MethodPathDescription
GET/POST/DELETE/mcpMCP Streamable HTTP transport

You authenticate the MCP endpoint with X-API-Key or Authorization: Bearer sq_live_*. When you’re ready to wire it up, the MCP Connection docs walk you through the configuration.

Error handling

When something goes wrong, you’ll always get the same consistent JSON shape back — no guessing how to parse it:

Error responsejson
{
  "error": {
    "code": "SKILL_NOT_ACCESSIBLE",
    "message": "The requested skill is not accessible with the current credentials.",
    "request_id": "a1b2c3d4-..."
  }
}

You’ll find the request_id field on execution errors. Authentication errors from the API key filter omit it.

Common error codes

HTTPCodeDescription
401INVALID_API_KEYMissing, invalid, expired, or revoked API key
401INVALID_AUTH_METHODJWT used on runtime surface (API key required)
403SKILL_NOT_ACCESSIBLEKey does not have access to the requested MicroSkill (not granted, not enabled, or access mode is NONE)
403TOOL_DISABLEDMicroSkill has been disabled by admin
404SKILL_NOT_ACCESSIBLEThe requested MicroSkill does not exist
400VALIDATION_ERRORThe input payload failed validation against the MicroSkill schema
429RATE_LIMIT_EXCEEDEDPer-key rate limit exceeded — back off and retry
429QUOTA_EXCEEDEDMonthly quota exceeded
504EXECUTION_TIMEOUTMicroSkill execution timed out
500INTERNAL_ERRORServer error — include request_id when contacting support
Tip
Hang onto the request_idfrom error responses — it’s worth it. It ties straight back to the invocation in your Usage dashboard and lets Squillify support get to the bottom of any issue fast.

Health check

The health and info endpoints are always open and never ask for authentication, so you can check on us anytime:

cURLbash
curl https://api.squillify.com/actuator/health
Responsejson
{ "status": "UP" }

Authenticated endpoints

Once you’re authenticated, you get more than the public catalog and the execute endpoint. Here are the endpoint groups open to you:

API key endpoints (runtime)

MethodPathDescription
POST/v1/executeExecute a MicroSkill (documented above)
GET/v1/runtime/skillsBrowse the skills your key can use (documented above)
GET/v1/runtime/skills/searchRanked skill search scoped to your key (documented above)
GET/v1/runtime/skills/{skillKey}/contractFetch a skill contract + digest (documented above)
GET/POST/DELETE/mcpMCP transport (see MCP Connection docs)