{"openapi":"3.1.0","info":{"title":"Money Toolkit","version":"0.1.0","description":"Locale-aware money handling — format and parse currency strings, round to minor units with selectable modes, and split amounts with exact minor-unit allocation. (Currency conversion lives in the fx verb.)","x-guidance":"Locale-aware money handling — format and parse currency strings, round to minor units with selectable modes, and split amounts with exact minor-unit allocation. (Currency conversion lives in the fx verb.) Each operation is an HTTP POST to its /v1/<operation> path with a JSON request body (see each operation's requestBody schema) and returns a JSON response. Endpoints are paid per successful call via x402 or MPP (USDC on Base); an unpaid request returns 402 with payment metadata in the WWW-Authenticate header.","contact":{"email":"hello@openverbs.com"}},"x-discovery":{"ownershipProofs":["0xb1401a71756f51464a9962db12f1eb3e9522490cd20010b06d00cf7b7770acfd5f79721f9dfdf2643f8cecd29af3bde9ec133941a386042b32d9886053a70de61b","0xc1c1f11793e18a00fcb7072421f26e89fb75b6aa517fa84370564991f4b10efa024f6f57e4e67eefd20cf46cc01fc5a62d793fa8fbcda04f26c946a3433d73f91b","0x676b474af0ef9ed4809b5d12d2e789b36e52d56215b21f601d71f76620e36ec630347116a7b2b349a3c3681e5db0fbfa76c4169a676b6d6f27864d0e5017284a1c","0xc2ab96522515ed9e9bc4f1a241b774bd48df42e951ddbf7f6aa8fc76f5a96a20421703e1ec402ce7eb1e4eabea3b6e4e4129cf39d56ea91cf4fcf38561fc94fc1c"]},"servers":[{"url":"https://money.openverbs.com"}],"paths":{"/health":{"get":{"summary":"Health check","security":[],"responses":{"200":{"description":"Healthy","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string"},"version":{"type":"string"}}}}}}}}},"/v1/format":{"post":{"summary":"Format currency","description":"Format a numeric amount as currency for a given locale using Intl, honouring the currency's own minor-unit convention (USD→2, JPY→0). display selects the symbol, narrow symbol, ISO code or full name. An unknown currency or locale is a clean 400. Paid endpoint (x402 + MPP). Price: $0.002000 USDC per successful payment.","tags":["format currency","currency formatting api","intl money format","amount to currency string","localized currency display","iso currency formatter"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"The amount to format."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 currency code, e.g. USD, EUR, JPY."},"locale":{"type":"string","description":"BCP-47 locale, e.g. en-US, de-DE. Default en-US."},"display":{"type":"string","enum":["symbol","narrowSymbol","code","name"],"description":"How to display the currency. Default symbol."}},"required":["amount","currency"],"additionalProperties":false},"example":{"amount":1234.56,"currency":"USD","locale":"en-US","display":"symbol"}}}},"responses":{"200":{"description":"`{ formatted, currency, locale }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ formatted, currency, locale }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Format a numeric amount as currency for a given locale using Intl, honouring the currency's own minor-unit convention (USD→2, JPY→0). display selects the symbol, narrow symbol, ISO code or full name. An unknown currency or locale is a clean 400.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"2000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Format a numeric amount as currency for a given locale using Intl, honouring the currency's own minor-unit convention (USD→2, JPY→0). display selects the symbol, narrow symbol, ISO code or full name. An unknown currency or locale is a clean 400.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Format a numeric amount as currency for a given locale using Intl, honouring the currency's own minor-unit convention (USD→2, JPY→0). display selects the symbol, narrow symbol, ISO code or full name. An unknown currency or locale is a clean 400.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/parse":{"post":{"summary":"Parse money string","description":"Parse a formatted money string back into a number, using the locale's grouping and decimal separators (so '1.234,56' in de-DE → 1234.56). Currency symbols/codes and whitespace are stripped; parentheses or a leading minus mean negative. A string with no numeric amount is a clean 400. Paid endpoint (x402 + MPP). Price: $0.002000 USDC per successful payment.","tags":["parse money string","currency string parser","money text to number","localized amount parsing","extract amount from price","parse formatted currency"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":100,"description":"The formatted money string."},"locale":{"type":"string","description":"BCP-47 locale that determines the separators. Default en-US."}},"required":["text"],"additionalProperties":false},"example":{"text":"$1,234.56","locale":"en-US"}}}},"responses":{"200":{"description":"`{ amount }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ amount }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse a formatted money string back into a number, using the locale's grouping and decimal separators (so '1.234,56' in de-DE → 1234.56). Currency symbols/codes and whitespace are stripped; parentheses or a leading minus mean negative. A string with no numeric amount is a clean 400.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"2000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Parse a formatted money string back into a number, using the locale's grouping and decimal separators (so '1.234,56' in de-DE → 1234.56). Currency symbols/codes and whitespace are stripped; parentheses or a leading minus mean negative. A string with no numeric amount is a clean 400.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Parse a formatted money string back into a number, using the locale's grouping and decimal separators (so '1.234,56' in de-DE → 1234.56). Currency symbols/codes and whitespace are stripped; parentheses or a leading minus mean negative. A string with no numeric amount is a clean 400.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/round":{"post":{"summary":"Round to minor units","description":"Round an amount to a currency's minor units (or an explicit minorUnits) with a chosen rounding mode: half-even (banker's, default), half-up, half-down, ceil, floor or trunc. Give a currency to derive minor units automatically (USD→2, JPY→0). Paid endpoint (x402 + MPP). Price: $0.002000 USDC per successful payment.","tags":["round currency amount","minor unit rounding","bankers rounding money","currency decimal places","round to cents","money rounding api"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"The amount to round."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 code used to derive minor units. Optional."},"minorUnits":{"type":"integer","minimum":0,"maximum":8,"description":"Explicit number of minor-unit digits. Overrides currency. Default 2."},"mode":{"type":"string","enum":["half-even","half-up","half-down","ceil","floor","trunc"],"description":"Rounding mode. Default half-even (banker's)."}},"required":["amount"],"additionalProperties":false}}}},"responses":{"200":{"description":"`{ amount, minorUnits, mode }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ amount, minorUnits, mode }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Round an amount to a currency's minor units (or an explicit minorUnits) with a chosen rounding mode: half-even (banker's, default), half-up, half-down, ceil, floor or trunc. Give a currency to derive minor units automatically (USD→2, JPY→0).","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"2000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Round an amount to a currency's minor units (or an explicit minorUnits) with a chosen rounding mode: half-even (banker's, default), half-up, half-down, ceil, floor or trunc. Give a currency to derive minor units automatically (USD→2, JPY→0).","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Round an amount to a currency's minor units (or an explicit minorUnits) with a chosen rounding mode: half-even (banker's, default), half-up, half-down, ceil, floor or trunc. Give a currency to derive minor units automatically (USD→2, JPY→0).","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}},"/v1/allocate":{"post":{"summary":"Allocate without losing cents","description":"Split an amount into parts using integer minor-unit math so the shares always sum back to the exact original — no rounding drift. Pass parts for an even split, or ratios for a weighted one (e.g. [1,1,1] splits $100 into 33.34/33.33/33.33). The leftover minor units go to the largest fractional remainders. Paid endpoint (x402 + MPP). Price: $0.002000 USDC per successful payment.","tags":["split money amount","allocate cents exactly","divide without rounding drift","proportional money split","minor unit allocation","split bill cents"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"The total to split."},"parts":{"type":"integer","minimum":1,"maximum":100000,"description":"Number of equal parts (use instead of ratios)."},"ratios":{"type":"array","items":{"type":"number","minimum":0},"minItems":1,"maxItems":100000,"description":"Weights for a proportional split (use instead of parts)."},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 code used to derive minor units. Optional."},"minorUnits":{"type":"integer","minimum":0,"maximum":8,"description":"Explicit minor-unit digits. Overrides currency. Default 2."}},"required":["amount"],"additionalProperties":false}}}},"responses":{"200":{"description":"`{ shares, minorUnits }`.","content":{"application/json":{"schema":{"type":"object","description":"`{ shares, minorUnits }`."}}}},"400":{"description":"Invalid request; no payment is attempted"},"402":{"description":"Payment required; x402/MPP metadata returned in headers"},"502":{"description":"Upstream provider error after payment verification"}},"x-payment-info":{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Split an amount into parts using integer minor-unit math so the shares always sum back to the exact original — no rounding drift. Pass parts for an even split, or ratios for a weighted one (e.g. [1,1,1] splits $100 into 33.34/33.33/33.33). The leftover minor units go to the largest fractional remainders.","method":"tempo","preferredOffer":"mpp-tempo","price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{"scheme":"exact","network":"eip155:8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"evm","intent":"charge","network":"8453","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}},{"mpp":{"method":"tempo","intent":"charge","network":"4217","currency":"0x20c000000000000000000000b9537d11c60e8b50","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}}],"network":"4217","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A","offers":[{"amount":"2000","currency":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","description":"Split an amount into parts using integer minor-unit math so the shares always sum back to the exact original — no rounding drift. Pass parts for an even split, or ratios for a weighted one (e.g. [1,1,1] splits $100 into 33.34/33.33/33.33). The leftover minor units go to the largest fractional remainders.","intent":"charge","method":"evm","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"},{"amount":"2000","currency":"0x20c000000000000000000000b9537d11c60e8b50","description":"Split an amount into parts using integer minor-unit math so the shares always sum back to the exact original — no rounding drift. Pass parts for an even split, or ratios for a weighted one (e.g. [1,1,1] splits $100 into 33.34/33.33/33.33). The leftover minor units go to the largest fractional remainders.","intent":"charge","method":"tempo","recipient":"0xb3f4de103F34b99f0Da19B4F16D6B53a14C2194A"}]}}}},"x-service-info":{"categories":["compute"],"docs":{"homepage":"https://money.openverbs.com","apiReference":"https://money.openverbs.com/openapi.json"}}}