List Blocks

List built-in and workspace-deployed blocks visible to the caller. Integration allowlists and preview visibility restrict results. Use capability=trigger for workflow starters and Get Block or Get Tool to resolve operation and tool IDs.

OAuth scope: api:read.

GET/api/v2/blocks
X-API-Key<token>

Your Sim API key, personal or workspace-scoped. Generate one under Settings, then API Keys. Operations that reject workspace keys say so in their own description.

In: header

Query Parameters

workspaceId*string

Workspace whose integration allowlist, revealed preview blocks, and deployed custom blocks decide what this catalog contains.

Length1 <= length <= 128
search?string

Case-insensitive substring match against the block id, name, and description.

Length1 <= length <= 200
category?string

Restrict to one toolbar category.

Value in"blocks" | "tools" | "triggers"
capability?string

Restrict to blocks that can start a workflow — the triggers category, blocks declaring triggerAllowed, and blocks with trigger-mode fields.

Value in"trigger"
source?string

Restrict to shipped blocks or to this workspace’s deployed custom blocks.

Value in"builtin" | "custom"
includeSunset?boolean

Include legacy and deprecated blocks. Off by default: a sunset block keeps executing where it is already placed, but it is not offered for new authoring. Each returned entry carries sunset.replacedBy, the block to build with instead.

sortBy?string

Field used to sort the result. Sorting by name is case-sensitive and follows the storage collation, so do not rely on a case-insensitive order.

Default"id"
Value in"id" | "name" | "category"
sortOrder?string

Sort direction.

Default"asc"
Value in"asc" | "desc"
limit?integer

Maximum blocks to return per page. Must be a whole number from 1 to 100. Defaults to 50.

Default50
Range1 <= value <= 100
cursor?string

Opaque cursor from the previous page. Send it back with the same sort and filters; only limit may change. Change anything else and pagination must restart without a cursor.

Length1 <= length

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://www.sim.ai/api/v2/blocks?workspaceId=string" \  -H "X-API-Key: YOUR_API_KEY"
{
  "data": [
    {
      "id": "slack",
      "name": "Slack",
      "description": "Send messages and read channels in Slack.",
      "category": "tools",
      "integrationType": "communication",
      "source": "builtin",
      "authMode": "oauth",
      "triggerAllowed": true,
      "triggerCapable": true,
      "triggerIds": [
        "slack_webhook"
      ],
      "toolIds": [
        "slack_message",
        "slack_canvas_read"
      ],
      "operationIds": [
        "send",
        "read"
      ],
      "preview": false,
      "docsLink": "https://docs.sim.ai/tools/slack",
      "tags": [
        "messaging"
      ]
    }
  ],
  "nextCursor": null
}
{
  "error": {
    "code": "BAD_REQUEST",
    "message": "Invalid request"
  }
}
{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Authentication required"
  }
}
{
  "error": {
    "code": "FORBIDDEN",
    "message": "Insufficient workspace permissions",
    "details": {
      "code": "INSUFFICIENT_WORKSPACE_ROLE"
    }
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Not found"
  }
}
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "API rate limit exceeded",
    "details": {
      "retryAfter": "2026-01-01T00:00:30.000Z"
    }
  }
}
{
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "Internal server error"
  }
}
{
  "error": {
    "code": "SERVICE_UNAVAILABLE",
    "message": "Service temporarily unavailable"
  }
}