# Discover nodes and templates

> Discover current node schemas and owned template endpoints, preserve their identifiers, follow opaque cursors, and build requests from the returned contract.

Source: https://kaitoi.io/docs/core/discovery/
Section: Kaitoi Core / REST API
Written for: Developers discovering operations and application-ready workflows.
Last reviewed: 2026-10-24

---

Discover current operations before constructing a graph or application.
Node types and templates are account-dependent; a label from an old example
is not a stable substitute for the schema the server returns.

All routes here are relative to `/api/v1`.

## Carry identity from search to execution


Search helps find candidates; details establish their callable identity and current input schema. A display name or category is not a substitute for the returned identifier. Read required inputs, types and defaults before building a request. Recheck discovery when availability changes instead of guessing an older name.

Resize Image illustrates exact inputImage and outputImage pin names. Two independently named instances use scale factors 0.5 and 0.25; those instance IDs are distinct from the operation type returned by discovery. The interface is an excerpt, not its complete schema.

*Figure: Use the exact runnable identity and schema returned by discovery.*

## Search node types

Use `GET /node-types` with `node_types:read`. Supported query fields include
`search`, `limit`, opaque `cursor`, and optional comma-separated `fields`.
The default limit is 50 and maximum is 200. Keep the returned `type` identifier,
including any path segments.

Read `GET /node-types/{node_type}` for detailed pins, widgets, defaults,
requirements, and help. Use exact pin identifiers in connections and run
inputs. The display title is not the type, and a type is not a graph instance ID.

## Discover application-ready templates

Use `GET /templates` with `templates:read`. Search by text and use
`hasEndpoint=true` when looking for active workflow endpoints. This REST list
describes the caller's owned templates; do not assume it is the entire
community catalog. Follow the returned cursor instead of constructing one.

Read `GET /templates/{template_id}/endpoints`, then
`GET /templates/{template_id}/endpoints/{endpoint_id}/docs`. The generated
contract describes API field names, required/default values, file input shapes,
and owner/external routes. It does not disclose an endpoint's secret key.

## Keep discovery and execution separate

**Node type:** discover the current operation and its exact pins. **Instance:**
assign a stable node ID when placing that type in a graph. **Template endpoint:**
read exposed API field names and the generated request contract. Discovery
does not run work, reveal endpoint secrets, or guarantee provider access.
Cursors are opaque and signed thumbnail URLs should not receive REST secrets.

## Build from the returned contract

Preserve schema identifiers and the request shape for the operation you mean
to call. A thumbnail URL has its own access mechanism: do not attach your REST
bearer secret to signed media URLs. A discoverable type or template may still
need configured providers, inputs, capabilities, or permission to execute.

See [Projects and graph documents](/docs/core/projects-and-graphs/) for editing,
[Workflow API endpoints](/docs/core/workflow-endpoints/) for application fields,
and [Runs, progress and cancellation](/docs/core/runs-and-files/) for execution.
