{"x402Version":2,"service":"HALOWERK medienwerk","version":"1.0.0","network":"eip155:8453","network_name":"Base Mainnet","chain_id":8453,"recipient":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","asset":{"symbol":"USDC","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","decimals":6},"facilitators":["CDP","https://facilitator.xpay.sh"],"payment_headers":{"primary":"PAYMENT-SIGNATURE","accepted":["PAYMENT-SIGNATURE","X-Payment","PAYMENT"],"challenge":["PAYMENT-REQUIRED"],"response":["PAYMENT-RESPONSE"]},"resources":[{"url":"https://medien.halowerk.com/v1/image-palette","method":"POST","name":"image_palette","description":"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.","summary":"Extracts the dominant and accent colours of an image with their area share, each given as HEX, sRGB and OKLCH, together with WCAG 2.1 contrast ratios against white, black and every other palette colour, computed deterministically and entirely on this machine.","inputSchema":{"type":"object","required":["source"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The image. Either url or content_base64, not both.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the image."},"content_base64":{"type":"string","maxLength":12000000,"description":"The image inline, base64."},"filename":{"type":"string","maxLength":260}}},"max_colors":{"type":"integer","minimum":2,"maximum":16,"default":6,"description":"Upper bound on palette size. Clusters whose share falls below min_share_pct are merged into their nearest neighbour, so the answer can contain fewer."},"min_share_pct":{"type":"number","minimum":0,"maximum":50,"default":1,"description":"Minimum area share in percent for a colour to stay in the palette. Below this it is merged into the perceptually nearest remaining colour and counted under merged_clusters."},"include_contrast":{"type":"boolean","default":true,"description":"Return WCAG 2.1 contrast ratios: against white and black per colour, and the full pairwise matrix."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/stt","method":"POST","name":"stt","description":"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.","summary":"Transcribes an audio or video file with word-level timestamps, detected language, paragraph and utterance structure, and a confidence breakdown that names the weakest passages by timestamp instead of presenting every word as equally certain.","inputSchema":{"type":"object","required":["source","duration_minutes"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the audio or video file."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64. Larger files must come by url."},"filename":{"type":"string","maxLength":260}}},"duration_minutes":{"type":"integer","minimum":1,"maximum":30,"description":"Length of the recording in started minutes — this is what you are billed for. A longer file is refused with its real length and nothing is charged; a shorter one costs what you declared, and the answer says how much less it would have been."},"language":{"type":"string","maxLength":12,"description":"BCP-47 code such as de, en, es. \"multi\" enables multilingual recognition and is billed at the provider's higher rate. Omit to let the recogniser detect the language."},"confidence_threshold":{"type":"number","minimum":0,"maximum":1,"default":0.7,"description":"Words below this confidence are listed separately as the passages worth checking."},"include_words":{"type":"boolean","default":true,"description":"Return every word with its timestamp. Off returns only the text, paragraphs and utterances."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"20000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/diarize","method":"POST","name":"diarize","description":"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.","summary":"Separates the speakers in a recording and returns every speaking turn with start, end and text, plus each speaker share of the talking time, the number of turns, the longest uninterrupted stretch and how often the floor changed.","inputSchema":{"type":"object","required":["source","duration_minutes"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the audio or video file."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260}}},"duration_minutes":{"type":"integer","minimum":1,"maximum":30,"description":"Length of the recording in started minutes — this is what you are billed for. A longer file is refused with its real length and nothing is charged."},"language":{"type":"string","maxLength":12,"description":"BCP-47 code such as de, en. \"multi\" enables multilingual recognition at the provider's higher rate. Omit to detect."},"include_turn_text":{"type":"boolean","default":true,"description":"Include the text of each turn. Off returns only the timeline and the figures."},"confidence_threshold":{"type":"number","minimum":0,"maximum":1,"default":0.7,"description":"Words below this confidence are listed separately."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"25000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/doc-translate","method":"POST","name":"doc_translate","description":"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.","summary":"Translates a document while keeping its structure intact — heading levels, list markers, table columns, placeholders, URLs and code blocks — and then measures the result against the original to report exactly what structure survived and what did not.","inputSchema":{"type":"object","required":["target_language"],"additionalProperties":false,"properties":{"text":{"type":"string","maxLength":24000,"description":"The document directly. Cheapest and clearest — its length is what you are billed for."},"source":{"type":"object","additionalProperties":false,"description":"Alternative to text: the document as a file.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto"}}},"target_language":{"type":"string","enum":["de","en","fr","es","it","nl","pt","pl","cs","da","sv","no","fi","tr","ro","hu","el"],"description":"Target language as a BCP-47 code."},"source_language":{"type":"string","enum":["auto","de","en","fr","es","it","nl","pt","pl","cs","da","sv","no","fi","tr","ro","hu","el"],"default":"auto","description":"Source language. \"auto\" lets the model detect it."},"document_chars":{"type":"integer","minimum":1,"maximum":24000,"description":"Only needed when the document arrives by url or content_base64: its length in characters, which is what you are billed for."},"formality":{"type":"string","enum":["neutral","formal","informal"],"default":"neutral","description":"Register of address where the target language distinguishes it."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/tts","method":"POST","name":"tts","description":"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.","summary":"Turns text into an audio file with a chosen Deepgram Aura voice and encoding, priced per thousand characters at a rate that follows the voice generation, with the voice checked against the provider list before anything is sent.","inputSchema":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","minLength":1,"maxLength":10000,"description":"The text to speak. At most 10000 characters per call."},"voice":{"type":"string","maxLength":60,"default":"aura-2-thalia-en","description":"Provider voice name, e.g. aura-2-thalia-en, aura-2-agathe-fr. Checked against the provider catalogue before the request is sent. Aura-1 voices are billed at half the Aura-2 rate."},"encoding":{"type":"string","enum":["mp3","wav","opus","flac","linear16"],"default":"mp3","description":"Audio format of the result."},"include_audio":{"type":"boolean","default":true,"description":"Return the audio base64. Off returns only the figures — useful for checking the price and length first."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"80000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/bg-remove","method":"POST","name":"bg_remove","description":"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.","summary":"Removes the background from an image and returns a cut-out PNG or WebP with an alpha channel, computed entirely on this machine — the image is not sent to any third party.","inputSchema":{"type":"object","required":["source"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The image. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the image."},"content_base64":{"type":"string","maxLength":12000000,"description":"The image inline, base64."},"filename":{"type":"string","maxLength":260}}},"format":{"type":"string","enum":["png","webp"],"default":"png","description":"Output format. Both carry an alpha channel; WebP is markedly smaller."},"alpha_matting":{"type":"boolean","default":false,"description":"Refine the edge for hair and fur. Slower, and not always better — compare before using it by default."},"crop_to_subject":{"type":"boolean","default":false,"description":"Crop the result to the bounding box of what remained."},"max_width":{"type":"integer","minimum":32,"maximum":4000,"description":"Scale the result down so the width fits. Never scales up."},"quality":{"type":"integer","minimum":1,"maximum":100,"default":90,"description":"For WebP output."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/doc-convert","method":"POST","name":"doc_convert","description":"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.","summary":"Converts a document or image between formats — DOCX, ODT, EPUB, HTML, Markdown, LaTeX, RST and friends via pandoc, PDF to text or page images, and raster images between PNG, JPEG, WebP, AVIF and TIFF — returning the result inline with the format actually detected in the bytes.","inputSchema":{"type":"object","required":["to"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The file to convert. Either url or content_base64, not both.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64. A data: prefix is accepted."},"filename":{"type":"string","maxLength":260,"description":"Optional. Only consulted when the bytes carry no recognisable signature."}}},"text":{"type":"string","maxLength":400000,"description":"Alternative to source for plain text input, e.g. Markdown or HTML source. Requires \"from\"."},"from":{"type":"string","enum":["auto","pdf","docx","odt","epub","html","markdown","gfm","commonmark","rst","org","latex","rtf","textile","mediawiki","jira","docbook","csv","tsv","ipynb","text","png","jpeg","gif","webp","tiff","avif","heic","svg"],"default":"auto","description":"Override the detected input format. \"auto\" reads it from the bytes."},"to":{"type":"string","enum":["markdown","gfm","commonmark","html","plain","text","rst","org","latex","rtf","textile","mediawiki","jira","asciidoc","docbook","typst","json","ipynb","docx","odt","epub","png","jpeg","webp","avif","tiff"],"description":"Target format. PDF is deliberately absent — see the description."},"standalone":{"type":"boolean","default":false,"description":"For pandoc targets: emit a complete document with header rather than a fragment."},"include_text_analysis":{"type":"boolean","default":true,"description":"Also return word, paragraph and heading counts of the extracted text."},"image":{"type":"object","additionalProperties":false,"description":"Only used for image targets.","properties":{"max_width":{"type":"integer","minimum":16,"maximum":8000,"description":"Scale down so the width fits. Never scales up."},"max_height":{"type":"integer","minimum":16,"maximum":8000,"description":"Scale down so the height fits."},"quality":{"type":"integer","minimum":1,"maximum":100,"default":82,"description":"For JPEG, WebP, AVIF and TIFF."},"dpi":{"type":"integer","minimum":36,"maximum":400,"default":150,"description":"Only when rendering PDF pages to images."},"first_page":{"type":"integer","minimum":1,"default":1,"description":"First PDF page to render."},"last_page":{"type":"integer","minimum":1,"description":"Last PDF page to render. Capped by max_pages."},"max_pages":{"type":"integer","minimum":1,"maximum":20,"default":5,"description":"Hard ceiling on rendered pages."}}}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/doc-diff","method":"POST","name":"doc_diff","description":"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.","summary":"Compares two versions of a document — PDF, DOCX, ODT, HTML, Markdown or plain text — and returns which paragraphs were removed, added or reworded, with a word-level diff inside every reworded paragraph and a symmetric similarity score.","inputSchema":{"type":"object","required":["a","b"],"additionalProperties":false,"properties":{"a":{"type":"object","additionalProperties":false,"description":"The earlier version. Exactly one of url, content_base64 or text.","properties":{"url":{"type":"string","maxLength":2048},"content_base64":{"type":"string","maxLength":12000000},"text":{"type":"string","maxLength":400000},"filename":{"type":"string","maxLength":260},"format":{"type":"string","enum":["auto","pdf","docx","odt","epub","html","markdown","rst","org","latex","rtf","csv","tsv","text"],"default":"auto"}}},"b":{"type":"object","additionalProperties":false,"description":"The later version. Same shape as a.","properties":{"url":{"type":"string","maxLength":2048},"content_base64":{"type":"string","maxLength":12000000},"text":{"type":"string","maxLength":400000},"filename":{"type":"string","maxLength":260},"format":{"type":"string","enum":["auto","pdf","docx","odt","epub","html","markdown","rst","org","latex","rtf","csv","tsv","text"],"default":"auto"}}},"ignore_whitespace":{"type":"boolean","default":true,"description":"Treat runs of spaces and tabs as one space before comparing."},"ignore_case":{"type":"boolean","default":false,"description":"Compare case-insensitively."},"include_unchanged":{"type":"boolean","default":false,"description":"Also list the unchanged blocks. Off by default — the changes are the answer."},"max_blocks_returned":{"type":"integer","minimum":10,"maximum":2000,"default":300,"description":"Ceiling on returned blocks. What is dropped is counted and reported, never silently cut."},"block_char_limit":{"type":"integer","minimum":80,"maximum":8000,"default":1200,"description":"Longer block texts are shortened in the answer; the diff itself always runs on the full text."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/pdf-fill","method":"POST","name":"pdf_fill","description":"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.","summary":"Reads the form fields of a PDF — names, types, options, current values, read-only and required flags — and fills the ones you name, returning the filled PDF. It never sets a signature and refuses to touch an already signed document.","inputSchema":{"type":"object","required":["source"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The PDF. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the PDF."},"content_base64":{"type":"string","maxLength":12000000,"description":"The PDF inline, base64."},"filename":{"type":"string","maxLength":260}}},"fields":{"type":"object","description":"Field name to value. Text fields take strings, check boxes true/false, dropdowns and radio groups one of their options, list boxes an array. Omit entirely to only inspect the form.","additionalProperties":{"type":["string","number","boolean","array","null"]}},"flatten":{"type":"boolean","default":false,"description":"Bake the values into the page content. Irreversible: the form is gone afterwards."},"return_pdf":{"type":"boolean","default":true,"description":"Return the filled PDF as base64. Set false if only the field report is wanted."},"ignore_encryption":{"type":"boolean","default":false,"description":"Try to open a PDF that declares encryption. Filling usually still fails; off by default so the reason stays visible."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/image-dupe","method":"POST","name":"image_dupe","description":"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.","summary":"Compares two to eight images with three perceptual hashes (average, gradient and DCT) plus SHA-256, and reports for every pair the measured Hamming distances, a verdict from identical through near-duplicate and likely-edited to different, and which images form a duplicate group.","inputSchema":{"type":"object","required":["images"],"additionalProperties":false,"properties":{"images":{"type":"array","minItems":2,"maxItems":8,"description":"Two to eight images. Each takes either url or content_base64.","items":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the image."},"content_base64":{"type":"string","maxLength":12000000,"description":"The image inline, base64."},"label":{"type":"string","maxLength":120,"description":"Name used in the answer. Defaults to image_1, image_2 …"},"filename":{"type":"string","maxLength":260}}}},"check_rotations":{"type":"boolean","default":false,"description":"Also compare against the other image rotated 90, 180 and 270 degrees."},"check_mirror":{"type":"boolean","default":false,"description":"Also compare against the mirrored image."},"phash_threshold":{"type":"integer","minimum":0,"maximum":32,"description":"Override the pHash distance below which a pair counts as likely edited. Default 10."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/c2pa-verify","method":"POST","name":"c2pa_verify","description":"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.","summary":"Reads the C2PA Content Credentials of an image, video, audio file or PDF and checks them: whether a manifest is present, whether its hashes and signature still hold, who signed and when, what edits the manifest records, and whether it declares generative-AI origin.","inputSchema":{"type":"object","required":["source"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The media file. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the file."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260}}},"include_assertions":{"type":"boolean","default":true,"description":"Return the full assertion payloads, not only their labels."},"include_all_manifests":{"type":"boolean","default":false,"description":"Return every manifest in the store, not only the active one."},"max_assertion_chars":{"type":"integer","minimum":200,"maximum":20000,"default":4000,"description":"Ceiling per assertion payload; longer ones are shortened and marked."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://medien.halowerk.com/v1/keyframes","method":"POST","name":"keyframes","description":"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.","summary":"Finds the scene changes in a video and returns every scene with its start, end, duration and share of the running time, optionally with a JPEG thumbnail per scene, using FFmpeg scene detection at a threshold you control.","inputSchema":{"type":"object","required":["source"],"additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"description":"The video. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the video."},"content_base64":{"type":"string","maxLength":12000000,"description":"The video inline, base64. Larger files must come by url."},"filename":{"type":"string","maxLength":260}}},"duration_minutes":{"type":"integer","minimum":1,"maximum":30,"default":1,"description":"Length of the video in started minutes — this is what you are billed for. A longer video is refused with its real duration and nothing is charged; a shorter one simply costs what you declared, and the answer says how much less it would have been."},"scene_threshold":{"type":"number","minimum":0.05,"maximum":0.95,"default":0.35,"description":"Frame-to-frame difference above which a new scene starts. Lower finds more, higher finds fewer."},"max_scenes":{"type":"integer","minimum":1,"maximum":400,"default":100,"description":"Ceiling on returned scenes. What is dropped is counted and reported."},"min_scene_seconds":{"type":"number","minimum":0,"maximum":60,"default":0.4,"description":"Merge cuts closer together than this. Guards against flicker being read as a cut."},"include_thumbnails":{"type":"boolean","default":false,"description":"Render one JPEG per scene and return it base64."},"thumbnail_width":{"type":"integer","minimum":32,"maximum":640,"default":160,"description":"Width of the thumbnails; height follows the aspect ratio."},"max_thumbnails":{"type":"integer","minimum":1,"maximum":60,"default":20,"description":"Ceiling on rendered thumbnails, independent of the scene count."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]}]}