InfraNest Webhooks API
Outbound webhook endpoints (#30) — org members subscribe an external URL to InfraNest events and receive signed POSTs. The signing secret is returned only on create / rotate.
Outbound webhook endpoints (#30) — org members subscribe an external URL to InfraNest events and receive signed POSTs. The signing secret is returned only on create / rotate.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/infranest:infranest-webhooks-api"
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.
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: 3.2.0
info:
title: InfraNest Webhooks 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: Webhooks
description: 'Outbound webhook endpoints (#30) — org members subscribe an external URL to InfraNest events and
receive signed POSTs. The signing secret is returned only on create / rotate.'
paths:
/api/organizations/{organization_id}/webhook-endpoints/schema:
get:
summary: Get the outbound webhook JSON Schema
operationId: theJSONSchemaOfTheEnvelopeWePOSTForTheChosenEvents2240PastedIntoAPowerAutomateTriggerOrParseJSONStepSoThePayloadsFieldsArriveTypedEveryEventWhenNoneAreNamed
description: The JSON Schema of the payload InfraNest sends to your webhook endpoints, for tools that type a payload from a schema. Narrow it with `events[]`; with none, it covers every event. `events` lists every event you can name.
parameters:
- in: path
name: organization_id
required: true
description: Your organization's ID.
schema:
type: integer
responses:
'200':
description: OK
content:
application/json:
example:
schema:
type: object
properties:
event:
title: Event
type: string
created_at:
title: Created at
type: string
format: date-time
data:
type: object
properties:
acknowledged_by:
title: Acknowledged by
anyOf:
- type: string
action:
title: Action
anyOf:
- type: string
actor:
title: Actor
anyOf:
- type: string
agent:
title: Agent
anyOf:
- type: string
asn_org:
title: ASN org
anyOf:
- type: string
assignee:
title: Assignee
anyOf:
- type: string
assignees:
title: Assignees
anyOf:
- type: array
items:
type: string
auction:
title: Auction
anyOf:
- type: object
author:
title: Author
anyOf:
- type: string
base_branch:
title: Base branch
anyOf:
- type: string
booted_at:
title: Booted at
anyOf:
- type: string
format: date-time
branch:
title: Branch
anyOf:
- type: string
change:
title: Change
anyOf:
- type: string
changed_fields:
title: Changed fields
anyOf:
- type: array
items:
type: string
check_name:
title: Check name
anyOf:
- type: string
check_status:
title: Check status
anyOf:
- type: string
comment:
title: Comment
anyOf:
- type: string
commits:
title: Commits
anyOf:
- type: integer
component:
title: Component
anyOf:
- type: string
conclusion:
title: Conclusion
anyOf:
- type: string
context:
title: Context
anyOf:
- type: string
country_code:
title: Country code
anyOf:
- type: string
created:
title: Created
anyOf:
- type: boolean
creator:
title: Creator
anyOf:
- type: string
current_ipv4:
title: Current IPv4
anyOf:
- type: string
current_ipv6:
title: Current IPv6
anyOf:
- type: string
custom_fields:
title: Custom fields
anyOf:
- type: object
days_left:
title: Days left
anyOf:
- type: integer
deleted:
title: Deleted
anyOf:
- type: boolean
deleted_in:
title: Deleted in
anyOf:
- type: string
deployment_id:
title: Deployment ID
anyOf:
- type: integer
description:
title: Description
anyOf:
- type: string
domain:
title: Domain
anyOf:
- type: string
down_everywhere:
title: Down everywhere
anyOf:
- type: boolean
draft:
title: Draft
anyOf:
- type: boolean
drop_eta:
title: Drop ETA
anyOf:
- type: string
format: date-time
duration_minutes:
title: Duration minutes
anyOf:
- type: integer
email:
title: Email
anyOf:
- type: string
endpoint:
title: Endpoint
anyOf:
- type: string
environment:
title: Environment
anyOf:
- type: string
environment_url:
title: Environment URL
anyOf:
- type: string
escalation_policy:
title: Escalation policy
anyOf:
- type: string
expires_at:
title: Expires at
anyOf:
- type: string
format: date-time
expiry_may_be_stale:
title: Expiry may be stale
anyOf:
- type: boolean
forced:
title: Forced
anyOf:
- type: boolean
full_at:
title: Full at
anyOf:
- type: string
has_monitor:
title: Has monitor
anyOf:
- type: boolean
head_branch:
title: Head branch
anyOf:
- type: string
head_sha:
title: Head SHA
anyOf:
- type: string
host:
title: Host
anyOf:
- type: string
identifier:
title: Identifier
anyOf:
- type: string
impact:
title: Impact
anyOf:
- type: string
incident_status:
title: Incident status
anyOf:
- type: string
incident_title:
title: Incident title
anyOf:
- type: string
incident_type:
title: Incident type
anyOf:
- type: string
incident_url:
title: Incident URL
anyOf:
- type: string
ip:
title: IP
anyOf:
- type: string
ip_version:
title: IP version
anyOf:
- type: string
is_hosting:
title: Is hosting
anyOf:
- type: boolean
is_pull_request:
title: Is pull request
anyOf:
- type: boolean
issue_type:
title: Issue type
anyOf:
- type: string
issuer:
title: Issuer
anyOf:
- type: string
issues:
title: Issues
anyOf:
- type: array
items:
type: string
label:
title: Label
anyOf:
- type: string
labels:
title: Labels
anyOf:
- type: array
items:
type: string
last_seen_at:
title: Last seen at
anyOf:
- type: string
format: date-time
listed_since:
title: Listed since
anyOf:
- type: string
format: date-time
lists:
title: Lists
anyOf:
- type: array
items:
type: string
load_balancers:
title: Load balancers
anyOf:
- type: array
items:
type: string
local_time:
title: Local time
anyOf:
- type: string
log_url:
title: Log URL
anyOf:
- type: string
merged:
title: Merged
anyOf:
- type: boolean
message:
title: Message
anyOf:
- type: string
monitor_type:
title: Monitor type
anyOf:
- type: string
monitors:
title: Monitors
anyOf:
- type: array
items:
type: string
mount_point:
title: Mount point
anyOf:
- type: string
name:
title: Name
anyOf:
- type: string
new_nameservers:
title: New nameservers
anyOf:
- type: array
items:
type: string
note:
title: Note
anyOf:
- type: string
note_trimmed:
title: Note trimmed
anyOf:
- type: boolean
number:
title: Number
anyOf:
- type: integer
old_nameservers:
title: Old nameservers
anyOf:
- type: array
items:
type: string
owner:
title: Owner
anyOf:
- type: string
owner_email:
title: Owner email
anyOf:
- type: string
owner_name:
title: Owner name
anyOf:
- type: string
pd_connection_id:
title: PagerDuty connection ID
anyOf:
- type: integer
pd_incident_id:
title: PagerDuty incident ID
anyOf:
- type: string
percent_per_day:
title: Percent per day
anyOf:
- type: number
prerelease:
title: Prerelease
anyOf:
- type: boolean
previous_state:
title: Previous state
anyOf:
- type: string
priority:
title: Priority
production_environment:
title: Production environment
anyOf:
- type: boolean
project:
title: Project
anyOf:
- type: string
provider:
title: Provider
anyOf:
- type: string
pusher:
title: Pusher
anyOf:
- type: string
record_action:
title: Record action
anyOf:
- type: string
record_name:
title: Record name
anyOf:
- type: string
record_type:
title: Record type
anyOf:
- type: string
records:
title: Records
anyOf:
- type: integer
ref:
title: Ref
anyOf:
- type: string
ref_type:
title: Ref type
anyOf:
- type: string
registrar:
title: Registrar
anyOf:
- type: string
repo:
title: Repo
anyOf:
- type: string
responder:
title: Responder
anyOf:
- type: string
responder_message:
title: Responder message
anyOf:
- type: string
responder_state:
title: Responder state
anyOf:
- type: string
reviewer:
title: Reviewer
anyOf:
- type: string
run_attempt:
title: Run attempt
anyOf:
- type: integer
run_id:
title: Run ID
anyOf:
- type: integer
run_number:
title: Run number
anyOf:
- type: integer
server_name:
title: Server name
anyOf:
- type: string
service:
title: Service
anyOf:
- type: string
sha:
title: SHA
anyOf:
- type: string
silent_minutes:
title: Silent minutes
anyOf:
- type: integer
size_gb:
title: Size GB
anyOf:
- type: integer
state:
title: State
anyOf:
- type: string
status:
title: Status
anyOf:
- type: string
status_page:
title: Status page
anyOf:
- type: string
subject:
title: Subject
anyOf:
- type: string
tag:
title: Tag
anyOf:
- type: string
task:
title: Task
anyOf:
- type: string
team:
title: Team
anyOf:
- type: string
threats:
title: Threats
anyOf:
- type: array
items:
type: string
ticket_key:
title: Ticket key
anyOf:
- type: string
ticket_state:
title: Ticket state
anyOf:
- type: string
ticket_url:
title: Ticket URL
anyOf:
- type: string
timezone:
title: Timezone
anyOf:
- type: string
title:
title: Title
anyOf:
- type: string
tld:
title: TLD
anyOf:
- type: string
tracker:
title: Tracker
anyOf:
- type: string
transient_environment:
title: Transient environment
anyOf:
- type: boolean
trigger_event:
title: Triggering event
anyOf:
- type: string
triggering_actor:
title: Triggering actor
anyOf:
- type: string
type:
title: Type
anyOf:
- type: string
unused:
title: Unused
anyOf:
- type: boolean
update_status:
title: Update status
anyOf:
- type: string
urgency:
title: Urgency
anyOf:
- type: string
url:
title: URL
anyOf:
- type: string
used_percent:
title: Used percent
anyOf:
- type: integer
via:
title: Via
anyOf:
- type: string
weekday:
title: Weekday
anyOf:
- type: integer
weeks:
title: Weeks
anyOf:
- type: integer
window_start:
title: Window start
anyOf:
- type: string
window_url:
title: Window URL
anyOf:
- type: string
workflow:
title: Workflow
anyOf:
- type: string
zone:
title: Zone
anyOf:
- type: string
required:
- event
events:
- domain.registered
'401':
$ref: '#/components/responses/Error401'
'403':
$ref: '#/components/responses/Error403'
'404':
$ref: '#/components/responses/Error404'
'429':
$ref: '#/components/responses/Error429'
tags:
- Webhooks
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
events:
type: array
description: ''
example:
- architecto
items:
type: string
x-infranest-scope: monitoring.read
x-infranest-token-writable: false
x-infranest-module: integrations
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