Ironfang Audit Retention API

Quoted, fixed-price extensions of hosted evidence retention.

Operations 2

POST /v1/retention/quotes Price an extension of hosted evidence retention #
POST /v1/retention/purchases Buy a retention quote #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/ironfang:ironfang-audit-retention-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

ironfang-audit-retention-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Ironfang Audit Retention 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: Retention
  description: Quoted, fixed-price extensions of hosted evidence retention.
paths:
  /v1/retention/quotes:
    post:
      operationId: createRetentionQuote
      tags:
      - Retention
      summary: Price an extension of hosted evidence retention
      description: 'Prices keeping the hosted evidence of the chosen audits (every hosted

        artifact of each) and artifacts for `months` whole months past each one''s

        current deadline. New audits are promised the standard retention (30 days

        in the draft catalogue); an extension is how evidence stays hosted longer.

        The quantity is in the `audit.retention_extension` meter''s unit: the

        selection''s bytes rounded up to that unit''s share of a decimal gigabyte,

        times the months, never below ten GB-months. `amount` is the fixed price of

        that quantity at the organisation''s position this month, exact and before

        tax, charged on the month''s invoice through the billing account. A quote

        can be bought until `expires_at` (about fifteen minutes), in the month and

        at the catalogue version it was made in; it moves nothing and charges

        nothing by itself, and nothing ever renews. Expired (deleted) evidence

        cannot be extended. An extension that would take the storage held under

        extended retention past the deployment''s capacity is refused, paid or not.

        Needs audit.read: a quote is a price, not a purchase.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - months
              properties:
                audit_ids:
                  type: array
                  maxItems: 200
                  items:
                    type: string
                    format: uuid
                artifact_ids:
                  type: array
                  maxItems: 5000
                  items:
                    type: string
                    format: uuid
                months:
                  type: integer
                  minimum: 1
                  maximum: 120
                  description: Whole months of extra retention past each current deadline.
      responses:
        '201':
          description: The quote, with each artifact's deadline before and after.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetentionQuote'
        '400':
          $ref: '#/components/responses/Problem'
          description: invalid_json or invalid_id
        '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.read
        '404':
          $ref: '#/components/responses/Problem'
          description: 'not_found: an audit or artifact that is not this organisation''s'
        '409':
          $ref: '#/components/responses/Problem'
          description: 'retention_capacity_reached: the deployment cannot hold more evidence under extended retention'
        '413':
          $ref: '#/components/responses/Problem'
          description: 'Billing refusal: operation_too_large'
        '422':
          $ref: '#/components/responses/Problem'
          description: selection_required, selection_too_large, invalid_months, or nothing_to_extend when none of the selection is still hosted
        '503':
          $ref: '#/components/responses/Problem'
          description: 'billing_disabled: unified billing is not running here'
  /v1/retention/purchases:
    post:
      operationId: purchaseRetentionQuote
      tags:
      - Retention
      summary: Buy a retention quote
      description: 'Buys a quote exactly as quoted, in one step: the quoted quantity of

        `audit.retention_extension` is admitted by the billing account, every

        quoted deadline moves to its quoted date, and the usage is committed -

        all of it or none. Needs billing.manage from a signed-in person with a

        verified email address: API keys and connected apps are refused

        (`insufficient_scope`, `person_required`), as for every billing change.

        A refusal from the billing account (paid usage not enabled, a budget

        reached) is the shared billing answer. A quote past its `expires_at`,

        made in another month or at another catalogue version, that the

        account''s position would now price differently, or whose evidence has

        changed since (deleted, or its deadline moved) is `quote_expired`: ask

        for a new quote. Buying a quote that is already bought returns it with

        200 and charges nothing more.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - quote_id
              properties:
                quote_id:
                  type: string
                  format: uuid
      responses:
        '201':
          description: Bought; the quote with its new deadlines.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetentionQuote'
        '200':
          description: Already bought; the quote as it was bought.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetentionQuote'
        '400':
          $ref: '#/components/responses/Problem'
          description: invalid_json
        '401':
          $ref: '#/components/responses/Problem'
          description: No credential, or one that is not accepted
        '402':
          $ref: '#/components/responses/Problem'
          description: 'Billing refusal: paid_usage_paused, payment_required, payment_action_required or account_restricted'
        '403':
          $ref: '#/components/responses/Problem'
          description: forbidden or insufficient_scope (billing.manage), person_required, email_unverified, or the billing refusal product_not_eligible
        '404':
          $ref: '#/components/responses/Problem'
          description: 'not_found: no such quote in this organisation'
        '409':
          $ref: '#/components/responses/Problem'
          description: quote_expired, or retention_capacity_reached
        '422':
          $ref: '#/components/responses/Problem'
          description: quote_required
        '429':
          $ref: '#/components/responses/Problem'
          description: 'Billing refusal: free_allowance_exhausted (the extension has no free allowance: paid usage must be enabled), account_budget_exhausted or product_budget_exhausted'
        '503':
          $ref: '#/components/responses/Problem'
          description: billing_disabled, or the billing refusal billing_temporarily_unavailable
components:
  schemas:
    RetentionQuote:
      type: object
      required:
      - id
      - status
      - meter
      - months
      - bytes
      - quantity
      - unit
      - amount
      - amount_minor
      - currency
      - prices_exclude_tax
      - catalogue_version
      - created_at
      - expires_at
      - audit_ids
      - artifacts
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          enum:
          - open
          - expired
          - purchased
        meter:
          type: string
          const: audit.retention_extension
        months:
          type: integer
          minimum: 1
          maximum: 120
        bytes:
          type: integer
          minimum: 1
          description: Hosted bytes the quote covers.
        quantity:
          type: integer
          minimum: 1
          description: 'In the meter''s unit (unit): the bytes rounded up to the unit''s share of a decimal gigabyte, times months, at least ten GB-months.'
        unit:
          type: string
          description: The meter's unit, for example 0.1 GB-month.
        amount:
          type: string
          description: The fixed price, exact, before tax, in pounds.
        amount_minor:
          type: integer
          description: The price rounded to pence.
        currency:
          type: string
          const: GBP
        prices_exclude_tax:
          type: boolean
          const: true
        catalogue_version:
          type: string
        created_at:
          type: string
          format: date-time
        expires_at:
          type: string
          format: date-time
          description: The quote can be bought until then.
        purchased_at:
          type: string
          format: date-time
        audit_ids:
          type: array
          items:
            type: string
            format: uuid
        artifacts:
          type: integer
          minimum: 0
        deadlines:
          type: array
          items:
            type: object
            required:
            - artifact_id
            - audit_id
            - byte_length
            - expires_before
            - expires_after
            properties:
              artifact_id:
                type: string
                format: uuid
              audit_id:
                type: string
                format: uuid
              byte_length:
                type: integer
                minimum: 0
              expires_before:
                type: string
                format: date-time
              expires_after:
                type: string
                format: date-time
  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