{
  "openapi": "3.1.0",
  "info": {
    "title": "Klik Flow API",
    "version": "2.0.0",
    "description": "The Klik Flow API sends WhatsApp messages and reads business data from your system. Full guides: /docs/en/api."
  },
  "servers": [
    {
      "url": "https://klikflow.id"
    }
  ],
  "tags": [
    {
      "name": "API v2",
      "description": "One API for WhatsApp (scan QR) and WhatsApp Official: send text, files, templates, and OTP codes, reply to conversations, manage contacts, and read channels and templates. Test keys reach test numbers only."
    },
    {
      "name": "Webhook v2",
      "description": "Events Klik Flow sends to your webhook URL."
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "API key (kf_live_… or kf_test_…), from Settings › API & Webhook › Create key (Pengaturan › API & Webhook › Buat kunci)."
      }
    }
  },
  "paths": {
    "/api/v2/messages": {
      "post": {
        "operationId": "v2-messages-send",
        "summary": "Send a message",
        "description": "One endpoint for WhatsApp (scan QR) and WhatsApp Official: text, a file, a template, or an OTP code.\n\nChoose the channel with `channel`. Klik Flow uses the first number the key may use, or the number in `from`. Outside 24 hours since the customer last wrote, WhatsApp Official can only send `template` or `otp`. Send an `Idempotency-Key` header so a retry does not produce a second message. Test keys send only to test numbers.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "channel": {
                    "type": "string",
                    "description": "Sending channel.",
                    "enum": [
                      "whatsapp_qr",
                      "whatsapp_official"
                    ],
                    "examples": [
                      "whatsapp_official"
                    ]
                  },
                  "to": {
                    "type": "string",
                    "description": "Destination number with country code; 08… is changed to 628….",
                    "examples": [
                      "6281234567890"
                    ]
                  },
                  "type": {
                    "type": "string",
                    "description": "Message type. `template` and `otp` are for whatsapp_official only.",
                    "enum": [
                      "text",
                      "image",
                      "video",
                      "audio",
                      "document",
                      "template",
                      "otp"
                    ],
                    "examples": [
                      "template"
                    ]
                  },
                  "from": {
                    "type": "string",
                    "description": "A specific sender number: the device id (whatsapp_qr) or number id (whatsapp_official), from `GET /api/v2/channels`."
                  },
                  "text": {
                    "type": "object",
                    "description": "`{ \"body\": \"…\" }`, at most 4,000 characters. For type text.",
                    "additionalProperties": true
                  },
                  "media": {
                    "type": "object",
                    "description": "`url` (https) or `base64` + `mime`, with `filename` and `caption`. For file types.",
                    "additionalProperties": true
                  },
                  "template": {
                    "type": "object",
                    "description": "`name`, `language`, `variables` (object or array), `header_variables`, `media_url`, `button_url`, `coupon_code`.",
                    "additionalProperties": true
                  },
                  "otp": {
                    "type": "object",
                    "description": "`template` (an Authentication template) and `code` (1–15 letters, digits, or `-`). The code is not stored.",
                    "additionalProperties": true
                  }
                },
                "required": [
                  "channel",
                  "to",
                  "type"
                ]
              },
              "example": {
                "channel": "whatsapp_official",
                "to": "6281234567890",
                "type": "template",
                "template": {
                  "name": "konfirmasi_pesanan",
                  "language": "id",
                  "variables": {
                    "nama": "Rina",
                    "orderid": "INV-2207"
                  },
                  "button_url": "INV-2207"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 99140,
                    "object": "message",
                    "conversation_id": 812,
                    "channel": "whatsapp_official",
                    "to": "6281234567890",
                    "type": "template",
                    "status": "sent",
                    "test": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_json, idempotency_key_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_json": {
                    "summary": "Body is not valid JSON",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_json",
                        "message": "Body is not valid JSON",
                        "doc_url": "/docs/api/error#invalid_json",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "idempotency_key_invalid": {
                    "summary": "Invalid Idempotency-Key",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "idempotency_key_invalid",
                        "message": "Invalid Idempotency-Key",
                        "doc_url": "/docs/api/error#idempotency_key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, test_number_required, channel_not_allowed, channel_paused",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "test_number_required": {
                    "summary": "Test keys send only to test numbers",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "test_number_required",
                        "message": "Test keys send only to test numbers",
                        "doc_url": "/docs/api/error#test_number_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_not_allowed": {
                    "summary": "Channel not allowed for this key",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "channel_not_allowed",
                        "message": "Channel not allowed for this key",
                        "doc_url": "/docs/api/error#channel_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_paused": {
                    "summary": "Channel paused",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "channel_paused",
                        "message": "Channel paused",
                        "doc_url": "/docs/api/error#channel_paused",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found, template_not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "template_not_found": {
                    "summary": "Template not found or not approved",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "template_not_found",
                        "message": "Template not found or not approved",
                        "doc_url": "/docs/api/error#template_not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict, request_in_progress, channel_unavailable, window_closed",
            "content": {
              "application/json": {
                "examples": {
                  "idempotency_conflict": {
                    "summary": "Idempotency-Key used for different content",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "idempotency_conflict",
                        "message": "Idempotency-Key used for different content",
                        "doc_url": "/docs/api/error#idempotency_conflict",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "request_in_progress": {
                    "summary": "The same request is still being processed",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "request_in_progress",
                        "message": "The same request is still being processed",
                        "doc_url": "/docs/api/error#request_in_progress",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_unavailable": {
                    "summary": "No usable WhatsApp number",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "channel_unavailable",
                        "message": "No usable WhatsApp number",
                        "doc_url": "/docs/api/error#channel_unavailable",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "window_closed": {
                    "summary": "Outside the 24-hour window",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "window_closed",
                        "message": "Outside the 24-hour window",
                        "doc_url": "/docs/api/error#window_closed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "media_too_large",
            "content": {
              "application/json": {
                "examples": {
                  "media_too_large": {
                    "summary": "File too large",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "media_too_large",
                        "message": "File too large",
                        "doc_url": "/docs/api/error#media_too_large",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request, invalid_phone, message_too_long, contact_blocked, template_values, template_not_supported, otp_code_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "invalid_phone": {
                    "summary": "Invalid destination number",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_phone",
                        "message": "Invalid destination number",
                        "doc_url": "/docs/api/error#invalid_phone",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "message_too_long": {
                    "summary": "Message too long",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "message_too_long",
                        "message": "Message too long",
                        "doc_url": "/docs/api/error#message_too_long",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "contact_blocked": {
                    "summary": "Contact blocked or unsubscribed",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "contact_blocked",
                        "message": "Contact blocked or unsubscribed",
                        "doc_url": "/docs/api/error#contact_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "template_values": {
                    "summary": "Template variables incomplete",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "template_values",
                        "message": "Template variables incomplete",
                        "doc_url": "/docs/api/error#template_values",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "template_not_supported": {
                    "summary": "Template type not supported yet",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "template_not_supported",
                        "message": "Template type not supported yet",
                        "doc_url": "/docs/api/error#template_not_supported",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "otp_code_invalid": {
                    "summary": "Invalid OTP code",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "otp_code_invalid",
                        "message": "Invalid OTP code",
                        "doc_url": "/docs/api/error#otp_code_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited, daily_limit, new_chat_limit",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "daily_limit": {
                    "summary": "Daily message limit reached",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "daily_limit",
                        "message": "Daily message limit reached",
                        "doc_url": "/docs/api/error#daily_limit",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "new_chat_limit": {
                    "summary": "Limit of chats to new numbers reached",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "new_chat_limit",
                        "message": "Limit of chats to new numbers reached",
                        "doc_url": "/docs/api/error#new_chat_limit",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "send_failed, channel_refused",
            "content": {
              "application/json": {
                "examples": {
                  "send_failed": {
                    "summary": "Message failed to send",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "send_failed",
                        "message": "Message failed to send",
                        "doc_url": "/docs/api/error#send_failed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_refused": {
                    "summary": "WhatsApp refused the message",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "channel_refused",
                        "message": "WhatsApp refused the message",
                        "doc_url": "/docs/api/error#channel_refused",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "messages:send"
      }
    },
    "/api/v2/messages/{id}": {
      "get": {
        "operationId": "v2-messages-get",
        "summary": "Message status",
        "description": "Status and error of a message sent by this key.\n\nOnly messages sent by the same key. The content of Authentication template messages is never shown.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "`id` from the Send a message response.",
            "schema": {
              "type": "integer"
            },
            "example": 99140
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 99140,
                    "object": "message",
                    "conversation_id": 812,
                    "direction": "out",
                    "type": "text",
                    "body": "[Template] konfirmasi_pesanan: Halo Rina…",
                    "media_url": null,
                    "status": "read",
                    "error": null,
                    "created_at": "2026-11-01T02:12:03.000Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "messages:send"
      }
    },
    "/api/v2/conversations": {
      "get": {
        "operationId": "v2-conversations-list",
        "summary": "List conversations",
        "description": "Conversations the key's creator can see, newest first.\n\nGet the next page with `cursor` = `next_cursor` from the previous response. Numbers and names follow the masking of the key creator's role. A key limited to specific numbers only sees the conversations of those numbers.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Filter by status.",
            "schema": {
              "type": "string",
              "enum": [
                "open",
                "pending",
                "resolved"
              ]
            }
          },
          {
            "name": "channel",
            "in": "query",
            "required": false,
            "description": "Filter by channel, for example `whatsapp_qr` or `whatsapp_official`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Search names or the text of the last message.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–50, default 25.",
            "schema": {
              "type": "integer"
            },
            "example": 25
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "`next_cursor` from the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id": 812,
                      "object": "conversation",
                      "channel": "whatsapp_official",
                      "contact_id": 301,
                      "name": "Rina",
                      "status": "open",
                      "unread_count": 1,
                      "handled_by": null,
                      "last_message_at": "2026-11-01T02:10:00.000Z",
                      "last_customer_at": "2026-11-01T02:10:00.000Z"
                    }
                  ],
                  "next_cursor": "eyJhIjo4MTJ9"
                }
              }
            }
          },
          "400": {
            "description": "cursor_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "cursor_invalid": {
                    "summary": "Invalid cursor",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "cursor_invalid",
                        "message": "Invalid cursor",
                        "doc_url": "/docs/api/error#cursor_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "conversations:read"
      }
    },
    "/api/v2/conversations/{id}": {
      "get": {
        "operationId": "v2-conversation-get",
        "summary": "Conversation details",
        "description": "One conversation the key's creator can see.\n\n`last_customer_at` shows when the WhatsApp Official 24-hour window started.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Conversation id.",
            "schema": {
              "type": "integer"
            },
            "example": 812
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 812,
                    "object": "conversation",
                    "channel": "whatsapp_official",
                    "contact_id": 301,
                    "name": "Rina",
                    "status": "open",
                    "unread_count": 0,
                    "handled_by": 5,
                    "last_message_at": "2026-11-01T02:10:00.000Z",
                    "last_customer_at": "2026-11-01T02:10:00.000Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "conversations:read"
      }
    },
    "/api/v2/conversations/{id}/messages": {
      "get": {
        "operationId": "v2-conversation-messages",
        "summary": "Messages in a conversation",
        "description": "Messages of one conversation, newest first.\n\n`next_cursor` opens older messages.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Conversation id.",
            "schema": {
              "type": "integer"
            },
            "example": 812
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–100, default 50.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "`next_cursor` from the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id": 99141,
                      "object": "message",
                      "conversation_id": 812,
                      "direction": "in",
                      "type": "text",
                      "body": "Kak, ongkir ke Bandung berapa?",
                      "media_url": null,
                      "status": null,
                      "error": null,
                      "created_at": "2026-11-01T02:10:00.000Z"
                    }
                  ],
                  "next_cursor": null
                }
              }
            }
          },
          "400": {
            "description": "cursor_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "cursor_invalid": {
                    "summary": "Invalid cursor",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "cursor_invalid",
                        "message": "Invalid cursor",
                        "doc_url": "/docs/api/error#cursor_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "conversations:read"
      },
      "post": {
        "operationId": "v2-conversation-reply",
        "summary": "Reply to a conversation",
        "description": "Reply with text or a file in a conversation the key's creator can see, on any channel the Inbox can reply on.\n\nWhatsApp Official needs the 24-hour window; outside it, send a template with Send a message. Test keys only reply to conversations with test numbers. Use `Idempotency-Key`.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Conversation id.",
            "schema": {
              "type": "integer"
            },
            "example": 812
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "description": "Default `text`.",
                    "enum": [
                      "text",
                      "image",
                      "video",
                      "audio",
                      "document"
                    ]
                  },
                  "text": {
                    "type": "object",
                    "description": "`{ \"body\": \"…\" }`.",
                    "additionalProperties": true
                  },
                  "media": {
                    "type": "object",
                    "description": "Same as Send a message.",
                    "additionalProperties": true
                  }
                },
                "required": []
              },
              "example": {
                "type": "text",
                "text": {
                  "body": "Ongkir ke Bandung Rp18.000, Kak."
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 99142,
                    "object": "message",
                    "conversation_id": 812,
                    "channel": "whatsapp_official",
                    "to": "6281234567890",
                    "type": "text",
                    "status": "sent",
                    "test": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_json, idempotency_key_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_json": {
                    "summary": "Body is not valid JSON",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_json",
                        "message": "Body is not valid JSON",
                        "doc_url": "/docs/api/error#invalid_json",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "idempotency_key_invalid": {
                    "summary": "Invalid Idempotency-Key",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "idempotency_key_invalid",
                        "message": "Invalid Idempotency-Key",
                        "doc_url": "/docs/api/error#idempotency_key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, test_number_required, channel_not_allowed, channel_paused",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "test_number_required": {
                    "summary": "Test keys send only to test numbers",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "test_number_required",
                        "message": "Test keys send only to test numbers",
                        "doc_url": "/docs/api/error#test_number_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_not_allowed": {
                    "summary": "Channel not allowed for this key",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "channel_not_allowed",
                        "message": "Channel not allowed for this key",
                        "doc_url": "/docs/api/error#channel_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_paused": {
                    "summary": "Channel paused",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "channel_paused",
                        "message": "Channel paused",
                        "doc_url": "/docs/api/error#channel_paused",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict, request_in_progress, channel_unavailable, window_closed",
            "content": {
              "application/json": {
                "examples": {
                  "idempotency_conflict": {
                    "summary": "Idempotency-Key used for different content",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "idempotency_conflict",
                        "message": "Idempotency-Key used for different content",
                        "doc_url": "/docs/api/error#idempotency_conflict",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "request_in_progress": {
                    "summary": "The same request is still being processed",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "request_in_progress",
                        "message": "The same request is still being processed",
                        "doc_url": "/docs/api/error#request_in_progress",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_unavailable": {
                    "summary": "No usable WhatsApp number",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "channel_unavailable",
                        "message": "No usable WhatsApp number",
                        "doc_url": "/docs/api/error#channel_unavailable",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "window_closed": {
                    "summary": "Outside the 24-hour window",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "window_closed",
                        "message": "Outside the 24-hour window",
                        "doc_url": "/docs/api/error#window_closed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "media_too_large",
            "content": {
              "application/json": {
                "examples": {
                  "media_too_large": {
                    "summary": "File too large",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "media_too_large",
                        "message": "File too large",
                        "doc_url": "/docs/api/error#media_too_large",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request, invalid_phone, message_too_long, contact_blocked",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "invalid_phone": {
                    "summary": "Invalid destination number",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_phone",
                        "message": "Invalid destination number",
                        "doc_url": "/docs/api/error#invalid_phone",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "message_too_long": {
                    "summary": "Message too long",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "message_too_long",
                        "message": "Message too long",
                        "doc_url": "/docs/api/error#message_too_long",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "contact_blocked": {
                    "summary": "Contact blocked or unsubscribed",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "contact_blocked",
                        "message": "Contact blocked or unsubscribed",
                        "doc_url": "/docs/api/error#contact_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited, daily_limit",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "daily_limit": {
                    "summary": "Daily message limit reached",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "daily_limit",
                        "message": "Daily message limit reached",
                        "doc_url": "/docs/api/error#daily_limit",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "send_failed",
            "content": {
              "application/json": {
                "examples": {
                  "send_failed": {
                    "summary": "Message failed to send",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "send_failed",
                        "message": "Message failed to send",
                        "doc_url": "/docs/api/error#send_failed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "messages:send"
      }
    },
    "/api/v2/contacts": {
      "get": {
        "operationId": "v2-contacts-list",
        "summary": "Search contacts",
        "description": "Contacts the key's creator can see, most recently updated first.\n\nNumbers are masked when the key creator's role masks them.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Search name, number, email, company, or city.",
            "schema": {
              "type": "string"
            },
            "example": "rina"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–100, default 25.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "`next_cursor` from the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id": 301,
                      "object": "contact",
                      "name": "Rina",
                      "phone": "6281234567890",
                      "email": "rina@contoh.com",
                      "company": null,
                      "city": "Bandung",
                      "source_channel": "whatsapp",
                      "custom_fields": {
                        "member": "Gold"
                      },
                      "created_at": "2026-10-01T03:00:00.000Z",
                      "updated_at": "2026-11-01T02:10:00.000Z"
                    }
                  ],
                  "next_cursor": null
                }
              }
            }
          },
          "400": {
            "description": "cursor_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "cursor_invalid": {
                    "summary": "Invalid cursor",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "cursor_invalid",
                        "message": "Invalid cursor",
                        "doc_url": "/docs/api/error#cursor_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "contacts:read"
      },
      "post": {
        "operationId": "v2-contacts-create",
        "summary": "Create a contact",
        "description": "Add a new contact with a number or an email.\n\nA contact with the same number or email is refused (409) with the existing id. The plan's contact limit applies. Custom fields use the field keys from Settings › Contacts (Pengaturan › Kontak).",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Contact name.",
                    "examples": [
                      "Rina"
                    ]
                  },
                  "phone": {
                    "type": "string",
                    "description": "Number with country code. Required when there is no email.",
                    "examples": [
                      "6281234567890"
                    ]
                  },
                  "email": {
                    "type": "string",
                    "description": "Email. Required when there is no number."
                  },
                  "company": {
                    "type": "string",
                    "description": "Company."
                  },
                  "city": {
                    "type": "string",
                    "description": "City.",
                    "examples": [
                      "Bandung"
                    ]
                  },
                  "custom_fields": {
                    "type": "object",
                    "description": "Custom field values by field key.",
                    "examples": [
                      {
                        "member": "Gold"
                      }
                    ],
                    "additionalProperties": true
                  }
                },
                "required": [
                  "name"
                ]
              },
              "example": {
                "name": "Rina",
                "phone": "6281234567890",
                "city": "Bandung",
                "custom_fields": {
                  "member": "Gold"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 301,
                    "object": "contact",
                    "name": "Rina",
                    "phone": "6281234567890",
                    "email": null,
                    "company": null,
                    "city": "Bandung",
                    "source_channel": null,
                    "custom_fields": {
                      "member": "Gold"
                    },
                    "created_at": "2026-11-01T02:12:03.000Z",
                    "updated_at": "2026-11-01T02:12:03.000Z"
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_json, idempotency_key_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_json": {
                    "summary": "Body is not valid JSON",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_json",
                        "message": "Body is not valid JSON",
                        "doc_url": "/docs/api/error#invalid_json",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "idempotency_key_invalid": {
                    "summary": "Invalid Idempotency-Key",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "idempotency_key_invalid",
                        "message": "Invalid Idempotency-Key",
                        "doc_url": "/docs/api/error#idempotency_key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict, request_in_progress",
            "content": {
              "application/json": {
                "examples": {
                  "idempotency_conflict": {
                    "summary": "Idempotency-Key used for different content",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "idempotency_conflict",
                        "message": "Idempotency-Key used for different content",
                        "doc_url": "/docs/api/error#idempotency_conflict",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "request_in_progress": {
                    "summary": "The same request is still being processed",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "request_in_progress",
                        "message": "The same request is still being processed",
                        "doc_url": "/docs/api/error#request_in_progress",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "contacts:write"
      }
    },
    "/api/v2/contacts/{id}": {
      "get": {
        "operationId": "v2-contact-get",
        "summary": "Contact details",
        "description": "One contact the key's creator can see.\n\nThe number follows the masking of the key creator's role.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Contact id.",
            "schema": {
              "type": "integer"
            },
            "example": 301
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 301,
                    "object": "contact",
                    "name": "Rina",
                    "phone": "6281234567890",
                    "email": "rina@contoh.com",
                    "company": null,
                    "city": "Bandung",
                    "source_channel": "whatsapp",
                    "custom_fields": {},
                    "created_at": "2026-10-01T03:00:00.000Z",
                    "updated_at": "2026-11-01T02:10:00.000Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "contacts:read"
      },
      "patch": {
        "operationId": "v2-contact-update",
        "summary": "Update a contact",
        "description": "Change contact fields; only the fields sent change.\n\nSame rules as editing a contact in the app, including the number and custom field checks.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Contact id.",
            "schema": {
              "type": "integer"
            },
            "example": 301
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Number."
                  },
                  "email": {
                    "type": "string",
                    "description": "Email."
                  },
                  "city": {
                    "type": "string",
                    "description": "City.",
                    "examples": [
                      "Jakarta"
                    ]
                  },
                  "custom_fields": {
                    "type": "object",
                    "description": "Custom fields to change.",
                    "additionalProperties": true
                  }
                },
                "required": []
              },
              "example": {
                "city": "Jakarta",
                "custom_fields": {
                  "member": "Platinum"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 301,
                    "object": "contact",
                    "name": "Rina",
                    "phone": "6281234567890",
                    "email": "rina@contoh.com",
                    "company": null,
                    "city": "Jakarta",
                    "source_channel": "whatsapp",
                    "custom_fields": {
                      "member": "Platinum"
                    },
                    "created_at": "2026-10-01T03:00:00.000Z",
                    "updated_at": "2026-11-01T02:14:00.000Z"
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_json",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_json": {
                    "summary": "Body is not valid JSON",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_json",
                        "message": "Body is not valid JSON",
                        "doc_url": "/docs/api/error#invalid_json",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "contacts:write"
      }
    },
    "/api/v2/channels": {
      "get": {
        "operationId": "v2-channels",
        "summary": "List channels",
        "description": "WhatsApp numbers this key may use, with their status.\n\n`from` in the response is used as `from` in Send a message.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id": "wa:12",
                      "object": "channel",
                      "channel": "whatsapp_qr",
                      "name": "CS Toko",
                      "connected": true,
                      "from": 12
                    },
                    {
                      "id": "waba:3",
                      "object": "channel",
                      "channel": "whatsapp_official",
                      "name": "Toko Rina Official",
                      "connected": true,
                      "from": 3
                    }
                  ],
                  "next_cursor": null
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "business:read"
      }
    },
    "/api/v2/templates": {
      "get": {
        "operationId": "v2-templates-list",
        "summary": "List templates",
        "description": "WhatsApp Official templates with the variables to fill.\n\n`variables` names the Send a message field for each value: `variables`, `header_variables`, `media_url`, `button_url`, or `coupon_code`.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Filter by status, for example `APPROVED`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id": 41,
                      "object": "template",
                      "name": "konfirmasi_pesanan",
                      "language": "id",
                      "category": "UTILITY",
                      "status": "APPROVED",
                      "channel_id": "waba:3",
                      "body": "Halo {{nama}}, pesanan {{orderid}} sudah kami terima.",
                      "sendable": true,
                      "reason": null,
                      "variables": [
                        {
                          "field": "variables",
                          "name": "nama",
                          "example": "Rina"
                        },
                        {
                          "field": "variables",
                          "name": "orderid",
                          "example": "INV-2207"
                        }
                      ]
                    }
                  ],
                  "next_cursor": null
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "templates:read"
      },
      "post": {
        "operationId": "v2-templates-create",
        "summary": "Submit a template",
        "description": "Submit a new WhatsApp Official template for approval.\n\n`template` uses the same shape as the template builder in the app and is checked with the same rules before it is submitted.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "channel_id": {
                    "type": "string",
                    "description": "WhatsApp Official account, `waba:<id>` from List channels.",
                    "examples": [
                      "waba:3"
                    ]
                  },
                  "template": {
                    "type": "object",
                    "description": "Template draft: `name`, `language`, `category`, `kind`, `parameterFormat`, `body`, `bodyExamples`, and more.",
                    "additionalProperties": true
                  }
                },
                "required": [
                  "channel_id",
                  "template"
                ]
              },
              "example": {
                "channel_id": "waba:3",
                "template": {
                  "name": "pengingat_bayar",
                  "language": "id",
                  "category": "UTILITY",
                  "kind": "standard",
                  "parameterFormat": "NAMED",
                  "header": {
                    "format": "NONE"
                  },
                  "body": "Halo {{nama}}, tagihan {{orderid}} jatuh tempo besok.",
                  "bodyExamples": {
                    "nama": "Rina",
                    "orderid": "INV-2207"
                  },
                  "footer": "",
                  "buttons": []
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "object": "template",
                    "name": "pengingat_bayar",
                    "language": "id",
                    "status": "PENDING",
                    "category_changed_to": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_json, idempotency_key_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_json": {
                    "summary": "Body is not valid JSON",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_json",
                        "message": "Body is not valid JSON",
                        "doc_url": "/docs/api/error#invalid_json",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "idempotency_key_invalid": {
                    "summary": "Invalid Idempotency-Key",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "idempotency_key_invalid",
                        "message": "Invalid Idempotency-Key",
                        "doc_url": "/docs/api/error#idempotency_key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, channel_not_allowed",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "channel_not_allowed": {
                    "summary": "Channel not allowed for this key",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "channel_not_allowed",
                        "message": "Channel not allowed for this key",
                        "doc_url": "/docs/api/error#channel_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict, request_in_progress",
            "content": {
              "application/json": {
                "examples": {
                  "idempotency_conflict": {
                    "summary": "Idempotency-Key used for different content",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "idempotency_conflict",
                        "message": "Idempotency-Key used for different content",
                        "doc_url": "/docs/api/error#idempotency_conflict",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "request_in_progress": {
                    "summary": "The same request is still being processed",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "request_in_progress",
                        "message": "The same request is still being processed",
                        "doc_url": "/docs/api/error#request_in_progress",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "channel_refused",
            "content": {
              "application/json": {
                "examples": {
                  "channel_refused": {
                    "summary": "WhatsApp refused the message",
                    "value": {
                      "error": {
                        "type": "channel_error",
                        "code": "channel_refused",
                        "message": "WhatsApp refused the message",
                        "doc_url": "/docs/api/error#channel_refused",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "templates:write"
      }
    },
    "/api/v2/webhooks": {
      "get": {
        "operationId": "v2-webhooks-list",
        "summary": "List webhooks",
        "description": "This business's webhooks, with their events, 7-day health, and number of failed deliveries.\n\nSame as Settings › API & Webhook › Webhook (Pengaturan › API & Webhook › Webhook). Live keys only: webhooks receive real events. The secret is never in this response.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id": 6,
                      "object": "webhook",
                      "url": "https://toko-anda.id/klikflow/webhook",
                      "description": "Server toko",
                      "events": [
                        "message.received",
                        "message.status",
                        "order.paid"
                      ],
                      "status": "active",
                      "paused_reason": null,
                      "health": "Sehat · 99,8% sukses 7 hari",
                      "failed_count": 0,
                      "created_at": "2026-11-01T02:00:00.000Z",
                      "last_success_at": "2026-11-01T02:12:04.000Z",
                      "last_failure_at": null
                    }
                  ],
                  "next_cursor": null
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, live_key_required",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "live_key_required": {
                    "summary": "Live key required",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "live_key_required",
                        "message": "Live key required",
                        "doc_url": "/docs/api/error#live_key_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "webhooks:manage"
      },
      "post": {
        "operationId": "v2-webhooks-create",
        "summary": "Add a webhook",
        "description": "Register your system's HTTPS URL and the events you want to receive.\n\nAt most 5 webhooks per business. The response contains `secret` only once (it can be viewed again in Settings › API & Webhook (Pengaturan › API & Webhook)). Use that secret to check the `Klikflow-Signature` header.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "Public HTTPS URL, at most 500 characters.",
                    "examples": [
                      "https://toko-anda.id/klikflow/webhook"
                    ]
                  },
                  "events": {
                    "type": "array",
                    "description": "Events to send; see the Webhook events guide.",
                    "enum": [
                      "message.received",
                      "message.status",
                      "contact.created",
                      "lead.created",
                      "order.paid",
                      "ticket.created",
                      "ticket.status",
                      "template.status",
                      "channel.status"
                    ],
                    "examples": [
                      [
                        "message.received",
                        "message.status",
                        "order.paid"
                      ]
                    ],
                    "items": {}
                  },
                  "description": {
                    "type": "string",
                    "description": "Description, at most 120 characters.",
                    "examples": [
                      "Server toko"
                    ]
                  }
                },
                "required": [
                  "url",
                  "events"
                ]
              },
              "example": {
                "url": "https://toko-anda.id/klikflow/webhook",
                "events": [
                  "message.received",
                  "message.status",
                  "order.paid"
                ],
                "description": "Server toko"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 6,
                    "object": "webhook",
                    "url": "https://toko-anda.id/klikflow/webhook",
                    "description": "Server toko",
                    "events": [
                      "message.received",
                      "message.status",
                      "order.paid"
                    ],
                    "status": "active",
                    "paused_reason": null,
                    "health": "Belum ada kiriman 7 hari",
                    "failed_count": 0,
                    "created_at": "2026-11-01T02:00:00.000Z",
                    "last_success_at": null,
                    "last_failure_at": null,
                    "secret": "whsec_4Hf2Kp9Lq7Rt1Zs8Vb3Nm6Xc0Ya5Wd2E"
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_json, idempotency_key_invalid",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_json": {
                    "summary": "Body is not valid JSON",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_json",
                        "message": "Body is not valid JSON",
                        "doc_url": "/docs/api/error#invalid_json",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "idempotency_key_invalid": {
                    "summary": "Invalid Idempotency-Key",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "idempotency_key_invalid",
                        "message": "Invalid Idempotency-Key",
                        "doc_url": "/docs/api/error#idempotency_key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, live_key_required",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "live_key_required": {
                    "summary": "Live key required",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "live_key_required",
                        "message": "Live key required",
                        "doc_url": "/docs/api/error#live_key_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict, request_in_progress",
            "content": {
              "application/json": {
                "examples": {
                  "idempotency_conflict": {
                    "summary": "Idempotency-Key used for different content",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "idempotency_conflict",
                        "message": "Idempotency-Key used for different content",
                        "doc_url": "/docs/api/error#idempotency_conflict",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "request_in_progress": {
                    "summary": "The same request is still being processed",
                    "value": {
                      "error": {
                        "type": "conflict_error",
                        "code": "request_in_progress",
                        "message": "The same request is still being processed",
                        "doc_url": "/docs/api/error#request_in_progress",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request, webhook_limit",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "webhook_limit": {
                    "summary": "Webhook limit reached",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "webhook_limit",
                        "message": "Webhook limit reached",
                        "doc_url": "/docs/api/error#webhook_limit",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "webhooks:manage"
      }
    },
    "/api/v2/webhooks/{id}": {
      "get": {
        "operationId": "v2-webhook-get",
        "summary": "Webhook details",
        "description": "One webhook with its events and health.\n\nLive keys only.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Webhook id.",
            "schema": {
              "type": "integer"
            },
            "example": 6
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 6,
                    "object": "webhook",
                    "url": "https://toko-anda.id/klikflow/webhook",
                    "description": "Server toko",
                    "events": [
                      "message.received",
                      "message.status",
                      "order.paid"
                    ],
                    "status": "active",
                    "paused_reason": null,
                    "health": "Sehat · 99,8% sukses 7 hari",
                    "failed_count": 0,
                    "created_at": "2026-11-01T02:00:00.000Z",
                    "last_success_at": "2026-11-01T02:12:04.000Z",
                    "last_failure_at": null
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, live_key_required",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "live_key_required": {
                    "summary": "Live key required",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "live_key_required",
                        "message": "Live key required",
                        "doc_url": "/docs/api/error#live_key_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "webhooks:manage"
      },
      "patch": {
        "operationId": "v2-webhook-update",
        "summary": "Update a webhook",
        "description": "Change the URL, events, or description, or pause and reactivate it.\n\nOnly the fields sent change. `status: active` after a pause sends the waiting deliveries again, starting now.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Webhook id.",
            "schema": {
              "type": "integer"
            },
            "example": 6
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "New public HTTPS URL."
                  },
                  "events": {
                    "type": "array",
                    "description": "Replacement event list.",
                    "enum": [
                      "message.received",
                      "message.status",
                      "contact.created",
                      "lead.created",
                      "order.paid",
                      "ticket.created",
                      "ticket.status",
                      "template.status",
                      "channel.status"
                    ],
                    "items": {}
                  },
                  "description": {
                    "type": "string",
                    "description": "Description."
                  },
                  "status": {
                    "type": "string",
                    "description": "Pause or activate.",
                    "enum": [
                      "active",
                      "paused"
                    ],
                    "examples": [
                      "paused"
                    ]
                  }
                },
                "required": []
              },
              "example": {
                "status": "paused"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 6,
                    "object": "webhook",
                    "url": "https://toko-anda.id/klikflow/webhook",
                    "description": "Server toko",
                    "events": [
                      "message.received",
                      "message.status",
                      "order.paid"
                    ],
                    "status": "paused",
                    "paused_reason": "Dijeda oleh tim.",
                    "health": "Dijeda",
                    "failed_count": 0,
                    "created_at": "2026-11-01T02:00:00.000Z",
                    "last_success_at": "2026-11-01T02:12:04.000Z",
                    "last_failure_at": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_json",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_json": {
                    "summary": "Body is not valid JSON",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_json",
                        "message": "Body is not valid JSON",
                        "doc_url": "/docs/api/error#invalid_json",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, live_key_required",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "live_key_required": {
                    "summary": "Live key required",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "live_key_required",
                        "message": "Live key required",
                        "doc_url": "/docs/api/error#live_key_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "webhooks:manage"
      },
      "delete": {
        "operationId": "v2-webhook-delete",
        "summary": "Delete a webhook",
        "description": "Delete a webhook together with its delivery log.\n\nLater events are no longer sent to this URL. This cannot be undone.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Webhook id.",
            "schema": {
              "type": "integer"
            },
            "example": 6
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "id": 6,
                    "object": "webhook",
                    "deleted": true
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, live_key_required",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "live_key_required": {
                    "summary": "Live key required",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "live_key_required",
                        "message": "Live key required",
                        "doc_url": "/docs/api/error#live_key_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "webhooks:manage"
      }
    },
    "/api/v2/webhooks/{id}/test": {
      "post": {
        "operationId": "v2-webhook-test",
        "summary": "Send a test event",
        "description": "Send a sample of one event (marked `test: true`) now, then see your system's response.\n\nThe sample is the same as in the Webhook events guide. Test events are not retried when they fail and do not count toward the webhook's health.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Webhook id.",
            "schema": {
              "type": "integer"
            },
            "example": 6
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "A unique key per request (for example a UUID), kept 24 hours: a retry with the same key never sends twice.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "event": {
                    "type": "string",
                    "description": "The event to sample, default `message.received`.",
                    "enum": [
                      "message.received",
                      "message.status",
                      "contact.created",
                      "lead.created",
                      "order.paid",
                      "ticket.created",
                      "ticket.status",
                      "template.status",
                      "channel.status"
                    ],
                    "examples": [
                      "order.paid"
                    ]
                  }
                },
                "required": []
              },
              "example": {
                "event": "order.paid"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "object": "webhook_delivery",
                    "event_id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                    "event": "order.paid",
                    "test": true,
                    "succeeded": true,
                    "status_code": 200,
                    "error": null,
                    "duration_ms": 182
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, scope_missing, permission_missing, live_key_required",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "scope_missing": {
                    "summary": "Key lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "scope_missing",
                        "message": "Key lacks this permission",
                        "doc_url": "/docs/api/error#scope_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "permission_missing": {
                    "summary": "Key creator's role lacks this permission",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "permission_missing",
                        "message": "Key creator's role lacks this permission",
                        "doc_url": "/docs/api/error#permission_missing",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "live_key_required": {
                    "summary": "Live key required",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "live_key_required",
                        "message": "Live key required",
                        "doc_url": "/docs/api/error#live_key_required",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_found",
            "content": {
              "application/json": {
                "examples": {
                  "not_found": {
                    "summary": "Not found",
                    "value": {
                      "error": {
                        "type": "not_found_error",
                        "code": "not_found",
                        "message": "Not found",
                        "doc_url": "/docs/api/error#not_found",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "invalid_request",
            "content": {
              "application/json": {
                "examples": {
                  "invalid_request": {
                    "summary": "Invalid field",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "invalid_request",
                        "message": "Invalid field",
                        "doc_url": "/docs/api/error#invalid_request",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": [
          "WhatsApp sending API"
        ],
        "x-klikflow-scope": "webhooks:manage"
      }
    },
    "/api/v2/me": {
      "get": {
        "operationId": "v2-me",
        "summary": "My key",
        "description": "The key type, the permissions it can use right now, and the channels it may use.\n\nCall this first to make sure the key is correct. `usable: false` means the key creator's role no longer has that permission.",
        "tags": [
          "API v2"
        ],
        "security": [
          {
            "apiKey": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "object": "api_key",
                    "name": "Toko online",
                    "prefix": "kf_test_Ab3dEf",
                    "mode": "test",
                    "business_id": 7,
                    "scopes": [
                      {
                        "scope": "messages:send",
                        "usable": true
                      }
                    ],
                    "channels": [
                      {
                        "id": "waba:3",
                        "channel": "whatsapp_official",
                        "name": "Toko Rina Official",
                        "connected": true
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "missing_key, key_invalid, key_revoked, key_expired, member_inactive",
            "content": {
              "application/json": {
                "examples": {
                  "missing_key": {
                    "summary": "API key not sent",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "missing_key",
                        "message": "API key not sent",
                        "doc_url": "/docs/api/error#missing_key",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_invalid": {
                    "summary": "Unknown API key",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_invalid",
                        "message": "Unknown API key",
                        "doc_url": "/docs/api/error#key_invalid",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_revoked": {
                    "summary": "API key revoked",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_revoked",
                        "message": "API key revoked",
                        "doc_url": "/docs/api/error#key_revoked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "key_expired": {
                    "summary": "API key expired",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "key_expired",
                        "message": "API key expired",
                        "doc_url": "/docs/api/error#key_expired",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "member_inactive": {
                    "summary": "Key creator is no longer a member",
                    "value": {
                      "error": {
                        "type": "authentication_error",
                        "code": "member_inactive",
                        "message": "Key creator is no longer a member",
                        "doc_url": "/docs/api/error#member_inactive",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "ip_not_allowed, plan_no_api, tenant_blocked, console_test_only",
            "content": {
              "application/json": {
                "examples": {
                  "ip_not_allowed": {
                    "summary": "Server IP not in the key's list",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "ip_not_allowed",
                        "message": "Server IP not in the key's list",
                        "doc_url": "/docs/api/error#ip_not_allowed",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "plan_no_api": {
                    "summary": "Plan does not include the API for live keys",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "plan_no_api",
                        "message": "Plan does not include the API for live keys",
                        "doc_url": "/docs/api/error#plan_no_api",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "tenant_blocked": {
                    "summary": "Business access suspended",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "tenant_blocked",
                        "message": "Business access suspended",
                        "doc_url": "/docs/api/error#tenant_blocked",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  },
                  "console_test_only": {
                    "summary": "The Try it console takes test keys only",
                    "value": {
                      "error": {
                        "type": "permission_error",
                        "code": "console_test_only",
                        "message": "The Try it console takes test keys only",
                        "doc_url": "/docs/api/error#console_test_only",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited",
            "content": {
              "application/json": {
                "examples": {
                  "rate_limited": {
                    "summary": "Too many requests per minute",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "message": "Too many requests per minute",
                        "doc_url": "/docs/api/error#rate_limited",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "internal_error",
            "content": {
              "application/json": {
                "examples": {
                  "internal_error": {
                    "summary": "Problem at Klik Flow",
                    "value": {
                      "error": {
                        "type": "api_error",
                        "code": "internal_error",
                        "message": "Problem at Klik Flow",
                        "doc_url": "/docs/api/error#internal_error",
                        "request_id": "req_8Kx2Qm"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-klikflow-plan": []
      }
    }
  },
  "webhooks": {
    "message.received": {
      "post": {
        "operationId": "webhook-message-received",
        "summary": "Message received",
        "description": "A customer sends a message on WhatsApp, live chat, Instagram, Messenger, or Telegram.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "message.received"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "message.received"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "message.received",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "message_id": 99141,
                  "conversation_id": 812,
                  "contact_id": 301,
                  "channel": "whatsapp_official",
                  "from": "6281234567890",
                  "name": "Rina",
                  "type": "text",
                  "text": "Kak, pesanan INV-2207 sudah dikirim?",
                  "has_media": false,
                  "received_at": "2026-11-01T09:12:03+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "message.status": {
      "post": {
        "operationId": "webhook-message-status",
        "summary": "Message status",
        "description": "An outgoing message is sent, delivered, read, or failed.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "message.status"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "message.status"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "message.status",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "message_id": 99140,
                  "conversation_id": 812,
                  "channel": "whatsapp_official",
                  "to": "6281234567890",
                  "status": "read",
                  "error": null,
                  "at": "2026-11-01T09:13:10+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "contact.created": {
      "post": {
        "operationId": "webhook-contact-created",
        "summary": "New contact",
        "description": "A new contact is saved: from a first chat, a form, a store buyer, manual entry, or the API. Bulk imports are not sent.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "contact.created"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "contact.created"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "contact.created",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "contact_id": 301,
                  "name": "Rina",
                  "phone": "6281234567890",
                  "email": "rina@contoh.com",
                  "source_channel": "whatsapp",
                  "created_at": "2026-11-01T09:12:03+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "lead.created": {
      "post": {
        "operationId": "webhook-lead-created",
        "summary": "New lead",
        "description": "A landing page or Bio Link form is submitted, or a WhatsApp chat matches a Smart Link click. Smart Link adds match, confidence, attribution_id, and conversation_id.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "lead.created"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "lead.created"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "lead.created",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "source": "landing_page",
                  "source_id": 14,
                  "source_name": "Promo Ramadan",
                  "submission_id": 902,
                  "contact_id": 301,
                  "name": "Rina",
                  "phone": "6281234567890",
                  "email": "rina@contoh.com",
                  "message": "Mau tanya paket reseller",
                  "fields": [
                    {
                      "label": "Kota",
                      "value": "Bandung"
                    }
                  ],
                  "created_at": "2026-11-01T09:12:03+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "order.paid": {
      "post": {
        "operationId": "webhook-order-paid",
        "summary": "Order paid",
        "description": "Payment for a store order is received (QRIS or marked as paid).\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "order.paid"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "order.paid"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "order.paid",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "order_id": 5521,
                  "number": "INV-2207",
                  "total": 185000,
                  "currency": "IDR",
                  "payment_method": "qris",
                  "customer": {
                    "name": "Rina",
                    "phone": "6281234567890",
                    "email": "rina@contoh.com"
                  },
                  "contact_id": 301,
                  "items": 2,
                  "paid_at": "2026-11-01T09:20:00+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "ticket.created": {
      "post": {
        "operationId": "webhook-ticket-created",
        "summary": "New ticket",
        "description": "A ticket is created from a chat, a form, or by staff.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "ticket.created"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "ticket.created"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "ticket.created",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "ticket_id": 77,
                  "number": "#1077",
                  "subject": "Paket belum sampai",
                  "status": "open",
                  "priority": "high",
                  "source": "chat",
                  "contact_id": 301,
                  "conversation_id": 812,
                  "assignee_id": 5,
                  "created_at": "2026-11-01T09:15:00+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "ticket.status": {
      "post": {
        "operationId": "webhook-ticket-status",
        "summary": "Ticket status",
        "description": "A ticket's status changes, for example to resolved.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "ticket.status"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "ticket.status"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "ticket.status",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "ticket_id": 77,
                  "number": "#1077",
                  "status": "resolved",
                  "previous_status": "open",
                  "at": "2026-11-01T11:40:00+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "template.status": {
      "post": {
        "operationId": "webhook-template-status",
        "summary": "Template status",
        "description": "A WhatsApp Official template is approved, rejected, or paused.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "template.status"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "template.status"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "template.status",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "template_id": 41,
                  "channel_id": "waba:3",
                  "name": "konfirmasi_pesanan",
                  "language": "id",
                  "category": "UTILITY",
                  "status": "APPROVED",
                  "reason": null,
                  "at": "2026-11-01T10:02:00+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    },
    "channel.status": {
      "post": {
        "operationId": "webhook-channel-status",
        "summary": "Channel status",
        "description": "A WhatsApp number connects or disconnects.\n\nSigned with the header Klikflow-Signature: t=<seconds>,v1=<HMAC-SHA256 of \"<t>.<body>\">. Answer 2xx within 8 seconds; otherwise it is sent again, up to 7 times.",
        "tags": [
          "Webhook v2"
        ],
        "parameters": [
          {
            "name": "Klikflow-Event",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "const": "channel.status"
            }
          },
          {
            "name": "Klikflow-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Klikflow-Delivery-Attempt",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 7
            }
          },
          {
            "name": "Klikflow-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "type",
                  "created",
                  "business_id",
                  "data"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "type": {
                    "type": "string",
                    "const": "channel.status"
                  },
                  "created": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "business_id": {
                    "type": "integer"
                  },
                  "test": {
                    "type": "boolean"
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              },
              "example": {
                "id": "evt_9Qx2Lm4Kp7Rt1Zs8",
                "type": "channel.status",
                "created": "2026-11-01T09:13:10+07:00",
                "business_id": 7,
                "data": {
                  "channel_id": "wa:12",
                  "channel": "whatsapp_qr",
                  "name": "CS Toko",
                  "connected": false,
                  "reason": "Perangkat logout dari WhatsApp.",
                  "at": "2026-11-01T08:55:00+07:00"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received (any 2xx counts as success)."
          }
        }
      }
    }
  }
}