{"x402Version":2,"service":"HALOWERK buerowerk","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://buero.halowerk.com/v1/entity-graph","method":"POST","name":"entity_graph","description":"Takes a text as text, a public URL or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and returns it as a graph: the people, organisations, places, products, documents and events it names, and the relations it states between them. Every relation carries the sentence it came from word for word, plus the character offset and line where that sentence stands, and each of those quotes is looked up in the source text before the answer goes out: an exact match, or a match after whitespace is normalised. A relation whose quote cannot be located is returned flagged as unverified and counted separately rather than passed off as a finding, and a relation pointing at an entity the extraction never named is discarded outright, because a model that invents an edge is worse than one that finds nothing — the buyer cannot tell. Dates are handled the same way: the wording is returned verbatim from the text and verified like any other quote, while the ISO form beside it is labelled as a conversion, not as a finding. Entities carry a deterministic identifier derived from their name, so two answers about the same text can be laid against each other. What this endpoint does not do is know anything: it adds no world knowledge, resolves no company against a register, merges no two same-named parties into one, and draws no conclusion the text does not state — what is not in the text is not in the graph. It also does not judge whether a relation is usual, favourable or lawful. The text is processed by a third-party model — the provider, what leaves this machine and what is retained there are named in every answer. Nothing is cached, nothing is written to a database, and no part of the text appears in any log or error message.","summary":"Extracts the entities, the relations between them and the dates from a supplied text, and returns every single relation with the verbatim sentence it was drawn from, checked against the source before it goes out.","inputSchema":{"type":"object","required":["document"],"additionalProperties":false,"properties":{"document":{"type":"object","additionalProperties":false,"description":"The text to read. Exactly one of text, url or content_base64.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"entity_types":{"type":"array","minItems":1,"maxItems":8,"description":"Which kinds of entity to look for. Default: person, organisation, place, product, document, event.","items":{"type":"string","enum":["person","organisation","place","product","document","event","amount","other"]}},"document_chars":{"type":"integer","minimum":1,"maximum":24000,"description":"Only needed when the text arrives by url or content_base64: its length in characters, which is what you are billed for. A longer text is refused with its real length and nothing is charged."},"max_relations":{"type":"integer","minimum":1,"maximum":120,"default":60,"description":"How many relations to return at most. What is dropped is counted, never silently cut."},"include_unverified":{"type":"boolean","default":true,"description":"Also return relations whose quote could not be located in the source, clearly marked. Off means they are only counted."},"include_isolated_entities":{"type":"boolean","default":true,"description":"Also return entities that ended up with no relation. Off means they are only counted."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","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://buero.halowerk.com/v1/processing-record","method":"POST","name":"processing_record","description":"Takes an inventory — the controller, and one entry per processing activity with its purposes, the stated legal basis, the categories of data subjects and of personal data, the categories of recipients, any third-country transfers, the erasure periods and the security measures — and returns it laid out as a draft record of processing activities under Article 30(1) GDPR. Every activity comes back mapped item by item onto letters (a) through (g) of that article, each letter marked present or missing, with a per-activity and an overall completeness count, so what the inventory does not yet cover is named rather than quietly rendered as a finished form. Legal bases are accepted only as the enumerated values of Article 6(1) and Article 9(2), and special-category data is flagged as requiring an Article 9(2) basis in addition, but which basis applies is the caller statement and is passed through, never chosen here. Third-country transfers are checked against the EEA member list and, where a destination lies outside it, the safeguard the caller has declared under Article 46 or 49 is carried into the record, or its absence is reported as a gap under letter (e). Two limits are deliberate and hard. The input is an inventory, not raw data: anything that looks like an IP address, and free-text addresses outside the contact blocks, are refused with HTTP 400 naming the field and the pattern but never echoing the value, because a record describes categories and does not carry a single data subject. And the output is a form draft, not legal advice: it does not decide whether a legal basis holds, whether a retention period is appropriate, whether a transfer is permitted or whether the processing is lawful at all, it performs no balancing test under Article 6(1)(f), and it does not assess whether a data protection impact assessment is required. Those decisions stay with the controller. No model is involved, no external source is contacted and nothing is stored: the same input yields byte-identical output.","summary":"Turns a structured inventory of processing activities into a draft record under Article 30(1) GDPR, listing each activity against the lettered items the article requires and naming exactly which of them the submitted inventory does not cover.","inputSchema":{"type":"object","required":["controller","activities"],"additionalProperties":false,"properties":{"controller":{"type":"object","additionalProperties":false,"description":"The controller — Article 30(1)(a). Required.","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":300,"description":"Legal name of the body."},"address":{"type":"string","maxLength":500,"description":"Postal address as one line."},"email":{"type":"string","maxLength":200,"description":"Contact mailbox of the body. A functional address, not a person."},"phone":{"type":"string","maxLength":60,"description":"Contact number of the body."}}},"representative":{"type":"object","additionalProperties":false,"description":"The representative under Article 27, where one is appointed. Article 30(1)(a).","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":300,"description":"Legal name of the body."},"address":{"type":"string","maxLength":500,"description":"Postal address as one line."},"email":{"type":"string","maxLength":200,"description":"Contact mailbox of the body. A functional address, not a person."},"phone":{"type":"string","maxLength":60,"description":"Contact number of the body."}}},"dpo":{"type":"object","additionalProperties":false,"description":"The data protection officer, where one is appointed. Article 30(1)(a).","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":300,"description":"Legal name of the body."},"address":{"type":"string","maxLength":500,"description":"Postal address as one line."},"email":{"type":"string","maxLength":200,"description":"Contact mailbox of the body. A functional address, not a person."},"phone":{"type":"string","maxLength":60,"description":"Contact number of the body."}}},"joint_controllers":{"type":"array","maxItems":20,"description":"Joint controllers under Article 26, where there are any. Article 30(1)(a).","items":{"type":"object","additionalProperties":false,"description":"One joint controller.","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":300,"description":"Legal name of the body."},"address":{"type":"string","maxLength":500,"description":"Postal address as one line."},"email":{"type":"string","maxLength":200,"description":"Contact mailbox of the body. A functional address, not a person."},"phone":{"type":"string","maxLength":60,"description":"Contact number of the body."}}}},"activities":{"type":"array","minItems":1,"maxItems":100,"description":"One entry per processing activity. This is an inventory of activities, not a log of events.","items":{"type":"object","required":["name","purposes"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"Short label of the activity, e.g. \"Payroll\" or \"Applicant management\"."},"purposes":{"type":"array","minItems":1,"maxItems":20,"description":"Article 30(1)(b). One purpose per entry, in your own words.","items":{"type":"string","minLength":1,"maxLength":500}},"legal_basis":{"type":"array","maxItems":6,"description":"Which of Article 6(1)(a) to (f) you rely on. Your statement — it is recorded, not chosen or checked here.","items":{"type":"string","enum":["art6_1_a_consent","art6_1_b_contract","art6_1_c_legal_obligation","art6_1_d_vital_interests","art6_1_e_public_task","art6_1_f_legitimate_interests"]}},"legitimate_interests_description":{"type":"string","maxLength":2000,"description":"The interests relied on, where art6_1_f_legitimate_interests is named. Recorded as stated; no balancing test is performed here."},"special_category_basis":{"type":"array","maxItems":8,"description":"Which of Article 9(2) you rely on, where special categories of data are processed.","items":{"type":"string","enum":["art9_2_a_explicit_consent","art9_2_b_employment_law","art9_2_c_vital_interests","art9_2_f_legal_claims","art9_2_g_substantial_public_interest","art9_2_h_health_care","art9_2_i_public_health","art9_2_j_archiving_research"]}},"data_subject_categories":{"type":"array","maxItems":30,"description":"Article 30(1)(c), first half. Categories, e.g. \"employees\", \"applicants\" — never individuals.","items":{"type":"string","minLength":1,"maxLength":200}},"data_categories":{"type":"array","maxItems":60,"description":"Article 30(1)(c), second half. Categories, e.g. \"contact data\", \"payroll data\" — never values.","items":{"type":"string","minLength":1,"maxLength":200}},"special_categories":{"type":"array","maxItems":12,"description":"Which special categories under Article 9(1) occur, if any.","items":{"type":"string","enum":["racial_or_ethnic_origin","political_opinions","religious_or_philosophical_beliefs","trade_union_membership","genetic_data","biometric_data","health_data","sex_life_or_orientation"]}},"recipient_categories":{"type":"array","maxItems":40,"description":"Article 30(1)(d). Categories of recipients, e.g. \"payroll provider\", \"tax authority\".","items":{"type":"string","minLength":1,"maxLength":300}},"third_country_transfers":{"type":"array","maxItems":30,"description":"Article 30(1)(e). One entry per destination outside your own establishment. Destinations inside the EEA are recorded and marked as such.","items":{"type":"object","required":["country_code"],"additionalProperties":false,"properties":{"country_code":{"type":"string","minLength":2,"maxLength":2,"description":"ISO 3166-1 alpha-2, uppercase, e.g. US."},"recipient_category":{"type":"string","maxLength":300,"description":"Category of recipient in that country."},"safeguard":{"type":"string","enum":["adequacy_decision_art45","scc_art46_2_c","bcr_art47","codes_of_conduct_art46_2_e","certification_art46_2_f","derogation_art49","none_stated"],"description":"The safeguard you rely on under Article 46 or 49. Recorded as stated."},"safeguard_reference":{"type":"string","maxLength":500,"description":"Where the safeguard is documented, e.g. a contract reference. Recorded, not retrieved."}}}},"retention_period_days":{"type":"integer","minimum":0,"maximum":36525,"description":"Article 30(1)(f). Erasure period in days, where a fixed one applies. Unit is in the name: days."},"retention_criteria":{"type":"string","maxLength":2000,"description":"Article 30(1)(f). The criteria for erasure where no fixed period applies, e.g. \"six years after the end of the contract year\"."},"security_measures":{"type":"array","maxItems":40,"description":"Article 30(1)(g). General description of the technical and organisational measures under Article 32(1).","items":{"type":"string","minLength":1,"maxLength":500}},"systems":{"type":"array","maxItems":40,"description":"The systems the activity runs in. Not required by Article 30; carried through because a record without systems is hard to maintain.","items":{"type":"string","minLength":1,"maxLength":200}},"processors":{"type":"array","maxItems":40,"description":"Processors under Article 28. Not required by Article 30(1); carried through unchanged.","items":{"type":"string","minLength":1,"maxLength":300}}}}},"record_language":{"type":"string","enum":["de","en"],"default":"de","description":"Language of the article texts printed beside each letter. Your own wording is never translated."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","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://buero.halowerk.com/v1/doc-merge","method":"POST","name":"doc_merge","description":"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. A region only one side touched is taken from that side; a region both sides changed to exactly the same text is taken once; and a region both sides changed differently is a conflict. Conflicts are never resolved. Each one comes back with the base wording, both competing versions, a word-level diff of each side against the base, and its position counted in units, and in the merged text it is marked with labelled markers, or the base wording is kept, or the merged text is withheld entirely — your choice, and whichever you pick the conflict is still reported and counted. The counts of merged, conflicting and unchanged paragraphs come alongside, plus a symmetric similarity figure for each version against the base and against the other version, and a flag saying whether the comparison really was the shortest edit script or hit its complexity ceiling, in which case the affected region is reported as a conflict rather than guessed at. What this endpoint does not do is decide. It does not judge which version is better, newer or more authoritative, does not know who wrote either, does not merge inside whichever unit you chose, and does not check that the merged document still makes sense as a whole — a merge that is clean by paragraph can still be contradictory in substance, and only a reader can see that. No model is involved and no external source is contacted: the same three inputs give byte-identical output, and no part of any document is written to a database, a cache, a log or an error message.","summary":"Merges two versions of a document against their common base, by paragraph or by line, and where both sides changed the same passage it names the conflict with all three readings instead of silently picking one.","inputSchema":{"type":"object","required":["base","a","b"],"additionalProperties":false,"properties":{"base":{"type":"object","additionalProperties":false,"description":"The common base both versions came from. Exactly one of text, url or content_base64.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"a":{"type":"object","additionalProperties":false,"description":"The first version. Same shape as base.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"b":{"type":"object","additionalProperties":false,"description":"The second version. Same shape as base.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"label_a":{"type":"string","maxLength":60,"default":"a","description":"Name for the first version, used in conflict markers and in the conflict list."},"label_b":{"type":"string","maxLength":60,"default":"b","description":"Name for the second version."},"conflict_style":{"type":"string","enum":["markers","keep_base","none"],"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."},"merge_unit":{"type":"string","enum":["paragraph","line"],"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."},"ignore_whitespace":{"type":"boolean","default":true,"description":"Treat runs of spaces and tabs as one space before comparing. Applied to all three documents alike."},"include_word_diff":{"type":"boolean","default":true,"description":"Include a word-level diff of each side against the base for every conflict."},"max_conflicts_detailed":{"type":"integer","minimum":1,"maximum":200,"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."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","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://buero.halowerk.com/v1/meeting-actions","method":"POST","name":"meeting_actions","description":"Takes a transcript as text, a public URL or inline base64 and returns what follows from the meeting: the tasks, who is responsible, by when, the decisions that were actually taken, and the questions that stayed open. Every single entry carries the verbatim passage it was drawn from, and that passage is looked up in the transcript before the answer goes out — an exact match or a match after whitespace is normalised. Anything that cannot be located is returned flagged as unverified and counted separately, because an invented task in a set of minutes is only noticed once somebody has failed to do it. Where the transcript does not name a responsible person, the field stays empty instead of being filled with the nearest name. Relative deadlines are only turned into dates when a reference_date is supplied, and then only for unambiguous phrases such as today, tomorrow, end of the month or a named weekday, with the rule that was applied returned alongside; everything else keeps the wording as it fell and is marked unresolved. The transcript is processed by a third-party model, and the provider, what leaves this machine and what is retained there are named in every answer — a caller under a confidentiality obligation or a works agreement has to make that call themselves. Nothing is cached, nothing is written to a database, and no part of the transcript appears in any log or error message.","summary":"Turns a meeting transcript into action items with owner and due date, the decisions that were taken and the questions left open — each one carrying the verbatim line it came from, checked against the transcript.","inputSchema":{"type":"object","required":["transcript"],"additionalProperties":false,"properties":{"transcript":{"type":"object","additionalProperties":false,"description":"The meeting transcript. Exactly one of text, url or content_base64.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"reference_date":{"type":"string","maxLength":40,"description":"The day the meeting took place, ISO 8601. Without it, relative deadlines like \"next Friday\" are returned as spoken and marked unresolved rather than guessed."},"document_chars":{"type":"integer","minimum":1,"maximum":24000,"description":"Only needed when the transcript arrives by url or content_base64: its length in characters, which is what you are billed for. A longer text is refused with its real length and nothing is charged."},"include_unverified":{"type":"boolean","default":true,"description":"Also return entries whose quote could not be located in the transcript, clearly marked."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","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://buero.halowerk.com/v1/availability-resolve","method":"POST","name":"availability_resolve","description":"Give it a search window, a meeting length, and for each participant a list of busy blocks — start and end, nothing else — and it returns the windows in which the meeting fits. Each participant carries their own IANA timezone and working hours, so nine-to-five means nine-to-five where they are, across daylight saving changes, and a meeting is only offered when it lies entirely inside one working-hours block for everyone counted as present. Windows are returned with the participants who can attend, those who cannot, and a rank that puts full attendance first and the earliest slot next; setting min_attendees or marking participants as optional produces partial windows too, each labelled with exactly who is missing. Alongside the windows every participant gets a load figure — busy minutes, free minutes inside working hours, and a percentage — and all of them are measured over the identical search window, because a percentage from a two-week sample set beside one from three weeks compares nothing. The input is deliberately impoverished: it takes no calendar credentials, no event titles, no attendee names, no location, and an identifier may be a single letter. Nothing is stored beyond the response. What it does not do is decide: it will not rank by anyone seniority, guess which meeting may be moved, or read a busy block as tentative — a block is busy, and a slot that fits is offered without any claim that it is a good time.","summary":"Takes anonymous busy blocks from several people, each with their own timezone and working hours, and returns the common free windows long enough for the meeting, ranked, with who can attend each one and who cannot.","inputSchema":{"type":"object","required":["participants","window","duration_minutes"],"additionalProperties":false,"properties":{"participants":{"type":"array","minItems":1,"maxItems":20,"description":"One entry per person. Identifiers are free text and need not be real names.","items":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":80,"description":"Any label, unique within the request. \"a\" is fine."},"busy":{"type":"array","maxItems":300,"description":"Busy blocks. Overlapping blocks are merged.","items":{"type":"object","required":["start","end"],"additionalProperties":false,"properties":{"start":{"type":"string","maxLength":40,"description":"ISO 8601 with offset or Z."},"end":{"type":"string","maxLength":40,"description":"ISO 8601 with offset or Z."}}}},"timezone":{"type":"string","maxLength":60,"description":"IANA zone for this person, e.g. Europe/Berlin. Falls back to the request default."},"working_hours":{"type":"object","additionalProperties":false,"description":"Working hours in this person local time. Omit to use the request default.","properties":{"start":{"type":"string","maxLength":5,"description":"HH:MM, e.g. 09:00."},"end":{"type":"string","maxLength":5,"description":"HH:MM. An end before the start means the block runs past midnight."},"days":{"type":"array","maxItems":7,"items":{"type":"integer","minimum":0,"maximum":6},"description":"0 is Sunday, 6 is Saturday. Default Monday to Friday."}}},"optional":{"type":"boolean","default":false,"description":"Optional participants may be missing from a returned window."}}}},"window":{"type":"object","required":["start","end"],"additionalProperties":false,"description":"The search window. Every load figure is measured over exactly this span for everyone.","properties":{"start":{"type":"string","maxLength":40,"description":"ISO 8601."},"end":{"type":"string","maxLength":40,"description":"ISO 8601."}}},"duration_minutes":{"type":"integer","minimum":5,"maximum":1440,"description":"How long the meeting needs to be."},"granularity_minutes":{"type":"integer","enum":[5,10,15,20,30,60],"default":15,"description":"Step of the candidate grid. Start times fall on this grid."},"default_timezone":{"type":"string","maxLength":60,"default":"UTC","description":"Timezone for participants that do not name one."},"working_hours":{"type":"object","additionalProperties":false,"description":"Default working hours for participants that do not name their own. Omit both this and per-participant hours to search around the clock.","properties":{"start":{"type":"string","maxLength":5},"end":{"type":"string","maxLength":5},"days":{"type":"array","maxItems":7,"items":{"type":"integer","minimum":0,"maximum":6}}}},"ignore_working_hours":{"type":"boolean","default":false,"description":"Search the whole window regardless of working hours."},"min_attendees":{"type":"integer","minimum":1,"description":"Also return windows where only this many can attend. Default: everyone who is not optional."},"max_results":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"How many windows to return. What is dropped is counted."},"output_timezone":{"type":"string","maxLength":60,"description":"Additionally render every returned time in this zone. Defaults to default_timezone."}}},"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://buero.halowerk.com/v1/clause-extract","method":"POST","name":"clause_extract","description":"Takes a contract as text, a public URL or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and returns the passages governing the requested topics. Termination, liability, term, payment and jurisdiction are the default; confidentiality, data protection, IP, warranty, force majeure, assignment and notice can be requested as well. Every finding comes back with the clause quoted word for word, the character offset and line where it stands, the section heading if the document names one, and a plain description of what is regulated. Each quote is then checked against the source text before it is returned: an exact match, or a match after whitespace is normalised, and anything that cannot be located is returned flagged as unverified and counted separately rather than passed off as a finding — a model that invents a clause is worse than one that finds nothing, because the buyer cannot tell. What this endpoint deliberately does not do is judge. It gives no opinion on whether a clause is effective, enforceable, unusual, risky or disadvantageous, makes no recommendation and offers no assessment of the legal position; that would be legal advice, which it is not permitted to give. The text is processed by a third-party model — the provider, what leaves this machine and what is retained there are named in every answer, because a caller bound by confidentiality has to decide that for themselves. Nothing is cached, nothing is written to a database, and no part of the contract appears in any log or error message.","summary":"Finds the termination, liability, term, payment and jurisdiction clauses in a contract and returns each one verbatim with its position in the text. It extracts and locates; it does not assess whether a clause is valid, usual or favourable.","inputSchema":{"type":"object","required":["document"],"additionalProperties":false,"properties":{"document":{"type":"object","additionalProperties":false,"description":"The contract. Exactly one of text, url or content_base64.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"clause_types":{"type":"array","minItems":1,"maxItems":12,"description":"Which topics to look for. Default: termination, liability, term, payment, jurisdiction.","items":{"type":"string","enum":["termination","liability","term","payment","jurisdiction","confidentiality","data_protection","ip","warranty","force_majeure","assignment","notice"]}},"document_chars":{"type":"integer","minimum":1,"maximum":24000,"description":"Only needed when the contract arrives by url or content_base64: its length in characters, which is what you are billed for. A longer text is refused with its real length and nothing is charged."},"include_unverified":{"type":"boolean","default":true,"description":"Also return findings whose quote could not be located in the source, clearly marked. Off means they are only counted."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","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://buero.halowerk.com/v1/terms-diff","method":"POST","name":"terms_diff","description":"Takes two contract versions as text, public URLs or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and reports what is different. Which passages changed is decided by a Myers shortest-edit-script over the paragraphs, not by a model: the deterministic comparison is the source of truth, and only afterwards is a model asked what changed in substance at those specific places. That order is the point. A model handed two whole contracts returns a plausible list of changes whose completeness nobody can check, which on a contract is the most expensive mistake available; here every statement is anchored to a paragraph pair that both versions evidence, and any passage the model fails to describe is still returned with its before and after text, because the diff decides, not the model. Each change carries its old and new wording, a word-level diff of exactly which words went and came, a factual type — value changed, deadline changed, obligation added or removed, party, scope, reference, or wording only — and the concrete old and new values where there are any. Alongside comes a symmetric similarity figure and the counts of added, removed and reworded paragraphs. What this endpoint does not do is judge: it says what is different, never whether a change is favourable, material or enforceable, and it is not legal advice. The changed passages are processed by a third-party model — provider, what leaves this machine and what is retained there are named in every answer. Nothing is cached, nothing is written to a database, and no part of either contract appears in any log or error message.","summary":"Compares two versions of a contract: a shortest-edit-script diff decides which passages changed, and a model then describes what changed in substance at exactly those passages — so no change can be invented and none silently dropped.","inputSchema":{"type":"object","required":["a","b"],"additionalProperties":false,"properties":{"a":{"type":"object","additionalProperties":false,"description":"The earlier version. Exactly one of text, url or content_base64.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"b":{"type":"object","additionalProperties":false,"description":"The later version. Same shape as a.","properties":{"text":{"type":"string","maxLength":200000,"description":"The text directly. Cheapest and clearest — its length is billed as counted here."},"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":4000000,"description":"The file inline, base64."},"filename":{"type":"string","maxLength":260,"description":"Only consulted when the bytes carry no recognisable signature."},"format":{"type":"string","enum":["auto","pdf","docx","odt","html","markdown","rtf","text"],"default":"auto","description":"Override the detected format. \"auto\" reads it from the bytes."}}},"document_chars":{"type":"integer","minimum":1,"maximum":24000,"description":"Only needed when a version arrives by url or content_base64: the combined length of both versions in characters, which is what you are billed for. Longer text is refused with the real length and nothing is charged."},"max_changes_described":{"type":"integer","minimum":1,"maximum":60,"default":25,"description":"How many changed passages the model describes. Beyond this the passages still come back with their before and after text, only without a description — what is dropped is counted, never silently cut."},"ignore_whitespace":{"type":"boolean","default":true,"description":"Treat runs of spaces and tabs as one space before comparing."},"include_unchanged_count":{"type":"boolean","default":true,"description":"Report how many paragraphs stayed identical."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","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}]}]}