{"protocolVersion":"0.3.0","name":"HALOWERK handelswerk","description":"HALOWERK handelswerk. Bezahlung über x402 in USDC auf Base Mainnet.","url":"https://handel.halowerk.com","version":"1.0.0","preferredTransport":"JSONRPC","capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"skills":[{"id":"local_business","name":"Find businesses of a given trade around a coordinate, with address, opening hours, contact details and distance, sourced from OpenStreetMap.","description":"Searches OpenStreetMap through Overpass for businesses of a chosen trade within a radius of a coordinate, and returns each with its name, address, opening hours, phone, website, and the distance from your point, sorted nearest first. Around thirty trades are mapped to the OSM tags that actually hold them, because OSM is indexed by tags and not by free text — a plain word search finds almost nothing there. Coverage is what volunteers have mapped: dense in cities, thin in rural areas, and a business absent here may simply never have been entered, which is stated rather than presented as an empty market. Overpass rejects requests over quota with a normal-looking empty answer; that case is detected and reported as an upstream condition instead of being passed off as no results. Data is ODbL and attribution is required on any reuse.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"registry_snapshot","name":"Register status of a legal entity from the global LEI register: legal form and register spelled out rather than left as codes, official seat, the competent register with its local file number, renewal dates and how well the record is corroborated.","description":"Looks up a legal entity in GLEIF, the worldwide Legal Entity Identifier register, by LEI or by name, and turns the raw record into an answer. GLEIF returns keys rather than statements: the legal form arrives as a code like 6QQB and the register as RA000304, so both are resolved against the GLEIF code lists into the legal form in its own language and the competent register with its website. registered_as carries the local file number, which is what actually lets a caller pull the national register entry. Two quality signals travel with every answer because they decide how much the record is worth. registration_status distinguishes an issued record from a lapsed one, where the annual confirmation was missed and the details may be stale. corroboration_level says whether the entry was checked against an official source or supplied by the company alone and never verified, which is the difference between a register extract and a self-declaration; an endpoint that hides this makes the two look identical. Relationships to the ultimate parent and to direct subsidiaries are included where GLEIF records them. Management and directors are not returned and cannot be: GLEIF records no corporate bodies, so the field stays null with the reason attached rather than being filled from elsewhere. Absence from GLEIF means the entity has no LEI, which is common for small companies and is not evidence that it does not exist.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"slotting_plan","name":"Assign SKUs to storage locations from your own pick frequencies, weights and slot distances, and return the placement with the travel distance recomputed against your current layout.","description":"Takes a warehouse as a table and returns a placement. You supply the storage locations with their walking distance to the pick-and-drop point and, where they exist, their weight and volume limits; you supply the SKUs with pick frequency, weight and volume; and you may supply the joint-pick pairs. The endpoint classifies the SKUs into A, B and C by cumulative pick share, groups the SKUs that are picked together into affinity clusters so that they are slotted next to each other, and then assigns clusters to the shortest free locations in descending order of pick frequency, skipping any location whose weight or volume limit the SKU would break. The travel distance is arithmetic, not an estimate: pick frequency times slot distance, doubled when the picker returns, summed over all SKUs. Where every SKU carries a current_location_id the same sum is computed for the existing layout and reported as the saving, so the plan can be judged rather than believed. The assignment heuristic is fixed and every ordering is decided by the input alone, so the same request always yields the same plan; it is a good placement, not a proven optimum, because the full problem is a quadratic assignment problem. This endpoint does not know your aisles: the distance per location is what you pass in, it is never derived from a floor plan, and nothing is stored between calls.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"container_load","name":"Plan a container or trailer load from your own package list: placement coordinates per package, volume and payload utilization, stack load per supporting package, centre of gravity and the static two-axle load split.","description":"Loads a package list into one loading space and returns the plan, not an estimate. The floor starts as one free surface; packages are sorted by footprint, then height, then weight, then identifier, and each one is placed on the lowest, then frontmost, then smallest free surface it fits on, turned by 90 degrees around the vertical axis where that makes it fit. Every placement splits the surface it used into two remainders and, where the package may be stacked on, opens a new free surface on top of it at its own height, so the floor is filled before anything is stacked and a stack is only ever built where the floor has run out. Packages are never tipped, so the stated height stays the height. Every placement comes back with its x, y and z coordinate in millimetres, its orientation, its stack level and the package it rests on, which makes the plan checkable rather than merely plausible. Three limits are enforced and every rejection names the limit it hit: loading stops before max_payload_kg is exceeded, no surface is opened on a package marked stackable false, and max_stack_load_kg is checked against the whole chain of packages underneath before a placement is made, so it constrains the plan rather than warning about it afterwards; the same check is run again over the finished plan and its result is reported. The result gives volume and floor-area utilization, payload utilization, the highest stack level, the centre of gravity in all three axes and, when two axle groups are given, the static payload share on each of them by the lever rule, flagged when it exceeds max_load_kg or when the centre of gravity falls outside the axle span. Every ordering is decided by the input, so the same request always returns the same plan; it is a good load, not a proven optimum, because three-dimensional packing is NP-hard, and a guillotine split cannot reuse an L-shaped remainder, which is stated in the response rather than hidden. This is not load securing: lashing forces, friction coefficients and VDI 2700 are out of scope, and so is any dynamic axle load.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"invoice_extract","name":"Pull the EN 16931 structure out of a ZUGFeRD or Factur-X PDF or an XRechnung: header, parties, lines, tax breakdown, totals and payment terms, with the stated totals recomputed.","description":"Reads a hybrid invoice and returns it as data. Accepts a PDF with an embedded ZUGFeRD or Factur-X XML, or the EN 16931 XML on its own, in either syntax the standard allows: CII, which ZUGFeRD and Factur-X use, and UBL, which XRechnung and Peppol BIS use. Both are mapped onto one flat result, so a caller does not have to know which syntax arrived: invoice number, type code, issue, delivery and due date, currency, profile identifier, buyer reference and order reference, seller and buyer with name, VAT number, legal identifier and address country, the payment means with IBAN and BIC, every line with quantity and unit code, net unit price, line net amount and tax category and rate, the tax breakdown per rate with taxable basis and tax amount, and the document totals from line total through tax basis, tax total and grand total to prepaid and amount due. The stated totals are then recomputed from the extracted parts in whole cents and every deviation is reported with the stated figure, the computed figure and the difference, with a one cent per tax group treated as rounding rather than as an error by the issuer. The result can be posted straight to /v1/invoice-audit for the full recomputation. Extraction is deterministic and literal: nothing is inferred, no model is involved, no external source is called, and a field that is not in the document comes back as null and is named in unavailable_fields. Scanned invoices are explicitly out of scope. A PDF that carries no embedded EN 16931 XML is rejected with a machine-readable reason and is never guessed at with text recognition, because a guessed invoice that is posted is a wrong booking that nobody notices in time.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"demand_forecast","name":"Forecast demand for one SKU from your own history, promotion calendar and holidays, with a prediction interval, the fitted seasonal and event factors, and a backtest against two baselines.","description":"Forecasts one SKU from a history you supply. The pipeline is fixed and fully disclosed in the response rather than hidden behind a score. The series is decomposed multiplicatively while every observation is positive and additively as soon as a zero or a negative appears, because a ratio is not defined there; the seasonal index is the median ratio per phase against a centred moving average, estimated only on periods that carry no promotion and no holiday so that a campaign in week twelve does not become the season of week twelve; the promotion and holiday factors are then estimated on the deseasonalised series against the quiet periods; the remainder is fitted with a Holt linear trend at fixed smoothing constants, deliberately fixed because tuning them per call would make the answer depend on a search that cannot be reproduced. The forecast recombines trend, season and the events you flag for the future periods, and the prediction interval comes from the standard deviation of the in-sample one-step errors widened by the square root of the horizon. Two baselines are always computed and reported even when they beat the method: the naive last value and the seasonal naive value one season back. A backtest holds back the tail of the history, refits the identical pipeline on the remainder and reports MAE, RMSE and MAPE for all three, so the forecast can be judged rather than believed. Everything is arithmetic on the data you send: no weather, no external source, no stored state, and the same request always returns the same numbers. It forecasts one series per call, it does not do cannibalisation between SKUs, and a season it cannot estimate is reported as not applied rather than assumed.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"return_disposition","name":"Decide per return whether to resell, repair and resell, recover value or scrap, computed from your own resale, repair, inspection and freight figures, with the full arithmetic and the break-even repair cost.","description":"Takes a list of returns with the figures your own systems already hold and returns one decision per return, with the arithmetic that produced it. Four routes are valued: reselling as is, at the resale value weighted by the probability that it actually sells and less the restocking cost; repairing and reselling, at the refurbished value weighted by the repair success probability plus the salvage value on the failure branch, less the repair cost, which is incurred either way; recovering value through parts or material; and scrapping, which is a cost and never proceeds. Inspection and inbound freight are charged to every route because they are incurred whatever you decide, so they change the level but never the ranking, and both figures are reported separately for exactly that reason. A route whose inputs are missing is reported as not evaluable together with the field names it needs, never quietly valued at zero, and an omitted cost that is treated as zero is listed per item so no decision rests on a silent assumption. Where the best route is ahead of the runner-up by less than decision_margin_pct the result is marked ambiguous and no winner is asserted, because a decision inside the noise of your own cost estimates is not a decision. For the repair route the break-even repair cost is reported: the amount at which repairing stops being the better choice. Amounts are in the currency you name and are never converted. This is arithmetic on your figures, not a valuation service: it does not know what the item is worth, it does not look up market prices, it stores nothing, and it does not run your returns process.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"landed_cost","name":"Work out the full landed cost of an import — goods, freight, insurance, duty and import VAT — with the duty rate looked up in the official UK or US tariff.","description":"Computes what an import actually costs at the destination. The customs value is assembled from goods, freight and insurance on the chosen basis (CIF or FOB), duty is applied to it, and import VAT is applied to the duty-inclusive value, which is the ordering most calculations get wrong. Duty rates come from the live tariff: the UK Trade Tariff for GB and the USITC HTS for the US, with the commodity description returned so a wrong classification is visible. For EU destinations only import VAT is computed — TARIC publishes no usable API, and rather than invent a duty rate the duty component is returned as null and flagged as outstanding, which is the honest state of the data. Reduced VAT rates, preferential origin, anti-dumping measures and quotas are not applied; a customs broker is not replaced.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"vat_resolve","name":"Validate an EU VAT number against VIES and determine the applicable rate or reverse-charge treatment for a supply between two countries.","description":"Two answers in one call. Validation: the number is checked against the VIES service of the member state that issued it, with the consultation date returned. Treatment: given the supplier country, the customer country and whether the customer is a business, it states whether the supply is domestic with the local rate, an intra-community B2B supply where the reverse charge shifts the liability to the customer, a B2C supply taxed where the customer sits, or an export outside the EU. VIES returns the trader name and address masked as three dashes unless a requester VAT number is supplied; that placeholder is never passed through — the fields come back as null with the reason stated, because a dash string in a name field silently poisons whatever consumes it. Standard rates only, with their effective date: reduced rates depend on the goods and would be guesswork without a tariff code. Not tax advice.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"invoice_audit","name":"Recompute an invoice from its line items: totals, tax per rate, discounts and rounding, and report every deviation with the exact amount.","description":"Rebuilds an invoice from its lines and compares the result with the stated totals. Line by line it checks quantity times unit price against the line total, applies line and document discounts in the right order, groups the net amounts by tax rate and computes the tax per group, then compares net, tax and gross with what the document claims. All arithmetic runs in whole cents, because adding decimal amounts as floating point produces cent-level noise that reads like an error by the issuer when it is an error by the checker. Rounding differences up to one cent per tax group are reported separately from real discrepancies. It also checks the formal side: a due date before the invoice date, a tax rate that is not one of the country standard rates, a negative line without a credit-note marker, and a missing VAT number where the reverse charge is claimed.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"po_invoice_match","name":"Three-way match of purchase order, delivery note and invoice: quantities, prices and totals per line, with over-delivery, over-billing and unmatched lines named.","description":"Compares a purchase order against a delivery note and an invoice, line by line. Lines are paired by article number where both sides carry one, and otherwise by text similarity — a text pairing is marked as such with its similarity score, because quietly matching on similar wording is exactly how a wrong invoice gets approved. Per pair it reports the ordered, delivered and invoiced quantity, the agreed and invoiced unit price, and flags the four cases that matter: invoiced more than delivered, delivered more than ordered, a unit price above the order beyond your tolerance, and a line on the invoice with no counterpart at all. Tolerances for quantity and price are yours to set. All arithmetic runs in whole cents. It compares the documents you supply and knows nothing about what was actually agreed or received.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"gtin_resolve","name":"Resolve an EAN, UPC or GTIN to product, brand and packaging, with the check digit verified first and the issuing country prefix decoded.","description":"Looks up a barcode number across Open Food Facts and a general product database, returning product name, brand, category, packaging, quantity and images where present. The check digit is computed locally before anything is queried: an invalid number is a typo, and reporting it as not found would send the caller looking in the wrong place. The GS1 country prefix is decoded and labelled for what it is — where the number was issued, not where the product was made, a distinction that is routinely confused. A prefix in the 2 range is flagged as an in-store number that exists only at the retailer who assigned it and is registered nowhere. Sources are named per field so a food entry from the open database is distinguishable from a general catalogue entry. Coverage is uneven: food is well covered, general goods much less, and absence is not evidence the product does not exist.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"return_policy","name":"Read a merchant return or refund policy page and get the terms as structured fields — window, who pays return shipping, refund method, restocking fee, exclusions and procedure — each backed by a verbatim quote from that page.","description":"Fetches one public policy page in a real browser and turns it into a fixed schema: return window in days and what it counts from, who pays the return shipping, how the refund is issued and within how many days, any restocking fee, the required condition of the goods, the excluded product categories, the steps of the procedure, whether an RMA is needed, the contact route and whether a statutory right of withdrawal is mentioned. Every populated field carries a verbatim quote of at most 200 characters from the page, and anything the page does not say stays null and is listed in unavailable_fields — a guessed deadline is worse than none. The structuring runs through a language model at Groq in the United States, which is disclosed in full in every response including what leaves the machine and what the provider agreement says about training and retention; nothing is cached or stored. The response carries structured facts and short quotes as evidence, not a copy of the merchant text. robots.txt is honoured and a disallowed page is refused rather than fetched, login walls, captchas and paywalls end the call, and none of those refusals is charged. This is an extraction of what a page says, not legal advice and not a check of whether the terms are lawful.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"parcel_normalize","name":"Identify the carrier from a tracking number using real check-digit arithmetic, and map free-text carrier status messages in German or English onto one common vocabulary with a phase, a terminal flag and an exception flag per event.","description":"Does two things that every shipping integration rebuilds and every one of them differently. First, carrier detection: the number is matched against the known formats and, where the format carries one, the check digit is actually computed — the UPS 1Z digit, the Universal Postal Union S10 digit and the GS1 mod-10 digit. This matters because pattern alone does not separate the formats: twelve digits can be DHL Paket or FedEx, fourteen can be GLS, DPD or Hermes. A passing check digit raises confidence sharply, a failing one rules that carrier out rather than merely lowering it, and everything that stays ambiguous comes back as a ranked candidate list with the matched rule and a reason, never as a single asserted carrier. For S10 numbers the country code identifies the postal operator that accepted the item. Second, status normalization: free-text event descriptions are mapped onto ten canonical states, each carrying its phase, whether it ends the journey and whether it is a disruption, plus the exact phrase that triggered the match so a caller can check and override the mapping. Rules are ordered from specific to general so that a failed delivery attempt is not swallowed by the word delivered. Unrecognised text becomes unknown with confidence zero and is never guessed into in_transit, because a wrongly assumed state triggers a wrong decision. There is no network access: this endpoint validates and normalizes what it is given and cannot confirm that a parcel exists or fetch its live status.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"price_elasticity","name":"Estimate own-price elasticity from your own price and sales series by log-log regression with standard error and confidence interval, and return the contribution-optimal price with the predicted units and contribution.","description":"Fits a constant-elasticity demand curve to the price and sales series you supply and returns the elasticity with its standard error, t statistic, two-sided p value and a Student t confidence interval, not a normal one, because at eight observations the difference in interval width is double-digit percent and a too narrow interval is exactly the kind of number a machine reuses unchecked. The competitor price can be added as a second regressor, giving the cross-price elasticity, and a promotion indicator can be added so that a campaign is not attributed to the price; in both cases you bring the figures and nothing is looked up. From the fitted elasticity the contribution-optimal price follows in closed form as unit cost times b over one plus b, and it is also evaluated at both ends of the confidence interval so the answer comes as a range rather than a false decimal. Where the elasticity is greater than minus one there is no interior optimum, and where it comes out positive the model says demand rises with price; in both cases the optimal price is returned as null with the reason stated instead of a number. An observation with zero units cannot enter a log fit; it is excluded, counted and named. If your price barely moved across the series the estimate rests on noise, and the price variation is measured and flagged rather than left for the caller to notice. A price grid you supply is evaluated at the fitted model with predicted units and contribution per candidate. This measures a relationship in observational data and never asserts a cause: it does not know your competitors, it does not look up market prices, it does not model stock-outs, cannibalisation or reference-price effects, and it stores nothing between calls.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"allergen_check","name":"Report the declared allergens and trace warnings of a food product with the original fields and data completeness — stating not declared rather than not present for anything absent.","description":"Returns what a product declares about allergens: the allergen tags, the trace warnings, the ingredients text in its original language, and the completeness of the record. The distinction it holds to throughout is between not declared and not present. The data come from volunteers and manufacturer submissions, so an empty allergen field means nobody entered one, and for somebody with an allergy that difference is the difference that matters — every absent allergen is therefore reported as not declared, never as absent. The fourteen allergens requiring declaration in the EU are each given a status of declared, trace or not declared so the gap is explicit rather than inferred from a short list. Completeness of the record, when it was last edited and by how many contributors are returned as the honest measure of how much weight the entry can carry. For an actual allergy the packaging governs, and the response says so.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"ingredient_decoder","name":"Normalise the ingredients of a product into a hierarchy with additives resolved to their E numbers — and the unresolved components reported as a result in their own right.","description":"Returns the ingredient list of a product as a structured hierarchy including sub-ingredients, with each additive resolved to its E number and name, the percentage where declared, and the origin markers such as palm oil or vegan and vegetarian status as the record carries them. What separates this from the usual ingredient parse is that unresolved components are a first-class result rather than dropped: an analysis that silently omits what it could not identify makes a list with five recognised ingredients out of twenty look complete, and the unresolved ones are precisely where an automated reading stops and a human has to look. The count and the names of unknown components are therefore returned, along with the share of the list that was resolved. Additive numbers are given as the record states them without a safety assessment attached, since permissibility and limits depend on the jurisdiction and the food category and vary between both.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"nutrition_eco","name":"Bundle nutrition values, Nutri-Score, environmental and packaging data for a product — together with the inputs each score was computed from and which of them were missing.","description":"Returns the nutritional values per hundred grams, the Nutri-Score and NOVA processing group, the environmental score where available, and the packaging composition, each with the data that produced it. A Nutri-Score without its inputs is a grade without a calculation: fibre and the fruit and vegetable share move the result substantially, and when they are absent the score is computed from what remains without that being visible in the grade itself. The response therefore lists the values that fed the score and names the ones that were missing, so a grade resting on half the inputs can be recognised. Serving size and per-serving values are returned separately from per-hundred-gram values rather than converted between them, since the serving size itself is frequently a manufacturer estimate. Environmental scores are returned as the record holds them without recomputation, and their absence for most products is stated rather than left as an empty field.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"reformulation_detector","name":"Watch products and report what changed since your last check — ingredients, allergens, nutrition, quantity and packaging — separating an actual reformulation from somebody merely filling in a missing field.","description":"A monitor with memory over food products. The first call stores a snapshot and says so rather than reporting everything as new. Later calls compare and report differences in the ingredient text, the allergen and trace lists, the additives, the nutritional values, the quantity, the serving size and the packaging. The distinction that decides whether a finding is worth anything is between a reformulation and a data entry: when a volunteer adds an ingredient that was previously missing, a naive comparison reports it as a recipe change. The completeness of the record is therefore compared alongside, and when it rises the change is flagged as probably an entry improvement rather than a product change. Both readings are given rather than one being chosen, because from outside they are not always separable. Allergen changes are reported separately from other changes since they are the ones with immediate consequences. Up to twenty-five products per call.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"hs_classify","name":"Suggest HS and commodity code candidates for a plain-text product description, ranked with the matched terms and the official heading text.","description":"Takes a product description and returns ranked tariff classification candidates. The first six digits are the WCO Harmonized System and are valid worldwide, including the EU. Digits 7-10 come from the UK Trade Tariff and are NOT the EU CN subheadings — they are returned as uk_commodity_code and must not be used for an EU customs declaration. This is a research aid, not a legally binding classification: only a Binding Tariff Information ruling (BTI in the EU, ATaR in the UK) binds customs. No duty rates are returned here — use /v1/landed-cost with a confirmed code for that. Candidates can be empty when the description is too generic; the response then says so instead of guessing.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"recall_check","name":"Check a brand, product name or GTIN against EU Safety Gate (RAPEX) dangerous-product alerts and return the matching cases with risk type and measures taken.","description":"Screens a product or supplier against the EU Safety Gate rapid alert system for dangerous non-food products. Matches on brand, product name, barcode/GTIN, category and country of origin. Returns each alert with case number, risk type, the hazard description, the measures ordered, the notifying member state and a link to the official alert page, plus aggregate counts by risk type and year for the brand. Limits: only cases notified by national market surveillance authorities are covered — an empty result is NOT a certificate of compliance and never presented as one. Coverage starts at the index year given in the response. Brand matching is normalised but not fuzzy, so a differently spelled brand can be missed. This is not legal advice and does not replace a conformity assessment, CE marking check or supplier audit.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"sanctions_check","name":"Screen a person or company name against the EU consolidated financial sanctions list and return every matching designation with programme, legal basis and the published aliases.","description":"Checks a name against the European Commission Financial Sanctions Database — the consolidated list of persons, groups and entities subject to EU financial sanctions. Returns each match with the EU reference number, subject type, sanctions programme, the regulation that designated the entry, a link to the Official Journal text, plus published aliases, citizenships, dates of birth, addresses and identification documents where the list carries them. Every match states how it was found: exact, all-words, or partial. LIMITS, and they are not incidental: this covers the EU list only — not OFAC/SDN, not UK OFSI, not national lists, and not the UN list as a separate source. It does NOT apply the ownership and control test (the 50 percent rule), so subsidiaries of designated owners are not surfaced. There is no phonetic or transliteration matching beyond the aliases the Commission publishes, so a differently romanised name can be missed. A result with no match is NOT clearance and is never labelled as such. This is a first-pass research aid, not a compliance decision, and not legal advice.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"sanctions_ofac","name":"Screen a person, company, vessel or aircraft name against the US OFAC Specially Designated Nationals (SDN) list and return every matching designation with its sanctions programmes, aliases and identifying details.","description":"Checks a name against the Specially Designated Nationals and Blocked Persons List published by the US Treasury Office of Foreign Assets Control. Returns each hit with the OFAC record number, the record type (individual, entity, vessel, aircraft), every sanctions programme the record is listed under, the aliases OFAC publishes together with their a.k.a./f.k.a./n.k.a. kind and OFAC's own strong/weak quality flag, plus nationalities, citizenships, dates and places of birth, addresses, identification documents and vessel particulars where the list carries them. Every hit states how it was found: exact, all_words or partial. LIMITS, and they are not incidental: this covers the SDN list ONLY. It does NOT cover OFAC's other sanctions lists — the Consolidated (non-SDN) lists such as SSI, CAPTA, NS-MBS, FSE and PLC are out of scope, so a party subject to sectoral or correspondent-account restrictions can be absent here. It does NOT apply OFAC's 50 Percent Rule: entities owned 50 percent or more, directly or indirectly, by one or more blocked persons are blocked by operation of law even though OFAC does not list them, and this endpoint will not surface them. There is no phonetic or transliteration matching beyond the aliases OFAC publishes, so a differently romanised name can be missed. OFAC marks some aliases \"weak\" precisely because they generate false positives; they are included by default and can be excluded. This is not the EU, UK or UN list. A result with no hit is NOT clearance and is never labelled as such. This is a first-pass research aid, not a compliance decision, and not legal advice.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"sanctions_ofsi","name":"Screen a person, company or ship name against the UK Sanctions List — the successor to the OFSI consolidated list — and return every matching designation with its regime, the measures imposed and the published aliases.","description":"Checks a name against the UK Sanctions List maintained by the Foreign, Commonwealth and Development Office. Returns each hit with the UK designation ID, the legacy OFSI group ID, the UN reference where the designation mirrors a UN listing, the designation type (individual, entity, ship), the regime regulations under which it was made, whether the designation originates from the UK or the UN, the specific measures imposed (asset freeze, travel ban, trust services, director disqualification and others), the designation and last-updated dates, the UK statement of reasons, plus published aliases, nationalities, positions, dates and places of birth, addresses, documents, corporate and ship particulars where the list carries them. Every hit states how it was found: exact, all_words or partial. IMPORTANT ON SOURCE: the OFSI Consolidated List of Financial Sanctions Targets closed on 28 January 2026 and is no longer updated; the UK Sanctions List is now the single authoritative source, and it is what this endpoint carries. The legacy OFSI group ID is returned so existing references still resolve. LIMITS, and they are not incidental: this covers the UK list only — not the EU consolidated list, not OFAC/SDN, and not the UN list as a separate source. It does NOT apply the ownership and control test, so a company owned or controlled by a designated person is caught by UK law but is not on the list and is not surfaced here. Non-Latin-script spellings are stored and returned but are NOT matchable, and there is no phonetic or transliteration matching beyond the aliases the FCDO publishes, so a differently romanised name can be missed. This endpoint does not cover UK trade, transport or immigration sanctions beyond what the designation record itself states. A result with no hit is NOT clearance and is never labelled as such. This is a first-pass research aid, not a compliance decision, and not legal advice.","tags":["handelswerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]}],"payment":{"protocol":"x402","network":"eip155:8453","asset":"USDC","recipient":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","manifest":"https://handel.halowerk.com/.well-known/x402"}}