DoConure

Coming from Carbone or Docmosis

Your Word templates keep their layout; only the tags change. One call rewrites the tags it understands, names every one it does not, and stores nothing. Your data stays the same JSON it is today.

One call per template

POST /api/v1/compose/templates/convert
Authorization: Bearer lpdc_...

{
  "from": "carbone",
  "templateType": "docx",
  "fileName": "invoice.docx",
  "fileBase64": "UEsDBBQABgAIAAAAIQ..."
}

The answer's output.compose.conversion holds the new file (fileBase64, fileName), every tag converted (converted, from what to what, with a note where something was dropped), every tag left as it was and why (unconverted), and the diagnostics Validate would give the new file. Nothing is stored, rendered or charged. When the report reads right, upload the file like any other (Managing templates from a script) and make a test call with the data your system sends today.

from is carbone or docmosis; templateType is docx or html. The key needs the documents:templates permission (the starter key does not have it: Create a full key on the API keys page). Word templates are read whole even where Word split a tag across two pieces of formatting.

What becomes what: Carbone

CarboneDoConureNote
{d.customer.name}{{ customer.name }}The d. goes: the data is the root.
A table row with {d.items[i].qty}, and the row after it with {d.items[i+1]...}The row between {%tr for row in items %} and {%tr endfor %}; each value is {{ row.qty }}The [i+1] row only marked the end of the list in Carbone and is removed.
:upperCase, :lowerCase, :ucFirst, :ucWords| upper, | lower, | capitalize, | title
:formatD(...), :formatN(...), :formatC(...) and the arithmetic formattersThe plain valueDropped and listed: send the value already formatted, as you want it printed.
:ifEQ(...), :show(...) and the other conditions; {c.}, {#alias}, {t()}Left as writtenListed under unconverted: rewrite them as conditional parts, or put the value in the data.

What becomes what: Docmosis

DocmosisDoConureNote
<<customer.name>>{{ customer.name }}A :format after the name is dropped and listed.
<<rr_items>> ... <<er_items>> in a table rowThe row between {%tr for row in items %} and {%tr endfor %}A field inside the row reads from each item (row.); if it is a field outside the list, remove row..
<<rs_items>> and <<es_items>>, each alone on its line{%p for row in items %} ... {%p endfor %}
<<cs_notes>> ... <<es_notes>>{% if notes %} ... {% endif %}On one line or on lines of their own.
Expressions (<<{...}>>), $variablesLeft as writtenListed under unconverted: compute the value into the data.

If you upload a template as it is

The upload works and the document comes out, with the other product's tags printed as text. The upload and Validate both warn when a template holds Carbone or Docmosis tags, with the number found.

With an AI agent

An agent can do the whole move: give it the folder of templates and this instruction, and read the reports it brings back before anything is uploaded.

Read https://app.doconure.com/llms-full.txt, then the guide page
https://app.doconure.com/docs/migrate-templates.
For each .docx in ./templates: call POST /api/v1/compose/templates/convert
(from = carbone or docmosis), write the result next to it as *-doconure.docx,
and write a report listing every "unconverted" tag and every "note".
Do not upload anything. Read the key from DOCONURE_API_KEY.

The syntax itself: Writing a template, Lists and repeating rows, Conditional parts. Moving an integration with an agent: How do I let an AI agent write the integration?