Clix · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the Clix External API v1

Non-destructive overlay on openapi/clix-so-openapi.yml (the provider's grpc-gateway-generated OpenAPI 3.1.0, fetched verbatim from https://docs.clix.so/api-reference/openapi.json). Adds the human info the generator left out — a title, description, contact, terms, licence, documentation links, a tag description, and the rate-limit and error-envelope facts from the docs — without changing any path, parameter or schema. Apply with an Overlay 1.0.0 processor; never edit the original.

12 actions 12 updates documentation extends ./openapi/clix-so-openapi.yml
Generated by API Evangelist Written by API Evangelist tooling for Clix's API. It is a proposal applied on top of the contract, not a document Clix publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

descriptionx-reversibilityexternalDocsx-rate-limitx-idempotencytitleversionsummary

Targets 12

$.info
$
$.servers[0]
$.tags[?(@.name=='ClixExternalService')]
$.components.securitySchemes.ApiKeyAuth
$.components.securitySchemes.ProjectIdAuth
$.paths['/api/v1/messages:send'].post
$.paths['/api/v1/campaigns/{campaign_id}:trigger'].post
$.paths['/api/v1/users/{project_user_id}'].delete
$.paths['/api/v1/users'].post
$.paths['/api/v1/health'].get
$.components.responses

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the Clix External API v1
  version: '2026-09-19'
  description: >-
    Non-destructive overlay on openapi/clix-so-openapi.yml (the provider's grpc-gateway-generated OpenAPI
    3.1.0, fetched verbatim from https://docs.clix.so/api-reference/openapi.json). Adds the human info the
    generator left out — a title, description, contact, terms, licence, documentation links, a tag
    description, and the rate-limit and error-envelope facts from the docs — without changing any path,
    parameter or schema. Apply with an Overlay 1.0.0 processor; never edit the original.
extends: ./openapi/clix-so-openapi.yml
x-generated: '2026-09-19'
x-method: generated
x-source: https://docs.clix.so/api-reference/overview
actions:
- target: $.info
  update:
    title: Clix External API
    version: v1
    summary: Server-to-server API for Clix mobile push — users, devices, events, ad-hoc pushes, Live Activities and campaign triggers.
    description: >-
      The Clix API enables programmatic control of user management, messaging, campaign execution, and event
      tracking through server-to-server communication. Base URL https://api.clix.so; every request carries
      X-Clix-Project-ID and X-Clix-API-Key (use the SECRET key server-side). JSON only; TLS 1.2+; requests
      terminate after 100 seconds; 10 MB maximum body. Generated by the provider from clix/external/v1/clix.proto
      (grpc-gateway), which is why write actions use custom verbs (messages:send, live-activities:start,
      campaigns/{campaign_id}:trigger) and bodies wrap lists.
    termsOfService: https://clix.so/terms
    contact:
      name: Clix support
      email: support@clix.so
      url: https://docs.clix.so/
    license:
      name: Clix Terms of Service
      url: https://clix.so/terms
    x-original-title: clix/external/v1/clix.proto
    x-original-version: version not set
- target: $
  update:
    externalDocs:
      description: Clix API reference
      url: https://docs.clix.so/api-reference/overview
- target: $.servers[0]
  update:
    description: Production. The only published host; also serves the A2A agent card at /.well-known/agent-card.json and the A2A JSON-RPC endpoint at /a2a.
- target: $.tags[?(@.name=='ClixExternalService')]
  update:
    description: All eleven external operations. Management operations (users, messages:send, campaigns:trigger) share a 1,000 requests/second/project token bucket.
    externalDocs: {url: 'https://docs.clix.so/api-reference/overview'}
- target: $.components.securitySchemes.ApiKeyAuth
  update:
    description: >-
      API key for authentication. Two key types: a PUBLIC key for client-side SDKs (safe to expose) and a
      SECRET key (prefix clix_sk_) for server-to-server operations — user management, message sending,
      campaign triggering. Send together with X-Clix-Project-ID.
- target: $.components.securitySchemes.ProjectIdAuth
  update:
    description: Project ID for authentication. Rate limits are tracked per project on this header.
- target: $.paths['/api/v1/messages:send'].post
  update:
    x-rate-limit: {scope: per-project, limit: 1000, window: 1s, headers: [X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After]}
    x-idempotency: none — no idempotency key; a retried request delivers twice. The A2A send-push-notification skill accepts X-Clix-Idempotency-Key.
    x-reversibility: none — a sent push cannot be recalled.
- target: $.paths['/api/v1/campaigns/{campaign_id}:trigger'].post
  update:
    x-rate-limit: {scope: per-project, limit: 1000, window: 1s}
    x-reversibility: none — delivery is asynchronous and no cancel-trigger operation exists; trigger_id is for tracking.
    x-limits: {audience_filter_attributes: 3}
- target: $.paths['/api/v1/users/{project_user_id}'].delete
  update:
    x-reversibility: none — "This action is irreversible and will remove the user and all associated data"; returns 200 even if the user does not exist.
- target: $.paths['/api/v1/users'].post
  update:
    x-idempotency: upsert — "If a user with the same project_user_id already exists, this endpoint will update the existing user's properties"
- target: $.paths['/api/v1/health'].get
  update:
    x-observed: 'Anonymous GET https://api.clix.so/api/v1/health returned an empty 404 on 2026-09-19; treat as authenticated or unexposed.'
- target: $.components.responses
  update:
    TooManyRequests:
      description: Rate limit exceeded — token bucket empty.
      headers:
        Retry-After: {schema: {type: integer}, description: Seconds to wait (typically 1).}
        X-RateLimit-Limit: {schema: {type: integer}}
        X-RateLimit-Remaining: {schema: {type: integer}}
        X-RateLimit-Reset: {schema: {type: integer}, description: Unix timestamp (seconds) when the bucket refills.}
      content:
        application/json:
          schema: {type: object, properties: {error: {type: string}}}
          example: {error: Too Many Requests}
    Unauthorized:
      description: Missing or invalid X-Clix-Project-ID / X-Clix-API-Key. Observed live as text/plain "Missing project id".
      content:
        text/plain: {schema: {type: string}, example: Missing project id}