{"openapi":"3.0.3","info":{"title":"UtiliForge API","description":"Free utility APIs: IBAN validation, SIRET validation. 100 requests/day per IP without API key.","version":"1.1.0","contact":{"email":"utiliforge@polsia.app"}},"servers":[{"url":"https://utiliforge.polsia.app","description":"Production"}],"paths":{"/api/v1/siret/validate":{"get":{"summary":"Validate a SIRET number","description":"Validates a French SIRET number (14 digits) using the Luhn algorithm. Returns SIREN, NIC, formatting, and whether it is the siege social.","operationId":"validateSIRET","parameters":[{"name":"siret","in":"query","required":true,"description":"The SIRET to validate (spaces and dashes are stripped automatically)","schema":{"type":"string","example":"36252187900034"}}],"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean"},"siret":{"type":"string"},"siret_formatted":{"type":"string"},"siren":{"type":"string"},"nic":{"type":"string"},"is_siege":{"type":"boolean"},"luhn_valid":{"type":"boolean"},"validation_method":{"type":"string"},"error":{"type":"string","nullable":true},"timestamp":{"type":"string","format":"date-time"}}},"example":{"valid":true,"siret":"36252187900034","siret_formatted":"362 521 879 00034","siren":"362521879","nic":"00034","is_siege":false,"luhn_valid":true,"validation_method":"Luhn algorithm","error":null,"timestamp":"2026-04-26T17:00:00.000Z"}}}},"400":{"description":"Missing siret parameter"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/iban/validate":{"get":{"summary":"Validate an IBAN","description":"Validates an IBAN number, checks the modulo-97 checksum, identifies the country, and looks up the bank name and BIC code.","operationId":"validateIBAN","parameters":[{"name":"iban","in":"query","required":true,"description":"The IBAN to validate (spaces and dashes are stripped automatically)","schema":{"type":"string","example":"FR7630006000011234567890189"}}],"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean","description":"Whether the IBAN is valid"},"iban_formatted":{"type":"string","nullable":true,"description":"IBAN formatted with spaces"},"country":{"type":"string","nullable":true,"description":"Country name"},"country_code":{"type":"string","nullable":true,"description":"ISO 3166-1 alpha-2 country code"},"bank_name":{"type":"string","nullable":true,"description":"Bank name (if identified)"},"bic":{"type":"string","nullable":true,"description":"BIC/SWIFT code (if identified)"},"checksum_valid":{"type":"boolean","description":"Whether the mod-97 checksum is valid"},"error":{"type":"string","nullable":true,"description":"Error message if validation failed"},"timestamp":{"type":"string","format":"date-time"}}},"example":{"valid":true,"iban_formatted":"FR76 3000 6000 0112 3456 7890 189","country":"France","country_code":"FR","bank_name":"Credit Agricole","bic":"AGRIFRPP","checksum_valid":true,"error":null,"timestamp":"2026-04-26T15:30:00.000Z"}}}},"400":{"description":"Missing iban parameter"},"429":{"description":"Rate limit exceeded (100/day without API key)"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Optional API key for unlimited access. Without a key, rate limit is 100 requests/day per IP."}}}}