Guides

Add E-Signatures to Any n8n Workflow with Firma.dev

n8n is where a lot of teams already run their contract logic: a form comes in, a deal moves stages, a renewal date hits, and a workflow fires. The missing piece is usually the signature itself. With Firma.dev you drop an HTTP Request node into any workflow, store your API key once, and send legally binding e-signatures without leaving n8n.

Because Firma.dev bills per envelope at €0.049 (~5¢ USD) with no seats and no monthly minimums, it fits automated sending especially well. When a workflow blasts out fifty renewal contracts overnight, you pay for fifty envelopes, not for a tier you grew into. That is the difference between automation that saves money and automation that quietly runs up a bill.

This post walks through three ways to wire Firma.dev into n8n: the HTTP Request node for sending, a Webhook trigger for reacting to signed documents, and Firma.dev as a tool for the n8n AI Agent.

Path 1: send with the HTTP Request node

This is the path most workflows need. You store your Firma.dev API key once as a credential, then any HTTP Request node in any workflow can reuse it.

First, create the credential. In the n8n editor, open Credentials, click Add Credential, and pick Header Auth. Name the credential Firma API, set the header Name to Authorization, and paste your Firma.dev API key as the Value. n8n encrypts credentials with your instance key, so referencing the credential keeps your key out of exported workflow JSON. Never paste the key directly into a node field.

Now add an HTTP Request node and point it at the create-and-send endpoint, which creates a signing request from a template and sends it in a single call:

  • Method: POST

  • URL: https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send

  • Authentication: Generic Credential Type, Header Auth, using the Firma API credential

  • Send Body: On, JSON

The body pulls values from upstream nodes with n8n expressions:

{
  "template_id": "{{ $json.template_id }}",
  "recipients": [
    {
      "first_name": "{{ $json.signer_first_name }}",
      "last_name": "{{ $json.signer_last_name }}",
      "email": "{{ $json.signer_email }}",
      "designation": "Signer",
      "order": 1
    }
  ]
}
{
  "template_id": "{{ $json.template_id }}",
  "recipients": [
    {
      "first_name": "{{ $json.signer_first_name }}",
      "last_name": "{{ $json.signer_last_name }}",
      "email": "{{ $json.signer_email }}",
      "designation": "Signer",
      "order": 1
    }
  ]
}
{
  "template_id": "{{ $json.template_id }}",
  "recipients": [
    {
      "first_name": "{{ $json.signer_first_name }}",
      "last_name": "{{ $json.signer_last_name }}",
      "email": "{{ $json.signer_email }}",
      "designation": "Signer",
      "order": 1
    }
  ]
}

Connect that node to whatever drives the workflow. A Form Trigger sends a contract the moment a customer submits. A Webhook Trigger fires the request when your app reports a deal moving stages. A Schedule Trigger runs a nightly batch of renewals against a database query. The response includes the id of the new signing request, so you can log it, store it, or reference it later.

If you need a human review step before anything goes out, create a draft with POST /signing-requests, drop an Approval node in the middle of the workflow, then call POST /signing-requests/{id}/send once it clears.

Path 2: react to signed documents with a Webhook trigger

Sending is half the loop. The other half is doing something the moment a document is signed. Add a Webhook node as a trigger, set its method to POST, and copy the production URL. In the Firma.dev dashboard under Settings → Webhooks, add that URL and subscribe to the events you care about, starting with signing_request.completed.

Back in n8n, add a Switch node after the trigger and route on {{ $json.body.type }}. A completed signing can update your CRM and kick off provisioning. A declined one can notify sales. An expired one can re-send or move the deal to lost. The signed document lives at {{ $json.body.data.signing_request.signed_document_url }}, so you can pass it straight into a Google Drive, S3, or Notion node and archive it without a seperate step.

Path 3: Firma.dev as a tool for the n8n AI Agent

If you run the AI Agent node, you can hand it Firma.dev as a callable tool and let it decide when to send. Add an HTTP Request Tool node as a tool input, configure it exactly like Path 1, and name the tool send_signing_request. Give it a description that tells the agent when to reach for it, and define an input schema with template_id, signer_email, signer_first_name, and signer_last_name. The agent will now send contracts straight from a natural-language instruction. Pair it with a second tool pointing at GET /templates if you want the agent to choose the right template on its own.

Signing inside another app

If your flow ends with the signer completing the document inside your own product rather than over email, pull the recipient's signing_request_user_id from the API response and embed Firma.dev's signing UI:

<iframe
  src="https://app.firma.dev/signing/{signing_request_user_id}"
  style="width:100%;height:900px;border:0;"
  allow="camera;microphone;clipboard-write"
  title="Document Signing"
></iframe>
<iframe
  src="https://app.firma.dev/signing/{signing_request_user_id}"
  style="width:100%;height:900px;border:0;"
  allow="camera;microphone;clipboard-write"
  title="Document Signing"
></iframe>
<iframe
  src="https://app.firma.dev/signing/{signing_request_user_id}"
  style="width:100%;height:900px;border:0;"
  allow="camera;microphone;clipboard-write"
  title="Document Signing"
></iframe>

Everything runs on EU-hosted infrastructure and produces a full audit trail, so the automation you build stays defensible.

📘 Read the full n8n integration guide
The complete setup, including every node field, credential detail, and webhook event, lives in the docs: https://docs.firma.dev/guides/n8n-integration

Get started

You can have the first path running in the time it takes to create one credential and one node. Get started with Firma.dev for free, no credit card required, and add e-signatures to the workflows you already run.

  1. Heading

Background Image

Ready to add e-signatures to your application?

Get started for free. No credit card required. Pay only €0.029 per envelope when you're ready to go live.

Background Image

Ready to add e-signatures to your application?

Get started for free. No credit card required. Pay only €0.029 per envelope when you're ready to go live.

Background Image

Ready to add e-signatures to your application?

Get started for free. No credit card required. Pay only €0.029 per envelope when you're ready to go live.