{"service":"HALOWERK x402werk","version":"1.0.0","currency":"USDC","network":"eip155:8453","network_name":"Base Mainnet","recipient":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","payment_header":"PAYMENT-SIGNATURE","endpoints":[{"method":"POST","path":"/offer/parse","url":"https://x402.netzhandwerker.de/offer/parse","tool":"parse_402_offer","price_usdc":0.002,"price_model":"per_call","summary":"Reads the x402 payment challenge of any URL and returns it field by field: network, asset, exact amount in units and in human form, recipient, and every gap a paying agent should know about.","description":"Fetches the 402 challenge of a foreign endpoint without paying anything — no payment header, no signature, no settlement — or parses a challenge you already hold. Returns x402_version, every accepts entry with scheme, network, resolved network name and chain id, asset, symbol, decimals and the amount both in raw units and in human form, plus the resource block and any expiry. amount_human is computed with the decimals of that token, resolved from a known-asset table or read from the chain; where decimals cannot be established it stays null and is listed in unavailable_fields rather than assuming six. parse_warnings names concrete gaps such as a missing description or missing inputSchema, a non-CAIP-2 network, a bridged instead of canonical asset, or an amount sent as a JSON number. It does not judge the service, does not pay, does not verify signatures and does not check whether the seller delivers. Answers for a URL are cached for 60 seconds; age_ms states the age of the fetched challenge.","input_schema":{"type":"object","additionalProperties":false,"anyOf":[{"required":["url"]},{"required":["challenge"]}],"properties":{"url":{"type":"string","pattern":"^https?://","maxLength":2048,"description":"Absolute http or https URL of the paid endpoint whose 402 challenge should be read. Private, loopback and link-local targets are rejected."},"challenge":{"type":"object","description":"A 402 challenge object you already hold, in x402 v1 or v2 form. Use this instead of url when nothing should be fetched."},"timeout_ms":{"type":"integer","minimum":1000,"maximum":12000,"default":6000,"description":"Time budget for fetching the foreign challenge."}}},"needs_history":false,"payment_required":true},{"method":"POST","path":"/offer/validate","url":"https://x402.netzhandwerker.de/offer/validate","tool":"validate_requirements","price_usdc":0.002,"price_model":"per_call","summary":"Checks an x402 payment challenge against the schemas of the x402 Foundation reference implementation and names every deviation with field, expectation, finding and the schema clause that rejected it.","description":"Validates a 402 challenge — fetched from a URL without paying, or supplied directly — against PaymentRequiredV1Schema and PaymentRequiredV2Schema of the installed @x402/core reference implementation. Reports the detected version and how it was detected, every error with field, expected, found and spec_ref naming package, version, schema and field path, whether the network is valid CAIP-2, whether the asset is a known and canonical token address or a bridged variant, whether the declared inputSchema compiles as a JSON Schema, which protocol extensions are declared and which of them are known, and whether v1-only and v2-only clients could each act on this offer. price_sane flags amounts whose magnitude typically comes from a wrong decimal place; its thresholds are stated in the answer and it is reported as null wherever the asset is not a known stablecoin, since without a price feed that question cannot be answered honestly. This endpoint judges conformance only. It does not rate the service, does not say whether a price is fair, does not pay and does not verify signatures — signatures are Nr. 85.","input_schema":{"type":"object","additionalProperties":false,"anyOf":[{"required":["url"]},{"required":["challenge"]}],"properties":{"url":{"type":"string","pattern":"^https?://","maxLength":2048,"description":"Absolute http or https URL whose 402 challenge should be fetched and validated. Nothing is paid. Private, loopback and link-local targets are rejected."},"challenge":{"type":"object","description":"A 402 challenge object to validate directly, in x402 v1 or v2 form."},"timeout_ms":{"type":"integer","minimum":1000,"maximum":12000,"default":6000,"description":"Time budget for fetching the foreign challenge."}}},"needs_history":false,"payment_required":true},{"method":"POST","path":"/receipt/verify","url":"https://x402.netzhandwerker.de/receipt/verify","tool":"verify_offer_receipt","price_usdc":0.003,"price_model":"per_call","summary":"Verifies the signature of a signed x402 offer and of an optional receipt, recovers the signer, and says whether that signer is actually the address the offer wants to be paid to.","description":"Cryptographic verification of the offer-receipt extension of x402. Accepts a signed offer in eip712, jws or eip191 form — either bundled as {format, payload, signature} or as payload plus a separate signature — and an optional signed receipt. Recovers the signer, compares it with the payTo of the offer, compares receipt and offer field by field and names every divergence with the value on each side, checks whether the offer has expired and whether the receipt timestamps are plausible against stated tolerances. The answer states plainly that recovering a signer proves nothing on its own: every well-formed ECDSA signature yields some address, so signer_matches_pay_to is the deciding field, and a valid signature from the wrong address is worthless. For jws the signer is a key identifier and not an EVM address, so signer_matches_pay_to is reported as null rather than guessed. If the verification method cannot be determined or a jws public key is missing, the call ends unverifiable with charged=false and nothing is billed. Nothing is fetched, nothing is paid, no chain is read — whether a settlement actually happened on chain is Nr. 86.","input_schema":{"type":"object","required":["offer"],"additionalProperties":false,"properties":{"offer":{"type":"object","description":"The signed offer as {format, payload, signature}, or the bare offer payload with version, resourceUrl, scheme, network, asset, payTo, amount and validUntil — then pass signature and format separately."},"signature":{"type":"string","maxLength":8192,"description":"Signature of the offer, if it is not inside the offer object."},"format":{"type":"string","enum":["eip712","jws","eip191"],"description":"Signature method, if the offer object does not name it. eip712 is what the offer-receipt extension produces."},"public_key":{"type":"object","description":"Public key as a JWK, required for jws signatures whose key identifier cannot be resolved from the token itself."},"receipt":{"type":"object","description":"Optional signed receipt as {format, payload, signature}, or the bare receipt payload with version, network, resourceUrl, payer, issuedAt and transaction."},"receipt_signature":{"type":"string","maxLength":8192,"description":"Signature of the receipt, if it is not inside the receipt object."},"receipt_format":{"type":"string","enum":["eip712","jws","eip191"],"description":"Signature method of the receipt, if the receipt object does not name it."},"expected_payer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Address you expected to have paid. When given, the receipt payer is compared against it."},"max_receipt_age_seconds":{"type":"integer","minimum":1,"maximum":2592000,"default":3600,"description":"How old a receipt may be before its timestamps are called implausible."}}},"needs_history":false,"payment_required":true},{"method":"POST","path":"/settlement/verify","url":"https://x402.netzhandwerker.de/settlement/verify","tool":"verify_settlement","price_usdc":0.002,"price_model":"per_call","summary":"Checks on chain whether a settlement transaction really paid the expected recipient the expected amount of the expected token, reads it from the transfer events, and states separately whether the transaction is confirmed and whether it is final.","description":"Reads the receipt of a transaction on Ethereum, Base, Base Sepolia, OP Mainnet, Arbitrum One, Polygon PoS or Avalanche C-Chain and compares it with what you expected to be paid. The comparison runs against the ERC-20 transfer events in the receipt, not against the transaction recipient, because in a token payment the transaction recipient is the token contract and never the seller. Returns every transfer event with sender, recipient, token, raw amount and human amount computed with that token decimals, the sum actually received by the expected recipient, underpaid_by and overpaid_by separately, the block number, the confirmation count, and a finality block read from the chain rather than estimated. Native coin payments are covered too when no token asset is expected. The verdict is bestaetigt, abweichung, nicht_gefunden or nicht_final; a correct but not yet finalized payment is reported as nicht_final rather than as confirmed. It does not pay, does not settle, does not sign and does not judge the counterparty.","input_schema":{"type":"object","required":["chain","tx_hash","expected"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["arb","arbitrum","arbitrum-one","avalanche","avax","base","base-mainnet","base-sepolia","basesepolia","eip155:1","eip155:10","eip155:137","eip155:42161","eip155:43114","eip155:8453","eip155:84532","eth","ethereum","ethereum-mainnet","mainnet","matic","op","op-mainnet","optimism","polygon"],"description":"Chain of the transaction, as CAIP-2 (\"eip155:8453\"), as a short name (\"base\") or as the chain id (\"8453\")."},"tx_hash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"Hash of the settlement transaction."},"expected":{"type":"object","required":["pay_to"],"additionalProperties":false,"properties":{"pay_to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Address that was supposed to receive the payment — the seller, not the token contract."},"amount_units":{"type":"string","pattern":"^[0-9]{1,78}$","description":"Expected amount as an integer in the smallest unit of the token. Omit to skip the amount comparison; amount_matches is then null."},"asset":{"type":"string","description":"Expected token contract address, or \"native\" for the chain coin. Omit to accept any token; asset_matches is then null."}}}}},"needs_history":false,"payment_required":true},{"method":"POST","path":"/guard/replay","url":"https://x402.netzhandwerker.de/guard/replay","tool":"replay_guard","price_usdc":0.002,"price_model":"per_call","summary":"Remembers payment identifiers, payload hashes and nonces as one-way fingerprints and tells you whether this one has been seen before, when, how often, and whether that sighting lies inside your window.","description":"A stateful duplicate check for agents that settle x402 payments. Supply any of payment_id, payload_hash and nonce; each is hashed with SHA-256 before storage, so the service keeps fingerprints and timestamps and never the values themselves, never a payload, never an address. The answer states for every supplied identifier whether it was seen before, when it was first and last seen, how often, and whether the first sighting falls inside window_seconds. The recommendation is ablehnen only for a repeated payment_id or nonce inside the window, since both are unique by definition; a repeated payload_hash alone yields pruefen, because buying the same query twice is legitimate. Every threshold behind the recommendation is stated in the answer. Fingerprints expire 24 hours after the last sighting. Set record to false to ask without writing, so a repeated check does not create the duplicate it reports. This endpoint does not verify payments, does not look at any chain and does not block anything by itself.","input_schema":{"type":"object","additionalProperties":false,"anyOf":[{"required":["payment_id"]},{"required":["payload_hash"]},{"required":["nonce"]}],"properties":{"payment_id":{"type":"string","minLength":1,"maxLength":512,"description":"Payment identifier of the x402 payment-identifier extension, or any identifier your client treats as unique per payment. Stored only as a SHA-256 fingerprint."},"payload_hash":{"type":"string","minLength":1,"maxLength":512,"description":"Hash of the request payload that was paid for. Stored only as a SHA-256 fingerprint of the value you send."},"nonce":{"type":"string","minLength":1,"maxLength":512,"description":"Nonce of the signed payment authorisation. Stored only as a SHA-256 fingerprint."},"window_seconds":{"type":"integer","minimum":1,"maximum":86400,"default":3600,"description":"How far back a sighting still counts as a duplicate for the recommendation. Fingerprints are kept for 24 hours regardless."},"record":{"type":"boolean","default":true,"description":"Whether this call is remembered. Set to false to check without writing, so repeated checks of the same payment do not report themselves as duplicates."}}},"needs_history":false,"payment_required":true},{"method":"POST","path":"/benchmark/price","url":"https://x402.netzhandwerker.de/benchmark/price","tool":"price_benchmark","price_usdc":0.006,"price_model":"per_call","summary":"Compares the price of one x402 endpoint with comparable offers from the public x402 Bazaar catalogue and states median, quartiles and where the price sits — with the reason each offer counts as comparable.","description":"Reads the public x402 Bazaar catalogue and finds offers comparable to yours, either from a resource_url whose 402 challenge is fetched without paying, or from a category and description you supply. Every comparable offer is listed with its price, its provider host, a similarity score and the terms both sides share, so comparability is justified rather than asserted; the formula, its weights and the inclusion threshold are stated in the answer. Prices are aggregated as median, p25 and p75 over comparable offers denominated in a known stablecoin, and position says whether your price sits below, at or above that range against stated thresholds. Below five comparable offers no position is given at all and the caveat says why. Offers denominated in other assets are counted but kept out of the price distribution, because converting them would require a price feed this service does not consult. The catalogue sample, its size against the full catalogue and its fetch time are named in every answer. This endpoint gives no pricing advice, calls no price fair or unfair and never suggests what to charge.","input_schema":{"type":"object","additionalProperties":false,"anyOf":[{"required":["resource_url"]},{"required":["description"]}],"properties":{"resource_url":{"type":"string","pattern":"^https?://","maxLength":2048,"description":"URL of your paid endpoint. Its 402 challenge is fetched without paying to read your own price and description."},"category":{"type":"string","maxLength":120,"description":"Category of the endpoint, for example \"web extraction\" or \"market data\". Used as extra comparison terms."},"description":{"type":"string","maxLength":2000,"description":"What your endpoint delivers. Used to find comparable offers when no resource_url is given."},"own_price_usdc":{"type":"string","pattern":"^[0-9]+(\\.[0-9]+)?$","description":"Your price in whole stablecoin units, if it should not be read from a challenge."},"max_comparables":{"type":"integer","minimum":3,"maximum":50,"default":25,"description":"How many comparable offers to list, highest similarity first."}}},"needs_history":false,"payment_required":true},{"method":"POST","path":"/policy/check","url":"https://x402.netzhandwerker.de/policy/check","tool":"spend_policy","price_usdc":0.002,"price_model":"per_call","summary":"Checks one proposed x402 payment against your own spending rules and returns allow, reject or review with every rule listed separately, each with its limit and the actual value.","description":"A stateless rule check for agents that pay for x402 endpoints. You supply the proposed payment, your policy and the amounts already spent this hour and this day; this endpoint keeps no ledger of its own and returns your counters unchanged. Every configured rule — max_per_call, max_per_hour, max_per_day, allowed_chains, allowed_assets, allowed_recipients, blocked_recipients, require_schema — is reported individually as erfuellt, verletzt, nicht_pruefbar or nicht_gesetzt, together with the limit and the actual value, so a rejection can be acted on. Amounts are compared exactly in the smallest unit of the token, using decimals resolved from a known-asset table or read from the chain; where decimals cannot be established the amount rules are reported as nicht_pruefbar and the decision becomes pruefen rather than a guess. risk_flags mark an unverifiable recipient, a missing input schema, a bridged instead of canonical token, an unusual or test chain and an amount above a fixed, stated threshold. Where two rules contradict each other the stricter one applies and the conflict is named. This endpoint does not pay, does not hold a budget, does not learn from previous calls and gives no advice on whether a price is fair.","input_schema":{"type":"object","required":["proposed_payment","policy"],"additionalProperties":false,"properties":{"proposed_payment":{"type":"object","required":["amount_units"],"additionalProperties":false,"properties":{"amount_units":{"type":"string","pattern":"^[0-9]{1,78}$","description":"Amount of the proposed payment as an integer in the smallest unit of the token."},"asset":{"type":"string","description":"Token contract address, or \"native\" for the chain coin."},"chain":{"type":"string","description":"Chain as CAIP-2 (\"eip155:8453\"), short name (\"base\") or chain id."},"pay_to":{"type":"string","description":"Recipient address of the proposed payment."},"resource":{"type":"string","maxLength":2048,"description":"URL of the resource being bought. Nothing is fetched; it is only checked for shape."},"input_schema_present":{"type":"boolean","description":"Whether the offer declares an inputSchema. Use Nr. 83 to find out if you do not know."}}},"policy":{"type":"object","additionalProperties":false,"properties":{"max_per_call":{"type":"string","pattern":"^[0-9]+(\\.[0-9]+)?$","description":"Largest allowed single payment, in whole tokens of the proposed asset, for example \"0.05\"."},"max_per_hour":{"type":"string","pattern":"^[0-9]+(\\.[0-9]+)?$","description":"Largest allowed sum per hour, in whole tokens."},"max_per_day":{"type":"string","pattern":"^[0-9]+(\\.[0-9]+)?$","description":"Largest allowed sum per day, in whole tokens."},"allowed_chains":{"type":"array","items":{"type":"string"},"description":"Chains you accept, as CAIP-2 or short names. Omit to allow any."},"allowed_assets":{"type":"array","items":{"type":"string"},"description":"Token addresses you accept. Omit to allow any."},"allowed_recipients":{"type":"array","items":{"type":"string"},"description":"Recipient addresses you accept. Omit to allow any; the recipient is then flagged as unverified."},"blocked_recipients":{"type":"array","items":{"type":"string"},"description":"Recipient addresses you refuse. Beats allowed_recipients on conflict."},"require_schema":{"type":"boolean","description":"Whether the offer must declare an inputSchema."}}},"spent_so_far":{"type":"object","additionalProperties":false,"properties":{"hour":{"type":"string","pattern":"^[0-9]+(\\.[0-9]+)?$","description":"Already spent in the current hour, in whole tokens."},"day":{"type":"string","pattern":"^[0-9]+(\\.[0-9]+)?$","description":"Already spent in the current day, in whole tokens."}}}}},"needs_history":false,"payment_required":true},{"method":"POST","path":"/reconcile","url":"https://x402.netzhandwerker.de/reconcile","tool":"x402_reconcile","price_usdc":0.008,"price_model":"per_call","summary":"Matches your x402 receipts against the token transfers that actually reached your address on chain, and lists every receipt without a payment and every payment without a receipt.","description":"Reads all incoming ERC-20 transfers of one token to one address within a block or time window and matches them against the receipts you supply. Matching runs first over the transaction hash, which is the strongest link, and otherwise over amount plus payer plus a stated time tolerance; the method used is named for every single match, so a weak match is never mistaken for a strong one. The answer lists matched pairs, receipts without a payment, payments without a receipt, amount mismatches with expected, found and difference, and duplicate receipts sharing a transaction hash or payment identifier. Totals are given for both sides with their difference, plus coverage_pct and the window actually used, including the block range and how timestamps were resolved to blocks. Unmatched items are never quietly dropped — they are the point of the exercise. Block timestamps are read from the chain for up to sixty distinct blocks; beyond that the timestamp of a payment stays null and says so. The window is limited to 114000 blocks per call because public RPC providers cap log queries; a larger request is rejected instead of silently truncated.","input_schema":{"type":"object","required":["chain","address","receipts"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["arb","arbitrum","arbitrum-one","avalanche","avax","base","base-mainnet","base-sepolia","basesepolia","eip155:1","eip155:10","eip155:137","eip155:42161","eip155:43114","eip155:8453","eip155:84532","eth","ethereum","ethereum-mainnet","mainnet","matic","op","op-mainnet","optimism","polygon"],"description":"Chain as CAIP-2, short name or chain id."},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Your receiving address whose incoming transfers should be read."},"asset":{"type":"string","description":"Token contract address to reconcile. Defaults to the canonical USDC of that chain."},"receipts":{"type":"array","minItems":1,"maxItems":500,"description":"Your receipts. Each needs at least amount_units; tx_hash makes the match strong, payer and ts make the fallback match possible.","items":{"type":"object","additionalProperties":false,"required":["amount_units"],"properties":{"receipt_id":{"type":"string","maxLength":200,"description":"Your own identifier for this receipt. Echoed back in every result."},"payment_id":{"type":"string","maxLength":200,"description":"Payment identifier, used to detect duplicate receipts."},"tx_hash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"Settlement transaction hash, if you recorded one."},"amount_units":{"type":"string","pattern":"^[0-9]{1,78}$","description":"Amount as an integer in the smallest unit of the token."},"payer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Address you believe paid."},"ts":{"type":"integer","description":"Unix seconds when the receipt was issued. Needed for the amount-and-time fallback match."}}}},"window":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"integer","description":"Start of the window as unix seconds. Resolved to a block by reading real blocks."},"to":{"type":"integer","description":"End of the window as unix seconds."},"from_block":{"type":"integer","minimum":0,"description":"Start block. Takes precedence over from."},"to_block":{"type":"integer","minimum":0,"description":"End block. Takes precedence over to."}}},"time_tolerance_seconds":{"type":"integer","minimum":0,"maximum":86400,"default":300,"description":"How far a receipt timestamp may sit from the block time of a payment and still match. Receipt and chain rarely carry the same second."}}},"needs_history":false,"payment_required":true}],"updated_at":"2026-08-07T10:07:03.786Z"}