Carbone alternative

Carbone and DocMint solve the same problem: you have a Word, Excel or PowerPoint file with placeholders in it, you have JSON, and you want the filled document back. This page is the comparison written by the people who build DocMint, so read it as such — every number about Carbone was read off carbone.io/pricing.html on 29 August 2026, and every number about DocMint was measured against the live API on this domain on the same day. The last section is the one about when you should not switch.

The short version

Carbone is the older, larger and more capable product. It has a template studio, a bigger formatter library, a choice of PDF converters, on-premise and private-cloud licensing, and a free tier three times the size of ours. DocMint is a narrower tool with two properties Carbone does not have — it will tell you what a template needs before you send data, and it refuses to render a document with a placeholder behind which there is nothing — and it is roughly an order of magnitude cheaper per document at volume.

The one-line version: if the thing that costs you time is guessing which JSON keys a template wants and documents going out with silently empty fields, DocMint was built for exactly that. If the thing you need is a studio, charts, barcodes or an on-premise licence, Carbone has them and we do not.

What counts as one document

This is the first thing to get straight, because the sticker prices are not comparable until you have. Carbone's pricing page defines its unit like this, verbatim:

"A Document is counted each time a report is generated with an injected data
(JSON + images) smaller than 1 MB. Examples:
 - 0.5 MB = 1 document
 - 1.2 MB = 2 documents
 - 2.3 MB = 3 documents."

So a Carbone "document" is a megabyte of input, not a document. Push a 2.3 MB payload — an invoice with a few embedded photographs will do it — and one PDF costs three. The page also says that anything over your plan's allowance "will be invoiced separately", so the meter does not stop at the ceiling.

DocMint counts differently and, we would argue, more predictably: one credit per document produced. Converting that document to PDF costs one more, because the conversion is a full LibreOffice process and costs about a hundred times the CPU of the fill. Nothing else is metered. Payload size does not enter into it, up to the flat 8 MB request limit.

The two units disagree in both directions, and it is worth being honest about that: a workflow that renders many small documents is cheaper per document under Carbone's rule than the headline price suggests, because several small payloads still cost one each — no, they do not aggregate; each render is its own count. A workflow that renders large documents, or embeds images, is where the rule bites.

Price per document, worked through

Carbone Cloud, monthly billing, read on 29 August 2026. DocMint's plans are on the pricing section of the home page.

PlanPriceDocuments / monthPer document
Carbone Free€0100
Carbone Essential€29 (€26 billed annually)1,000€0.029
Carbone Advanced€159 (€149 billed annually)20,000€0.008
DocMint Free$030
DocMint Starter$92,000$0.0045
DocMint Pro$2920,000$0.00145
DocMint Scale$99100,000$0.00099

The row that does the work is the 20,000-document row: €159 against $29 for the same number of documents, and that is before Carbone's megabyte rule is applied to a payload with images in it. At the other end, Carbone's free tier is 100 documents a month against our 30 — more than three times ours. If you are evaluating, or if 100 documents a month is genuinely your volume, Carbone's free tier is the better free tier and you should use it.

One more thing the table does not show: Carbone's free plan runs the Community Edition. Their own pricing page says the Enterprise Features — "dynamic images, colors, barcodes, charts, HTML, aggregations, PDF operations and more" — are unlocked by a licence, and "without a license, Carbone runs the free Community Edition". DocMint has no feature ladder; every plan including the free one has every feature we have. That is less impressive than it sounds, because the list of features we have is shorter.

Asking a template what it needs

Here is the loop this replaces. You have a .docx from your finance team. The placeholder names are inside a zipped binary that your workflow tool cannot open. So you guess the keys, render, open the result in Word, look for the field that came out empty, and guess again.

DocMint answers the question directly. POST /v1/inspect takes the template and returns a typed, nested field list — free, no document produced, no credit charged. Run live on 29 August 2026 against a three-placeholder invoice template, abridged:

POST /v1/inspect        HTTP 200, 0 credits

{ "fields": [
    { "name": "invoice_no", "scope": "", "type": "string", "required": true,
      "locations": ["word/document.xml, paragraph 1"] },
    { "name": "items", "scope": "", "type": "array", "repeating": true,
      "formatters": ["sumProduct", "currency"],
      "locations": ["word/document.xml, paragraph 2",
                    "word/document.xml, paragraph 4"] },
    { "name": "price", "scope": "items", "type": "number", "required": true,
      "inferred": true } ],
  "names": ["invoice_no","customer","description","qty","price","items"],
  "sample_data": { … a skeleton you can POST straight back … } }

scope is what makes this a tree rather than a flat list of names: price lives inside items, and the response says so instead of leaving you to infer it. That is precisely the shape a form builder — or n8n's resourceMapper — needs in order to render a repeating section instead of a raw JSON textarea.

Carbone's API has no equivalent. Its GET /templates family covers upload, download and deletion; GET /templates/tags returns organisational folder labels, not the placeholders inside the file. If you know of an introspection endpoint we have missed, tell us and this paragraph gets corrected — we would rather be wrong in public than wrong on a customer's invoice.

A placeholder your data does not have

In Carbone, a tag whose data is absent renders as nothing. The request succeeds, you get a file, and the gap is only discovered by whoever opens the document — which, for an invoice, is usually the customer.

DocMint treats this as an error by default. Measured live on 29 August 2026, with price removed from the first line item:

POST /v1/render        HTTP 422 — no document, no credit

{ "error": {
    "code": "placeholder_unresolved",
    "message": "The template uses {price|currency} but the data has no \"price\".",
    "hint": "Add \"price\" to the data, or write {price|default:} to allow it to be absent.",
    "details": {
      "field": "price",
      "location": "word/document.xml, paragraph 2",
      "available": ["invoice_no","customer","items","description","qty"],
      "format": "docx" },
    "request_id": "dm_T2VKsfB09yAc" } }

Three things in that response are the point: the location is where a human would look (Invoice!C5 in Excel, slide 2, table "Items 5", row 2, cell 3 in PowerPoint), the available list tells you which names do exist at that point in your data, and the failure costs nothing. That last one is not a claim, it is a reading: eight failed renders during the writing of this page, and GET /v1/usage reported credits: 0 against all of them, with used unchanged at 7 before and after.

If you want Carbone's behaviour, you can have it: onMissing: "empty" relaxes the rule wholesale, and {price|default:—} does it for one field. The difference is which way round the default points.

When to stay with Carbone

These are real, and none of them is on a roadmap we can promise you.

What we cannot claim

A comparison page that only lists the author's strengths is one you find out the truth about later, at a worse moment.

If you do want to switch

Templates mostly move without editing. Carbone uses {d.name}-style tags; DocMint accepts both {name} and {{name}} in all three formats, so a template written for docxtemplater or for a mustache-style tool renders unchanged, and a Carbone template needs its d. prefixes dropped. Sections use {#items}…{/items}.

# 1. What does this template actually need? Free, no render.
curl -X POST https://docmint.app.mintapis.com/v1/inspect \
  -H "Authorization: Bearer dm_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"template_base64":"'"$(base64 -w0 invoice.docx)"'"}'

# 2. Render it. Ask for document, pdf, or both — per request.
curl -X POST https://docmint.app.mintapis.com/v1/render \
  -H "Authorization: Bearer dm_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"template":"invoice","data":{…},"output":"pdf"}' \
  --output invoice.pdf

A key is one POST /v1/signup away, no card and no dashboard, and the free tier is enough to wire a workflow end to end and see it work before deciding anything. The full API reference documents every error code, and the n8n page covers the workflow route.