The definition format
One JSON document describes the whole node. It contains no n8n concepts at all, which is what lets the builder be designed around how people think about APIs rather than how n8n stores them.
A definition is resources, operations, fields
There are no displayOptions, no routing blocks, and no flat properties array. The compiler generates all of that.
{
"nodesterVersion": 1,
"node": {
"name": "example",
"displayName": "Example",
"baseUrl": "https://api.example.com"
},
"resources": [
{
"name": "post",
"displayName": "Post",
"operations": [
{
"name": "get",
"method": "GET",
"path": "/posts/{postId}",
"fields": [
{
"name": "postId",
"displayName": "Post ID",
"type": "number",
"target": "path",
"required": true,
"default": 1
}
]
}
]
}
]
}A field is a binding
This is the idea most likely to be lost. A field is not just a form input; it is a binding between a form input and part of an HTTP request. target is what encodes that.
pathputs the value into the URL, replacing a placeholder.queryappends it as a query parameter.bodymakes it a property of the JSON body.headersends it as a request header.
Strip the bindings and you have a settings panel that does nothing. It is why the builder shows the request as a line with drop zones underneath: moving a field from Body to Query literally sets target.
Machine names must be camelCase and match ^[a-z][a-zA-Z0-9]*$. The builder derives them from the display name and keeps them behind an advanced disclosure, so nobody has to know that rule exists.
Authentication
Three kinds, and the honest limit is that OAuth2 is not one of them. It is absent deliberately: it can be generated easily enough, but not tested properly yet, and a credential type that cannot be verified is worse than one that does not exist.
nonefor public APIs.apiKeyin a header or the query string, with an optional prefix.basicfor HTTP basic auth.
What the compiler adds
Given the document above, the emitted package is six files and about 2.5 kB. n8n's own TypeScript template produces 68.6 kB across 50 files and needs roughly 600 MB of dependencies to build. The difference is that a declarative node never actually required a compiler.
The only JavaScript in the output is a four line shim that reads the JSON and hands it to n8n. It is byte identical in every node except the class name.