{"components":{"headers":{"RetryAfter":{"description":"Seconds to wait before retrying. Mirrors `retry_after_seconds`.","schema":{"minimum":1,"type":"integer"}},"XIronfangRequestID":{"description":"Ironfang's id for the request, repeated in every Problem as `request_id`.","schema":{"$ref":"#/components/schemas/RequestID"}},"XRequestIDEcho":{"description":"Your own well-formed `X-Request-ID` (visible ASCII, 1 to 128 bytes), echoed back.","required":false,"schema":{"pattern":"^[\\x21-\\x7E]{1,128}$","type":"string"}}},"parameters":{"IdempotencyKey":{"description":"Optional on authenticated requests; scoped to the organisation and this endpoint. The same key with a different request (different bytes, selectors or scope) is `409 idempotency_conflict`.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":128,"minLength":8,"pattern":"^[A-Za-z0-9_-]+$","type":"string"}}},"responses":{"AdmissionGone":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["ruleset_disabled","account_closed"]}}}]}}},"description":"The release was withdrawn from every use, or the billing account is closed. Nothing was queued."},"AdmissionRefused":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["unknown_ruleset","selection_conflict","family_undetected","family_mismatch","unsupported_variant","unsupported_document_type","scope_unavailable","no_embedded_invoice","ambiguous_embedded_invoice","encrypted_pdf","processing_limit"]}}}]}}},"description":"The job cannot be validated as asked, for the reasons synchronous validation would refuse it. Nothing was queued or charged."},"DeliveryUnavailable":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"delivery_unavailable"}}}]}}},"description":"Destination delivery is not configured on this deployment.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"IdempotencyConflict":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"idempotency_conflict"}}}]}}},"description":"The Idempotency-Key was used for a different request."},"InsufficientScope":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"insufficient_scope"}}}]}}},"description":"The key lacks the scope this operation needs."},"InternalError":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"internal_error"}}}]}}},"description":"Ironfang Finance failed. Not a verdict on anything."},"MalformedRequest":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"malformed_request"}}}]}}},"description":"The request is malformed."},"NotFound":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"not_found"}}}]}}},"description":"No such release or result is visible."},"PayloadTooLarge":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"payload_too_large"}}}]}}},"description":"The body is over the limit for its media type."},"PaymentRequired":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["paid_usage_paused","payment_required","payment_action_required","account_restricted"]}}}]}}},"description":"The free allowance is used up and paid usage cannot continue until the billing account is put right: paused, no working payment method, a payment awaiting confirmation, or restricted. Nothing was accepted."},"RateLimited":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"rate_limited"}}}]}}},"description":"Too many requests.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"ReportIncomplete":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"report_incomplete"}}}]}}},"description":"The retained findings are truncated; no complete signed report can be issued."},"ReportUnavailable":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"report_unavailable"}}}]}}},"description":"Signed reports are not configured, or a readable PDF was asked for a result that has none. The result is unchanged."},"ResultGone":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"result_gone"}}}]}}},"description":"The result expired or was erased. Its operation record remains."},"RulesetDisabled":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"ruleset_disabled"}}}]}}},"description":"The release was withdrawn from every use."},"ScopeOrEligibility":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["insufficient_scope","product_not_eligible"]}}}]}}},"description":"The key lacks the scope this operation needs, or paid Ironfang Finance usage needs an approved business and the free allowance is used up. Nothing was accepted."},"Unauthenticated":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"unauthenticated"}}}]}}},"description":"The credential is missing or not accepted."},"UnsupportedContentType":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"unsupported_content_type"}}}]}}},"description":"The media type, encoding or content is not accepted."},"ValidationInternalError":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"internal_error"}},"required":["outcome","usage_charged"]}]}}},"description":"Ironfang Finance failed while validating. Indeterminate and uncharged."},"ValidatorUnavailable":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"validator_unavailable"}},"required":["outcome","usage_charged"]}]}}},"description":"The validator for the selected ruleset is not available. Indeterminate and uncharged.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"schemas":{"APIVersion":{"description":"The API a result was made through.","enum":["v1","v2"],"type":"string"},"Batch":{"additionalProperties":false,"properties":{"api_version":{"$ref":"#/components/schemas/APIVersion"},"counts":{"$ref":"#/components/schemas/JobCounts"},"created_at":{"format":"date-time","type":"string"},"id":{"$ref":"#/components/schemas/OpaqueID"},"jobs":{"items":{"$ref":"#/components/schemas/Job"},"maxItems":100,"minItems":1,"type":"array"},"schema":{"const":"ironfang/finance/einvoice/batch/v2","type":"string"},"status":{"$ref":"#/components/schemas/BatchStatus"}},"required":["schema","id","api_version","status","created_at","counts","jobs"],"type":"object"},"BatchList":{"additionalProperties":false,"properties":{"batches":{"items":{"$ref":"#/components/schemas/BatchSummary"},"maxItems":100,"type":"array"},"next_cursor":{"maxLength":256,"minLength":1,"type":"string"},"schema":{"const":"ironfang/finance/einvoice/batch-list/v2","type":"string"}},"required":["schema","batches"],"type":"object"},"BatchRequest":{"additionalProperties":false,"properties":{"jobs":{"items":{"$ref":"#/components/schemas/JobRequest"},"maxItems":100,"minItems":1,"type":"array"}},"required":["jobs"],"type":"object"},"BatchStatus":{"description":"queued until a job starts; running while any is unfinished; then the one status every job shares, or partial.","enum":["queued","running","completed","failed","cancelled","partial"],"type":"string"},"BatchSummary":{"additionalProperties":false,"properties":{"api_version":{"$ref":"#/components/schemas/APIVersion"},"counts":{"$ref":"#/components/schemas/JobCounts"},"created_at":{"format":"date-time","type":"string"},"id":{"$ref":"#/components/schemas/OpaqueID"},"job_count":{"maximum":100,"minimum":1,"type":"integer"},"status":{"$ref":"#/components/schemas/BatchStatus"}},"required":["id","api_version","status","created_at","counts","job_count"],"type":"object"},"BillingRefusal":{"additionalProperties":false,"description":"On a billing refusal only: the product and meter the unified billing account refused, and when the free allowance renews (the start of the next UTC month) where that is the reason.","properties":{"meter":{"enum":["finance.validation","finance.generation"],"type":"string"},"product":{"enum":["finance"],"type":"string"},"reset_at":{"format":"date-time","type":"string"}},"type":"object"},"CheckGroup":{"additionalProperties":false,"description":"One of the groups a person reads a result in. `invoice_xml` is always present; `pdfa` and `attachment_metadata` only at `hybrid_pdf` scope. The status is the worst of its layers.","properties":{"group":{"enum":["pdfa","attachment_metadata","invoice_xml"],"type":"string"},"layers":{"items":{"$ref":"#/components/schemas/Layer"},"minItems":1,"type":"array"},"status":{"enum":["passed","failed","skipped"],"type":"string"}},"required":["group","status","layers"],"type":"object"},"Coverage":{"additionalProperties":false,"description":"What the result covers. `checked` is the layers that ran to completion; `not_checked` names every aspect the result does not establish, and why.","properties":{"checked":{"items":{"$ref":"#/components/schemas/Layer"},"type":"array","uniqueItems":true},"not_checked":{"items":{"additionalProperties":false,"properties":{"aspect":{"enum":["pdf_container","visual_consistency","digital_signature","en16931_semantics"],"type":"string"},"reason":{"enum":["no_pdf_supplied","not_implemented","outside_scope","reduced_profile"],"type":"string"}},"required":["aspect","reason"],"type":"object"},"type":"array"},"scope":{"$ref":"#/components/schemas/Scope"}},"required":["scope","checked","not_checked"],"type":"object"},"Declared":{"additionalProperties":false,"description":"What the document itself declares, copied from its source identifiers. A declaration, not a verdict: validation decides whether it is true.","properties":{"business_process_id":{"description":"UBL ProfileID, or CII BusinessProcessSpecifiedDocumentContextParameter/ID.","maxLength":256,"type":"string"},"family":{"$ref":"#/components/schemas/Family"},"pdf":{"additionalProperties":false,"description":"For a PDF, the invoice declarations in its XMP metadata.","properties":{"conformance_level":{"maxLength":32,"type":"string"},"document_file_name":{"maxLength":128,"type":"string"},"document_type":{"maxLength":32,"type":"string"},"pdfa_conformance":{"maxLength":4,"type":"string"},"pdfa_part":{"maxLength":4,"type":"string"},"version":{"maxLength":16,"type":"string"}},"type":"object"},"root":{"description":"The root element's local name.","maxLength":64,"type":"string"},"specification_id":{"description":"UBL CustomizationID, or CII GuidelineSpecifiedDocumentContextParameter/ID.","maxLength":256,"type":"string"},"syntax":{"description":"The syntax the root element names.","enum":["ubl","cii","other"],"type":"string"},"type_code":{"description":"The invoice type code, which decides invoice or credit note in CII.","maxLength":8,"type":"string"},"variant":{"$ref":"#/components/schemas/Variant"}},"required":["syntax"],"type":"object"},"Delivery":{"additionalProperties":false,"properties":{"api_version":{"$ref":"#/components/schemas/APIVersion"},"attempts":{"maximum":32,"minimum":0,"type":"integer"},"created_at":{"format":"date-time","type":"string"},"destination_id":{"$ref":"#/components/schemas/OpaqueID"},"event":{"description":"The event as queued. Its schema matches api_version.","oneOf":[{"$ref":"#/components/schemas/EventV1"},{"$ref":"#/components/schemas/EventV2"}]},"event_id":{"$ref":"#/components/schemas/OpaqueID"},"expires_at":{"format":"date-time","type":"string"},"failure_code":{"enum":["destination_unavailable","credentials_unavailable","network_error","http_rejected","storage_rejected","object_conflict","result_unavailable","internal_error","lease_expired","event_expired"],"type":"string"},"finished_at":{"format":"date-time","type":"string"},"http_status":{"maximum":599,"minimum":1,"type":"integer"},"id":{"$ref":"#/components/schemas/OpaqueID"},"max_attempts":{"maximum":32,"minimum":1,"type":"integer"},"next_attempt_at":{"description":"Scheduled time for pending work; ignore for terminal deliveries.","format":"date-time","type":"string"},"operation_id":{"$ref":"#/components/schemas/OpaqueID"},"status":{"enum":["pending","delivering","delivered","failed"],"type":"string"}},"required":["id","event_id","operation_id","destination_id","api_version","status","attempts","max_attempts","created_at","expires_at","next_attempt_at","event"],"type":"object"},"DeliveryArtifact":{"additionalProperties":false,"properties":{"bytes":{"minimum":1,"type":"integer"},"content_type":{"enum":["application/json","application/xml"],"type":"string"},"name":{"enum":["result.json","document.xml"],"type":"string"},"sha256":{"$ref":"#/components/schemas/SHA256"}},"required":["name","content_type","sha256","bytes"],"type":"object"},"DeliveryAttempt":{"additionalProperties":false,"properties":{"attempt":{"maximum":32,"minimum":1,"type":"integer"},"failure_code":{"maxLength":64,"type":"string"},"finished_at":{"format":"date-time","type":"string"},"http_status":{"maximum":599,"minimum":1,"type":"integer"},"started_at":{"format":"date-time","type":"string"}},"required":["attempt","started_at"],"type":"object"},"DeliveryDetail":{"additionalProperties":false,"properties":{"delivery":{"$ref":"#/components/schemas/Delivery"},"history":{"items":{"$ref":"#/components/schemas/DeliveryAttempt"},"maxItems":32,"type":"array"},"schema":{"const":"ironfang/finance/einvoice/delivery/v2","type":"string"}},"required":["schema","delivery","history"],"type":"object"},"DeliveryList":{"additionalProperties":false,"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/Delivery"},"maxItems":100,"type":"array"},"next_cursor":{"maxLength":256,"minLength":1,"type":"string"},"schema":{"const":"ironfang/finance/einvoice/delivery-list/v2","type":"string"}},"required":["schema","deliveries"],"type":"object"},"DocumentType":{"enum":["invoice","credit_note"],"type":"string"},"DocumentTypeSelector":{"enum":["invoice","credit_note","auto"],"type":"string"},"Engine":{"additionalProperties":false,"properties":{"image_digest":{"$ref":"#/components/schemas/ImageDigest"},"name":{"maxLength":128,"minLength":1,"type":"string"},"role":{"enum":["xml","pdf"],"type":"string"}},"required":["role","name","image_digest"],"type":"object"},"EventV1":{"description":"The event of an operation made through V1 (financewolf/einvoice/event/v1),\ndescribed in full by the V1 contract at\nhttps://api.ironfang.com/finance/openapi.yaml (DeliveryEvent).\n","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"type":"object"},"id":{"$ref":"#/components/schemas/OpaqueID"},"schema":{"const":"financewolf/einvoice/event/v1","type":"string"},"state_version":{"const":1,"type":"integer"},"type":{"enum":["einvoice.validation.completed","einvoice.generation.completed","einvoice.operation.failed"],"type":"string"}},"required":["schema","id","type","created_at","state_version","data"],"type":"object"},"EventV2":{"additionalProperties":false,"description":"The event of an operation made through V2, as a webhook body, an S3\nmanifest.json and here. Signed and delivered exactly as V1's event.\n","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"additionalProperties":false,"properties":{"artifacts":{"items":{"$ref":"#/components/schemas/DeliveryArtifact"},"maxItems":1,"type":"array"},"batch_id":{"$ref":"#/components/schemas/OpaqueID"},"failure_code":{"maxLength":64,"type":"string"},"family":{"description":"The family the result was made under; for a failure, as requested, which may be detect.","enum":["detect","peppol-bis-billing-3","xrechnung","zugferd-facturx"],"type":"string"},"input_sha256":{"$ref":"#/components/schemas/SHA256"},"job_id":{"$ref":"#/components/schemas/OpaqueID"},"operation":{"const":"validate","type":"string"},"operation_id":{"$ref":"#/components/schemas/OpaqueID"},"outcome":{"enum":["valid","invalid","indeterminate"],"type":"string"},"result_url":{"pattern":"^/finance/v2/einvoices/results/[0-9a-f-]{36}$","type":"string"},"ruleset_id":{"$ref":"#/components/schemas/RulesetID"},"scope":{"description":"What was checked, xml or hybrid_pdf; for a failure, as requested.","enum":["xml","hybrid_pdf"],"type":"string"},"status":{"enum":["completed","error"],"type":"string"},"usage_charged":{"type":"boolean"},"variant":{"description":"The variant the result was made under; for a failure, as requested, which may be detect.","enum":["detect","core","extension","cvd","minimum","basic-wl","basic","en16931","extended","xrechnung"],"type":"string"}},"required":["operation_id","operation","status","outcome","input_sha256","usage_charged","artifacts"],"type":"object"},"id":{"$ref":"#/components/schemas/OpaqueID"},"schema":{"const":"ironfang/finance/einvoice/event/v2","type":"string"},"state_version":{"const":1,"type":"integer"},"type":{"enum":["einvoice.validation.completed","einvoice.operation.failed"],"type":"string"}},"required":["schema","id","type","created_at","state_version","data"],"type":"object"},"Family":{"description":"An invoice family. `zugferd-facturx` is one family: ZUGFeRD and Factur-X are corresponding release names of the same standard.","enum":["peppol-bis-billing-3","xrechnung","zugferd-facturx"],"type":"string"},"FieldError":{"additionalProperties":false,"properties":{"code":{"enum":["unknown_field","repeated","invalid_value","missing"],"type":"string"},"field":{"maxLength":64,"minLength":1,"type":"string"},"message":{"maxLength":256,"minLength":1,"type":"string"}},"required":["field","code","message"],"type":"object"},"Finding":{"additionalProperties":false,"properties":{"hint_code":{"maxLength":64,"type":"string"},"layer":{"$ref":"#/components/schemas/Layer"},"location":{"$ref":"#/components/schemas/Location"},"message":{"description":"A fixed, safe message for the rule or layer. Official rule texts are not repeated, because they can carry invoice values.","maxLength":256,"minLength":1,"type":"string"},"rule_flag":{"$ref":"#/components/schemas/Severity","description":"The rule's own flag. It differs from `severity` where the family's official configuration sets another level for the rule (XRechnung's per-scenario levels)."},"rule_id":{"description":"The official rule identifier, unchanged. Ironfang's own checks use the `FW-` namespace (`rule_source: ironfang`).","pattern":"^[A-Za-z0-9._:-]{1,64}$","type":"string"},"rule_source":{"enum":["official","ironfang"],"type":"string"},"severity":{"$ref":"#/components/schemas/Severity","description":"The level the ruleset applies, which decides the outcome."},"source_url":{"format":"uri","maxLength":256,"type":"string"}},"required":["severity","rule_flag","layer","rule_id","rule_source","message","location"],"type":"object"},"FindingsSummary":{"additionalProperties":false,"properties":{"cap":{"const":1000,"type":"integer"},"returned":{"maximum":1000,"minimum":0,"type":"integer"},"total":{"minimum":0,"type":"integer"},"truncated":{"type":"boolean"}},"required":["returned","total","cap","truncated"],"type":"object"},"ImageDigest":{"pattern":"^sha256:[0-9a-f]{64}$","type":"string"},"Job":{"additionalProperties":false,"description":"One durable job, V1's or V2's: metadata only, never its document.\n`outcome` appears once the job has finished: `valid` or `invalid`\nwhen completed, `indeterminate` when failed or cancelled, with\n`failure_code`. A queued job being retried keeps the last attempt's\n`failure_code`. `result_url` appears while the result can be read.\n","properties":{"api_version":{"$ref":"#/components/schemas/APIVersion"},"attempts":{"maximum":3,"minimum":0,"type":"integer"},"batch_id":{"$ref":"#/components/schemas/OpaqueID"},"created_at":{"format":"date-time","type":"string"},"engine_image_digest":{"$ref":"#/components/schemas/ImageDigest","description":"The engine the job is pinned to (for V2, the XML worker, or for Peppol BIS Billing 3 the Peppol validator)."},"expires_at":{"description":"When an unfinished job is failed as job_expired and its document erased.","format":"date-time","type":"string"},"failure_code":{"enum":["validation_timeout","validator_unavailable","internal_error","generation_failed","job_cancelled","job_expired"],"type":"string"},"finished_at":{"format":"date-time","type":"string"},"id":{"$ref":"#/components/schemas/OpaqueID"},"operation":{"description":"V2 jobs validate; a V1 job may generate.","enum":["validate","generate"],"type":"string"},"operation_id":{"$ref":"#/components/schemas/OpaqueID"},"outcome":{"enum":["valid","invalid","indeterminate"],"type":"string"},"position":{"description":"The job's place in its batch; 0 outside one.","maximum":99,"minimum":0,"type":"integer"},"result_available":{"type":"boolean"},"result_url":{"pattern":"^/finance/v2/einvoices/results/[0-9a-f-]{36}$","type":"string"},"ruleset_id":{"$ref":"#/components/schemas/RulesetID"},"schema":{"const":"ironfang/finance/einvoice/job/v2","type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"usage_charged":{"type":"boolean"}},"required":["schema","id","operation_id","position","api_version","operation","status","attempts","ruleset_id","engine_image_digest","usage_charged","result_available","created_at","expires_at"],"type":"object"},"JobCounts":{"additionalProperties":false,"properties":{"cancelled":{"minimum":0,"type":"integer"},"completed":{"minimum":0,"type":"integer"},"failed":{"minimum":0,"type":"integer"},"queued":{"minimum":0,"type":"integer"},"running":{"minimum":0,"type":"integer"}},"required":["queued","running","completed","failed","cancelled"],"type":"object"},"JobList":{"additionalProperties":false,"properties":{"jobs":{"items":{"$ref":"#/components/schemas/Job"},"maxItems":100,"type":"array"},"next_cursor":{"maxLength":256,"minLength":1,"type":"string"},"schema":{"const":"ironfang/finance/einvoice/job-list/v2","type":"string"}},"required":["schema","jobs"],"type":"object"},"JobRequest":{"additionalProperties":false,"properties":{"document_base64":{"contentEncoding":"base64","description":"The document's bytes, standard padded base64 without line breaks. XML at most 5 MiB, a PDF at most 20 MiB decoded.","minLength":4,"type":"string"},"media_type":{"description":"What the document is. The content must agree, or the job is `415 unsupported_content_type`.","enum":["application/xml","text/xml","application/pdf"],"type":"string"},"options":{"$ref":"#/components/schemas/ValidationOptions"}},"required":["document_base64","media_type"],"type":"object"},"JobStatus":{"enum":["queued","running","completed","failed","cancelled"],"type":"string"},"Layer":{"description":"A validation stage. A result reports the stages its pipeline runs, in the pipeline's order; no pipeline runs them all.","enum":["input","pdfa","hybrid_binding","xml","xsd","en16931","peppol","xrechnung","zugferd_profile"],"type":"string"},"LayerResult":{"additionalProperties":false,"properties":{"fatal":{"minimum":0,"type":"integer"},"information":{"minimum":0,"type":"integer"},"layer":{"$ref":"#/components/schemas/Layer"},"reason":{"enum":["skipped_after_failure","engine_error","deadline_exceeded"],"type":"string"},"status":{"enum":["passed","failed","skipped","error"],"type":"string"},"warning":{"minimum":0,"type":"integer"}},"required":["layer","status","fatal","warning","information"],"type":"object"},"Location":{"additionalProperties":false,"description":"Where a finding applies, in the source it came from: an XPath or a line and column in the invoice XML, or a PDF object or structure path. A PDF finding never carries an XML location.","properties":{"kind":{"enum":["none","xpath","line-column","pdf"],"type":"string"},"value":{"maxLength":256,"minLength":1,"type":"string"}},"required":["kind"],"type":"object"},"OpaqueID":{"pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","type":"string"},"PDFDocument":{"contentEncoding":"binary","contentMediaType":"application/pdf","description":"At most 20 MiB (20,971,520 bytes).","type":"string"},"Problem":{"additionalProperties":false,"allOf":[{"if":{"properties":{"code":{"const":"malformed_request"}}},"then":{"properties":{"status":{"const":400},"type":{"const":"https://ironfang.com/problems/malformed_request"}}}},{"if":{"properties":{"code":{"const":"unauthenticated"}}},"then":{"properties":{"status":{"const":401},"type":{"const":"https://ironfang.com/problems/unauthenticated"}}}},{"if":{"properties":{"code":{"const":"insufficient_scope"}}},"then":{"properties":{"status":{"const":403},"type":{"const":"https://ironfang.com/problems/insufficient_scope"}}}},{"if":{"properties":{"code":{"const":"not_found"}}},"then":{"properties":{"status":{"const":404},"type":{"const":"https://ironfang.com/problems/not_found"}}}},{"if":{"properties":{"code":{"const":"idempotency_conflict"}}},"then":{"properties":{"status":{"const":409},"type":{"const":"https://ironfang.com/problems/idempotency_conflict"}}}},{"if":{"properties":{"code":{"const":"ruleset_disabled"}}},"then":{"properties":{"status":{"const":410},"type":{"const":"https://ironfang.com/problems/ruleset_disabled"}}}},{"if":{"properties":{"code":{"const":"result_gone"}}},"then":{"properties":{"status":{"const":410},"type":{"const":"https://ironfang.com/problems/result_gone"}}}},{"if":{"properties":{"code":{"const":"payload_too_large"}}},"then":{"properties":{"status":{"const":413},"type":{"const":"https://ironfang.com/problems/payload_too_large"}}}},{"if":{"properties":{"code":{"const":"unsupported_content_type"}}},"then":{"properties":{"status":{"const":415},"type":{"const":"https://ironfang.com/problems/unsupported_content_type"}}}},{"if":{"properties":{"code":{"const":"unknown_ruleset"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/unknown_ruleset"}}}},{"if":{"properties":{"code":{"const":"selection_conflict"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/selection_conflict"}}}},{"if":{"properties":{"code":{"const":"family_undetected"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/family_undetected"}}}},{"if":{"properties":{"code":{"const":"family_mismatch"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/family_mismatch"}}}},{"if":{"properties":{"code":{"const":"unsupported_variant"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/unsupported_variant"}}}},{"if":{"properties":{"code":{"const":"unsupported_document_type"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/unsupported_document_type"}}}},{"if":{"properties":{"code":{"const":"scope_unavailable"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/scope_unavailable"}}}},{"if":{"properties":{"code":{"const":"no_embedded_invoice"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/no_embedded_invoice"}}}},{"if":{"properties":{"code":{"const":"ambiguous_embedded_invoice"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/ambiguous_embedded_invoice"}}}},{"if":{"properties":{"code":{"const":"encrypted_pdf"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/encrypted_pdf"}}}},{"if":{"properties":{"code":{"const":"processing_limit"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/processing_limit"}}}},{"if":{"properties":{"code":{"const":"rate_limited"}}},"then":{"properties":{"status":{"const":429},"type":{"const":"https://ironfang.com/problems/rate_limited"}}}},{"if":{"properties":{"code":{"const":"quota_exhausted"}}},"then":{"properties":{"status":{"const":429},"type":{"const":"https://ironfang.com/problems/quota_exhausted"}}}},{"if":{"properties":{"code":{"const":"internal_error"}}},"then":{"properties":{"status":{"const":500},"type":{"const":"https://ironfang.com/problems/internal_error"}}}},{"if":{"properties":{"code":{"const":"validator_unavailable"}}},"then":{"properties":{"status":{"const":503},"type":{"const":"https://ironfang.com/problems/validator_unavailable"}}}},{"if":{"properties":{"code":{"const":"delivery_unavailable"}}},"then":{"properties":{"status":{"const":503},"type":{"const":"https://ironfang.com/problems/delivery_unavailable"}}}},{"if":{"properties":{"code":{"const":"jobs_unavailable"}}},"then":{"properties":{"status":{"const":503},"type":{"const":"https://ironfang.com/problems/jobs_unavailable"}}}},{"if":{"properties":{"code":{"const":"report_incomplete"}}},"then":{"properties":{"status":{"const":422},"type":{"const":"https://ironfang.com/problems/report_incomplete"}}}},{"if":{"properties":{"code":{"const":"report_unavailable"}}},"then":{"properties":{"status":{"const":503},"type":{"const":"https://ironfang.com/problems/report_unavailable"}}}},{"if":{"properties":{"code":{"const":"validation_timeout"}}},"then":{"properties":{"status":{"const":504},"type":{"const":"https://ironfang.com/problems/validation_timeout"}}}},{"if":{"properties":{"code":{"const":"free_allowance_exhausted"}}},"then":{"properties":{"status":{"const":429},"type":{"const":"https://ironfang.com/problems/free_allowance_exhausted"}}}},{"if":{"properties":{"code":{"const":"account_budget_exhausted"}}},"then":{"properties":{"status":{"const":429},"type":{"const":"https://ironfang.com/problems/account_budget_exhausted"}}}},{"if":{"properties":{"code":{"const":"product_budget_exhausted"}}},"then":{"properties":{"status":{"const":429},"type":{"const":"https://ironfang.com/problems/product_budget_exhausted"}}}},{"if":{"properties":{"code":{"const":"exemption_limit_reached"}}},"then":{"properties":{"status":{"const":429},"type":{"const":"https://ironfang.com/problems/exemption_limit_reached"}}}},{"if":{"properties":{"code":{"const":"paid_usage_paused"}}},"then":{"properties":{"status":{"const":402},"type":{"const":"https://ironfang.com/problems/paid_usage_paused"}}}},{"if":{"properties":{"code":{"const":"payment_required"}}},"then":{"properties":{"status":{"const":402},"type":{"const":"https://ironfang.com/problems/payment_required"}}}},{"if":{"properties":{"code":{"const":"payment_action_required"}}},"then":{"properties":{"status":{"const":402},"type":{"const":"https://ironfang.com/problems/payment_action_required"}}}},{"if":{"properties":{"code":{"const":"account_restricted"}}},"then":{"properties":{"status":{"const":402},"type":{"const":"https://ironfang.com/problems/account_restricted"}}}},{"if":{"properties":{"code":{"const":"account_closed"}}},"then":{"properties":{"status":{"const":410},"type":{"const":"https://ironfang.com/problems/account_closed"}}}},{"if":{"properties":{"code":{"const":"product_not_eligible"}}},"then":{"properties":{"status":{"const":403},"type":{"const":"https://ironfang.com/problems/product_not_eligible"}}}},{"if":{"properties":{"code":{"const":"billing_temporarily_unavailable"}}},"then":{"properties":{"status":{"const":503},"type":{"const":"https://ironfang.com/problems/billing_temporarily_unavailable"}}}}],"description":"An RFC 9457 problem. `code` is the stable identifier and fixes `status` and `type`. `detail` is safe to show: it never carries parser output, invoice content or stack traces.","properties":{"billing":{"$ref":"#/components/schemas/BillingRefusal"},"code":{"enum":["malformed_request","unauthenticated","insufficient_scope","not_found","idempotency_conflict","ruleset_disabled","result_gone","payload_too_large","unsupported_content_type","unknown_ruleset","selection_conflict","family_undetected","family_mismatch","unsupported_variant","unsupported_document_type","scope_unavailable","no_embedded_invoice","ambiguous_embedded_invoice","encrypted_pdf","processing_limit","rate_limited","quota_exhausted","internal_error","validator_unavailable","validation_timeout","delivery_unavailable","jobs_unavailable","report_incomplete","report_unavailable","free_allowance_exhausted","account_budget_exhausted","product_budget_exhausted","exemption_limit_reached","paid_usage_paused","payment_required","payment_action_required","account_restricted","account_closed","product_not_eligible","billing_temporarily_unavailable"],"type":"string"},"detail":{"maxLength":512,"minLength":1,"type":"string"},"detected":{"$ref":"#/components/schemas/Declared","description":"On `family_mismatch`, `family_undetected` and `unsupported_variant` only: what the document declares, so a client can point to the right tool. Identifiers only, never invoice content."},"errors":{"description":"Field-level errors, on `malformed_request` only.","items":{"$ref":"#/components/schemas/FieldError"},"maxItems":50,"minItems":1,"type":"array"},"instance":{"format":"uri-reference","maxLength":256,"type":"string"},"operation_id":{"$ref":"#/components/schemas/OpaqueID","description":"On an indeterminate validation only, the operation that was opened."},"outcome":{"const":"indeterminate","type":"string"},"request_id":{"$ref":"#/components/schemas/RequestID"},"retry_after_seconds":{"maximum":3600,"minimum":1,"type":"integer"},"status":{"maximum":599,"minimum":400,"type":"integer"},"title":{"maxLength":128,"minLength":1,"type":"string"},"type":{"format":"uri","pattern":"^https://ironfang\\.com/problems/[a-z_]+$","type":"string"},"usage_charged":{"const":false,"type":"boolean"}},"required":["type","title","status","detail","code","request_id"],"type":"object"},"ReportRequest":{"additionalProperties":false,"properties":{"include_pdf":{"description":"A readable PDF of a retained V1 generation. A V2 result has none.","type":"boolean"},"operation_id":{"$ref":"#/components/schemas/OpaqueID"}},"required":["operation_id"],"type":"object"},"ReportVerification":{"additionalProperties":false,"description":"The integrity check of a signed report of either version. A\nverified report passed every stage and says what it records; an\nunverified one gives at least one reason in `errors` and records\nnothing.\n","properties":{"artifact_hashes":{"enum":["not_verified","verified","invalid"],"type":"string"},"claim":{"maxLength":1024,"type":"string"},"errors":{"items":{"maxLength":256,"type":"string"},"maxItems":8,"type":"array"},"family":{"$ref":"#/components/schemas/Family"},"invoice_outcome":{"enum":["valid","invalid"],"type":"string"},"key_id":{"pattern":"^fw_ed25519_[0-9a-f]{64}$","type":"string"},"manifest_sha256":{"$ref":"#/components/schemas/SHA256"},"operation_id":{"$ref":"#/components/schemas/OpaqueID"},"report_schema":{"enum":["financewolf/einvoice/report-manifest/v1","ironfang/finance/einvoice/report-manifest/v2"],"type":"string"},"ruleset_id":{"$ref":"#/components/schemas/RulesetID"},"schema":{"const":"ironfang/finance/einvoice/report-verification/v2","type":"string"},"scope":{"$ref":"#/components/schemas/Scope"},"signature":{"enum":["not_verified","verified","invalid","untrusted"],"type":"string"},"timestamp":{"enum":["not_present","not_verified","verified","invalid"],"type":"string"},"verified":{"type":"boolean"}},"required":["schema","verified","signature","artifact_hashes","timestamp","errors","claim"],"type":"object"},"RequestID":{"pattern":"^[A-Za-z0-9_-]{8,64}$","type":"string"},"ResultSchema":{"description":"The schema of a retained document.","enum":["ironfang/finance/einvoice/validation-result/v2","financewolf/einvoice/validation-result/v1","financewolf/einvoice/generation-result/v1"],"type":"string"},"RetainedDocument":{"description":"A retained document in the schema it was made under. A V1 document is described by the V1 contract (/finance/v1/openapi.yaml); here it is only named by its `schema`.","oneOf":[{"$ref":"#/components/schemas/ValidationVerdict"},{"properties":{"schema":{"enum":["financewolf/einvoice/validation-result/v1","financewolf/einvoice/generation-result/v1"],"type":"string"}},"required":["schema"],"type":"object"}]},"RetainedResult":{"additionalProperties":false,"properties":{"api_version":{"$ref":"#/components/schemas/APIVersion"},"available":{"description":"The document can still be read; false once expired or erased.","type":"boolean"},"created_at":{"format":"date-time","type":"string"},"deleted_at":{"format":"date-time","type":"string"},"display_name":{"description":"The name given when the document was validated in the portal, while the result is available.","maxLength":255,"type":"string"},"expires_at":{"format":"date-time","type":"string"},"family":{"$ref":"#/components/schemas/Family"},"kind":{"enum":["validate","generate"],"type":"string"},"operation_id":{"$ref":"#/components/schemas/OpaqueID"},"outcome":{"enum":["valid","invalid"],"type":"string"},"result_schema":{"$ref":"#/components/schemas/ResultSchema"},"ruleset_id":{"$ref":"#/components/schemas/RulesetID"}},"required":["operation_id","kind","api_version","result_schema","family","outcome","ruleset_id","created_at","expires_at","available"],"type":"object"},"RetainedResultList":{"additionalProperties":false,"properties":{"next_cursor":{"maxLength":256,"minLength":1,"type":"string"},"results":{"items":{"$ref":"#/components/schemas/RetainedResult"},"maxItems":100,"type":"array"},"retention_days":{"const":30,"type":"integer"},"schema":{"const":"ironfang/finance/einvoice/result-list/v2","type":"string"},"total":{"minimum":0,"type":"integer"}},"required":["schema","results","total","retention_days"],"type":"object"},"Ruleset":{"additionalProperties":false,"description":"One immutable release: the exact pipeline a validation that names it runs, every artefact by checksum, and the engine image it is pinned to. Nothing about a release changes after activation except its lifecycle state.","properties":{"artifacts":{"items":{"$ref":"#/components/schemas/RulesetArtifact"},"minItems":1,"type":"array"},"bis_release":{"maxLength":32,"type":"string"},"document_type":{"$ref":"#/components/schemas/DocumentType"},"en16931_release":{"maxLength":32,"type":"string"},"engine":{"additionalProperties":false,"properties":{"image_digest":{"$ref":"#/components/schemas/ImageDigest"},"name":{"maxLength":128,"minLength":1,"type":"string"}},"required":["name","image_digest"],"type":"object"},"family":{"$ref":"#/components/schemas/Family"},"id":{"$ref":"#/components/schemas/RulesetID"},"latest":{"type":"boolean"},"layers":{"items":{"$ref":"#/components/schemas/Layer"},"maxItems":9,"minItems":3,"type":"array","uniqueItems":true},"manifest_sha256":{"$ref":"#/components/schemas/SHA256","description":"The SHA-256 of the release's pipeline manifest, which names every\nartefact, engine module and configuration it runs. A Peppol BIS\nBilling 3 release runs on the Peppol validator, not a pipeline:\nits checksum is over its release identity document\n(`ironfang/finance/einvoice/peppol-release/v1`: id, VESID,\ndocument type, syntax, official, EN 16931 and BIS releases,\nengine and image digest), and its three rule artefacts are listed\nin `artifacts`.\n"},"official_release":{"maxLength":128,"minLength":1,"type":"string"},"operations":{"items":{"$ref":"#/components/schemas/RulesetOperation"},"minItems":1,"type":"array","uniqueItems":true},"published_on":{"format":"date","type":"string"},"replaced_by":{"$ref":"#/components/schemas/RulesetID"},"retired_at":{"format":"date-time","type":"string"},"schema":{"const":"ironfang/finance/einvoice/ruleset/v2","type":"string"},"scope":{"$ref":"#/components/schemas/Scope"},"sources":{"items":{"format":"uri","maxLength":256,"type":"string"},"minItems":1,"type":"array"},"state":{"$ref":"#/components/schemas/RulesetState"},"syntax":{"$ref":"#/components/schemas/Syntax"},"technical_release":{"maxLength":64,"type":"string"},"valid_from":{"format":"date-time","type":"string"},"valid_until":{"format":"date-time","type":"string"},"variant":{"$ref":"#/components/schemas/Variant"}},"required":["schema","id","state","latest","family","syntax","document_type","scope","operations","official_release","layers","artifacts","manifest_sha256","engine","valid_from","sources"],"type":"object"},"RulesetArtifact":{"additionalProperties":false,"properties":{"layer":{"$ref":"#/components/schemas/Layer"},"licence":{"maxLength":64,"minLength":1,"type":"string"},"licence_status":{"enum":["permissive","notice-required","no-raw-redistribution"],"type":"string"},"role":{"enum":["entry","dependency"],"type":"string"},"sha256":{"$ref":"#/components/schemas/SHA256"},"source_url":{"format":"uri","maxLength":256,"type":"string"}},"required":["layer","role","sha256","licence","licence_status","source_url"],"type":"object"},"RulesetID":{"pattern":"^fwrs_[a-z0-9_]{1,80}$","type":"string"},"RulesetList":{"additionalProperties":false,"properties":{"rulesets":{"items":{"$ref":"#/components/schemas/Ruleset"},"type":"array"},"schema":{"const":"ironfang/finance/einvoice/ruleset-list/v2","type":"string"}},"required":["schema","rulesets"],"type":"object"},"RulesetOperation":{"enum":["validate","generate"],"type":"string"},"RulesetSelection":{"additionalProperties":false,"properties":{"family":{"$ref":"#/components/schemas/Family"},"id":{"$ref":"#/components/schemas/RulesetID"},"official_release":{"description":"The specification release","e.g. 3.0.2.":null,"maxLength":128,"minLength":1,"type":"string"},"requested":{"$ref":"#/components/schemas/RulesetSelector"},"scope":{"$ref":"#/components/schemas/Scope"},"selection_method":{"enum":["exact","latest","detected"],"type":"string"},"state":{"$ref":"#/components/schemas/RulesetState"},"syntax":{"$ref":"#/components/schemas/Syntax"},"technical_release":{"description":"The technical bundle","e.g. 2026-08-31":null,"maxLength":64,"type":"string","where the family publishes one separately.":null},"variant":{"$ref":"#/components/schemas/Variant"}},"required":["requested","id","selection_method","state","family","syntax","scope","official_release"],"type":"object"},"RulesetSelector":{"pattern":"^(latest|fwrs_[a-z0-9_]{1,80})$","type":"string"},"RulesetState":{"enum":["scheduled","sendable","historical"],"type":"string"},"SHA256":{"pattern":"^[0-9a-f]{64}$","type":"string"},"Scope":{"enum":["xml","hybrid_pdf"],"type":"string"},"Severity":{"description":"`fatal` fails the document; `warning` and `information` never do.","enum":["fatal","warning","information"],"type":"string"},"SeverityCounts":{"additionalProperties":false,"properties":{"fatal":{"minimum":0,"type":"integer"},"information":{"minimum":0,"type":"integer"},"warning":{"minimum":0,"type":"integer"}},"required":["fatal","warning","information"],"type":"object"},"Syntax":{"description":"The syntax and schema edition a pipeline validates against, taken from the pinned release, never inferred from a namespace.","enum":["ubl-2.1","cii-d16b","cii-d22b"],"type":"string"},"Timing":{"additionalProperties":false,"properties":{"completed_at":{"format":"date-time","type":"string"},"duration_ms":{"maximum":30000,"minimum":0,"type":"integer"},"started_at":{"format":"date-time","type":"string"}},"required":["started_at","completed_at","duration_ms"],"type":"object"},"Usage":{"additionalProperties":false,"properties":{"charged":{"type":"boolean"},"credits":{"maximum":1,"minimum":0,"type":"integer"},"period_ends_at":{"description":"Only on results recorded before usage billing, returned as they were recorded.","format":"date-time","type":"string"},"remaining":{"description":"Only on results recorded before usage billing, returned as they were recorded.","minimum":0,"type":"integer"}},"required":["charged","credits"],"type":"object"},"ValidationInput":{"additionalProperties":false,"properties":{"bytes":{"maximum":20971520,"minimum":0,"type":"integer"},"document_type":{"enum":["invoice","credit_note","unknown"],"type":"string"},"embedded_xml":{"additionalProperties":false,"description":"For a PDF, the invoice XML exactly as extracted - original bytes, never re-serialised.","properties":{"bytes":{"maximum":5242880,"minimum":0,"type":"integer"},"file_name":{"description":"The attachment's name as declared in the PDF","for display only.":null,"maxLength":128,"type":"string"},"sha256":{"$ref":"#/components/schemas/SHA256"}},"required":["bytes","sha256"],"type":"object"},"media_type":{"enum":["application/xml","application/pdf"],"type":"string"},"sha256":{"$ref":"#/components/schemas/SHA256"}},"required":["media_type","bytes","sha256","document_type"],"type":"object"},"ValidationOptions":{"additionalProperties":false,"description":"The multipart `options` part. The same names as the query parameters. Unknown or repeated keys are `400`.","properties":{"document_type":{"$ref":"#/components/schemas/DocumentTypeSelector"},"family":{"$ref":"#/components/schemas/Family"},"ruleset":{"$ref":"#/components/schemas/RulesetSelector"},"scope":{"$ref":"#/components/schemas/Scope"},"variant":{"$ref":"#/components/schemas/Variant"}},"type":"object"},"ValidationVerdict":{"additionalProperties":false,"description":"The result of one completed validation. `outcome` is decided by the fatal findings of the checks that ran, within `coverage`.","properties":{"counts":{"additionalProperties":false,"properties":{"by_severity":{"$ref":"#/components/schemas/SeverityCounts"}},"required":["by_severity"],"type":"object"},"coverage":{"$ref":"#/components/schemas/Coverage"},"declared":{"$ref":"#/components/schemas/Declared"},"engines":{"items":{"$ref":"#/components/schemas/Engine"},"maxItems":2,"minItems":1,"type":"array"},"findings":{"items":{"$ref":"#/components/schemas/Finding"},"maxItems":1000,"type":"array"},"findings_summary":{"$ref":"#/components/schemas/FindingsSummary"},"groups":{"items":{"$ref":"#/components/schemas/CheckGroup"},"maxItems":3,"minItems":1,"type":"array"},"input":{"$ref":"#/components/schemas/ValidationInput"},"layers":{"items":{"$ref":"#/components/schemas/LayerResult"},"maxItems":9,"minItems":3,"type":"array"},"next_actions":{"description":"What this input supports next, from the capability registry: open the readable view, or extract the embedded XML. Never guessed by a client.","items":{"enum":["view","extract_xml"],"type":"string"},"type":"array","uniqueItems":true},"operation_id":{"$ref":"#/components/schemas/OpaqueID"},"outcome":{"enum":["valid","invalid"],"type":"string"},"ruleset":{"$ref":"#/components/schemas/RulesetSelection"},"schema":{"const":"ironfang/finance/einvoice/validation-result/v2","type":"string"},"status":{"const":"completed","type":"string"},"timing":{"$ref":"#/components/schemas/Timing"},"usage":{"$ref":"#/components/schemas/Usage"}},"required":["schema","status","outcome","input","declared","ruleset","coverage","groups","layers","counts","findings","findings_summary","timing","engines","next_actions"],"type":"object"},"Variant":{"description":"A variant or profile within a family. XRechnung: `core`, `extension`, `cvd`. ZUGFeRD / Factur-X: `minimum`, `basic-wl`, `basic`, `en16931`, `extended`, `xrechnung` (the ZUGFeRD XRECHNUNG reference profile). Peppol BIS Billing 3 has none. Recognition is not support: the ruleset list is the only statement of what is validated.","enum":["core","extension","cvd","minimum","basic-wl","basic","en16931","extended","xrechnung"],"type":"string"},"XMLDocument":{"contentMediaType":"application/xml","maxLength":5242880,"type":"string"}},"securitySchemes":{"platformKey":{"description":"An Ironfang platform API key minted in the portal, carrying the scopes an operation lists.","scheme":"bearer","type":"http"}}},"externalDocs":{"description":"Ironfang Finance documentation","url":"https://ironfang.com/docs/finance"},"info":{"contact":{"email":"hello@ironfang.com","name":"Ironfang","url":"https://ironfang.com/finance"},"description":"V2 validates an e-invoice against the exact, immutable ruleset of its\nfamily and reports precisely what was checked. It exists beside V1,\nwhich is unchanged: V1 clients keep their Peppol-only shapes, and a V2\nresult is never returned through a V1 route.\n\n**Families.** `xrechnung` (the German CIUS of EN 16931, in UBL or\nUN/CEFACT CII), `zugferd-facturx` (the shared ZUGFeRD / Factur-X\nimplementation, as CII XML or embedded in a PDF/A-3) and\n`peppol-bis-billing-3`. ZUGFeRD and Factur-X are corresponding release\nnames of one standard, validated once. `GET /v2/einvoices/rulesets` lists\nexactly which family, variant, syntax, document type and scope each\nactive release covers; nothing else is supported.\n\n**Scope.** An XML body is checked at `xml` scope: the invoice XML\nagainst its schema and rules. A PDF body is checked at `hybrid_pdf`\nscope: PDF/A-3 conformance, the invoice attachment and its metadata,\nand the embedded invoice XML, each reported separately. A PDF is never\nsilently checked as XML only, and XML success never reads as a complete\nhybrid check. `coverage` lists what was not checked: a PDF that was not\nsupplied, the visual PDF content against the XML (never compared), and\ndigital signatures (never verified).\n\n**Reduced profiles.** ZUGFeRD / Factur-X MINIMUM and BASIC WL are not\nfull EN 16931 invoices. A pass against them is a pass against that\nprofile's rules, and `coverage` says the EN 16931 semantic model was not\nestablished.\n\n**What a result is not.** Validation does not transmit invoices,\ncertify legal or tax compliance, or guarantee acceptance by a recipient\nor a submission portal. Documents are never corrected.\n\n**Authentication, anonymous use, idempotency and retention** follow V1:\nIronfang platform API keys (`Authorization: Bearer`), anonymous\nvalidation with nothing stored and tighter rate limits, optional\n`Idempotency-Key` on authenticated requests, 30-day retained results.\nUploaded XML or PDF bytes are not stored by synchronous validation.\n\n**Durable jobs.** `POST /v2/einvoices/jobs` queues one validation and\n`POST /v2/einvoices/batches` 1 to 100 together, each document base64 in\nJSON. Everything synchronous validation decides before it validates is\ndecided when a job is accepted, so a document it would refuse is\nrefused then, and nothing is queued or charged. An accepted job's\ndocument is held encrypted until it finishes, at most 24 hours. Its\nresult, usage and webhook or S3 event are exactly a synchronous\nvalidation's.\n\n**Problems.** Every error is an RFC 9457 Problem\n(`application/problem+json`); branch on `code`:\n\n| code | status | meaning |\n| --- | --- | --- |\n| `malformed_request` | 400 | The request is malformed: an unknown or repeated parameter or part, an invalid value, or a body that is not one document. |\n| `unauthenticated` | 401 | The credential is missing, malformed, unknown or revoked. |\n| `paid_usage_paused` | 402 | Paid usage is paused for the billing account and the free allowance is used up. |\n| `payment_required` | 402 | Paid usage needs a working payment method. |\n| `payment_action_required` | 402 | A payment needs the account holder's confirmation before paid usage continues. |\n| `account_restricted` | 402 | Paid usage is restricted on the billing account. |\n| `product_not_eligible` | 403 | Paid Ironfang Finance usage needs an approved business; the free allowance is used up. |\n| `insufficient_scope` | 403 | The key lacks the scope this operation needs. |\n| `not_found` | 404 | No such resource is visible to the caller. |\n| `idempotency_conflict` | 409 | The Idempotency-Key was used for a different request. |\n| `ruleset_disabled` | 410 | The ruleset was withdrawn from every use. |\n| `account_closed` | 410 | The billing account is closed. |\n| `result_gone` | 410 | The original result behind this Idempotency-Key has expired or was deleted; nothing was run again. |\n| `payload_too_large` | 413 | The body is over the published limit for its media type. |\n| `unsupported_content_type` | 415 | The body's media type, encoding or content is not one this operation accepts. |\n| `unknown_ruleset` | 422 | The ruleset id names no release that can be validated against, or no current release exists for the selection. |\n| `selection_conflict` | 422 | The selectors disagree with each other or with the named ruleset. |\n| `family_undetected` | 422 | The document declares no family Ironfang recognises; name a family or an exact ruleset. |\n| `family_mismatch` | 422 | The document declares a different family from the one requested. |\n| `unsupported_variant` | 422 | The document declares a variant or profile Ironfang recognises but does not validate yet. |\n| `unsupported_document_type` | 422 | The document type is not one the selected ruleset validates, or it contradicts the document. |\n| `scope_unavailable` | 422 | The requested scope cannot be checked with this input, such as hybrid scope for an XML body or XML scope for a PDF. |\n| `no_embedded_invoice` | 422 | The PDF carries no embedded invoice XML Ironfang could identify. |\n| `ambiguous_embedded_invoice` | 422 | The PDF carries more than one plausible invoice XML; none was chosen. |\n| `encrypted_pdf` | 422 | The PDF is encrypted or password-protected. |\n| `processing_limit` | 422 | The document is over a published processing limit (pages, attachments, decoded size); this is not a verdict on the invoice. |\n| `rate_limited` | 429 | Too many requests from this caller. |\n| `free_allowance_exhausted` | 429 | This month's free allowance is used up and paid usage is not enabled. |\n| `account_budget_exhausted` | 429 | The billing account's monthly usage limit is reached. |\n| `product_budget_exhausted` | 429 | The monthly usage limit for Ironfang Finance is reached. |\n| `exemption_limit_reached` | 429 | The account's agreed monthly limit is reached. |\n| `quota_exhausted` | 429 | The organisation's queue of unfinished jobs is full (job and batch submission). |\n| `internal_error` | 500 | Ironfang Finance failed while processing the request. |\n| `validator_unavailable` | 503 | The validator for the selected ruleset is not available. |\n| `delivery_unavailable` | 503 | Destination delivery is not configured (delivery retry). |\n| `jobs_unavailable` | 503 | Durable jobs are not configured on this deployment (job and batch submission). |\n| `billing_temporarily_unavailable` | 503 | Billing is briefly unavailable; retry shortly. |\n| `report_incomplete` | 422 | The retained result's findings were truncated, so no complete signed report can be issued. |\n| `report_unavailable` | 503 | Signed report issuance is not configured, or a readable PDF was asked for a result that has none. |\n| `validation_timeout` | 504 | Validation did not finish within the deadline. |\n\n`validator_unavailable`, `validation_timeout` and, on validation,\n`internal_error` are indeterminate: they carry `outcome: indeterminate`\nand `usage_charged: false`, and nothing is billed.\n","license":{"identifier":"LicenseRef-Ironfang-Proprietary","name":"Proprietary"},"summary":"Validate XRechnung, ZUGFeRD / Factur-X and Peppol invoices, as XML or as a PDF with embedded XML.","termsOfService":"https://ironfang.com/legal/terms","title":"Ironfang Finance E-Invoicing API","version":"2.0.0"},"openapi":"3.1.0","paths":{"/v2/einvoices/batches":{"get":{"description":"A page of the organisation's batches, newest first, made through V1\nor V2 (`api_version`). Pass `next_cursor` as `cursor` for the next\npage. V1's own list shows V1 batches only.\n","operationId":"listEInvoiceBatchesV2","parameters":[{"in":"query","name":"cursor","required":false,"schema":{"maxLength":256,"minLength":1,"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"api_version","required":false,"schema":{"$ref":"#/components/schemas/APIVersion"}}],"responses":{"200":{"content":{"application/json":{"examples":{"union":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-batch-list.json","summary":"A V2 batch beside a V1 one"}},"schema":{"$ref":"#/components/schemas/BatchList"}}},"description":"The page. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"List batches, V1 and V2 together","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:read"]},"post":{"description":"Accepts 1 to 100 jobs together, all or none: a job that would be\nrefused refuses the batch, and the Problem's `detail` names it by\nposition (`Job 3: ...`), as `errors[].field` does (`jobs[3].options`).\nThe documents together are at most 25 MiB (26,214,400 bytes) and the\nenvelope at most 36 MiB. PDFs are inspected on acceptance, within the\n30-second hybrid deadline for the whole batch; a batch that cannot\nbe is `504 validation_timeout` and nothing is queued, so send fewer\nPDFs at once. Each job then runs, is charged and is retained on its\nown.\n\n**Idempotency.** An `Idempotency-Key` names the whole batch: the\nsame key and envelope return the original batch (`200`), a\ndifferent envelope `409 idempotency_conflict`. Keys are V2's own,\napart from V1 batches and from synchronous validation.\n","operationId":"submitEInvoiceBatchV2","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}},"description":"The batch this Idempotency-Key already names, unchanged."},"202":{"content":{"application/json":{"examples":{"accepted":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-batch.json","summary":"A ZUGFeRD PDF and an XRechnung XML, queued together"}},"schema":{"$ref":"#/components/schemas/Batch"}}},"description":"Accepted and queued. Location names the batch. Cache-Control is no-store.","headers":{"Location":{"description":"/finance/v2/einvoices/batches/{id}","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/ScopeOrEligibility"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"410":{"$ref":"#/components/responses/AdmissionGone"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"415":{"$ref":"#/components/responses/UnsupportedContentType"},"422":{"$ref":"#/components/responses/AdmissionRefused"},"429":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["rate_limited","quota_exhausted","free_allowance_exhausted","account_budget_exhausted","product_budget_exhausted","exemption_limit_reached"]}}}]}}},"description":"Rate limited, the queue full, or the billing account can admit no more of this work this month. Nothing was queued.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"500":{"$ref":"#/components/responses/InternalError"},"503":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["validator_unavailable","jobs_unavailable","billing_temporarily_unavailable"]}}}]}}},"description":"The release's engine is not available, durable jobs are not configured, or billing is briefly unavailable. Nothing was queued.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"504":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"validation_timeout"}}}]}}},"description":"A PDF could not be inspected within the admission deadline. Nothing was queued."}},"security":[{"platformKey":[]}],"summary":"Queue 1 to 100 validations as one batch","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:write"]}},"/v2/einvoices/batches/{id}":{"get":{"description":"One batch, V1's or V2's, with every job in position order and the\ncounts by status. `partial` means every job finished, not all the\nsame way.\n","operationId":"getEInvoiceBatchV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}},"description":"The batch. Cache-Control is no-store."},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"One batch","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:read"]}},"/v2/einvoices/batches/{id}/cancel":{"post":{"description":"Cancels every unfinished job in the batch, as cancelling each\nwould; finished jobs keep their results. The body is empty.\n","operationId":"cancelEInvoiceBatchV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}},"description":"The batch after cancellation. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"Cancel a batch","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:write"]}},"/v2/einvoices/deliveries":{"get":{"description":"A page of the organisation's deliveries, newest first. A finished\noperation queues one event, and the event one delivery per enabled\ndestination (webhook or S3). An operation made through V1 carries\nthe `financewolf/einvoice/event/v1` event; one made through V2 the\n`ironfang/finance/einvoice/event/v2` event, whose `result_url` is\nunder `/finance/v2`. Each delivery says which (`api_version`); branch\non the event's `schema`. Pass `next_cursor` as `cursor` for the next\npage. Deliveries and events are kept for 30 days.\n\nV1's own delivery list shows deliveries of V1 events only.\n","operationId":"listEInvoiceDeliveriesV2","parameters":[{"in":"query","name":"cursor","required":false,"schema":{"maxLength":256,"minLength":1,"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"destination","required":false,"schema":{"$ref":"#/components/schemas/OpaqueID"}},{"in":"query","name":"operation_id","required":false,"schema":{"$ref":"#/components/schemas/OpaqueID"}},{"description":"`retrying` is a pending delivery with at least one attempt behind it; `pending` one with none.","in":"query","name":"status","required":false,"schema":{"enum":["pending","retrying","delivering","delivered","failed"],"type":"string"}},{"in":"query","name":"api_version","required":false,"schema":{"$ref":"#/components/schemas/APIVersion"}}],"responses":{"200":{"content":{"application/json":{"examples":{"union":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-delivery-list.json","summary":"A V2 validation's delivery beside a V1 one"}},"schema":{"$ref":"#/components/schemas/DeliveryList"}}},"description":"The page. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"List webhook and S3 deliveries, V1 and V2 events together","tags":["deliveries"],"x-ironfang-scopes":["finance:einvoices:read"]}},"/v2/einvoices/deliveries/{id}":{"get":{"description":"One delivery of a V1 or a V2 event, with its event as queued and\nthe history of every attempt: when it started and finished, the\nHTTP status the destination answered and why it failed, if it did.\n","operationId":"getEInvoiceDeliveryV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"examples":{"v2":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-delivery.json","summary":"A delivered V2 event"}},"schema":{"$ref":"#/components/schemas/DeliveryDetail"}}},"description":"The delivery. Cache-Control is no-store."},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"One delivery and every attempt made","tags":["deliveries"],"x-ironfang-scopes":["finance:einvoices:read"]}},"/v2/einvoices/deliveries/{id}/retry":{"post":{"description":"Grants a failed delivery a fresh ladder of up to eight attempts\n(32 in all), keeping every earlier attempt in its history. Only a\nfailed delivery to an enabled destination, whose event has not\nexpired, can be retried; anything else is `400 malformed_request`.\nThe body is empty.\n","operationId":"retryEInvoiceDeliveryV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryDetail"}}},"description":"The delivery, pending again. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DeliveryUnavailable"}},"security":[{"platformKey":[]}],"summary":"Retry a failed delivery","tags":["deliveries"],"x-ironfang-scopes":["finance:einvoices:destinations:manage"]}},"/v2/einvoices/jobs":{"get":{"description":"A page of the organisation's jobs, newest first, made through V1\nor V2 (`api_version`). Pass `next_cursor` as `cursor` for the next\npage. V1's own list shows V1 jobs only.\n","operationId":"listEInvoiceJobsV2","parameters":[{"in":"query","name":"cursor","required":false,"schema":{"maxLength":256,"minLength":1,"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/JobStatus"}},{"in":"query","name":"api_version","required":false,"schema":{"$ref":"#/components/schemas/APIVersion"}}],"responses":{"200":{"content":{"application/json":{"examples":{"union":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-job-list.json","summary":"A V2 job beside a V1 one"}},"schema":{"$ref":"#/components/schemas/JobList"}}},"description":"The page. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"List jobs, V1 and V2 together","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:read"]},"post":{"description":"Queues one validation: `document_base64` holds the document's\nbytes, `media_type` says what they are (the content must agree, as\nin synchronous validation) and `options` are the synchronous\noptions. XML at most 5 MiB, a PDF at most 20 MiB; the envelope at\nmost 28 MiB.\n\n**Acceptance.** Every decision synchronous validation makes before\nit validates is made now: the document's content and size, the\nscope, a PDF's inspection and its embedded invoice, and the release\n`latest` or the ruleset id resolves to. A document it would refuse is\nrefused here with the same Problem, and nothing is queued or\ncharged. An accepted job is pinned to that release and its engines,\nand one validation is reserved on the billing account until the job\nfinishes: charged if it reaches a verdict, returned otherwise. A\nbatch is admitted whole or not at all.\n\n**Running.** The job runs through the same validation as\n`POST /v2/einvoices/validate`. Its result is a V2 validation result,\nread at `result_url` once the job is `completed`; its usage and its\nwebhook or S3 event (`ironfang/finance/einvoice/event/v2`, naming\n`job_id`) are a synchronous validation's. An unavailable engine or a\ntimeout is retried, up to 3 attempts; then the job is `failed`,\nindeterminate and uncharged. The document is held encrypted until\nthe job finishes, at most 24 hours (`expires_at`), then erased.\n\n**Queue.** An organisation holds at most 100 unfinished jobs and\n25 MiB of their documents; more is `429 quota_exhausted`.\n\n**Idempotency.** As synchronous validation, with the request\nidentified by the document's bytes, the options and the scope. Keys\nare V2's own, apart from V1 jobs and from synchronous validation.\n","operationId":"submitEInvoiceJobV2","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"The job this Idempotency-Key already names, unchanged."},"202":{"content":{"application/json":{"examples":{"queued":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-job.json","summary":"A ZUGFeRD PDF queued"}},"schema":{"$ref":"#/components/schemas/Job"}}},"description":"Accepted and queued. Location names the job. Cache-Control is no-store.","headers":{"Location":{"description":"/finance/v2/einvoices/jobs/{id}","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/ScopeOrEligibility"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"410":{"$ref":"#/components/responses/AdmissionGone"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"415":{"$ref":"#/components/responses/UnsupportedContentType"},"422":{"$ref":"#/components/responses/AdmissionRefused"},"429":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["rate_limited","quota_exhausted","free_allowance_exhausted","account_budget_exhausted","product_budget_exhausted","exemption_limit_reached"]}}}]}}},"description":"Rate limited, the queue full, or the billing account can admit no more of this work this month. Nothing was queued.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"500":{"$ref":"#/components/responses/InternalError"},"503":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["validator_unavailable","jobs_unavailable","billing_temporarily_unavailable"]}}}]}}},"description":"The release's engine is not available, durable jobs are not configured, or billing is briefly unavailable. Nothing was queued.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"504":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"validation_timeout"}}}]}}},"description":"A PDF could not be inspected within the admission deadline. Nothing was queued."}},"security":[{"platformKey":[]}],"summary":"Queue one validation","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:write"]}},"/v2/einvoices/jobs/{id}":{"get":{"description":"One job, V1's or V2's: its status, attempts, pinned release and\nengine, and once it has finished its outcome, usage and result.\n","operationId":"getEInvoiceJobV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"The job. Cache-Control is no-store."},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"One job","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:read"]}},"/v2/einvoices/jobs/{id}/cancel":{"post":{"description":"Cancels an unfinished job: its operation ends indeterminate and\nuncharged, and its document is erased. A job that has finished is\nreturned unchanged. The body is empty.\n","operationId":"cancelEInvoiceJobV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"The job after cancellation. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"Cancel a job","tags":["jobs"],"x-ironfang-scopes":["finance:einvoices:write"]}},"/v2/einvoices/reports":{"post":{"description":"A ZIP binding the exact retained result, its complete findings and\nthe facts it records to an Ed25519 signature by Ironfang Finance.\nThe report is in its result's version. A V2 validation, XML or\nhybrid PDF, gets the V2 manifest\n(`ironfang/finance/einvoice/report-manifest/v2`): the input and, for\na PDF, its embedded XML by hash; the ruleset release with its\nfamily, variant, syntax, scope and manifest checksum (see the\nruleset's `manifest_sha256`); for\na hybrid release the PDF engine, PDF/A profiles and binding table it\npins; both engines by image digest; every check group and layer;\nwhat was not checked; and the release's rule artefacts by hash. A\nresult made through V1 gets exactly the bundle\n`POST /finance/v1/einvoices/reports` issues, V1 manifest and all.\n\nThe ZIP holds `manifest.json` (canonical), `signature.json`,\n`result.json` (the retained bytes), `findings.json` and a readable\n`report.html` derived from the manifest; with RFC 3161 timestamps\nconfigured, `timestamp.tsq` and `timestamp.tsr` too. V2 reports\nsign under their own domain and envelope schema, so a V1 signature\ncan never be read as V2 or the reverse. Both are signed by the keys\nat `GET /finance/v1/einvoices/reports/keys`.\n\nSend `operation_id` (and, for a V1 generation only, `include_pdf`)\nin a JSON body of at most 1024 bytes. A V2 result has no readable\nPDF: `include_pdf` on one is `503 report_unavailable`. Truncated\nfindings are `422 report_incomplete`. Nothing is validated or\ncharged again and nothing is stored; issuance time and signature may\ndiffer between downloads of one result, its facts never do. Expiry\nand deletion are checked again before the bundle is released.\nA signature does not certify compliance.\n","operationId":"createEInvoiceReportV2","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"200":{"content":{"application/zip":{"schema":{"format":"binary","type":"string"}}},"description":"The signed report ZIP as an attachment. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"$ref":"#/components/responses/ResultGone"},"415":{"$ref":"#/components/responses/UnsupportedContentType"},"422":{"$ref":"#/components/responses/ReportIncomplete"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ReportUnavailable"}},"security":[{"platformKey":[]}],"summary":"Download a signed report of a retained result","tags":["reports"],"x-ironfang-scopes":["finance:einvoices:read"]}},"/v2/einvoices/reports/verify":{"post":{"description":"Send the ZIP as `application/zip`. Ironfang Finance reads which\nmanifest it carries (V1's or V2's) and checks the canonical\nmanifest, the domain-separated signature against its own published\nkeys, every bound member's hash and length, the readable page and,\nwhere the report requires one, its RFC 3161 timestamp. It performs\nno network access, no validation and no retention. HTTP 200 answers\n`verified` true or false; verified means the report is intact and\nissued by a trusted key, not that the invoice is valid: read\n`invoice_outcome`. `report_schema` names the manifest; `family` and\n`scope` are the release's (a V1 report is Peppol BIS Billing 3 at\nXML scope). Unknown or revoked keys, tampering and unknown schemas\nfail. For a completely local check, `ironfang finance verify` does\nthe same with keys you obtain independently.\n\nBounded to 48 MiB compressed and expanded, nine members, two checks\nat a time per API process and 15 seconds. No query, compression or\nIdempotency-Key. Per-address anonymous limits apply.\n","operationId":"verifyEInvoiceReportV2","requestBody":{"content":{"application/zip":{"schema":{"format":"binary","type":"string"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"tampered":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-report-verification-failed.json","summary":"A report whose findings were changed after signing"},"verified":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-report-verification.json","summary":"A verified V2 report of a hybrid ZUGFeRD PDF"}},"schema":{"$ref":"#/components/schemas/ReportVerification"}}},"description":"The integrity check. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"415":{"$ref":"#/components/responses/UnsupportedContentType"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{}],"summary":"Verify a signed report of either version, without an account","tags":["reports"]}},"/v2/einvoices/results":{"get":{"description":"A page of the organisation's retained results, newest first:\nvalidations and generations made through V1 and validations made\nthrough V2, each saying which API made it (`api_version`), the\nschema of its retained document (`result_schema`) and its family.\n`total` counts every matching record, expired and deleted ones\nincluded; names are hidden after expiry or deletion and cannot\nmatch `q`. Pass `next_cursor` as `cursor` for the next page.\n\nV1's own result list shows only V1 results: a V2 result is not a\ndocument its schema describes.\n","operationId":"listEInvoiceResultsV2","parameters":[{"in":"query","name":"cursor","required":false,"schema":{"maxLength":256,"minLength":1,"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"kind","required":false,"schema":{"enum":["validate","generate"],"type":"string"}},{"in":"query","name":"outcome","required":false,"schema":{"enum":["valid","invalid"],"type":"string"}},{"in":"query","name":"family","required":false,"schema":{"$ref":"#/components/schemas/Family"}},{"in":"query","name":"api_version","required":false,"schema":{"$ref":"#/components/schemas/APIVersion"}},{"in":"query","name":"ruleset","required":false,"schema":{"$ref":"#/components/schemas/RulesetID"}},{"description":"Case-insensitive literal substring of the operation id or an available document name.","in":"query","name":"q","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}},{"in":"query","name":"operation_id","required":false,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"examples":{"union":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-result-list.json","summary":"A V2 XRechnung validation beside a V1 Peppol one"}},"schema":{"$ref":"#/components/schemas/RetainedResultList"}}},"description":"The page. Cache-Control is no-store."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"List retained results, V1 and V2 together","tags":["results"],"x-ironfang-scopes":["finance:einvoices:read"]}},"/v2/einvoices/results/{id}":{"delete":{"description":"Erases the retained document and its name, V1 or V2, before its\n30 days are up. Deleting an already erased or expired result\nanswers `204` again. The operation record stays, so a replay under\nits Idempotency-Key answers `410 result_gone` and never runs or\ncharges again.\n","operationId":"deleteEInvoiceResultV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"204":{"description":"Erased."},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"Erase one retained result now","tags":["results"],"x-ironfang-scopes":["finance:einvoices:write"]},"get":{"description":"The exact retained document, byte for byte as it was first\nreturned: a V2 validation's `ironfang/finance/einvoice/validation-result/v2`,\nor, for an operation made through V1, V1's\n`financewolf/einvoice/validation-result/v1` or\n`financewolf/einvoice/generation-result/v1`, which the V1 contract\ndocuments. Branch on `schema`. Reading a result never validates or\ncharges again.\n","operationId":"getEInvoiceResultV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/OpaqueID"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetainedDocument"}}},"description":"The retained document. Cache-Control is no-store."},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"$ref":"#/components/responses/ResultGone"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"platformKey":[]}],"summary":"One retained result, in the schema it was made under","tags":["results"],"x-ironfang-scopes":["finance:einvoices:read"]}},"/v2/einvoices/rulesets":{"get":{"description":"The `scheduled`, `sendable` and `historical` releases of every\nfamily. Exactly one `sendable` release per capability (family,\nvariant, syntax, document type and scope) carries `latest: true`: the\none `ruleset=latest` resolves to now. A release of a family in this\nlist is the only evidence that the family is supported.\n","operationId":"listEInvoiceRulesetsV2","parameters":[{"in":"query","name":"family","required":false,"schema":{"$ref":"#/components/schemas/Family"}},{"in":"query","name":"variant","required":false,"schema":{"$ref":"#/components/schemas/Variant"}},{"in":"query","name":"document_type","required":false,"schema":{"$ref":"#/components/schemas/DocumentType"}},{"in":"query","name":"scope","required":false,"schema":{"$ref":"#/components/schemas/Scope"}},{"in":"query","name":"operation","required":false,"schema":{"$ref":"#/components/schemas/RulesetOperation"}},{"in":"query","name":"state","required":false,"schema":{"$ref":"#/components/schemas/RulesetState"}}],"responses":{"200":{"content":{"application/json":{"examples":{"xrechnung":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-ruleset-list-xrechnung.json","summary":"The XRechnung releases"}},"schema":{"$ref":"#/components/schemas/RulesetList"}}},"description":"The matching releases, newest effective date first."},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{},{"platformKey":[]}],"summary":"List the releases a V2 validation can name","tags":["rulesets"],"x-ironfang-scopes":["finance:einvoices:rulesets:read"]}},"/v2/einvoices/rulesets/{id}":{"get":{"description":"One release by id, in any public state (scheduled, sendable or historical), with its pipeline, layers and pinned engine. A release never changes once published; results name the release that produced them, so this is how to see exactly what checked a document.","operationId":"getEInvoiceRulesetV2","parameters":[{"in":"path","name":"id","required":true,"schema":{"$ref":"#/components/schemas/RulesetID"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ruleset"}}},"description":"The release."},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/InsufficientScope"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"$ref":"#/components/responses/RulesetDisabled"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{},{"platformKey":[]}],"summary":"One immutable release and its pipeline","tags":["rulesets"],"x-ironfang-scopes":["finance:einvoices:rulesets:read"]}},"/v2/einvoices/validate":{"post":{"description":"**Body.** Send the document itself with `Content-Type`\n`application/xml`, `text/xml` or `application/pdf`, choosing with the\nquery parameters. Or send `multipart/form-data` with one `document`\npart (one of those media types) and an optional `options` part\nholding a JSON `ValidationOptions` object; query parameters are not\nread for multipart requests. The media type is a hint: the content\nis inspected, and an XML part holding a PDF (or the reverse) is\n`415 unsupported_content_type`. Archives and compressed bodies are\nrefused the same way.\n\n**Limits.** XML at most 5 MiB (5,242,880 bytes), 64 levels deep,\n250,000 elements. PDF at most 20 MiB, 200 pages and 20 embedded\nfiles; the embedded invoice XML at most 5 MiB; 25 MiB of decoded\nattachment data in total; 256 MiB of compressed (Flate) content\ndecoded across the whole PDF. Over a byte limit is `413`; over any other\nprocessing limit is `422 processing_limit`, which is not a verdict on\nthe invoice. The XML deadline is 10 seconds and the hybrid deadline\n30 seconds; exceeding it is indeterminate (`504`).\n\n**Selection.** `ruleset` is `latest` (default) or an exact ruleset\nid.\n\n- With an exact id, the release supplies family, variant, syntax,\n  document type and scope. Any selector also sent must equal the\n  release's value, or the request is `422 selection_conflict`; the\n  document must fit the release (`422 unsupported_document_type`,\n  `422 family_mismatch`).\n- With `latest`, the family is the one requested or, without\n  `family`, the one the document declares\n  (`selection_method: detected`); an undeclared or unknown family is\n  `422 family_undetected`. A requested family the document\n  contradicts is `422 family_mismatch`, and the Problem's\n  `detected` says what the document declares, so a client can offer\n  the right tool; the document is never validated under the wrong\n  family. The variant is the one the document declares; a variant\n  Ironfang recognises but does not validate is\n  `422 unsupported_variant`, never a fallback to a weaker profile.\n- `scope` defaults to `xml` for XML and `hybrid_pdf` for a PDF.\n  Any other combination is `422 scope_unavailable`. To inspect only\n  the XML inside a PDF, extract it explicitly\n  (`POST /tools/v2/invoice/extract`) and validate that XML.\n\n**PDF inputs.** An encrypted PDF is `422 encrypted_pdf`. A PDF with\nno identifiable embedded invoice XML is `422 no_embedded_invoice`,\nand one with more than one plausible invoice XML is\n`422 ambiguous_embedded_invoice`: no attachment is ever chosen\narbitrarily. These three are uncharged. Everything wrong with an\nidentified embedded invoice - its name, relationship, media type,\nmetadata, PDF/A conformance, or the XML itself - is a finding in a\ncompleted validation.\n\n**Outcome.** `200` is always a verdict: `status: completed`,\n`outcome` `valid` or `invalid`, and every check that ran completed.\nA deterministic defect makes the outcome `invalid`, and checks it\nprevented are `skipped` with a reason. A timeout, an unavailable\nvalidator or an internal failure is a Problem with\n`outcome: indeterminate`; known findings are never presented as a\nverdict.\n\n**Usage.** One completed validation is one operation, whatever the\nscope; the checks inside it are not billed separately. As in V1, a\ncompleted validation is charged once its schema check (`xsd`)\nreached a verdict, passed or failed; a document that is not\nwell-formed XML ends before it and is not charged. Rejected\nrequests and indeterminate outcomes are not charged. An\nauthenticated verdict carries `operation_id` and `usage`, and is\nretained for 30 days as V1 results are; it is served only through\nV2, never through a V1 result, list or report.\n\n**Idempotency.** As V1, with the request identified by the input\nbytes (for a PDF, the PDF's own bytes), the selectors and the scope.\nA replay returns the original operation and its result, even if\n`latest` has since moved.\n\n**Findings.** At most 1,000 inline, ordered by the pipeline's layer\norder, then severity (`fatal`, `warning`, `information`), then\n`rule_id`, then location, then message. `findings_summary` states\nthe totals and whether truncation happened.\n","operationId":"validateEInvoiceV2","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"description":"`latest` (default) or an exact ruleset id. Raw bodies only.","in":"query","name":"ruleset","required":false,"schema":{"$ref":"#/components/schemas/RulesetSelector"}},{"description":"The family to resolve `latest` within. Omit to use the family the document declares. Raw bodies only.","in":"query","name":"family","required":false,"schema":{"$ref":"#/components/schemas/Family"}},{"description":"The variant or profile expected. It must match what the document declares. Raw bodies only.","in":"query","name":"variant","required":false,"schema":{"$ref":"#/components/schemas/Variant"}},{"description":"Expected document type, or `auto` (default). Raw bodies only.","in":"query","name":"document_type","required":false,"schema":{"$ref":"#/components/schemas/DocumentTypeSelector"}},{"description":"Expected scope. Defaults from the body: `xml` for XML, `hybrid_pdf` for a PDF. Raw bodies only.","in":"query","name":"scope","required":false,"schema":{"$ref":"#/components/schemas/Scope"}}],"requestBody":{"content":{"application/pdf":{"schema":{"$ref":"#/components/schemas/PDFDocument"}},"application/xml":{"schema":{"$ref":"#/components/schemas/XMLDocument"}},"multipart/form-data":{"encoding":{"document":{"contentType":"application/xml, text/xml, application/pdf"},"options":{"contentType":"application/json"}},"schema":{"additionalProperties":false,"properties":{"document":{"contentMediaType":"application/octet-stream","description":"The XML or PDF document.","type":"string"},"options":{"$ref":"#/components/schemas/ValidationOptions"}},"required":["document"],"type":"object"}},"text/xml":{"schema":{"$ref":"#/components/schemas/XMLDocument"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"peppol-valid":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-validation-peppol-valid.json","summary":"A Peppol BIS Billing 3 invoice, detected and run on the Peppol validator its release is pinned to"},"xrechnung-cii-invalid":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-validation-xrechnung-cii-invalid.json","summary":"An XRechnung CII invoice without a buyer reference, family requested"},"xrechnung-ubl-valid":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-validation-xrechnung-ubl-valid.json","summary":"A valid XRechnung UBL invoice, family detected; information findings do not fail it"},"zugferd-hybrid-container-failed":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-validation-zugferd-hybrid-container-failed.json","summary":"Invoice XML passed; the PDF container checks failed"},"zugferd-minimum-xml":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-validation-zugferd-minimum-xml-valid.json","summary":"A ZUGFeRD MINIMUM XML passes its reduced profile; no PDF was supplied"}},"schema":{"$ref":"#/components/schemas/ValidationVerdict"}}},"description":"A verdict within the reported scope.","headers":{"X-Ironfang-Request-ID":{"$ref":"#/components/headers/XIronfangRequestID"},"X-Request-ID":{"$ref":"#/components/headers/XRequestIDEcho"}}},"400":{"$ref":"#/components/responses/MalformedRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/ScopeOrEligibility"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"410":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["ruleset_disabled","result_gone","account_closed"]}}}]}}},"description":"A withdrawn ruleset, a replayed result that has expired or was deleted, or a closed billing account."},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"415":{"$ref":"#/components/responses/UnsupportedContentType"},"422":{"content":{"application/problem+json":{"examples":{"family-mismatch":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-problem-family-mismatch.json","summary":"A Peppol invoice sent to the XRechnung validator"},"no-embedded-invoice":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-problem-no-embedded-invoice.json","summary":"An ordinary PDF with no invoice XML inside"}},"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["unknown_ruleset","selection_conflict","family_undetected","family_mismatch","unsupported_variant","unsupported_document_type","scope_unavailable","no_embedded_invoice","ambiguous_embedded_invoice","encrypted_pdf","processing_limit"]}}}]}}},"description":"The selection cannot be made for this document, or the PDF cannot be processed. Uncharged."},"429":{"content":{"application/problem+json":{"examples":{"free-allowance-exhausted":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-problem-free-allowance-exhausted.json","summary":"The month's free validations are used up"}},"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["rate_limited","free_allowance_exhausted","account_budget_exhausted","product_budget_exhausted","exemption_limit_reached"]}}}]}}},"description":"Rate limited, or the billing account can admit no more of this work this month.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"500":{"$ref":"#/components/responses/ValidationInternalError"},"503":{"content":{"application/problem+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"enum":["validator_unavailable","billing_temporarily_unavailable"]}}},{"if":{"properties":{"code":{"const":"validator_unavailable"}}},"then":{"required":["outcome","usage_charged"]}}]}}},"description":"The validator for the selected ruleset is not available (indeterminate and uncharged), or billing is briefly unavailable (nothing was accepted).","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"504":{"content":{"application/problem+json":{"examples":{"timeout":{"externalValue":"https://api.ironfang.com/finance/v2/examples/v2-problem-validation-timeout.json","summary":"A hybrid validation that did not finish"}},"schema":{"allOf":[{"$ref":"#/components/schemas/Problem"},{"properties":{"code":{"const":"validation_timeout"}},"required":["outcome","usage_charged"]}]}}},"description":"Validation did not finish within the deadline. Indeterminate and uncharged."}},"security":[{},{"platformKey":[]}],"summary":"Validate one invoice, as XML or as a PDF with embedded invoice XML","tags":["validation"],"x-ironfang-scopes":["finance:einvoices:write"]}}},"servers":[{"description":"Production. Paths below are relative to this product prefix.","url":"https://api.ironfang.com/finance"}],"tags":[{"description":"Validate one invoice, XML or PDF.","name":"validation"},{"description":"The immutable releases a validation can name.","name":"rulesets"},{"description":"Retained results, V1 and V2 together.","name":"results"},{"description":"Webhook and S3 deliveries of V1 and V2 events together.","name":"deliveries"},{"description":"Durable validation jobs and batches, V1 and V2 together.","name":"jobs"},{"description":"Signed reports of retained results, and their verification.","name":"reports"}]}