furō Morfee

PDF documents from Power Automate

Power Automate has no built-in action that turns an HTML design into a PDF with your own data in it. The usual answers are a premium connector, a Word template that fights you over layout, or a "Create HTML table" action that produces something nobody would send to a customer. Morfee is a plain HTTP API, so the built-in HTTP action is the entire integration: no connector to install, no premium license.

What you are building

One flow, three parts. You do the first part once per document type; every flow after that is the second and third part only.

  1. A template in Morfee. Paste the HTML of the invoice, quote or work order you already have, point at the fields that have to come from your data, and save. That gives you a templateId that never changes.
  2. One HTTP action in your flow. It posts the id and your data to Morfee and gets a PDF back.
  3. Whatever you do with a file today. Attach it to an email, drop it in a SharePoint library, or hand someone a link. Nothing downstream of the HTTP action is specific to Morfee.

Step 1: the HTTP action

Add a plain HTTP action (the built-in one, not a connector) with these settings:

Method  : POST
URI     : https://morfee.furo.solutions/api/render?format=url
Headers : {
            "X-Api-Key": "mrf_your_key_here",
            "Content-Type": "application/json"
          }
Body    : {
            "templateId": "quote-a3f9c1",
            "data": @{outputs('Compose_the_data')}
          }

Make the key on API keys once your account exists; a key belongs to one organization and reaches nothing outside it. Put the template id in a variable at the top of the flow rather than typing it into every action that needs it: when you copy a template to make a new version, the id changes, and then there is exactly one place to update.

?format=url is the setting that matters most in Power Automate. Without it, the response body is the raw PDF bytes, and dragging binary content through a flow is where most Power Automate PDF attempts go wrong: every action after it has to know it is carrying bytes and not JSON, and the run history becomes unreadable. With it, the response is a small JSON object and the bytes stay out of your flow entirely until the one action that actually needs them.

Step 2: what comes back

With ?format=url the HTTP action's body is:

{
  "url": "https://morfee.furo.solutions/api/download/1f9b2c4a-...",
  "filename": "quote-a3f9c1.pdf",
  "bytes": 48213
}

That link is valid for an hour and needs no key, which is exactly what an email attachment or a "Create file" action wants. Two ways to use it:

Skip ?format=url only when you already know the flow will not touch the bytes more than once, for example a single "Create file" straight after the render. Then the first HTTP action's raw body is the file content and the second call is not needed.

Step 3: make retries safe

Power Automate retries a failed HTTP action on its own, with the default retry policy or one you set. A render that succeeded but whose response got lost on the way back would otherwise be repeated, which means a second document and a second one counted against your plan. Send an Idempotency-Key header with a value that is unique to this run and stable across its retries, for example the flow run id combined with the action name:

Headers : {
            "X-Api-Key": "mrf_your_key_here",
            "Content-Type": "application/json",
            "Idempotency-Key": "@{workflow().run.name}-render-quote"
          }

Send the same key again for the same request and Morfee hands back the same answer instead of rendering twice. Send it again for a request that is not the same, and you get back idempotency_key_reused instead of a silently wrong document, which is the failure you want: loud, not quiet.

Questions people ask about this specific flow

Do I need a custom connector?

No. The built-in HTTP action is the whole integration. A custom connector would give you a nicer picker for the fields, at the cost of a connector to build and maintain for an API that is one POST request.

Does this work the same in Logic Apps, Make.com or Zapier?

Yes. It is the same HTTP call and the same JSON body everywhere; only the way you fill in the headers and the body differs per tool. Power Automate is the one written out here because it is where this comes up most.

My document is going straight into an email and it is close to the attachment size limit

Use ?format=url and check bytes in the response before you decide whether to attach the file or send the download link instead. A link never hits an attachment limit.

Can an AI agent build the flow instead of me clicking through it?

Morfee also has an Agent Skill and an MCP server with the same API key, so an assistant that is wired into your Power Platform tenant can create the template and read back what fields it expects without anyone typing the HTTP action by hand.

See the whole API

This page covers one action. The documentation covers everything Morfee does: templates, folders, versions, and the full set of error codes an HTTP action in a flow should branch on.