# Connect n8n

> Learn how to install the Bannerify community node in n8n and render images and PDFs in a workflow.

Canonical: https://bannerify.co/docs/integrations/n8n

The Bannerify node renders a template and returns the link of the file. It runs once for every item that reaches it, so a node that receives 20 items makes 20 files. The package is [`n8n-nodes-bannerify`](https://www.npmjs.com/package/n8n-nodes-bannerify) on npm.

## Operations

| Operation | Output | Fields |
| --- | --- | --- |
| Render Image | A PNG, JPEG, or WebP file | Template, Format, Modifications JSON |
| Render PDF | A PDF file | Template, Modifications JSON |

Both operations return an object with a `url` field. Bannerify saves the file on its CDN, and each file counts as one generation.

## Prerequisites

- An n8n account that can install community nodes. n8n limits this to the Owner and Admin roles.
- A Bannerify [API key](https://bannerify.co/docs/api-reference/authentication#create-an-api-key).
- A template with named layers. [Modifications](https://bannerify.co/docs/essentials/modifications#name-your-layers) explains why the names matter.

## Install the node

1. In n8n, open **Settings**, then **Community nodes**.
2. Click **Install**.
3. Enter `n8n-nodes-bannerify` as the npm package name.
4. Accept the risk prompt for unverified code, then click **Install**.

## Add your API key

1. Add a **Bannerify** node to a workflow and create a new credential for it. The credential type is **Bannerify API**.
2. Paste your key in **API Key**.
3. Leave **API Base URL** as `https://api.bannerify.co`.
4. Save the credential.

## Render a file

1. Choose an **Operation**: **Render Image** or **Render PDF**.
2. In **Template**, choose a template. The node loads the templates of the workspace that owns the key.
3. For Render Image, choose a **Format**. The default is PNG, and JPEG and WebP are the other options.
4. In **Modifications JSON**, enter the values. Use an expression to read data from an earlier node:

```json
{
  "headline": "{{ $json.title }}",
  "photo": { "src": "{{ $json.imageUrl }}" }
}
```

5. Run the node. Each output item has a `url` field.

The field takes an object where each key is a layer name, or the array that the API uses. [Modifications](https://bannerify.co/docs/essentials/modifications) lists the fields that each layer type reads.

If a render fails, the node stops the workflow. When you set the node to continue on error, the failed item holds an `error` field with the error message.

## Recipe: form answers to a PDF

1. Add a **Webhook** trigger and point your form tool at its URL.
2. Add a **Bannerify** node and choose **Render PDF**. Map the answers to layer names in **Modifications JSON**.
3. Add a **Send Email** node and put the `url` in the message.

## Troubleshooting

| Problem | What to do |
| --- | --- |
| The **Template** list is empty | Check that the API key belongs to the workspace that owns the templates, and that **API Base URL** is `https://api.bannerify.co` |
| A layer does not change | Check the layer name in the editor. Names are case-sensitive, and the API ignores a name that does not exist |
| The node fails with a JSON error | Check that **Modifications JSON** is valid JSON |
| The node fails with a usage limit message | The workspace reached its daily or monthly limit. Each item counts as one generation. See [Quota and limits](https://bannerify.co/docs/account/quota) |

## Related

- [Previous: Connect Zapier](https://bannerify.co/docs/integrations/zapier)
- [Next: Connect Pipedream](https://bannerify.co/docs/integrations/pipedream)
- [Documentation index](https://bannerify.co/docs/llms.txt)
