All skills
Skillintermediate
Declarative nodes
Preferred for most integrations that simply call external APIs.
Claude Code Knowledge Pack7/10/2026
Overview
Declarative nodes
Preferred for most integrations that simply call external APIs.
Also read .agents/nodes.md for shared node anatomy and conventions.
When to use
- The integration is mostly simple HTTP/REST requests and responses
- You can express the behavior by mapping parameters to URL/query/body/headers
If you need multiple dependent API calls, complex control flow, or heavy
transformations, use programmatic-style instead (see
.agents/nodes-programmatic.md).
What you define
- Node
properties(parameters) requestDefaults(base URL, default headers)routingon parameters and operations:- Where to send the request (URL, method)
- How to map parameters to query/body/headers
- Optional pre-send and post-receive transformations
requestDefaults
requestDefaults: {
baseURL: 'https://api.nasa.gov',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
},
Parameter routing
Example parameter with routing:
{
displayName: 'Rover Name',
description: 'Choose which Mars Rover to get a photo from',
required: true,
name: 'roverName',
type: 'options',
options: [
{ name: 'Curiosity', value: 'curiosity' },
{ name: 'Opportunity', value: 'opportunity' },
{ name: 'Perseverance', value: 'perseverance' },
{ name: 'Spirit', value: 'spirit' },
],
routing: {
request: {
method: 'GET',
url: '=/mars-photos/api/v1/rovers/{{$value}}/photos',
},
},
default: 'curiosity',
displayOptions: {
show: {
resource: ['marsRoverPhotos'],
},
},
}
Post-receive transformations
You can modify response data with routing.output.postReceive:
postReceive: [
{
type: 'setKeyValue',
properties: {
name: '={{$responseItem.modelName}}',
description: '={{$responseItem.modelArn}}',
value: '={{$responseItem.modelId}}',
},
},
{
type: 'sort',
properties: {
key: 'name',
},
},
async function (
this: IExecuteSingleFunctions,
data: INodeExecutionData[],
response: IN8nHttpFullResponse,
): Promise<INodeExecutionData[]> {
// Custom transformation if needed
return data;
},
]
Pre-send transformations
You can also use routing.send.preSend to change the request before
sending (e.g. add custom headers or body transformations).
Guidelines
- Prefer declarative transformations like
setKeyValue,sort, etc (there are other transformations that are not in the example). - Only add custom functions when necessary.
- Declarative-style nodes only support light versioning (not full
versioning). See
.agents/versioning.mdfor details.