Fwozen Audit API
The append-only record. Every freeze, thaw, exception and enforcement write, with an actor and a source on every row, plus a CSV export.
The append-only record. Every freeze, thaw, exception and enforcement write, with an actor and a source on every row, plus a CSV export.
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/fwozen-com:fwozen-com-audit-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: Fwozen Com Audit API
version: 1.0.0
contact:
name: Fwozen support
url: https://fwozen.com/docs
email: hello@fwozen.com
license:
name: Fwozen Terms of Service
url: https://fwozen.com/legal/terms
description: 'Operations tagged Audit across 2 of this provider''s published API definitions: fwozen-com-openapi.json, fwozen-com-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.fwozen.com
security:
- bearerApiKey: []
tags:
- name: Audit
description: The append-only record. Every freeze, thaw, exception and enforcement write, with an actor and a source on every row, plus a CSV export.
paths:
/v1/audit:
get:
operationId: listAudit
summary: List audit entries (read-time retention filter)
tags:
- Audit
security:
- bearerApiKey:
- audit:read
- bearerJwt: []
parameters:
- name: limit
in: query
required: false
schema:
default: 50
type: integer
minimum: 1
maximum: 200
- name: cursor
in: query
required: false
schema:
type: string
maxLength: 512
- name: from
in: query
required: false
schema:
type: string
format: date-time
- name: to
in: query
required: false
schema:
type: string
format: date-time
- name: action
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
enum:
- freeze.created
- freeze.ended
- freeze.superseded
- freeze.extended
- freeze.fanout_completed
- freeze.fanout_failed
- freeze.target_applied
- freeze.target_failed
- freeze.impact_acknowledged
- thaw_override.created
- thaw_override.ended
- exception.requested
- exception.granted
- exception.denied
- exception.revoked
- exception.expired
- exception.consumed
- exception.reblocked_new_commit
- schedule.created
- schedule.updated
- schedule.deleted
- schedule.imported
- schedule.occurrence_applied
- schedule.occurrence_lifted
- schedule.occurrence_skipped
- schedule.watchdog_healed
- repo.enabled
- repo.disabled
- repo.settings_updated
- branch.watched
- branch.unwatched
- branch.settings_updated
- enforcement.verified
- enforcement.degraded
- enforcement.advisory_acknowledged
- enforcement.ruleset_created
- enforcement.ruleset_repaired
- enforcement.ruleset_write_failed
- enforcement.delegate_minted
- enforcement.delegate_redeemed
- identity.github_unlinked
- reconcile.drift_repaired
- installation.created
- installation.claimed
- installation.deleted
- installation.suspended
- installation.unsuspended
- installation.permissions_accepted
- installation.permissions_reduced
- installation.repos_changed
- apikey.created
- apikey.rotated
- apikey.revoked
- apikey.expired
- member.invited
- member.joined
- member.removed
- member.role_changed
- slack.installed
- slack.uninstalled
- slack.linked
- slack.subscription_changed
- org.settings_updated
- org.deleted
- org.claimed
- billing.tier_changed
- billing.trial_started
- billing.trial_expired
- billing.payment_failed
- billing.source_changed
- billing.limit_exceeded
- type: string
enum:
- freeze.created
- freeze.ended
- freeze.superseded
- freeze.extended
- freeze.fanout_completed
- freeze.fanout_failed
- freeze.target_applied
- freeze.target_failed
- freeze.impact_acknowledged
- thaw_override.created
- thaw_override.ended
- exception.requested
- exception.granted
- exception.denied
- exception.revoked
- exception.expired
- exception.consumed
- exception.reblocked_new_commit
- schedule.created
- schedule.updated
- schedule.deleted
- schedule.imported
- schedule.occurrence_applied
- schedule.occurrence_lifted
- schedule.occurrence_skipped
- schedule.watchdog_healed
- repo.enabled
- repo.disabled
- repo.settings_updated
- branch.watched
- branch.unwatched
- branch.settings_updated
- enforcement.verified
- enforcement.degraded
- enforcement.advisory_acknowledged
- enforcement.ruleset_created
- enforcement.ruleset_repaired
- enforcement.ruleset_write_failed
- enforcement.delegate_minted
- enforcement.delegate_redeemed
- identity.github_unlinked
- reconcile.drift_repaired
- installation.created
- installation.claimed
- installation.deleted
- installation.suspended
- installation.unsuspended
- installation.permissions_accepted
- installation.permissions_reduced
- installation.repos_changed
- apikey.created
- apikey.rotated
- apikey.revoked
- apikey.expired
- member.invited
- member.joined
- member.removed
- member.role_changed
- slack.installed
- slack.uninstalled
- slack.linked
- slack.subscription_changed
- org.settings_updated
- org.deleted
- org.claimed
- billing.tier_changed
- billing.trial_started
- billing.trial_expired
- billing.payment_failed
- billing.source_changed
- billing.limit_exceeded
- name: source
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
enum:
- ui
- api
- slack
- schedule
- incident
- system
- github
- compat
- type: string
enum:
- ui
- api
- slack
- schedule
- incident
- system
- github
- compat
- name: actorType
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
enum:
- user
- api_key
- slack_user
- scheduler
- system
- github_user
- type: string
enum:
- user
- api_key
- slack_user
- scheduler
- system
- github_user
- name: actorId
in: query
required: false
schema:
type: string
maxLength: 64
- name: repoId
in: query
required: false
schema:
type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
- name: branchId
in: query
required: false
schema:
type: string
pattern: ^wbr_[1-9A-HJ-NP-Za-km-z]{16}$
- name: freezeId
in: query
required: false
schema:
type: string
pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
- name: prNumber
in: query
required: false
schema:
type: integer
exclusiveMinimum: 0
maximum: 9007199254740991
- name: q
in: query
required: false
schema:
type: string
maxLength: 200
responses:
'200':
description: List audit entries (read-time retention filter)
content:
application/json:
schema:
$ref: '#/components/schemas/AuditEntryPage'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-permissions:
- audit:read
x-fwozen-scopes:
- audit:read
servers:
- url: https://api.fwozen.com
/v1/audit/export:
get:
operationId: exportAudit
summary: Stream the audit log as CSV (hard cap 500 000 rows)
tags:
- Audit
security:
- bearerApiKey:
- audit:read
- bearerJwt: []
parameters:
- name: from
in: query
required: false
schema:
type: string
format: date-time
- name: to
in: query
required: false
schema:
type: string
format: date-time
- name: action
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
enum:
- freeze.created
- freeze.ended
- freeze.superseded
- freeze.extended
- freeze.fanout_completed
- freeze.fanout_failed
- freeze.target_applied
- freeze.target_failed
- freeze.impact_acknowledged
- thaw_override.created
- thaw_override.ended
- exception.requested
- exception.granted
- exception.denied
- exception.revoked
- exception.expired
- exception.consumed
- exception.reblocked_new_commit
- schedule.created
- schedule.updated
- schedule.deleted
- schedule.imported
- schedule.occurrence_applied
- schedule.occurrence_lifted
- schedule.occurrence_skipped
- schedule.watchdog_healed
- repo.enabled
- repo.disabled
- repo.settings_updated
- branch.watched
- branch.unwatched
- branch.settings_updated
- enforcement.verified
- enforcement.degraded
- enforcement.advisory_acknowledged
- enforcement.ruleset_created
- enforcement.ruleset_repaired
- enforcement.ruleset_write_failed
- enforcement.delegate_minted
- enforcement.delegate_redeemed
- identity.github_unlinked
- reconcile.drift_repaired
- installation.created
- installation.claimed
- installation.deleted
- installation.suspended
- installation.unsuspended
- installation.permissions_accepted
- installation.permissions_reduced
- installation.repos_changed
- apikey.created
- apikey.rotated
- apikey.revoked
- apikey.expired
- member.invited
- member.joined
- member.removed
- member.role_changed
- slack.installed
- slack.uninstalled
- slack.linked
- slack.subscription_changed
- org.settings_updated
- org.deleted
- org.claimed
- billing.tier_changed
- billing.trial_started
- billing.trial_expired
- billing.payment_failed
- billing.source_changed
- billing.limit_exceeded
- type: string
enum:
- freeze.created
- freeze.ended
- freeze.superseded
- freeze.extended
- freeze.fanout_completed
- freeze.fanout_failed
- freeze.target_applied
- freeze.target_failed
- freeze.impact_acknowledged
- thaw_override.created
- thaw_override.ended
- exception.requested
- exception.granted
- exception.denied
- exception.revoked
- exception.expired
- exception.consumed
- exception.reblocked_new_commit
- schedule.created
- schedule.updated
- schedule.deleted
- schedule.imported
- schedule.occurrence_applied
- schedule.occurrence_lifted
- schedule.occurrence_skipped
- schedule.watchdog_healed
- repo.enabled
- repo.disabled
- repo.settings_updated
- branch.watched
- branch.unwatched
- branch.settings_updated
- enforcement.verified
- enforcement.degraded
- enforcement.advisory_acknowledged
- enforcement.ruleset_created
- enforcement.ruleset_repaired
- enforcement.ruleset_write_failed
- enforcement.delegate_minted
- enforcement.delegate_redeemed
- identity.github_unlinked
- reconcile.drift_repaired
- installation.created
- installation.claimed
- installation.deleted
- installation.suspended
- installation.unsuspended
- installation.permissions_accepted
- installation.permissions_reduced
- installation.repos_changed
- apikey.created
- apikey.rotated
- apikey.revoked
- apikey.expired
- member.invited
- member.joined
- member.removed
- member.role_changed
- slack.installed
- slack.uninstalled
- slack.linked
- slack.subscription_changed
- org.settings_updated
- org.deleted
- org.claimed
- billing.tier_changed
- billing.trial_started
- billing.trial_expired
- billing.payment_failed
- billing.source_changed
- billing.limit_exceeded
- name: source
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
enum:
- ui
- api
- slack
- schedule
- incident
- system
- github
- compat
- type: string
enum:
- ui
- api
- slack
- schedule
- incident
- system
- github
- compat
- name: actorType
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
enum:
- user
- api_key
- slack_user
- scheduler
- system
- github_user
- type: string
enum:
- user
- api_key
- slack_user
- scheduler
- system
- github_user
- name: actorId
in: query
required: false
schema:
type: string
maxLength: 64
- name: repoId
in: query
required: false
schema:
type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
- name: branchId
in: query
required: false
schema:
type: string
pattern: ^wbr_[1-9A-HJ-NP-Za-km-z]{16}$
- name: freezeId
in: query
required: false
schema:
type: string
pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
- name: prNumber
in: query
required: false
schema:
type: integer
exclusiveMinimum: 0
maximum: 9007199254740991
- name: q
in: query
required: false
schema:
type: string
maxLength: 200
- name: format
in: query
required: false
schema:
default: csv
type: string
enum:
- csv
- jsonl
responses:
'200':
description: A CSV or NDJSON stream.
content:
text/csv:
schema:
type: string
application/x-ndjson:
schema:
type: string
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'413':
$ref: '#/components/responses/ExportTooLarge'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 20
x-fwozen-feature: audit_export
x-fwozen-permissions:
- audit:export
x-fwozen-scopes:
- audit:read
servers:
- url: https://api.fwozen.com
/v1/audit/actions:
get:
operationId: listAuditActions
summary: The audit action vocabulary
tags:
- Audit
security:
- bearerApiKey:
- audit:read
- bearerJwt: []
responses:
'200':
description: The audit action vocabulary
content:
application/json:
schema:
$ref: '#/components/schemas/AuditActions'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-permissions:
- audit:read
x-fwozen-scopes:
- audit:read
servers:
- url: https://api.fwozen.com
components:
schemas:
Actor:
type: object
properties:
type:
type: string
enum:
- user
- api_key
- slack_user
- scheduler
- system
- github_user
id:
anyOf:
- type: string
- type: 'null'
displayName:
type: string
githubLogin:
anyOf:
- type: string
- type: 'null'
slackUserId:
anyOf:
- type: string
- type: 'null'
impersonatorId:
anyOf:
- type: string
- type: 'null'
apiKeyKind:
default: null
anyOf:
- type: string
enum:
- human
- agent
- type: 'null'
required:
- type
- id
- displayName
- githubLogin
- slackUserId
- impersonatorId
- apiKeyKind
additionalProperties: false
AuditEntry:
type: object
properties:
id:
type: string
pattern: ^aud_[1-9A-HJ-NP-Za-km-z]{16}$
action:
type: string
actionLabel:
anyOf:
- type: string
- type: 'null'
source:
type: string
enum:
- ui
- api
- slack
- schedule
- incident
- system
- github
- compat
actor:
$ref: '#/components/schemas/Actor'
at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
repoId:
anyOf:
- type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
- type: 'null'
repoFullName:
anyOf:
- type: string
- type: 'null'
branch:
anyOf:
- type: string
- type: 'null'
freezeId:
anyOf:
- type: string
pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
- type: 'null'
exceptionId:
anyOf:
- type: string
pattern: ^exc_[1-9A-HJ-NP-Za-km-z]{16}$
- type: 'null'
scheduleId:
anyOf:
- type: string
pattern: ^sch_[1-9A-HJ-NP-Za-km-z]{16}$
- type: 'null'
prNumber:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
reason:
anyOf:
- type: string
- type: 'null'
incidentRef:
anyOf:
- type: string
- type: 'null'
approverId:
anyOf:
- type: string
- type: 'null'
approverName:
anyOf:
- type: string
- type: 'null'
durationSeconds:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
metadata:
type: object
propertyNames:
type: string
additionalProperties: {}
requestId:
anyOf:
- type: string
- type: 'null'
required:
- id
- action
- actionLabel
- source
- actor
- at
- repoId
- repoFullName
- branch
- freezeId
- exceptionId
- scheduleId
- prNumber
- reason
- incidentRef
- approverId
- approverName
- durationSeconds
- metadata
- requestId
additionalProperties: false
AuditActions:
type: object
properties:
actions:
type: array
items:
type: object
properties:
value:
type: string
enum:
- freeze.created
- freeze.ended
- freeze.superseded
- freeze.extended
- freeze.fanout_completed
- freeze.fanout_failed
- freeze.target_applied
- freeze.target_failed
- freeze.impact_acknowledged
- thaw_override.created
- thaw_override.ended
- exception.requested
- exception.granted
- exception.denied
- exception.revoked
- exception.expired
- exception.consumed
- exception.reblocked_new_commit
- schedule.created
- schedule.updated
- schedule.deleted
- schedule.imported
- schedule.occurrence_applied
- schedule.occurrence_lifted
- schedule.occurrence_skipped
- schedule.watchdog_healed
- repo.enabled
- repo.disabled
- repo.settings_updated
- branch.watched
- branch.unwatched
- branch.settings_updated
- enforcement.verified
- enforcement.degraded
- enforcement.advisory_acknowledged
- enforcement.ruleset_created
- enforcement.ruleset_repaired
- enforcement.ruleset_write_failed
- enforcement.delegate_minted
- enforcement.delegate_redeemed
- identity.github_unlinked
- reconcile.drift_repaired
- installation.created
- installation.claimed
- installation.deleted
- installation.suspended
- installation.unsuspended
- installation.permissions_accepted
- installation.permissions_reduced
- installation.repos_changed
- apikey.created
- apikey.rotated
- apikey.revoked
- apikey.expired
- member.invited
- member.joined
- member.removed
- member.role_changed
- slack.installed
- slack.uninstalled
- slack.linked
- slack.subscription_changed
- org.settings_updated
- org.deleted
- org.claimed
- billing.tier_changed
- billing.trial_started
- billing.trial_expired
- billing.payment_failed
- billing.source_changed
- billing.limit_exceeded
label:
type: string
required:
- value
- label
additionalProperties: false
csvColumns:
type: array
items:
type: string
required:
- actions
- csvColumns
additionalProperties: false
ErrorEnvelope:
type: object
properties:
error:
type: object
properties:
type:
type: string
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
path:
type: string
message:
type: string
required:
- path
- message
additionalProperties: false
docsUrl:
type: string
requestId:
type: string
warnings:
type: array
items:
type: string
required:
- type
- code
- message
- requestId
additionalProperties: false
required:
- error
additionalProperties: false
AuditEntryPage:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/AuditEntry'
nextCursor:
anyOf:
- type: string
- type: 'null'
required:
- data
- nextCursor
additionalProperties: false
responses:
ExportTooLarge:
description: The requested range exceeds 500 000 rows. Narrow from/to.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
ValidationFailed:
description: The request failed schema validation; see `error.details`.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
Forbidden:
description: Authenticated, but not permitted.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
NotFound:
description: No such resource — also returned for another organization's id.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
BadRequest:
description: Malformed request.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
RateLimited:
description: Rate limit exceeded. Honour the `Retry-After` header.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
Unauthorized:
description: Missing or invalid credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
securitySchemes:
bearerApiKey:
type: http
scheme: bearer
bearerFormat: fwz_<env>_<40 base58>
description: 'Org-scoped, never user-scoped: the scope list IS the authorization. Calling a
session-only route with a key returns **403 `credential_type_not_allowed`**, never 401,
so scripts get an actionable message.
**Where one comes from.** Sign in at
[https://fwozen.com/app/settings/api-keys](https://fwozen.com/app/settings/api-keys) as an owner or an
admin, press **Create key**, tick the narrowest scopes that do the job (`freeze:read`
for a deploy gate, `freeze:write` to freeze and thaw), pick an expiry, and copy the
secret, which is shown once. `POST /v1/api-keys` is the same thing programmatically and
takes a **session** credential only, so a key can never mint another key. Scopes are
fixed at creation and cannot be widened.
- `freeze:read` — List freezes, freeze targets and freeze state, including GET /v1/freeze-state.
- `freeze:write` — Start a freeze, lift one, extend one, create a thaw override, retry targets.
- `schedule:read` — List schedules, occurrences and previews.
- `schedule:write` — Create, edit, delete, skip and import schedules.
- `exception:read` — List per-PR exceptions and exception requests.
- `exception:write` — Grant, decide and revoke per-PR exceptions.
- `repo:read` — List repositories, watched branches and enforcement state.
- `repo:write` — Enable or disable repositories and change watched-branch settings.
- `audit:read` — Read the audit log and stream the CSV export.
- `billing:read` — Read the billing summary, plan, trial state and resolved entitlements.
- `billing:write` — Start the 14-day no-card trial, and ask for a Stripe Checkout or Customer Portal link. It cannot pay for anything: those routes return a URL for a human to open and take no card details of any kind.'
bearerJwt:
type: http
scheme: bearer
bearerFormat: JWT
description: A short-lived RS256 session token from `GET /api/auth/token` on the web origin. Used by the dashboard, the CLI and agents; audience-bound to this API.
x-refined-from:
- fwozen-com-openapi.json
- fwozen-com-openapi.yml
x-provenance:
method: harvested
publisher: Fwozen
source: https://fwozen.com/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)