# HALOWERK medienwerk > HALOWERK medienwerk liefert maschinenlesbare Ergebnisse gegen Zahlung nach x402. > Netz Base Mainnet, Zahlungsmittel USDC, Empfänger 0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E. ## So wird bezahlt 1. Route ohne Zahlungskopf aufrufen. Die Antwort ist 402 und trägt accepts, description und inputSchema. 2. Bedingungen mit einem x402-Client signieren. 3. Aufruf wiederholen, Nachweis im Kopf PAYMENT-SIGNATURE. Eine 402-Antwort kostet nichts und löst keine Arbeit aus. Scheitert die Arbeit, trägt die Antwort charged=false und es wird nicht abgerechnet. ## Endpunkte ### POST /v1/image-palette Takes an image by URL or inline base64 and returns its colour palette: up to sixteen colours, each with the share of the visible area it covers, its HEX and sRGB values, its OKLCH coordinates, and the WCAG 2.1 contrast ratio against white, against black and against every other colour in the palette. The grouping runs in OKLab rather than RGB, because distance in RGB does not match what an eye sees — it merges dark blue with black and splits two yellows nobody tells apart. The dominant colour is simply the largest share; the accent is chosen as the most chromatic colour whose hue is at least twenty degrees away from the dominant one, and when no such colour exists the answer says so instead of naming an arbitrary second colour. The result is deterministic: the same file returns the same palette, byte for byte, because the sampling edge is fixed at 200 pixels, the starting points are chosen by frequency and greatest distance rather than at random, the iteration count is bounded, and every tie is broken by colour key. Alongside each cluster mean the closest colour that actually occurs in the image is returned, so a value can be quoted that is really present rather than an average that is not. The limits are stated plainly. This reports the colours that are there, not the colours a brand uses: it does not read logos, does not name colours, does not detect gradients as gradients, and does not simulate colour vision deficiency. The contrast figures follow WCAG 2.1, which is what audits and accessibility rules currently require; that formula is known to overstate the readability of light text on mid-tone backgrounds, and the answer says so rather than presenting a pass as a guarantee. Transparent pixels below an alpha of 128 are excluded and counted separately, an animated image is read as its first frame only, and an image with an embedded colour profile other than sRGB is converted by libvips, which is reported. - Preis: 0.002 USDC - MCP-Werkzeug: `image_palette` - Eingabe: `["source","max_colors","min_share_pct","include_contrast"]` ### POST /v1/stt Takes an audio or video file by URL or inline base64 and returns the transcript: the full text, every word with start and end time and its own confidence, the utterances and paragraphs the recogniser separated, and the detected language with its confidence where no language was specified. Alongside comes a confidence breakdown — mean, median, lowest tenth, and the weakest words listed with their timestamps — because a transcript reads equally fluent where the recogniser was certain and where it guessed, and the difference is exactly what a caller needs before quoting it. The running time is measured locally with ffprobe before anything is sent, so a file longer than declared is refused with its real length and nothing is charged, at this end or the provider. Billing is per started audio minute and the price is fixed before the file is even fetched, which is why the caller declares the length. Processing is by Deepgram, and that is stated in every answer along with what leaves this machine: Deepgram uses submitted content to train its models by default, so this service sends the per-request opt-out on every single call — a measure whose effect cannot be verified from the outside, since unknown parameters are accepted just as silently, and the answer says so rather than implying a guarantee. The result is machine-generated and must not be passed off as human transcription. Nothing is cached; neither audio nor transcript is written to any database, log or error message. - Preis: 0.02 USDC - MCP-Werkzeug: `stt` - Eingabe: `["source","duration_minutes","language","confidence_threshold","include_words"]` ### POST /v1/diarize Takes an audio or video file by URL or inline base64 and reports who spoke when. Every turn comes back with its speaker label, start and end time, duration, word count and text, and consecutive words from the same speaker are merged into one turn rather than left as a word list. On top of the turns come the figures that make a recording readable at a glance: talking time and share per speaker, number of turns each, longest uninterrupted stretch with its timestamp, speaker changes per minute, and how much of the running time carries no speech at all. The running time is measured locally with ffprobe before anything is sent, so a file longer than declared is refused with its real length and nothing is charged at either end. What this endpoint does not do is identify anybody: it returns speaker 0 and speaker 1, not names, it compares no voices against any reference and stores no voice profile — that would be a biometric feature and a different service entirely. Diarization is also not exact; speakers with similar voices get merged, a single speaker on a bad line gets split, and short interjections are the least reliable part, which is why the confidence figures come with it. Processing is by Deepgram, whose terms make training on submitted content the default, so the per-request opt-out is sent on every call — its effect cannot be verified from outside, and the answer says so. Nothing is cached and neither audio nor transcript reaches any database, log or error message. - Preis: 0.025 USDC - MCP-Werkzeug: `diarize` - Eingabe: `["source","duration_minutes","language","include_turn_text","confidence_threshold"]` ### POST /v1/doc-translate Takes a document as text, a public URL or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and returns it translated into the target language. Structure is the point: heading levels, indentation, blank lines, list markers, the number of table columns, placeholders such as double-brace tokens or printf specifiers, URLs, e-mail addresses, file names and fenced code blocks are meant to come through untouched. Rather than assert that, the endpoint measures it. Line count, table rows and columns, headings, list items, code fences, URLs and the full set of placeholders are counted before and after, and every difference is returned as a named finding — a placeholder that vanished or a table that lost a column is reported, not smoothed over, because that is the failure a caller only discovers once the document is in use. Terms the model left in the source language are listed separately. What this endpoint does not do is certify: it is not a sworn translation, it makes no claim about legal equivalence of terms across jurisdictions, and for a contract that has to hold up somewhere, a translated clause is a reading aid and not the clause. The text is processed by a third-party model — provider, what leaves this machine and whether it is used for training are named in every answer, because a caller under confidentiality has to make that call themselves. Nothing is cached and no part of the document reaches any database, log or error message. - Preis: 0.006 USDC - MCP-Werkzeug: `doc_translate` - Eingabe: `["text","source","target_language","source_language","document_chars","formality"]` ### POST /v1/tts Takes a text and returns it spoken, as MP3, WAV, Opus, FLAC or raw linear16, encoded base64 with its media type and the resulting running time. The voice is chosen freely from the provider catalogue — over a hundred voices across languages and accents — and is validated against that catalogue before the request goes out, so a mistyped voice name comes back immediately with a list of near matches instead of a provider error. Pricing follows the voice: Aura-2 costs twice as much at the provider as Aura-1, so charging both alike would overcharge the cheaper one, and the rate that applies is stated in the payment challenge before you pay. The purchase cost is computed from the character count the provider itself reports and returned with every answer, so the margin is verifiable rather than asserted. Processing is by Deepgram, whose terms make training on submitted content the default; this service therefore sends the per-request opt-out on every call, and states plainly that the effect of that opt-out cannot be verified from the client side because unknown parameters are accepted just as silently. The result is machine-generated speech and the provider forbids passing it off as a human recording — if it goes somewhere a listener could mistake it for a person, that is the caller's disclosure to make. Nothing is cached and no text is written to any database, log or error message. - Preis: 0.080 USDC - MCP-Werkzeug: `tts` - Eingabe: `["text","voice","encoding","include_audio"]` ### POST /v1/bg-remove Takes an image by URL or inline base64 and returns it with the background removed, as PNG or WebP with a real alpha channel, together with the share of the frame that survived, the bounding box of the remaining subject and the option to crop to it. The whole computation runs locally with rembg and the U2-Net model: the image is not sent anywhere, no provider sees it, nothing is retained, and there is consequently no purchase price and no third-party terms to accept — for a product photo not yet published or a picture of a person, that is the whole point. Optional alpha matting refines the edge for hair and fur at a noticeably higher compute cost, and is off by default because it is slower and not always better. The limits are stated: the model finds the salient subject, so an image with no clear subject, several equally prominent ones, or a subject the same colour as its background produces a poor mask, and the returned foreground share is the number that shows it — a result near zero or near one almost always means the cut-out failed rather than that the picture was unusual. Glass, smoke, fine mesh and motion blur are the known hard cases. The result is a suggestion, not a measurement, and nothing here decides whether the image may be used. - Preis: 0.01 USDC - MCP-Werkzeug: `bg_remove` - Eingabe: `["source","format","alpha_matting","crop_to_subject","max_width","quality"]` ### POST /v1/doc-convert Takes one file, by URL or inline base64, and returns it in the format you ask for. Text documents go through pandoc, so DOCX, ODT, EPUB, HTML, Markdown, RST, Org, LaTeX, RTF, MediaWiki, Textile, CSV and Jupyter notebooks convert in both directions. A PDF is a one-way street: its text is extracted with poppler (to markdown, html or plain text) or its pages are rendered to PNG or JPEG at a chosen dpi, but no format converts into PDF here — this machine has no PDF typesetting engine (no LaTeX, no wkhtmltopdf), and pandoc listing pdf among its output formats does not change that, so asking for PDF output is refused with the reason rather than failing halfway. Raster images convert between PNG, JPEG, WebP, AVIF and TIFF with optional downscaling and quality, and the before/after dimensions and byte sizes come back with them. The input format is taken from the bytes themselves, not from the file name or the Content-Type the server claimed, and both are reported so a mismatch stays visible. A scanned PDF with no text layer returns empty text and says so — there is no OCR in this endpoint, and an empty result is the honest finding rather than a fault. - Preis: 0.005 USDC - MCP-Werkzeug: `doc_convert` - Eingabe: `["source","text","from","to","standalone","include_text_analysis","image"]` ### POST /v1/doc-diff Takes two documents, by URL, inline base64 or raw text, extracts the text of each and compares them. Paragraphs are the unit: the answer lists every block that was removed, added, or kept but reworded, and for reworded blocks it names the individual words that went and came, so a single changed number in a long clause is visible instead of the whole clause being flagged. Alongside the content diff a structural comparison reports headings, paragraph, list and table-line counts on both sides. The similarity score is deliberately symmetric — two times the shared words divided by the sum of both lengths — because a one-sided measure would rate a heavily shortened document as almost unchanged. Both sides are measured the same way over the same units; if the two inputs arrive in different formats, so that one text comes out of a PDF and the other out of a DOCX, that is reported as a caveat, because part of any structural difference then comes from the extraction path and not from the documents. Ordering and duplicate paragraphs are handled by a shortest-edit-script diff, not by set comparison. What this endpoint does not do is judge: it says what changed, never whether the change is favourable, material or lawful. - Preis: 0.002 USDC - MCP-Werkzeug: `doc_diff` - Eingabe: `["a","b","ignore_whitespace","ignore_case","include_unchanged","max_blocks_returned","block_char_limit"]` ### POST /v1/pdf-fill Called without "fields" it inspects: every AcroForm field of the PDF comes back with its name, type, current value, whether it is required or read-only, the permitted options for dropdowns, radio groups and list boxes, and the character limit of text fields. Called with "fields" it fills exactly those and returns the resulting PDF as base64, together with what each field held before and after. Values are checked against the form before anything is written — an unknown field name, a value outside a dropdown list, text beyond a field length limit or a write to a read-only field is refused with the reason and nothing is charged, because a half-filled PDF is worse than none. Signatures are outside this service by design: it will not set a cryptographic signature and will not paste a picture of one, it refuses any write to a signature field, and if the document already carries a signature it refuses to modify it at all — any change to a signed PDF breaks that signature, and returning a document whose proof is quietly broken would be the most damaging thing this endpoint could do. Inspection of a signed document is still available. Optional flattening bakes the entered values into the page content so they can no longer be edited; note that flattening is irreversible and removes the form. - Preis: 0.005 USDC - MCP-Werkzeug: `pdf_fill` - Eingabe: `["source","fields","flatten","return_pdf","ignore_encryption"]` ### POST /v1/image-dupe Takes between two and eight images by URL or inline base64 and compares each pair. Three perceptual hashes are computed, because each fails differently: an average hash over an 8x8 grey image is cheap but moves with brightness, a gradient hash reads the slope between neighbouring pixels and survives exposure changes, and a DCT hash over the low frequencies of a 32x32 grey image is the sturdiest against rescaling and re-encoding. A SHA-256 catches byte-identical files, which perceptual hashes cannot distinguish from a lossless re-save. Every pair comes back with all three Hamming distances, the verdict, and the thresholds that produced it, so a caller sorting a large collection can move the line without re-buying. Optional checks re-hash the second image mirrored and rotated by 90, 180 and 270 degrees and report which transform matched, because a rotated copy is a duplicate to a human and a completely different image to a hash. Images too flat to carry a hash verdict — colour fields, blank scans, a logo on white — are detected and returned as inconclusive with their measured distances rather than as a match, because in the low-frequency band two unrelated plain surfaces sit as close together as two copies of the same photograph, and reporting that as a duplicate would be the easiest way for this endpoint to be confidently wrong. The other limits are stated rather than implied: perceptual hashing is robust against rescaling, re-compression, mild colour and brightness changes, and reasonably robust against small overlays; it is not robust against cropping, which shifts the whole frame, and it says nothing about whether two images show the same object or scene. This is duplicate detection, not image recognition, and neither the images nor their hashes are stored beyond the request. - Preis: 0.005 USDC - MCP-Werkzeug: `image_dupe` - Eingabe: `["images","check_rotations","check_mirror","phash_threshold"]` ### POST /v1/c2pa-verify Takes one media file by URL or inline base64 and reads its C2PA manifest store. The answer says whether a manifest is present at all, whether the cryptographic checks pass — every failing check is returned with its code and explanation, so a hash mismatch on the image data is distinguishable from a broken claim signature — who the signing certificate names as issuer, its serial number, the signing algorithm and the signing time, the chain of ingredients a derived file inherited from, and every edit action the manifest records. Where the manifest declares a digital source type, it is translated: trainedAlgorithmicMedia means generated by a model, compositeWithTrainedAlgorithmicMedia means partly so, digitalCapture means a camera. The verdict is deliberately narrow. A passing check proves that the file has not changed since it was signed and matches what the signer signed. It does not prove that the signer is who the certificate says, that the depicted scene is real, or that nothing was omitted before signing — and this endpoint does not check the issuer against a trust list, so an unknown or self-issued certificate produces the same passing hashes as a camera manufacturer, and the answer says so instead of implying accreditation. The absence of a manifest is likewise reported as absence and nothing more: almost no file in the world carries Content Credentials, so a missing manifest is not evidence of manipulation. Nothing is stored beyond the request. - Preis: 0.002 USDC - MCP-Werkzeug: `c2pa_verify` - Eingabe: `["source","include_assertions","include_all_manifests","max_assertion_chars"]` ### POST /v1/keyframes Takes a video by URL or inline base64 and reports where the picture changes. FFmpeg measures the difference between consecutive frames; every jump above the threshold starts a new scene, and the answer lists each scene with start, end, duration and the fraction of the running time it covers, plus the raw detection score positions. A thumbnail can be rendered per scene, sampled a little after the cut rather than exactly on it because the frame on the cut is often a transition, and returned as base64 JPEG at a width you choose. Media facts come from ffprobe: duration, container, codec, resolution, frame rate and whether there is audio. The threshold is the whole game and is therefore exposed and reported back: at 0.2 a slow pan becomes several scenes, at 0.6 a hard cut between similar shots is missed, and 0.3 to 0.4 suits most edited material — no threshold is correct for all footage, and the endpoint does not pretend otherwise. What it does not do is understand the video: it detects visual discontinuity, so a lighting change or a camera flash counts as a scene change and a cut between two similar shots does not, and it neither recognises objects nor reads the audio. Billing is per started minute, and because the price has to be fixed before the file is even fetched, the caller declares the length: if the video turns out longer than declared, the call is refused with the real duration and nothing is charged. - Preis: 0.01 USDC - MCP-Werkzeug: `keyframes` - Eingabe: `["source","duration_minutes","scene_threshold","max_scenes","min_scene_seconds","include_thumbnails","thumbnail_width","max_thumbnails"]` ### POST /v1/msds-extract Downloads one public PDF up to 5 MiB through SSRF-safe redirect checks or accepts extracted text, runs pdftotext in a private temporary directory, and deterministically extracts the requested codes with their source lines. Temporary PDF and text files are deleted before the response. It does not OCR scans, identify symbols from images, translate legal wording or certify regulatory completeness. - Preis: 0.010 USDC - MCP-Werkzeug: `msds_extract` - Eingabe: `["pdf_url","text"]` ## Weitere Flächen - OpenAPI: https://medien.halowerk.com/openapi.json - Preise: https://medien.halowerk.com/pricing - x402-Manifest: https://medien.halowerk.com/.well-known/x402 - Bazaar: https://medien.halowerk.com/.well-known/x402/bazaar - MCP: https://medien.halowerk.com/mcp ## Missing a capability? If you looked for something this service does not offer, say so. One call, no payment, no sign-up, no account: POST https://bedarf.halowerk.com/capabilities/request Content-Type: application/json {"requested_capability": "what you would buy", "description": "the use case, one sentence", "callback_url": "optional - we call back once it exists"} Only requested_capability is required, 3 to 160 characters. Schema and status: https://bedarf.halowerk.com/openapi.json Submissions are held for review and are never published verbatim.