Ironfang Rig Suites API

Persistent, versioned test definitions.

Operations 5

GET /v1/suites List suites #
POST /v1/suites Create a suite #
GET /v1/suites/{suiteId} Get a suite #
PUT /v1/suites/{suiteId} Revise a suite #
GET /v1/suites/{suiteId}/versions List a suite's versions #

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-rig-suites-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-rig-suites-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Ironfang Rig Suites API
  version: 0.1.0
  summary: Disposable inboxes, callback URLs, mock endpoints and connector routes for integration tests.
  description: 'Ironfang Rig gives an application under test a disposable external

    world: temporary inbox addresses, public callback URLs, mock HTTP

    endpoints and connector routes, allocated fresh for every run, with an

    append-only, sequenced timeline of everything Ironfang observed.'
  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/rig
security:
- apiKey: []
- bearerAuth: []
tags:
- name: Suites
  description: Persistent, versioned test definitions.
paths:
  /v1/suites:
    get:
      tags:
      - Suites
      operationId: listSuites
      summary: List suites
      description: Returns the organisation's suites, newest first, optionally within one project. Read-only.
      parameters:
      - name: project
        in: query
        required: false
        description: Limit to one project by id.
        schema:
          type: string
          format: uuid
      - $ref: '#/components/parameters/Cursor'
      - $ref: '#/components/parameters/Limit'
      responses:
        '200':
          description: A page of suites
          content:
            application/json:
              schema:
                type: object
                required:
                - suites
                properties:
                  suites:
                    type: array
                    items:
                      $ref: '#/components/schemas/Suite'
                  next_cursor:
                    type: string
        '400':
          $ref: '#/components/responses/InvalidQuery'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
    post:
      tags:
      - Suites
      operationId: createSuite
      summary: Create a suite
      description: Creates a suite and its first version from a definition. The definition is validated in full and stored canonically; its SHA-256 identifies the version. The slug is unique within the project. Needs rig.write.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - project_id
              - slug
              - name
              - definition
              additionalProperties: false
              properties:
                project_id:
                  type: string
                  format: uuid
                slug:
                  type: string
                  pattern: ^[a-z0-9][a-z0-9-]{0,62}$
                  example: signup
                name:
                  type: string
                  maxLength: 120
                  example: Signup flow
                definition:
                  $ref: '#/components/schemas/Definition'
      responses:
        '201':
          description: Suite created with version 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteWithVersion'
        '400':
          $ref: '#/components/responses/InvalidJSON'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/InvalidRequest'
  /v1/suites/{suiteId}:
    parameters:
    - $ref: '#/components/parameters/SuiteId'
    get:
      tags:
      - Suites
      operationId: getSuite
      summary: Get a suite
      description: Returns the suite and its current version.
      responses:
        '200':
          description: The suite and its current version
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteWithVersion'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      tags:
      - Suites
      operationId: reviseSuite
      summary: Revise a suite
      description: Records a new version when the definition changed and answers the current version unchanged when it did not, so sending the same document twice creates one version. Existing runs keep the version they were created from. Needs rig.write.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - definition
              additionalProperties: false
              properties:
                name:
                  type: string
                  maxLength: 120
                  description: A new display name; omit to keep the current one.
                definition:
                  $ref: '#/components/schemas/Definition'
      responses:
        '200':
          description: The suite and the version now current
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/SuiteWithVersion'
                - type: object
                  properties:
                    revised:
                      type: boolean
                      description: Whether anything changed.
        '400':
          $ref: '#/components/responses/InvalidJSON'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/InvalidRequest'
  /v1/suites/{suiteId}/versions:
    parameters:
    - $ref: '#/components/parameters/SuiteId'
    get:
      tags:
      - Suites
      operationId: listSuiteVersions
      summary: List a suite's versions
      description: Returns up to 100 versions, newest first, each with its full definition.
      responses:
        '200':
          description: The versions
          content:
            application/json:
              schema:
                type: object
                required:
                - versions
                properties:
                  versions:
                    type: array
                    items:
                      $ref: '#/components/schemas/SuiteVersion'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    Cursor:
      name: cursor
      in: query
      required: false
      description: The next_cursor of the previous page.
      schema:
        type: string
    Limit:
      name: limit
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 50
    SuiteId:
      name: suiteId
      in: path
      required: true
      schema:
        type: string
        format: uuid
  responses:
    InvalidRequest:
      description: A field is invalid; the message names it (`invalid_request`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The credential lacks the permission or scope, or names another organisation (`forbidden`, `insufficient_scope`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InvalidQuery:
      description: An unknown, repeated or malformed query parameter (`invalid_query`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: No credential, an invalid one, or a delegated token where none is accepted (`unauthorized`, `invalid_api_key`, `delegated_not_allowed`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: No such object in this organisation (`not_found`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InvalidJSON:
      description: The body is not one strict JSON value of the documented shape (`invalid_json`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Conflict:
      description: A name is already taken, or the target is archived (`conflict`, `archived`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    MockResponse:
      type: object
      required:
      - status
      additionalProperties: false
      description: 'One answer. With template, the body and the header values are rendered from the request: {{request.method}}, {{request.path}}, {{request.query}}, {{request.query.name}}, {{request.header.Name}}, {{request.body}}, {{request.json.a.b.0}}, {{run.id}}, {{resource.name}}, {{step}}, {{call}} and {{received_at}}. In a json body a placeholder sits inside a string and is escaped for it. An unknown placeholder is refused when the rules are written.'
      properties:
        status:
          type: integer
          minimum: 100
          maximum: 599
          example: 201
        headers:
          type: object
          additionalProperties:
            type: string
        body:
          type: string
          maxLength: 65536
          description: A text body; exclusive with json.
        json:
          description: A JSON body; sets Content-Type unless a header does.
        delay:
          type: string
          description: Held before answering, a duration such as "250ms", at most 10s.
        template:
          type: boolean
          description: Render the body and header values from the request.
    OpenAPISpec:
      type: object
      description: 'For a mock_http, an OpenAPI 3 document the mock stands in for, instead of rules: one rule per operation, in document order, its path template as the match, its lowest 2xx (or default) response as the answer, and the documented example, or a value built from the schema, as the body. References resolve within the document; nothing is fetched. At most 32 operations; name the ones a suite needs in include. The CLI inlines openapi.file from beside the suite file; the platform takes document only.'
      required:
      - document
      additionalProperties: false
      properties:
        document:
          type: string
          maxLength: 262144
          description: The OpenAPI 3 document, JSON or YAML.
        include:
          type: array
          maxItems: 32
          items:
            type: string
          description: Operations to keep, as "GET /pets/{id}".
        prefer:
          type: string
          enum:
          - example
          - schema
          description: Whether a documented example (the default) or a value built from the schema answers.
    ConnectorSpec:
      type: object
      description: Binds a callback to a local route by label. The label is all the platform ever sends; the destination behind it belongs to the connector on the developer's machine.
      required:
      - route
      additionalProperties: false
      properties:
        route:
          type: string
          pattern: ^[a-z0-9][a-z0-9-]{0,62}$
          example: stripe
    SuiteWithVersion:
      type: object
      required:
      - suite
      - version
      properties:
        suite:
          $ref: '#/components/schemas/Suite'
        version:
          $ref: '#/components/schemas/SuiteVersion'
    MockRule:
      type: object
      description: 'One rule of a mock: what to match and what to answer. Rules are evaluated in order and the first match answers. A rule answers with respond, one answer, or with sequence, its calls taking the responses in turn and repeat saying what later calls get. Deterministic: the same request against the same rules, at the same step, gets the same answer, delay included.'
      required:
      - match
      additionalProperties: false
      properties:
        match:
          type: object
          additionalProperties: false
          properties:
            method:
              type: string
              description: An HTTP method, or "*" or omitted for any.
              example: POST
            path:
              type: string
              description: Exact path under the mock URL, a prefix ending in "/*", or a template whose {name} segments match any one segment; omitted for any.
              example: /v1/ship/{id}
            headers:
              type: object
              additionalProperties:
                type: string
              description: Headers that must be present with exactly these values.
            json:
              type: object
              additionalProperties: true
              description: Top-level fields a JSON request body must equal.
        respond:
          $ref: '#/components/schemas/MockResponse'
        sequence:
          type: array
          minItems: 2
          maxItems: 16
          description: The responses this rule gives its calls in turn; exclusive with respond. Replacing the rules starts every sequence afresh.
          items:
            $ref: '#/components/schemas/MockResponse'
        repeat:
          type: string
          enum:
          - last
          - cycle
          description: 'After a sequence''s last response: keep giving the last (the default) or start again.'
    SuiteVersion:
      type: object
      required:
      - id
      - organisation_id
      - suite_id
      - version
      - definition
      - definition_sha256
      - created_at
      properties:
        id:
          type: string
          format: uuid
        organisation_id:
          type: string
          format: uuid
        suite_id:
          type: string
          format: uuid
        version:
          type: integer
        definition:
          $ref: '#/components/schemas/Definition'
        definition_sha256:
          type: string
          description: SHA-256 of the canonical definition.
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
    Suite:
      type: object
      required:
      - id
      - organisation_id
      - project_id
      - slug
      - name
      - current_version
      - created_at
      properties:
        id:
          type: string
          format: uuid
        organisation_id:
          type: string
          format: uuid
        project_id:
          type: string
          format: uuid
        slug:
          type: string
        name:
          type: string
        current_version:
          type: integer
        created_at:
          type: string
          format: date-time
        archived_at:
          type: string
          format: date-time
    Definition:
      type: object
      description: A suite's content. Resources are named identities a run receives; expectations are deterministic conditions on the run's events, stored and validated now and evaluated once the platform observes the events they name.
      required:
      - version
      - resources
      additionalProperties: false
      properties:
        version:
          type: integer
          const: 1
        defaults:
          type: object
          additionalProperties: false
          properties:
            run_ttl:
              type: string
              description: Default run lifetime, 1m to 24h ("30m").
              example: 30m
        resources:
          type: object
          minProperties: 1
          maxProperties: 32
          additionalProperties:
            $ref: '#/components/schemas/ResourceSpec'
          example:
            customer_email:
              type: email
            stripe_callback:
              type: callback
              connector:
                route: stripe
            shipping_api:
              type: mock_http
        expectations:
          type: array
          maxItems: 64
          items:
            $ref: '#/components/schemas/ExpectationSpec'
    ResourceSpec:
      type: object
      required:
      - type
      additionalProperties: false
      properties:
        type:
          type: string
          enum:
          - email
          - callback
          - mock_http
          - connector_route
        scope:
          type: string
          enum:
          - run
          default: run
        route:
          type: string
          description: The route label of a connector_route.
        connector:
          $ref: '#/components/schemas/ConnectorSpec'
        rules:
          type: array
          maxItems: 32
          description: For a mock_http, the rules it answers with, in order.
          items:
            $ref: '#/components/schemas/MockRule'
        openapi:
          $ref: '#/components/schemas/OpenAPISpec'
    ExpectationSpec:
      type: object
      required:
      - id
      - resource
      - event
      additionalProperties: false
      properties:
        id:
          type: string
          pattern: ^[a-z][a-z0-9_]{0,63}$
          example: verification_email
        resource:
          type: string
          description: A declared resource name.
        event:
          type: string
          description: An event type from the catalogue, such as email.received or callback.forwarded.
        match:
          type: object
          maxProperties: 16
          additionalProperties: true
          example:
            subject_contains: Verify
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: object
          required:
          - code
          - message
          properties:
            code:
              type: string
            message:
              type: string
            docs:
              type: string
              format: uri
              description: Where the API and its error codes are documented.
        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 - `rig:read`, `rig:write`, `rig:run`,

        `rig:connector`, or `rig:*` - and it acts only in the organisation

        it was minted for. Keys without Rig scopes 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 (`X-Ironfang-Tenant`), resolved live from Warden:

        reads need `rig.read`; creating and revising projects and suites

        `rig.write`; starting, finishing and cancelling runs and allocating

        resources `rig.run`. A missing permission is 403; a permission

        lookup failure is 503.

        '
externalDocs:
  description: Ironfang Rig documentation
  url: https://ironfang.com/rig/docs