openapi: 3.2.0 info: title: Ironfang Audit Export Destinations API version: 1.0.0 summary: Website audits with findings and signed, independently timestamped evidence. description: Asynchronous website audits with signed, independently timestamped evidence. contact: name: Ironfang email: hello@ironfang.uk url: https://ironfang.com/contact termsOfService: https://ironfang.com/legal/terms license: name: Proprietary - use governed by the Ironfang terms of service url: https://ironfang.com/legal/terms servers: - url: https://api.ironfang.com/audit description: Production security: - bearerAuth: [] - apiKey: [] tags: - name: ExportDestinations description: Where exports are delivered. paths: /v1/export-destinations: get: operationId: listExportDestinations description: Returns S3 destination configurations for the authenticated organisation without exposing stored access credentials. tags: - ExportDestinations summary: List S3 destinations responses: '200': description: Destinations; credentials are never returned '401': $ref: '#/components/responses/Problem' description: No credential, or one that is not accepted '403': $ref: '#/components/responses/Problem' description: The key's scopes or the person's role do not allow audit.integrations, or the request names another organisation post: operationId: createExportDestinations description: Stores an S3 or S3-compatible destination for the authenticated organisation. Access credentials are encrypted before storage and are not returned by destination listings. tags: - ExportDestinations summary: Create an encrypted S3/S3-compatible destination requestBody: required: true content: application/json: schema: type: object required: - region - bucket - access_key - secret_key properties: endpoint: type: string format: uri region: type: string bucket: type: string prefix: type: string default: audit access_key: type: string secret_key: type: string writeOnly: true session_token: type: string writeOnly: true path_style: type: boolean default: false export_mode: type: string enum: - after_every_audit - only_if_compliance_changes - only_if_audit_fails - manual_only responses: '201': description: Destination created '400': $ref: '#/components/responses/Problem' description: 'invalid_json: the body is not one JSON value of the documented shape' '401': $ref: '#/components/responses/Problem' description: No credential, or one that is not accepted '403': $ref: '#/components/responses/Problem' description: The key's scopes or the person's role do not allow audit.integrations, or the request names another organisation '422': $ref: '#/components/responses/Problem' description: invalid_destination, invalid_endpoint, invalid_prefix, object_lock_not_configured or invalid_export_mode /v1/export-destinations/{destinationId}/test: post: operationId: testExportDestinationsByDestinationId description: Uses the destination's stored credentials to upload and verify a connection-test object. A failed upload or verification returns destination_test_failed. tags: - ExportDestinations summary: Upload and verify a connection-test object parameters: - $ref: '#/components/parameters/DestinationId' responses: '200': description: Upload verified '422': $ref: '#/components/responses/Problem' components: parameters: DestinationId: name: destinationId in: path required: true schema: type: string format: uuid responses: Problem: description: Problem response content: application/json: schema: type: object properties: error: type: object required: - code - message properties: code: type: string description: Stable machine-readable code. Billing refusals use the codes every Ironfang product shares (BillingCode), with the same status and message whichever product answered; everything else is Ironfang Audit's own. message: type: string docs: type: string format: uri description: Where the errors are documented. example: https://ironfang.com/audit/docs#errors product: type: string description: 'Billing refusals only: the product the refused work belongs to (audit).' meter: type: string description: 'Billing refusals only: the meter that refused, audit.capture or audit.retention_extension.' reset_at: type: string format: date-time description: 'Billing refusals only: when the free allowance renews (the next month''s start, UTC).' request_id: type: string description: The X-Ironfang-Request-ID of the failed request. securitySchemes: apiKey: type: http scheme: bearer bearerFormat: if_live_ platform API key description: 'A platform API key minted in the portal (Warden). Its scopes are its permissions - `audit:read`, `audit:run`, `audit:manage`, `audit:evidence`, `audit:integrations`, or `audit:*` - and it acts only in the organisation it was minted for. Legacy Ironfang Render keys carry no Ironfang Audit scopes and are refused with 403. ' bearerAuth: type: http scheme: bearer bearerFormat: Warden JWT description: 'A Warden user token. Each route also requires a tenant permission in the acting tenant, resolved live from Warden: read routes need `audit.read`; creating sites and rules `audit.manage`; queueing an audit `audit.run`; evidence bundles and raw artifacts `audit.evidence`; webhooks, export destinations and manual exports `audit.integrations`; billing changes `billing.manage`. A missing permission is 403; a permission lookup failure is 503. ' externalDocs: description: Ironfang Audit documentation url: https://ironfang.com/audit/docs