Pipedream
The Formfeed components for Pipedream are built and wait for Pipedream to add the app to its registry; until Pipedream has added it, they cannot be used in Pipedream. Until then, a Node.js step does the same job, see the end of this page.
Connect
Connect a Formfeed account with an API key from the app (API keys). A
ff_test_ key renders for free (with a watermark on the Free plan). The default scopes of a new key
(render:create, render:read, template:read, account:read) cover the connection test, the
template list and fields and every render action; tick
file:write for Upload File and webhook:manage for the sources,
which register a webhook endpoint.
Actions and sources
| Component | What it does |
|---|---|
| Create Document | Renders a template. Picking the template adds one prop per field of its data schema, or of its sample data. |
| Create Document From HTML | Renders HTML built earlier in the workflow, in Jinja2, Liquid or Handlebars. |
| Create Document From URL | Renders a public page. |
| Get Render | Returns a render by its ID, with a fresh download URL. |
| Convert Document to PDF | Turns a Word, Excel, PowerPoint, OpenDocument or RTF file (a URL or a /tmp path), or the render of a Word or PowerPoint template, into a PDF. Starter plan and above. |
| Upload File | Adds an image or PDF to the file library, where templates use it with asset(). |
| New Render Completed (Instant) | Emits every successful render. |
| New Render Failed (Instant) | Emits every failed render, with its problem. |
| New Batch Finished (Instant) | Emits every finished batch (job.completed and job.failed), with its zip URL and renders. |
The props of each action:
| Action | Props |
|---|---|
| Create Document | Template (required; the published version renders), Version (a release channel; published when empty), one prop per field of the template, Data (an object merged over those fields), Output (empty: the template's format; PDF, PNG, JPG, WebP, DOCX or PPTX), File Name, Locale (for example de-DE), Save File (on by default) |
| Create Document From HTML | HTML (required, up to 5 MB), Template Language (Jinja2, the default, Liquid or Handlebars), Data, Output (PDF, the default, PNG, JPG or WebP), File Name, Settings (paper, margins, header and footer, as in Override settings per request), Save File |
| Create Document From URL | URL (required, a public https page), Output (PDF, the default, PNG, JPG or WebP), File Name, Settings, Save File |
| Get Render | Render ID (required, rnd_…) |
| Convert Document to PDF | File (a URL or a path under /tmp: DOCX, XLSX, PPTX, ODT, ODS, ODP, DOC, XLS, PPT or RTF, up to 20 MB) or Render ID (rnd_… of a render with output DOCX or PPTX); Page Ranges (for example 1-3,5), Landscape, One Page per Sheet, File Name (the file's own name with .pdf when empty), Save File |
| Upload File | File (required, a URL or a path under /tmp: PNG, JPEG, WebP, GIF, SVG, AVIF or PDF, up to 10 MB), Name in Library (the name templates use with asset(), for example brand/logo.png; the file's own name when empty; the same name replaces the file) |
The Template list shows the workspace's templates by name and kind; only published templates
render, and an unpublished one fails with template_not_found.
The document actions save the file under /tmp (the File Stash) and return its path as filePath
beside the render, so the next step attaches or uploads it; turn Save File off when the download
URL is enough. Lists such as invoice lines go into Data, which is merged over the fields value by
value: an object adds to the fields at the same place, a value replaces the field's, and a list
replaces the whole list. A render that takes longer than a minute continues in the background; the
action then checks it every five seconds for up to five minutes, and returns it as it is if it has
not finished by then. A render that fails ends the step with the problem's detail and code.
The sources register a webhook endpoint in the workspace when they are deployed and remove it when they are deleted; it is listed in the app under Webhooks as Pipedream. Environment chooses whose renders count: live keys, test keys or both (the default). On deploy a source emits up to ten recent matching events, so the workflow has real data to build on. Every delivery's signature is checked against the endpoint's secret (and refused when it is older than five minutes), and each event is emitted once, by its id.
Until the app is listed
A Node.js code step renders with the TypeScript SDK and the key from an
environment variable (FORMFEED_API_KEY in Pipedream's environment variables):
import { Formfeed } from '@formfeed/sdk';
export default defineComponent({
async run({ steps, $ }) {
const formfeed = new Formfeed({ apiKey: process.env.FORMFEED_API_KEY });
return await formfeed.renders.create({
template: 'invoice-de',
data: { invoice: { number: '2026-0042' } },
});
},
});
The step returns the render with its download_url. A render that takes longer than a minute comes
back with status: queued; await formfeed.renders.waitFor(render.id) waits for it (up to two
minutes).