Nodaro Docs
DocumentationNode ReferenceModelsAI Agents (MCP)DevelopersSelf-hostingResearch
REST API

Presets

Read your saved node presets, preset folders and the built-in preset catalog over REST, apply a preset to a node, and manage preset favorites.

The Presets API reads the node presets you saved in the editor and the built-in preset catalog of each node type. A preset is a named node configuration, such as a model, a prompt, an aspect ratio and a quality, that you apply to a node in one step. For API tokens the routes are read-only: you create and edit presets in the editor.

The routes work on every edition. They take a bearer token: a personal API token (ndr_…), an OAuth app token with the presets:read scope, or your session token. See Authentication and Presets for what presets do in the editor.

Endpoints

MethodPathWhat it does
GET/v1/node-presetsYour custom presets, newest first. Optional nodeType filter.
GET/v1/node-preset-groupsYour preset folders and sections. Optional nodeType filter.
GET/v1/node-presets/factoryThe built-in catalog of one node type. nodeType is required.
GET/v1/node-presets/favoritesThe preset ids you starred for one node type. nodeType is required.
POST/v1/node-presets/favoritesStar a preset. Browser session only.
DELETE/v1/node-presets/favoritesRemove a star. Browser session only.

Read your presets

GET /v1/node-presets returns { data: NodePreset[] }, newest first. Pass nodeType, for example generate-image, to list the presets of one node type.

curl "https://app.nodaro.ai/v1/node-presets?nodeType=generate-image" \
  -H "Authorization: Bearer $NODARO_API_KEY"
import { createClient, StaticTokenAuth } from '@nodaro/sdk'

const client = createClient({
  baseUrl: 'https://app.nodaro.ai',
  auth: new StaticTokenAuth(process.env.NODARO_API_KEY!),
})

const presets = await client.presets.list('generate-image')
const cinematic = presets.find((p) => p.name === 'Cinematic Portrait')
const groups = await client.presets.listGroups('generate-image')
{
  "data": [
    {
      "id": "7e2c4a9f-1b3d-4f6a-8c5e-2d9b7a1f3c4e",
      "nodeType": "generate-image",
      "name": "Cinematic Portrait",
      "description": "Warm key light, shallow depth of field",
      "data": {
        "provider": "nano-banana-pro",
        "aspectRatio": "3:4",
        "resolution": "2K",
        "prompt": "cinematic portrait, warm key light, 85mm, shallow depth of field"
      },
      "groupId": null,
      "tags": ["portrait"],
      "sortOrder": 0,
      "createdAt": "2026-09-14T08:12:40Z",
      "updatedAt": "2026-09-14T08:12:40Z"
    }
  ]
}
FieldWhat it holds
idThe preset's uuid.
nodeTypeThe node type the preset belongs to.
name, descriptionThe preset's name and an optional description.
dataThe captured node configuration. This is what you apply.
groupIdThe folder the preset is in, from GET /v1/node-preset-groups, or null.
tags, sortOrderYour tags and the preset's position in its list.
createdAt, updatedAtTimestamps.

Read the built-in catalog

GET /v1/node-presets/factory?nodeType=generate-image returns { data: FactoryPreset[] }, the presets that ship with Nodaro for that node type. Each entry is { id, name, description?, group?, groupKind?, data }. A factory id has the form <node-type>/<name>, for example generate-image/character-board or generate-video/orbit-360.

curl "https://app.nodaro.ai/v1/node-presets/factory?nodeType=generate-video" \
  -H "Authorization: Bearer $NODARO_API_KEY"
const { data } = await client.presets.listFactory('generate-video')
const orbit = data.find((p) => p.id === 'generate-video/orbit-360')

Apply a preset

A preset's data is a captured node configuration. To apply a preset, merge its data into the node's data when you create or update a workflow. Values you set on the node after the merge win.

const node = {
  id: 'portrait-1',
  type: 'generate-image',
  data: { ...cinematic.data, prompt: 'a lighthouse keeper at dawn' },
}

A preset can also carry promptPrefix and promptSuffix: text that is added before and after the prompt when the node runs. See Prompt pre and post text.

Over MCP, find a preset with list_node_presets and read it with get_node_preset, or pass its presetId straight to a generation tool such as generate_image. The server then applies the preset, wraps your prompt with the preset's prefix and suffix, and lets any field you pass explicitly override it. See the MCP tools reference.

Favorites

Favorites put starred presets at the top of the editor's preset list. A favorite id is either a factory preset id or a custom preset's uuid. Reads accept OAuth app tokens with presets:read; the writes accept only a browser session, and no OAuth scope grants them.

MethodPathQuery or bodyReturns
GET/v1/node-presets/favoritesnodeType (required){ data: string[] }, the most recent first
POST/v1/node-presets/favoritesBody { nodeType, presetId }{ data: { success: true } }. Adding a favorite twice changes nothing.
DELETE/v1/node-presets/favoritesnodeType and presetId (both required){ data: { success: true } }

Factory ids contain a /, so URL-encode presetId in the DELETE query string:

curl -X DELETE "https://app.nodaro.ai/v1/node-presets/favorites?nodeType=generate-image&presetId=generate-image%2Fcharacter-board" \
  -H "Authorization: Bearer $SESSION_TOKEN"

Create and edit presets

Creating, renaming and deleting presets is limited to the Nodaro web app's own signed-in session: POST /v1/node-presets creates a preset, PATCH /v1/node-presets/:id renames it or replaces its data, and DELETE /v1/node-presets/:id deletes it. An API token or an OAuth app token gets 403 forbidden.

These writes accept an optional expectedUpdatedAt: in the body of a PATCH, and as a query parameter of a DELETE. Send the timestamp the library returned. When the preset changed since then, the route answers 409 conflict; read it again before you retry.

Recast render presets

The same library stores Recast generation settings under the recast-render namespace. It is not a node type: it saves a complete set of Recast render settings so you can reuse them. The factory entries are read-only, and your own entries stay private to you on every device.

A recast-render preset's data is a strict, complete snapshot:

{
  "schemaVersion": 1,
  "provider": "seedance-2-5",
  "resolution": "480p",
  "segmentSec": "max",
  "renderMethod": "extend",
  "anchorMode": "upfront",
  "citeStyle": "bare",
  "promptTiming": true,
  "textOnly": false,
  "interactive": true,
  "anchorGates": false,
  "musicGates": true,
  "musicSource": "generated"
}
FieldAccepted values
segmentSecmax, scenes-max (Long) or scenes (Short).
resolution480p, 720p, 1080p or 4k.
renderMethodextend or keyframes.
anchorModeupfront, progressive or none.
citeStylebare or rich.
musicSourcegenerated, original or upload.
promptTiming, textOnly, interactive, anchorGates, musicGatestrue or false.

Unknown fields and unknown schema versions are refused. The snapshot never contains source media, cast references, prompts, uploaded tracks, rights confirmations or results. Applying a preset changes the settings and refreshes the price quote; it never starts a generation. An Original or Upload music choice uses the target project's own media. Check the chosen model's current capabilities before you generate.

Errors

StatusCodeMeaning
400validation_errornodeType is missing where it is required, or a field is invalid.
401unauthorizedThe token is missing, invalid or revoked.
403forbiddenA write was sent with an API token or an OAuth app token. Writes need the browser session.
403insufficient_scopeAn OAuth app token lacks presets:read.
409conflictThe preset changed since expectedUpdatedAt. Read it again.

Frequently asked questions

Last updated on

On this page