{
  "openapi": "3.1.0",
  "info": {
    "title": "Omini organization API",
    "version": "1.0.0",
    "description": "3PAP-owned asynchronous communications API. Tenant identity comes from the scoped Bearer credential. Sandbox credentials permit scoped reads and cannot initiate real provider or device work. Provider credentials are never returned."
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "security": [
    {
      "OrganizationKey": []
    }
  ],
  "components": {
    "securitySchemes": {
      "OrganizationKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "Omini organization API key"
      }
    }
  },
  "paths": {
    "/api/v1/context": {
      "get": {
        "operationId": "context",
        "summary": "Inspect authenticated organization",
        "description": "Required scopes: organization:read. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/sms/messages": {
      "post": {
        "operationId": "sendSms",
        "summary": "Queue an SMS",
        "description": "Required scopes: sms:send, services:use. Requires a production key, approved sender, current SMS service and bounded funding. The same UUID and body may be retried safely.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sender_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "to": {
                    "type": "string",
                    "pattern": "^\\+[1-9][0-9]{6,14}$"
                  },
                  "body": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1600
                  },
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  }
                },
                "required": [
                  "sender_id",
                  "to",
                  "body",
                  "idempotency_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/sms/messages/{message}": {
      "get": {
        "operationId": "smsStatus",
        "summary": "Read SMS delivery",
        "description": "Required scopes: messaging:read. ",
        "parameters": [
          {
            "name": "message",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/otp/challenges": {
      "post": {
        "operationId": "createOtp",
        "summary": "Create a commercial verification challenge",
        "description": "Required scopes: otp:verify, services:use. Also requires sms:send or email:send for the selected channel. Returns no verification code. Expiry, destination cooldown and attempt limits apply.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sender_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "to": {
                    "type": "string",
                    "description": "E.164 for SMS; email address for email."
                  },
                  "channel": {
                    "type": "string",
                    "enum": [
                      "sms",
                      "email"
                    ]
                  },
                  "purpose": {
                    "type": "string",
                    "maxLength": 100
                  },
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "application_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Optional approved organization verification application. Its current sender, destination and abuse policy is snapshotted at issuance."
                  }
                },
                "required": [
                  "sender_id",
                  "to",
                  "channel",
                  "purpose",
                  "idempotency_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/otp/challenges/{challenge}/verify": {
      "post": {
        "operationId": "verifyOtp",
        "summary": "Consume a verification code",
        "description": "Required scopes: otp:verify. ",
        "parameters": [
          {
            "name": "challenge",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string",
                    "pattern": "^[0-9]{6}$"
                  }
                },
                "required": [
                  "code"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/whatsapp/messages": {
      "post": {
        "operationId": "sendWhatsapp",
        "summary": "Queue an approved WhatsApp template",
        "description": "Required scopes: whatsapp:send, services:use. ",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "identity_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "template_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "to": {
                    "type": "string"
                  },
                  "variables": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "consent_reference": {
                    "type": "string",
                    "minLength": 10,
                    "maxLength": 200,
                    "description": "Required for marketing templates; identifies your opt-in evidence. Email marketing also requires a configured public HTTPS unsubscribe origin."
                  }
                },
                "required": [
                  "identity_id",
                  "template_id",
                  "to",
                  "variables",
                  "idempotency_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/whatsapp/templates": {
      "get": {
        "operationId": "whatsappTemplates",
        "summary": "List approved organization template metadata",
        "description": "Required scopes: whatsapp:send. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/channels/email/messages": {
      "post": {
        "operationId": "sendEmail",
        "summary": "Queue an approved transactional email",
        "description": "Required scopes: email:send, services:use. Requires a verified and reviewed sender domain/identity and approved template.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "identity_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "template_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "to": {
                    "type": "string"
                  },
                  "variables": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  }
                },
                "required": [
                  "identity_id",
                  "template_id",
                  "to",
                  "variables",
                  "idempotency_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      },
      "get": {
        "operationId": "emailMessages",
        "summary": "List email delivery history",
        "description": "Required scopes: messaging:read. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/requests": {
      "get": {
        "operationId": "requests",
        "summary": "List organization service requests",
        "description": "Required scopes: services:read. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      },
      "post": {
        "operationId": "createRequest",
        "summary": "Queue an entitled service operation",
        "description": "Required scopes: services:use. The operation additionally requires its own scope. Operation parameters and limits must match the active entitlement; immutable retail prices are snapshotted. For Omini AI, omit parameters.model to use the subscription's authorized model automatically, or pass its Omini model identifier shown in the service workspace.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "subscription_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "parameters": {
                    "type": "object"
                  }
                },
                "required": [
                  "subscription_id",
                  "idempotency_key",
                  "parameters"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/requests/{serviceRequest}": {
      "get": {
        "operationId": "request",
        "summary": "Read a service result",
        "description": "Required scopes: services:read. ",
        "parameters": [
          {
            "name": "serviceRequest",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/usage": {
      "get": {
        "operationId": "usage",
        "summary": "Read usage charges and outstanding holds by currency",
        "description": "Required scopes: billing:read. Optional from/to inclusive UTC dates, ordered and at most 366 days. Defaults to requests created in the last 30 days. Monetary micros are decimal strings.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/billing/transactions": {
      "get": {
        "operationId": "transactions",
        "summary": "Read organization billing transactions",
        "description": "Required scopes: billing:read. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/webhooks": {
      "get": {
        "operationId": "webhooks",
        "summary": "List organization webhook destinations",
        "description": "Required scopes: webhooks:manage. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      },
      "post": {
        "operationId": "createWebhook",
        "summary": "Register a public HTTPS receiver",
        "description": "Required scopes: webhooks:manage. Returns the signing secret once. Requires production mode. Receiver must verify Omini-Signature, enforce a timestamp window and deduplicate Omini-Event-Id.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 100
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "HTTPS public domain, port443; redirects/private destinations are not permitted."
                  },
                  "events": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 4,
                    "uniqueItems": true,
                    "items": {
                      "type": "string",
                      "enum": [
                        "messaging.delivery",
                        "channels.delivery",
                        "otp.verified",
                        "service.state_changed"
                      ]
                    }
                  }
                },
                "required": [
                  "name",
                  "url",
                  "events"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/voice/numbers": {
      "get": {
        "operationId": "voiceNumbers",
        "summary": "List assigned phone numbers",
        "description": "Required scopes: voice:read. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/voice/extensions": {
      "get": {
        "operationId": "voiceExtensions",
        "summary": "List organization extensions without credentials",
        "description": "Required scopes: voice:read. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/voice/calls/{call}": {
      "get": {
        "operationId": "voiceCall",
        "summary": "Read a call and validated CDR charge",
        "description": "Required scopes: voice:read. ",
        "parameters": [
          {
            "name": "call",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/voice/call-flows": {
      "post": {
        "operationId": "voiceFlow",
        "summary": "Queue an IVR, ring group or queue change",
        "description": "Required scopes: voice:manage, services:use. ",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "ivr",
                      "ring_group",
                      "queue"
                    ]
                  },
                  "parameters": {
                    "type": "object",
                    "description": "Validated desired resource fields; see docs/voice-device-runtime-contract.md."
                  }
                },
                "required": [
                  "idempotency_key",
                  "kind",
                  "parameters"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/devices": {
      "get": {
        "operationId": "devices",
        "summary": "List assigned devices and observed state",
        "description": "Required scopes: devices:read. ",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/devices/{device}/reprovision": {
      "post": {
        "operationId": "reprovisionDevice",
        "summary": "Queue a new device configuration generation",
        "description": "Required scopes: devices:manage, services:use. Requires an active device service. Configuration download is separate from SIP registration.",
        "parameters": [
          {
            "name": "device",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  }
                },
                "required": [
                  "idempotency_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/whatsapp/conversations": {
      "get": {
        "operationId": "listWhatsappConversations",
        "summary": "List organization WhatsApp conversations",
        "description": "Required scope: messaging:read. Conversations arise only from authenticated and provider-verified inbound messages. Addresses and message bodies are omitted from this listing.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        }
      }
    },
    "/api/v1/whatsapp/conversations/{conversation}/reply": {
      "post": {
        "operationId": "replyWhatsappConversation",
        "summary": "Queue a WhatsApp session reply",
        "description": "Required scopes: whatsapp:send, services:use. A production key, active WhatsApp service, explicit priced whatsapp.session.send subscription, approved sender, unsuppressed recipient and unexpired verified customer service window are required. Reusing the idempotency key prevents duplicate reservations.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "subscription_id",
                  "body_text",
                  "idempotency_key"
                ],
                "properties": {
                  "subscription_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "body_text": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1600
                  },
                  "idempotency_key": {
                    "type": "string",
                    "format": "uuid"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted asynchronously; not proof of delivery",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Credential unavailable"
          },
          "403": {
            "description": "Scope, membership or service access denied"
          },
          "409": {
            "description": "Idempotency or resource state conflict"
          },
          "415": {
            "description": "Send application/json"
          },
          "422": {
            "description": "Input or allowance rejected"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "503": {
            "description": "Temporarily unavailable"
          }
        },
        "parameters": [
          {
            "name": "conversation",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      }
    }
  }
}
