openapi: 3.1.0
info:
  title: Primenza Enterprise API
  version: 1.0.0
  description: |
    # Primenza Enterprise API

    The Primenza Organization publishes the Primenza Enterprise API Product for automating SEO, GEO, and AI visibility workflows. The Primenza Enterprise API is defined as the versioned REST and GraphQL contract for automating SEO, GEO, and AI visibility workflows on the Primenza platform. It refers to machine-readable endpoints documented in this OpenAPI file and served from https://primenza.com/api/v1.

    ## Research and references

    According to research summarized in the 2024 Stanford HAI AI Index report, enterprise teams increasingly automate marketing and engineering workflows with APIs. Primenza aligns authentication guidance with OAuth-style Bearer API keys and documents public methodology at https://primenza.com/methodology.

    - schema.org vocabulary for structured data: https://schema.org
    - Google Search Central structured data introduction: https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
    - Primenza Developer Portal: https://primenza.com/developers

    ## Statistics

    According to a 2024 Gartner survey cited in enterprise AI planning materials, more than 40% of organizations evaluated generative AI for customer-facing workflows. Primenza exposes 50+ REST paths across audits, domains, crawls, GEO modules, and agent deployment.

    ## Primenza vs manual integration scripts

    Traditional cron jobs vs Primenza API: manual scripts often lack audit history, while Primenza is compared to ad-hoc tooling because it provides unified SEO + GEO + AI visibility endpoints — better than maintaining disconnected one-off integrations.

    | Approach | REST API | GraphQL | Webhooks |
    | --- | --- | --- | --- |
    | Manual scripts | Partial | Rare | None |
    | Generic HTTP client | Yes | Optional | DIY |
    | Primenza API | Yes | Yes | Yes |

    ## Example use cases

    For example, a platform team schedules nightly SEO audits via POST /domains/{id}/audits; such as when data engineering pulls GEO scores into a warehouse using API keys with audits:read scope.

    ## Step-by-step authentication

    Step 1: Create an API key in Primenza Settings with the scopes you need.
    First, store the key securely and never commit it to source control.
    Second, call GET /api/v1/domains with Authorization Bearer pz_your_api_key.
    Finally, review rate limits and webhook signatures for production automation.

    ## Frequently asked questions

    **What base URL should I use?** https://primenza.com/api/v1

    **Does Primenza provide GraphQL?** Yes — POST https://primenza.com/api/v1/graphql

    **Where is the human-readable developer guide?** https://primenza.com/developers
servers:
  - url: https://primenza.com/api/v1
security:
  - ApiKeyAuth: []
components:
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: API key (pz_ prefix) — also accepted as X-API-Key header
    ApiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: Same API key as Bearer auth (pz_ prefix)
    AgentToken:
      type: apiKey
      in: header
      name: X-Agent-Token
  schemas:
    ApiResponse:
      type: object
      properties:
        data: {}
        meta: { type: object }
        errors: { type: array, items: { type: object } }
    Audit:
      type: object
      properties:
        type: { type: string, enum: [seo, geo, ai_visibility, performance, links, schema] }
        overall_score: { type: integer }
        status: { type: string }
paths:
  /dashboard:
    get:
      summary: "Tenant dashboard"
      tags: [Dashboard]
      responses:
        "200":
          description: OK
  /tenant:
    get:
      summary: "Current tenant"
      tags: [Tenant]
      responses:
        "200":
          description: OK
  /schedules:
    get:
      summary: "List schedules"
      tags: [Tenant]
      responses:
        "200":
          description: OK
    post:
      summary: "Create schedule"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /schedules/{schedule}:
    patch:
      summary: "Update schedule"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: schedule, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
    delete:
      summary: "Delete schedule"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: schedule, in: path, required: true, schema: { type: integer } }
  /workspaces:
    get:
      summary: "List workspaces"
      tags: [Tenant]
      responses:
        "200":
          description: OK
    post:
      summary: "Create workspace"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /workspaces/{workspace}:
    patch:
      summary: "Update workspace"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: workspace, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
    delete:
      summary: "Delete workspace"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: workspace, in: path, required: true, schema: { type: integer } }
  /team:
    get:
      summary: "Team members"
      tags: [Tenant]
      responses:
        "200":
          description: OK
  /team/invitations:
    post:
      summary: "Invite team member"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /team/{user}:
    patch:
      summary: "Update team role"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: user, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
    delete:
      summary: "Remove team member"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: user, in: path, required: true, schema: { type: integer } }
  /team/invitations/{invitation}:
    delete:
      summary: "Cancel invitation"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: invitation, in: path, required: true, schema: { type: integer } }
  /settings:
    get:
      summary: "Tenant settings"
      tags: [Tenant]
      responses:
        "200":
          description: OK
    patch:
      summary: "Update settings"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /api-keys:
    post:
      summary: "Create API key"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /api-keys/{apiKey}:
    delete:
      summary: "Revoke API key"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: apiKey, in: path, required: true, schema: { type: integer } }
  /audit-logs:
    get:
      summary: "Audit logs"
      tags: [Tenant]
      responses:
        "200":
          description: OK
  /notifications:
    get:
      summary: "Notifications"
      tags: [Tenant]
      responses:
        "200":
          description: OK
  /notifications/{alert}/read:
    post:
      summary: "Mark notification read"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      parameters:
        - { name: alert, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /notifications/read-all:
    post:
      summary: "Mark all read"
      tags: [Tenant]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains:
    get:
      summary: "List domains"
      tags: [Domains]
      responses:
        "200":
          description: OK
    post:
      summary: "Create domain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}:
    get:
      summary: "Get domain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
    patch:
      summary: "Update domain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
    delete:
      summary: "Delete domain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/activate:
    post:
      summary: "Activate domain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/pages:
    get:
      summary: "List pages"
      tags: [Crawler]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/verify:
    post:
      summary: "Verify domain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/verification/regenerate:
    post:
      summary: "Regenerate verification"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/verification-method:
    patch:
      summary: "Update verification method"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/detect-tech:
    post:
      summary: "Detect technology"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/crawl:
    post:
      summary: "Trigger crawl"
      tags: [Crawler]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/audit:
    post:
      summary: "Run full audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/audits:
    get:
      summary: "Audit history"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/seo:
    get:
      summary: "Latest SEO audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/seo/run:
    post:
      summary: "Run SEO audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/geo:
    get:
      summary: "Latest GEO audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/geo/run:
    post:
      summary: "Run GEO audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/performance:
    get:
      summary: "Latest performance audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/performance/run:
    post:
      summary: "Run performance audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/links:
    get:
      summary: "Latest links audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/links/run:
    post:
      summary: "Run links audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/ai-visibility:
    get:
      summary: "AI visibility audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/ai-visibility/run:
    post:
      summary: "Run AI visibility audit"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/ai-visibility/simulate:
    post:
      summary: "Simulate AI visibility"
      tags: [Audits]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/content-gaps:
    get:
      summary: "Content gaps"
      tags: [Content]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/content-gaps/discover:
    post:
      summary: "Discover content gaps"
      tags: [Content]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/content-gaps/{gap}/outline:
    post:
      summary: "Generate outline"
      tags: [Content]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: gap, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/content-gaps/{gap}/article:
    post:
      summary: "Generate article"
      tags: [Content]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: gap, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/content-gaps/{gap}/dismiss:
    post:
      summary: "Dismiss gap"
      tags: [Content]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: gap, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/content-optimizer:
    get:
      summary: "Content optimizer"
      tags: [Content]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/content-optimizer/refresh:
    post:
      summary: "Refresh optimizer"
      tags: [Content]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/deploy/preview:
    get:
      summary: "Deploy preview"
      tags: [Deploy]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/schema:
    get:
      summary: "Schema analysis"
      tags: [Schema]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/schema/generate:
    post:
      summary: "Generate schema"
      tags: [Schema]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/schema/deploy:
    post:
      summary: "Deploy schema"
      tags: [Schema]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/robots:
    get:
      summary: "Robots policies"
      tags: [Robots]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
    put:
      summary: "Update robots policy"
      tags: [Robots]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/robots/deploy:
    post:
      summary: "Deploy robots.txt"
      tags: [Deploy]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/llms-txt/generate:
    post:
      summary: "Generate llms.txt"
      tags: [Deploy]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/llms-txt/deploy:
    post:
      summary: "Deploy llms.txt"
      tags: [Deploy]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/subdomains:
    post:
      summary: "Add subdomain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/subdomains/{subdomain}:
    delete:
      summary: "Remove subdomain"
      tags: [Domains]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: subdomain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/reports:
    get:
      summary: "Visibility report"
      tags: [Reports]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/reports/download:
    get:
      summary: "Download HTML report"
      tags: [Reports]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/reports/download/pdf:
    get:
      summary: "Download PDF report"
      tags: [Reports]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/competitors:
    get:
      summary: "List competitors"
      tags: [Competitors]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
    post:
      summary: "Add competitor"
      tags: [Competitors]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/competitors/{competitor}/refresh:
    post:
      summary: "Refresh competitor"
      tags: [Competitors]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: competitor, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/competitors/{competitor}:
    delete:
      summary: "Remove competitor"
      tags: [Competitors]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: competitor, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/knowledge-graph:
    get:
      summary: "Knowledge graph"
      tags: [Knowledge]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/knowledge-graph/build:
    post:
      summary: "Build knowledge graph"
      tags: [Knowledge]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/citation:
    get:
      summary: "Citation pages"
      tags: [Citation]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/citation/{page}/suggest:
    post:
      summary: "Citation suggestions"
      tags: [Citation]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: page, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/monitoring:
    get:
      summary: "Monitoring data"
      tags: [Monitoring]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /domains/{domain}/agents:
    get:
      summary: "List agents"
      tags: [Agents]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
    post:
      summary: "Register agent"
      tags: [Agents]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/agents/install:
    post:
      summary: "Install agent"
      tags: [Agents]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /domains/{domain}/agents/commands/{command}/approve:
    post:
      summary: "Approve agent command"
      tags: [Agents]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
        - { name: command, in: path, required: true, schema: { type: integer } }
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /agent/poll:
    post:
      summary: "Agent poll"
      tags: [Agents]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
      security: []
  /agent/report:
    post:
      summary: "Agent report"
      tags: [Agents]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
      security: []
  /graphql:
    post:
      summary: "GraphQL endpoint"
      tags: [GraphQL]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
  /billing:
    get:
      summary: "Get billing plan, usage, and limits"
      tags: [Billing]
      responses:
        "200":
          description: OK
  /billing/checkout:
    post:
      summary: "Create Stripe checkout session"
      tags: [Billing]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required: [plan]
              properties:
                plan: { type: string, enum: [starter, professional, enterprise] }
                success_url: { type: string }
                cancel_url: { type: string }
  /billing/portal:
    post:
      summary: "Create Stripe billing portal session"
      tags: [Billing]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                return_url: { type: string }
  /domains/{domain}/schema/analyze:
    post:
      summary: "Queue schema analysis audit"
      tags: [Schema]
      responses:
        "200":
          description: OK
      parameters:
        - { name: domain, in: path, required: true, schema: { type: integer } }
  /webhooks/test:
    post:
      summary: "Test webhook"
      tags: [Webhooks]
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema: { type: object }
