InfraNest Automations API

The Automations API from InfraNest — 8 operation(s) for automations.

Operations 8

GET /api/organizations/{organization_id}/automations List automations #
GET /api/organizations/{organization_id}/automations/{automationRule_id} Get an automation #
GET /api/organizations/{organization_id}/automations/{automationRule_id}/runs List an automation’s runs #
GET /api/organizations/{organization_id}/automation-connections List automation connections #
GET /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/incident-reports Get a docs tool’s postmortem settings #
GET /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/incident-reports/targets List where postmortems can go #
GET /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/remembered-settings List switches remembered for this account #
GET /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/other-product Get the other product this connection’s site offers #

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/infranest:infranest-automations-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

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

infranest-automations-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: InfraNest Automations API
  description: Domains, DNS, cloud servers, certificates and uptime monitoring in one API, across the registrars, DNS hosts and clouds you already use, such as Cloudflare, Route 53, Hetzner and GoDaddy. Start in a free sandbox with sample data, use scoped tokens, try DNS changes as a dry run first, and retry safely with idempotency keys.
  version: 1.0.0
  x-logo:
    url: https://developers.infranest.io/logo.svg
    altText: InfraNest
  contact:
    name: InfraNest
    url: https://developers.infranest.io
  termsOfService: https://infranest.io/terms
servers:
- url: https://api.infranest.io
security:
- default: []
tags:
- name: Automations
  description: ''
paths:
  /api/organizations/{organization_id}/automations:
    get:
      summary: List automations
      operationId: getApiOrganizationsOrganization_idAutomations
      description: 'Every automation, newest first, with its tags and run statistics: runs in the last 30 and 7 days, success rate, average duration and the last run’s status. Test runs are not counted. `mode` is `act`, or `observe` for one that only records what it would have done, and `observed_30d` counts those records.'
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
              - id: 14
                organization_id: 1
                name: Maintenance opened → reboot web-01 at its quietest hour
                trigger_event: maintenance.started
                conditions: []
                actions:
                - action: wait
                  config:
                    quiet: quietest
                    quiet_server_id: 1
                - action: server_reboot
                  config:
                    server: 1
                enabled: true
                cooldown_seconds: 0
                consecutive_failures: 0
                disabled_reason: null
                last_triggered_at: null
                created_by: 1
                created_at: '2026-01-15T12:00:00.000000Z'
                updated_at: '2026-01-15T12:00:00.000000Z'
                condition_match: all
                run_as: owner
                trigger_kind: event
                schedule: null
                trigger_events: null
                deleted_at: null
                purge_after: null
                purge_reminder_sent_at: null
                deleted_by_id: null
                deleted_by_label: null
                deletion_reason: null
                disabled_detail: null
                template_key: null
                mode: act
                managed_by_connection_id: null
                tags: []
                automatic_fix: false
                acting_blocked_by_plan: false
                runs_30d: 0
                observed_30d: 0
                runs_7d: 0
                success_rate: null
                avg_duration_ms: null
                last_status: null
                last_run_at: null
                spark:
                - total: 0
                  failed: 0
                - total: 0
                  failed: 0
              - id: 7
                organization_id: 1
                name: Incidents to Jira (northwind.atlassian.net)
                trigger_event: incident.opened
                conditions: []
                actions:
                - action: jira_create_issue
                  config:
                    if_open: comment
                    project: OPS
                    summary: '{{title}}'
                    issue_type: '10001'
                    description: Opened by InfraNest for {{check_name}}. The incident is linked from this issue.
                    connection_id: 4
                enabled: true
                cooldown_seconds: 0
                consecutive_failures: 0
                disabled_reason: null
                last_triggered_at: null
                created_by: 1
                created_at: '2026-01-15T12:00:00.000000Z'
                updated_at: '2026-01-15T12:00:00.000000Z'
                condition_match: all
                run_as: owner
                trigger_kind: event
                schedule: null
                trigger_events:
                - incident.opened
                deleted_at: null
                purge_after: null
                purge_reminder_sent_at: null
                deleted_by_id: null
                deleted_by_label: null
                deletion_reason: null
                disabled_detail: null
                template_key: null
                mode: act
                managed_by_connection_id: 4
                tags: []
                automatic_fix: false
                acting_blocked_by_plan: false
                runs_30d: 0
                observed_30d: 0
                runs_7d: 0
                success_rate: null
                avg_duration_ms: null
                last_status: null
                last_run_at: null
                spark:
                - total: 0
                  failed: 0
                - total: 0
                  failed: 0
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/automations/{automationRule_id}:
    get:
      summary: Get an automation
      operationId: getApiOrganizationsOrganization_idAutomationsAutomationRule_id
      description: One automation with its trigger, conditions, actions and tags, plus its 20 most recent runs and their steps.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      - in: path
        name: automationRule_id
        required: true
        description: The automationRule's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                id: 1
                organization_id: 1
                name: Release published → announce on status page
                trigger_event: github.release
                conditions:
                - op: eq
                  field: action
                  value: published
                - op: eq
                  field: prerelease
                  value: 'false'
                actions:
                - action: create_status_announcement
                  config:
                    body: '{{name}}.'
                    title: 'Released: {{tag}}'
                    status_page_id: 1
                enabled: true
                cooldown_seconds: 0
                consecutive_failures: 0
                disabled_reason: null
                last_triggered_at: null
                created_by: 1
                created_at: '2026-01-15T12:00:00.000000Z'
                updated_at: '2026-01-15T12:00:00.000000Z'
                condition_match: all
                run_as: owner
                trigger_kind: event
                schedule: null
                trigger_events: null
                deleted_at: null
                purge_after: null
                purge_reminder_sent_at: null
                deleted_by_id: null
                deleted_by_label: null
                deletion_reason: null
                disabled_detail: null
                template_key: null
                mode: act
                managed_by_connection_id: null
                tags: []
                runs: []
                automatic_fix: false
                acting_blocked_by_plan: false
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/automations/{automationRule_id}/runs:
    get:
      summary: List an automation’s runs
      operationId: runHistorymostRecentFirstEachWithItsPerStepResults
      description: The automation’s run history with each run’s steps, newest first, 25 per page. Filter with `status` and the dates `from` and `to`, and with `observed=1` for only the runs that recorded what the automation would have done. Unless you may edit automations, what triggered each run is left out and `details_hidden` is true.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      - in: path
        name: automationRule_id
        required: true
        description: The automationRule's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                details_hidden: false
                current_page: 1
                data: []
                first_page_url: http://localhost/api/organizations/1/automations/1/runs?page=1
                from: null
                last_page: 1
                last_page_url: http://localhost/api/organizations/1/automations/1/runs?page=1
                links:
                - url: null
                  label: '« Previous'
                  page: null
                  active: false
                - url: http://localhost/api/organizations/1/automations/1/runs?page=1
                  label: '1'
                  page: 1
                  active: true
                next_page_url: null
                path: http://localhost/api/organizations/1/automations/1/runs
                per_page: 25
                prev_page_url: null
                to: null
                total: 0
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/automation-connections:
    get:
      summary: List automation connections
      operationId: theOrgsConnectionsnoSecrets
      description: The accounts automations can act through, such as GitHub, Jira or PagerDuty, with each one’s status, whether it is paused and whether its triggers can fire. `actions` lists what you can do with each one, in order — `test`, `reconnect` or `replace_key`, `rename`, `pause`, `disconnect` — and `needs_reconnect` is true when the provider no longer accepts its access, so reconnecting or replacing the key brings it back without changing its id.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
              - id: 1
                provider: pagerduty
                kind: oauth
                label: Northwind on-call
                meta:
                  service_name: Platform — production
                  account: northwind
                  auth: oauth
                  region: us
                  authorized_by:
                    name: Alex Rivera
                    email: demo@example.com
                  webhook_subscription_id: PD3WHS1
                status: active
                paused: false
                plan_paused: false
                triggers_on: false
                actions:
                - rename
                - pause
                needs_reconnect: false
                created_at: '2026-01-15T12:00:00+00:00'
              - id: 2
                provider: github
                kind: github_app
                label: northwyndr
                meta:
                  installation_id: '20000001'
                  account: northwyndr
                status: active
                paused: false
                plan_paused: false
                triggers_on: true
                actions:
                - rename
                - disconnect
                needs_reconnect: false
                created_at: '2026-01-15T12:00:00+00:00'
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/incident-reports:
    get:
      summary: Get a docs tool’s postmortem settings
      operationId: theSectionsSettingsThePlacesAReportCanGoAndTheLastTestPage
      description: 'For a Notion connection: whether it writes a postmortem when an incident resolves, the database it goes into (`target`) and which incidents count (`scope`: `all`, `critical` or `monitors`), the databases to choose from, and the last test page.'
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      - in: path
        name: automationConnection_id
        required: true
        description: The automationConnection's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                enabled: true
                rule_id: 8
                target: 1f2e3d4c-5b6a-4798-8a1b-2c3d4e5f6a01
                scope: all
                monitor_ids: []
                target_noun: database
                targets:
                - id: 1f2e3d4c-5b6a-4798-8a1b-2c3d4e5f6a01
                  name: Postmortems
                - id: 1f2e3d4c-5b6a-4798-8a1b-2c3d4e5f6a02
                  name: Incident log
                targets_error: null
                test:
                  status: written
                  page:
                    id: 2b3c4d5e-6f70-4812-9a3b-4c5d6e7f8091
                    url: https://www.notion.so/northwind/Test-postmortem-2b3c4d5e6f7048129a3b4c5d6e7f8091
                  sample: false
                  error: null
                  at: '2025-12-25T12:06:00+00:00'
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/incident-reports/targets:
    get:
      summary: List where postmortems can go
      operationId: thePlacesAReportCanGoForTheWriteAPostmortemStepsPickerdatavalueLabelLikeEveryBuilderLookupWithTheReasonWhenTheToolWouldNotAnswerAlsoThePublishTheIncidentReviewSteps5839AConnectionThatPublishesReviewsWithoutWritingPostmortemsConfluenceThroughJirasALinearProjectListsThePlacesAReviewCanGoAndSayspermissionWhileTheExtraGrantItNeedsIsMissing
      description: The databases this connection can write a postmortem into, as `{value, label}` rows — only those shared with the connection. When the tool would not answer, `data` is empty and `error` says why.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      - in: path
        name: automationConnection_id
        required: true
        description: The automationConnection's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                data:
                - value: 1f2e3d4c-5b6a-4798-8a1b-2c3d4e5f6a01
                  label: Postmortems
                - value: 1f2e3d4c-5b6a-4798-8a1b-2c3d4e5f6a02
                  label: Incident log
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/remembered-settings:
    get:
      summary: List switches remembered for this account
      operationId: gETAutomationConnectionsconnectionrememberedSettingsTheSwitchesThisAccountHadWhenItWasLastDisconnected5825StillWithinTheir30DaysThatThisConnectionDoesNotAlreadyHaveOnReadOnTheJustConnectedScreenToOfferThemBack
      description: When this connection reaches an account that was disconnected in the last 30 days (the same Linear or Notion workspace, the same Jira site), the switches that account had on — `incident_tickets` (Issues for Incidents) or `incident_reports` (Postmortems) — with their `target`, its name as this connection sees it (`target_name`, null when the tool would not say), `scope` and when the offer lapses (`expires_at`). Switches this connection already has on are left out, and another account gets an empty list.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      - in: path
        name: automationConnection_id
        required: true
        description: The automationConnection's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                offers: []
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/automation-connections/{automationConnection_id}/other-product:
    get:
      summary: Get the other product this connection’s site offers
      operationId: gETAutomationConnectionsconnectionotherProductfromtileTheSitesOtherProductOfferedOnceOnTheJustConnectedScreen5846AllowConfluenceAfterAJiraConnectTurnOnIssuesForIncidentsAfterAConfluenceOneOrSayConfluenceIsReadyfromIsTheTileThePersonConnectedFromOurRowsOnly
      description: 'For a connection whose account reaches more than one product (an Atlassian site with Jira and Confluence), what to offer next, seen from the tile it was connected from (`from`: `jira` or `confluence`). `offer.kind` is `grant` (allow the other product with one more sign-in on the same connection, named in `grant`), `turn_on` (turn on the switch named in `switch`, `incident_tickets`) or `ready` (the connection already reaches it), with the product, the `site`, and the current default place (`default_target`, `default_target_name`). `offer` is null when the site does not have the other product, or the offer was dismissed for this connection. Read from what InfraNest recorded; nothing is asked of the tool.'
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      - in: path
        name: automationConnection_id
        required: true
        description: The automationConnection's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                offer: null
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Automations
      x-infranest-scope: monitoring.read
      x-infranest-token-writable: false
      x-infranest-module: automations
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
components:
  responses:
    Error401:
      description: The token is missing, wrong, expired or revoked. The body is an Error; its `code` says which.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error404:
      description: Nothing exists at this address, or you cannot see it. The body is an Error; its `code` says which.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error429:
      description: 'Too many requests: wait the seconds in Retry-After. The body is an Error; its `code` says which.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error403:
      description: The token or your role may not do this here. The body is an Error; its `code` says which.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      required:
      - code
      - message
      - hint
      - retryable
      properties:
        code:
          type: string
          enum:
          - unauthenticated
          - scope_missing
          - session_only
          - not_token_writable
          - write_disabled
          - wrong_organization
          - token_ip_not_allowed
          - test_token_required
          - test_token_sandbox_only
          - api_token_required
          - sandbox_personal
          - sandbox_needs_organization
          - organization_offline
          - permission_denied
          - forbidden
          - organization_suspended
          - read_only_session
          - sso_required
          - two_factor_setup_required
          - password_reset_required
          - email_verification_required
          - plan_limit
          - not_found
          - method_not_allowed
          - conflict
          - validation_failed
          - unprocessable
          - range_too_large
          - rate_limited
          - idempotency_key_reused
          - idempotency_in_progress
          - provider_refused
          - provider_rate_limited
          - provider_unavailable
          - maintenance
          - server_error
          description: 'What kind of error this is. Stable: codes are added, never renamed or removed.'
        message:
          type: string
          description: A sentence for people. May be reworded.
        hint:
          type: string
          description: What to do about it.
        retryable:
          type: boolean
          description: Whether the same request can succeed later unchanged.
        docs_url:
          type: string
          format: uri
        reference:
          type: string
          description: The request ID; also the X-Request-Id header.
        retry_after:
          type: integer
          description: Seconds to wait before retrying.
        required:
          type: string
          description: The missing token scope (scope_missing).
        required_permission:
          type: string
          description: The missing role permission (permission_denied).
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: Create a token in the app under My account → Developer. Tokens are managed in the app only, never through the API.
externalDocs:
  description: 'InfraNest: domains, DNS, cloud servers, certificates and uptime monitoring in one place'
  url: https://infranest.io