{"openapi":"3.1.0","info":{"title":"agenticweb.nl API","version":"1.0.0","description":"Clean, structured data endpoints for AI agents, metered per call via x402 (USDC on Base). Every endpoint answers a free sample at ?sample=1 and returns a unified { data, meta } envelope. Paying a 402 challenge constitutes acceptance of the terms of service; privacy policy at https://agenticweb.nl/privacy.","termsOfService":"https://agenticweb.nl/terms","contact":{"url":"https://agenticweb.nl","email":"contact@agenticweb.nl"}},"servers":[{"url":"https://api.agenticweb.nl"}],"paths":{"/api/v1/nl/vehicle":{"post":{"operationId":"vehicle","summary":"Dutch vehicle lookup","description":"Registration, fuel/EV, APK (roadworthiness) and open recalls (terugroepacties) for a Dutch licence plate (kenteken).\n\nPaid per call over x402 ($0.02). Free sample: `GET /api/v1/nl/vehicle?sample=1`.","requestBody":{"required":true,"description":"Parameters as JSON. They are sent in the body, not the URL, so that personal data never appears in a request URL or a server access log.","content":{"application/json":{"schema":{"type":"object","required":["kenteken"],"properties":{"kenteken":{"type":"string","description":"Plate, in the JSON request body. Case/format-insensitive (e.g. 0001TJ)."}}},"example":{"kenteken":"0001TJ"}}}},"x-x402":{"price":"$0.02","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"vehicleSample","summary":"Dutch vehicle lookup — free sample","description":"Free, unpaid sample response with fixed demo data. Only `?sample=1` is accepted: the paid call is `POST /api/v1/nl/vehicle` with its parameters in a JSON body, so that personal data never appears in a request URL.","parameters":[{"name":"sample","in":"query","required":true,"description":"Set to 1 for the free demo response.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Free sample — unified data envelope with demo data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"405":{"description":"Method Not Allowed — a GET without `?sample=1`. Use POST with a JSON body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/nl/school-holidays":{"get":{"operationId":"school-holidays","summary":"Dutch school holidays","description":"Current, merged Dutch school-holiday dates, queryable by school year, region or a specific date.\n\nPaid per call over x402 ($0.008). Free sample: `GET /api/v1/nl/school-holidays?sample=1`.","parameters":[{"name":"year","in":"query","required":false,"description":"School year, e.g. 2025-2026. Defaults to the current one.","schema":{"type":"string"}},{"name":"region","in":"query","required":false,"description":"noord | midden | zuid.","schema":{"type":"string"}},{"name":"date","in":"query","required":false,"description":"YYYY-MM-DD — returns the holiday (if any) covering that date.","schema":{"type":"string"}},{"name":"sample","in":"query","required":false,"description":"Query param on GET; set to 1 for the free demo response.","schema":{"type":"string"}}],"x-x402":{"price":"$0.008","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/nl/vacation-region":{"post":{"operationId":"vacation-region","summary":"Vacation region resolver","description":"Resolve a Dutch place to its vacation region (noord/midden/zuid) and attach that region's current holiday dates.\n\nPaid per call over x402 ($0.01). Free sample: `GET /api/v1/nl/vacation-region?sample=1`.","requestBody":{"required":true,"description":"Parameters as JSON. They are sent in the body, not the URL, so that personal data never appears in a request URL or a server access log.","content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"postcode":{"type":"string","description":"Dutch postcode, e.g. 1011AC (resolved to gemeente/region via PDOK). In the JSON request body."},"plaats":{"type":"string","description":"Place/city name."},"gemeente":{"type":"string","description":"Municipality name."},"province":{"type":"string","description":"Province name."}}},"example":{"postcode":"1011AC"}}}},"x-x402":{"price":"$0.01","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"vacation-regionSample","summary":"Vacation region resolver — free sample","description":"Free, unpaid sample response with fixed demo data. Only `?sample=1` is accepted: the paid call is `POST /api/v1/nl/vacation-region` with its parameters in a JSON body, so that personal data never appears in a request URL.","parameters":[{"name":"sample","in":"query","required":true,"description":"Set to 1 for the free demo response.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Free sample — unified data envelope with demo data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"405":{"description":"Method Not Allowed — a GET without `?sample=1`. Use POST with a JSON body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/nl/address":{"post":{"operationId":"address","summary":"Dutch address lookup","description":"Resolve a Dutch postcode + house number to a full address (street, city, gemeente, province, WGS84 + RD coordinates), or reverse-geocode coordinates to the nearest address.\n\nPaid per call over x402 ($0.005). Free sample: `GET /api/v1/nl/address?sample=1`.","requestBody":{"required":true,"description":"Parameters as JSON. They are sent in the body, not the URL, so that personal data never appears in a request URL or a server access log.","content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"postcode":{"type":"string","description":"Dutch postcode, e.g. 1011AC (forward lookup; with huisnummer)."},"huisnummer":{"type":"number","description":"House number (forward lookup; with postcode)."},"lat":{"type":"number","description":"WGS84 latitude (reverse lookup; with lon)."},"lon":{"type":"number","description":"WGS84 longitude (reverse lookup; with lat)."}}},"example":{"postcode":"1011AC","huisnummer":128}}}},"x-x402":{"price":"$0.005","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"addressSample","summary":"Dutch address lookup — free sample","description":"Free, unpaid sample response with fixed demo data. Only `?sample=1` is accepted: the paid call is `POST /api/v1/nl/address` with its parameters in a JSON body, so that personal data never appears in a request URL.","parameters":[{"name":"sample","in":"query","required":true,"description":"Set to 1 for the free demo response.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Free sample — unified data envelope with demo data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"405":{"description":"Method Not Allowed — a GET without `?sample=1`. Use POST with a JSON body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/nl/building":{"post":{"operationId":"building","summary":"Dutch building lookup (BAG)","description":"Construction year (bouwjaar), floor area (oppervlakte), use function (gebruiksdoel) and status for a Dutch address, from the BAG via PDOK.\n\nPaid per call over x402 ($0.008). Free sample: `GET /api/v1/nl/building?sample=1`.","requestBody":{"required":true,"description":"Parameters as JSON. They are sent in the body, not the URL, so that personal data never appears in a request URL or a server access log.","content":{"application/json":{"schema":{"type":"object","required":["postcode","huisnummer"],"properties":{"postcode":{"type":"string","description":"Dutch postcode, e.g. 1011AC."},"huisnummer":{"type":"number","description":"House number."}}},"example":{"postcode":"1011AC","huisnummer":128}}}},"x-x402":{"price":"$0.008","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"buildingSample","summary":"Dutch building lookup (BAG) — free sample","description":"Free, unpaid sample response with fixed demo data. Only `?sample=1` is accepted: the paid call is `POST /api/v1/nl/building` with its parameters in a JSON body, so that personal data never appears in a request URL.","parameters":[{"name":"sample","in":"query","required":true,"description":"Set to 1 for the free demo response.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Free sample — unified data envelope with demo data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"405":{"description":"Method Not Allowed — a GET without `?sample=1`. Use POST with a JSON body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/nl/elevation":{"post":{"operationId":"elevation","summary":"Dutch elevation (AHN / NAP height)","description":"Ground height above NAP, surface height and derived object height for a Dutch postcode or coordinate, from the AHN 0.5 m height model via PDOK.\n\nPaid per call over x402 ($0.006). Free sample: `GET /api/v1/nl/elevation?sample=1`.","requestBody":{"required":true,"description":"Parameters as JSON. They are sent in the body, not the URL, so that personal data never appears in a request URL or a server access log.","content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"postcode":{"type":"string","description":"Dutch postcode, e.g. 3511LM (resolved to its centroid)."},"lat":{"type":"number","description":"WGS84 latitude; use with lon instead of postcode."},"lon":{"type":"number","description":"WGS84 longitude; use with lat instead of postcode."}}},"example":{"postcode":"3511LM"}}}},"x-x402":{"price":"$0.006","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"elevationSample","summary":"Dutch elevation (AHN / NAP height) — free sample","description":"Free, unpaid sample response with fixed demo data. Only `?sample=1` is accepted: the paid call is `POST /api/v1/nl/elevation` with its parameters in a JSON body, so that personal data never appears in a request URL.","parameters":[{"name":"sample","in":"query","required":true,"description":"Set to 1 for the free demo response.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Free sample — unified data envelope with demo data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"405":{"description":"Method Not Allowed — a GET without `?sample=1`. Use POST with a JSON body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/nl/demographics":{"get":{"operationId":"demographics","summary":"Dutch municipality demographics","description":"CBS key figures for a Dutch municipality (population, men/women, households, average household size, population density), by gemeente name or CBS code.\n\nPaid per call over x402 ($0.005). Free sample: `GET /api/v1/nl/demographics?sample=1`.","parameters":[{"name":"gemeente","in":"query","required":false,"description":"Municipality name (CBS spelling, e.g. Amsterdam or 's-Gravenhage).","schema":{"type":"string"}},{"name":"code","in":"query","required":false,"description":"Exact CBS municipality code, e.g. GM0363 (precise; overrides gemeente).","schema":{"type":"string"}},{"name":"sample","in":"query","required":false,"description":"Query param on GET; set to 1 for the free demo response.","schema":{"type":"string"}}],"x-x402":{"price":"$0.005","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/nl/validate":{"post":{"operationId":"validate","summary":"Dutch identifier validation","description":"Offline validation of a Dutch identifier: BSN (elfproef), IBAN (structure + mod-97 + bank), or kenteken (sidecode format).\n\nPaid per call over x402 ($0.001). Free sample: `GET /api/v1/nl/validate?sample=1`.","requestBody":{"required":true,"description":"Parameters as JSON. They are sent in the body, not the URL, so that personal data never appears in a request URL or a server access log.","content":{"application/json":{"schema":{"type":"object","required":["type","value"],"properties":{"type":{"type":"string","description":"One of: bsn, iban, kenteken."},"value":{"type":"string","description":"The identifier to validate."}}},"example":{"type":"iban","value":"NL91ABNA0417164300"}}}},"x-x402":{"price":"$0.001","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"validateSample","summary":"Dutch identifier validation — free sample","description":"Free, unpaid sample response with fixed demo data. Only `?sample=1` is accepted: the paid call is `POST /api/v1/nl/validate` with its parameters in a JSON body, so that personal data never appears in a request URL.","parameters":[{"name":"sample","in":"query","required":true,"description":"Set to 1 for the free demo response.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Free sample — unified data envelope with demo data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"405":{"description":"Method Not Allowed — a GET without `?sample=1`. Use POST with a JSON body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/global/fx":{"get":{"operationId":"fx","summary":"FX conversion (ECB)","description":"Currency conversion using ECB euro reference rates. Informational only — not tradeable quotes.\n\nPaid per call over x402 ($0.003). Free sample: `GET /api/v1/global/fx?sample=1`.","parameters":[{"name":"from","in":"query","required":false,"description":"ISO 4217 source currency (default EUR).","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"ISO 4217 target currency (default USD).","schema":{"type":"string"}},{"name":"amount","in":"query","required":false,"description":"Amount to convert (default 1).","schema":{"type":"string"}},{"name":"sample","in":"query","required":false,"description":"Query param on GET; set to 1 for the free demo response.","schema":{"type":"string"}}],"x-x402":{"price":"$0.003","network":"eip155:8453","asset":"USDC","assetAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"},"responses":{"200":{"description":"Success — unified data envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"402":{"description":"Payment Required — pay the advertised x402 price and retry with the PAYMENT-SIGNATURE header (the legacy X-PAYMENT name is also accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"404":{"description":"Not found / no data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Envelope":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","additionalProperties":true},"meta":{"type":"object","properties":{"source":{"type":"string","example":"agenticweb.nl"},"attribution":{"type":"array","items":{"type":"string"}},"license_notes":{"type":"string"},"disclaimer":{"type":"string"},"retrieved_at":{"type":"string","format":"date-time"},"cache_age_seconds":{"type":"integer"}}}}},"PaymentRequired":{"type":"object","properties":{"x402Version":{"type":"integer","example":1},"error":{"type":"string"},"accepts":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","additionalProperties":true}}}}}}