Skip to main content

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​

ComponentWhat it does
Create DocumentRenders a template. Picking the template adds one prop per field of its data schema, or of its sample data.
Create Document From HTMLRenders HTML built earlier in the workflow, in Jinja2, Liquid or Handlebars.
Create Document From URLRenders a public page.
Get RenderReturns a render by its ID, with a fresh download URL.
Convert Document to PDFTurns 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 FileAdds 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:

ActionProps
Create DocumentTemplate (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 HTMLHTML (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 URLURL (required, a public https page), Output (PDF, the default, PNG, JPG or WebP), File Name, Settings, Save File
Get RenderRender ID (required, rnd_…)
Convert Document to PDFFile (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 FileFile (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).