Takes three documents — the common base and the two versions derived from it — as text, pu
Takes three documents — the common base and the two versions derived from it — as text, public URLs or inline base64, reads PDF, DOCX, ODT, HTML and Markdown, and returns one merged document. The procedure is diff3 over paragraphs, or over lines if you ask for that: each version is first compared against the base with a Myers shortest-edit-script, the two comparisons together yield the passages that are identical in all three, and each region between them is resolved by rule.
4000 (raw units)
price
2
calls / 30d
2
unique payers
2026-09-14
updated
Provider
buero.halowerk.com · discovered, not yet claimed by its owner
Payment (x402 accepts[])
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "4000",
"maxTimeoutSeconds": 300
}
]Output schema
{
"bazaar": {
"info": {
"input": {
"body": {
"a": {
"text": "§ 1 Gegenstand\nDer Auftragnehmer liefert Steuergeraete nach Anlage 1.\n\n§ 2 Menge\nGeliefert werden zwanzig Geraete.\n\n§ 3 Lieferort\nLieferort ist das Werk Ulm.\n\n§ 4 Laufzeit\nDer Vertrag laeuft zwoelf Monate.\n\n§ 5 Gerichtsstand\nGerichtsstand ist Berlin.\n\n§ 6 Zahlung\nDie Verguetung ist binnen 14 Tagen faellig."
},
"b": {
"text": "§ 1 Gegenstand\nDer Auftragnehmer liefert Steuergeraete nach Anlage 1.\n\n§ 2 Menge\nGeliefert werden zehn Geraete.\n\n§ 3 Lieferort\nLieferort ist das Werk Ulm.\n\n§ 4 Laufzeit\nDer Vertrag laeuft vierundzwanzig Monate.\n\n§ 5 Gerichtsstand\nGerichtsstand ist Berlin.\n\n§ 6 Zahlung\nDie Verguetung ist binnen 60 Tagen faellig."
},
"base": {
"text": "§ 1 Gegenstand\nDer Auftragnehmer liefert Steuergeraete nach Anlage 1.\n\n§ 2 Menge\nGeliefert werden zehn Geraete.\n\n§ 3 Lieferort\nLieferort ist das Werk Ulm.\n\n§ 4 Laufzeit\nDer Vertrag laeuft zwoelf Monate.\n\n§ 5 Gerichtsstand\nGerichtsstand ist Berlin.\n\n§ 6 Zahlung\nDie Verguetung ist binnen 30 Tagen faellig."
},
"label_a": "einkauf",
"label_b": "recht"
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"additionalProperties": false,
"properties": {
"a": {
"additionalProperties": false,
"description": "The first version. Same shape as base.",
"properties": {
"content_base64": {
"description": "The file inline, base64.",
"maxLength": 4000000,
"type": "string"
},
"filename": {
"description": "Only consulted when the bytes carry no recognisable signature.",
"maxLength": 260,
"type": "string"
},
"format": {
"default": "auto",
"description": "Override the detected format. \"auto\" reads it from the bytes.",
"enum": [
"auto",
"pdf",
"docx",
"odt",
"html",
"markdown",
"rtf",
"text"
],
"type": "string"
},
"text": {
"description": "The text directly. Cheapest and clearest — its length is billed as counted here.",
"maxLength": 200000,
"type": "string"
},
"url": {
"description": "Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused.",
"maxLength": 2048,
"type": "string"
}
},
"type": "object"
},
"b": {
"additionalProperties": false,
"description": "The second version. Same shape as base.",
"properties": {
"content_base64": {
"description": "The file inline, base64.",
"maxLength": 4000000,
"type": "string"
},
"filename": {
"description": "Only consulted when the bytes carry no recognisable signature.",
"maxLength": 260,
"type": "string"
},
"format": {
"default": "auto",
"description": "Override the detected format. \"auto\" reads it from the bytes.",
"enum": [
"auto",
"pdf",
"docx",
"odt",
"html",
"markdown",
"rtf",
"text"
],
"type": "string"
},
"text": {
"description": "The text directly. Cheapest and clearest — its length is billed as counted here.",
"maxLength": 200000,
"type": "string"
},
"url": {
"description": "Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused.",
"maxLength": 2048,
"type": "string"
}
},
"type": "object"
},
"base": {
"additionalProperties": false,
"description": "The common base both versions came from. Exactly one of text, url or content_base64.",
"properties": {
"content_base64": {
"description": "The file inline, base64.",
"maxLength": 4000000,
"type": "string"
},
"filename": {
"description": "Only consulted when the bytes carry no recognisable signature.",
"maxLength": 260,
"type": "string"
},
"format": {
"default": "auto",
"description": "Override the detected format. \"auto\" reads it from the bytes.",
"enum": [
"auto",
"pdf",
"docx",
"odt",
"html",
"markdown",
"rtf",
"text"
],
"type": "string"
},
"text": {
"description": "The text directly. Cheapest and clearest — its length is billed as counted here.",
"maxLength": 200000,
"type": "string"
},
"url": {
"description": "Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused.",
"maxLength": 2048,
"type": "string"
}
},
"type": "object"
},
"conflict_style": {
"default": "markers",
"description": "markers: conflicts appear in merged_text between labelled markers. keep_base: the base wording is kept at the conflict site and the conflict is still reported — this is not a resolution. none: merged_text is withheld while any conflict remains.",
"enum": [
"markers",
"keep_base",
"none"
],
"type": "string"
},
"ignore_whitespace": {
"default": true,
"description": "Treat runs of spaces and tabs as one space before comparing. Applied to all three documents alike.",
"type": "boolean"
},
"include_word_diff": {
"default": true,
"description": "Include a word-level diff of each side against the base for every conflict.",
"type": "boolean"
},
"label_a": {
"default": "a",
"description": "Name for the first version, used in conflict markers and in the conflict list.",
"maxLength": 60,
"type": "string"
},
"label_b": {
"default": "b",
"description": "Name for the second version.",
"maxLength": 60,
"type": "string"
},
"max_conflicts_detailed": {
"default": 50,
"description": "How many conflicts come back with their full text. Beyond this they are still counted and still marked in merged_text, only without the detail block.",
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"merge_unit": {
"default": "paragraph",
"description": "What counts as one piece. paragraph: blank lines separate, which is how a contract is read — but two changes inside one paragraph then collide even when they concern different sentences. line: merges more finely and conflicts less often, though a paragraph written as one long line stays one piece either way.",
"enum": [
"paragraph",
"line"
],
"type": "string"
}
},
"required": [
"base",
"a",
"b"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST",
"PUT",
"PATCH"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}
}
}Use it
curl
curl "https://buero.halowerk.com/v1/doc-merge" # -> 402 Payment Required, accepts[] lists how to pay # retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid
JavaScript
const res = await fetch("https://buero.halowerk.com/v1/doc-merge");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}Python
import httpx
res = httpx.get("https://buero.halowerk.com/v1/doc-merge")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerMachine-readable
Everything on this page is also available as clean JSON at /resources/15228.json, and this resource appears in /discovery/resources and /discovery/search.