{
  "openapi": "3.0.3",
  "info": {
    "title": "W-API — WhatsApp REST API",
    "version": "1.0.0",
    "description": "API REST para integração com o WhatsApp.\n\nAutenticação: header 'Authorization: Bearer SEU_TOKEN' em todas as requisições.\ninstanceId vai como query param: ?instanceId=SEU_INSTANCE_ID",
    "contact": {
      "name": "Suporte W-API",
      "url": "https://w-api.app"
    }
  },
  "servers": [
    {
      "url": "https://api.w-api.app",
      "description": "Produção"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    },
    "parameters": {
      "instanceId": {
        "name": "instanceId",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "ID da instância W-API"
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/v1/instance/fetch-instance": {
      "get": {
        "summary": "Dados da instância",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "T34398-VYR3QD-MS29SL",
                  "instanceName": "Instância teste",
                  "connected": false,
                  "paymentStatus": "PAID",
                  "expires": 1737137931513,
                  "contacts": 0
                }
              }
            }
          }
        }
      }
    },
    "/v1/instance/status-instance": {
      "get": {
        "summary": "Status da instância",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Status",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "T34398-VYR3QD-MS29SL",
                  "connected": true
                }
              }
            }
          }
        }
      }
    },
    "/v1/instance/update-proxy": {
      "put": {
        "summary": "Atualizar proxy da instância",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "useProxy": {
                    "type": "boolean"
                  },
                  "proxyProtocol": {
                    "type": "string"
                  },
                  "proxyHost": {
                    "type": "string"
                  },
                  "proxyPort": {
                    "type": "string"
                  },
                  "proxyUser": {
                    "type": "string"
                  },
                  "proxyPass": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "error": false,
                  "message": "Proxy da instância atualizado com sucesso."
                }
              }
            }
          }
        }
      }
    },
    "/v1/instance/qr-code": {
      "get": {
        "summary": "Conectar com QR CODE",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          },
          {
            "name": "image",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "enable"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "QR Code",
            "content": {
              "application/json": {
                "example": {
                  "qrcode": "data:image/png;base64,..."
                }
              }
            }
          }
        }
      }
    },
    "/v1/instance/pairing-code": {
      "get": {
        "summary": "Conectar por código de emparelhamento",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          },
          {
            "name": "phoneNumber",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Número com DDI. Ex: 5511999999999"
          }
        ],
        "responses": {
          "200": {
            "description": "Código",
            "content": {
              "application/json": {
                "example": {
                  "pairingCode": "12345678"
                }
              }
            }
          }
        }
      }
    },
    "/v1/instance/restart": {
      "get": {
        "summary": "Reiniciar instância",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/instance/disconnect": {
      "get": {
        "summary": "Desconectar (logout)",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/instance/extension-token": {
      "post": {
        "summary": "Gerar token da extensão",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "error": false,
                  "token": "A1B2C3D4"
                }
              }
            }
          }
        }
      }
    },
    "/v1/message/send-text": {
      "post": {
        "summary": "Enviar mensagem de texto",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Número com DDI ou ID de grupo (ex: 1234@g.us)"
                  },
                  "message": {
                    "type": "string"
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para citar/responder"
                  },
                  "delayMessage": {
                    "type": "number",
                    "description": "Delay em segundos (1–15)"
                  }
                },
                "required": [
                  "phone",
                  "message"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Mensagem enfileirada",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "T34398-VYR3QD-MS29SL",
                  "messageId": "A3B9K2X7Q1",
                  "insertedId": "64f7a..."
                }
              }
            }
          },
          "400": {
            "description": "Campo ausente",
            "content": {
              "application/json": {
                "example": {
                  "error": true,
                  "message": "A mensagem é obrigatória."
                }
              }
            }
          }
        }
      }
    },
    "/v1/message/send-image": {
      "post": {
        "summary": "Enviar imagem",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "image": {
                    "type": "string",
                    "description": "URL pública (.jpg/.png) ou base64"
                  },
                  "caption": {
                    "type": "string"
                  },
                  "delayMessage": {
                    "type": "number"
                  }
                },
                "required": [
                  "phone",
                  "image"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "T34398-VYR3QD-MS29SL",
                  "messageId": "A3B9K2X7Q1"
                }
              }
            }
          }
        }
      }
    },
    "/v1/message/send-document": {
      "post": {
        "summary": "Enviar documento",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "document": {
                    "type": "string"
                  },
                  "extension": {
                    "type": "string"
                  },
                  "fileName": {
                    "type": "string"
                  }
                },
                "required": [
                  "phone",
                  "document",
                  "extension"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/message/send-audio": {
      "post": {
        "summary": "Enviar áudio (mensagem de voz)",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "audio": {
                    "type": "string"
                  }
                },
                "required": [
                  "phone",
                  "audio"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/message/send-location": {
      "post": {
        "summary": "Enviar localização",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "lat": {
                    "type": "number"
                  },
                  "lng": {
                    "type": "number"
                  },
                  "address": {
                    "type": "string"
                  }
                },
                "required": [
                  "phone",
                  "lat",
                  "lng"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/message/download-media": {
      "post": {
        "summary": "Baixar mídia recebida",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "messageId": {
                    "type": "string"
                  }
                },
                "required": [
                  "messageId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Mídia em base64",
            "content": {
              "application/json": {
                "example": {
                  "base64": "data:image/jpeg;base64,...",
                  "mimetype": "image/jpeg",
                  "size": 45230
                }
              }
            }
          }
        }
      }
    },
    "/v1/message/send-reaction": {
      "post": {
        "summary": "Reagir a mensagem [PRO]",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "messageId": {
                    "type": "string"
                  },
                  "reaction": {
                    "type": "string"
                  }
                },
                "required": [
                  "phone",
                  "messageId",
                  "reaction"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/message/send-poll": {
      "post": {
        "summary": "Enviar enquete [PRO]",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "options": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "allowMultiple": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "phone",
                  "title",
                  "options"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/message/delete-message": {
      "delete": {
        "summary": "Deletar mensagem [PRO]",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "messageId": {
                    "type": "string"
                  }
                },
                "required": [
                  "phone",
                  "messageId"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/group/get-all-groups": {
      "get": {
        "summary": "Listar grupos",
        "tags": [
          "Grupos"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Lista de grupos",
            "content": {
              "application/json": {
                "example": [
                  {
                    "id": "1234567890@g.us",
                    "name": "Meu Grupo",
                    "participants": 12
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/group/create-group": {
      "post": {
        "summary": "Criar grupo [PRO]",
        "tags": [
          "Grupos"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupName": {
                    "type": "string"
                  },
                  "participants": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "groupName",
                  "participants"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Grupo criado",
            "content": {
              "application/json": {
                "example": {
                  "groupId": "1234567890@g.us",
                  "name": "Novo Grupo"
                }
              }
            }
          }
        }
      }
    },
    "/v1/contacts/phone-exists": {
      "get": {
        "summary": "Verificar se número tem WhatsApp",
        "tags": [
          "Contatos"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          },
          {
            "name": "phone",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Número com DDI. Ex: 5511999999999"
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado",
            "content": {
              "application/json": {
                "example": {
                  "exists": true,
                  "jid": "5511999999999@s.whatsapp.net"
                }
              }
            }
          }
        }
      }
    },
    "/v1/contacts/phone-exists-batch": {
      "post": {
        "summary": "Verificar números em lote [PRO]",
        "tags": [
          "Contatos"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phones": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "phones"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultados",
            "content": {
              "application/json": {
                "example": [
                  {
                    "phone": "5511999999999",
                    "exists": true
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/v1/webhook/update-webhook-received": {
      "put": {
        "summary": "Configurar webhook de mensagens",
        "tags": [
          "Webhooks"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "enabled": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "url",
                  "enabled"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/call/send-call": {
      "post": {
        "summary": "Iniciar chamada perdida",
        "tags": [
          "Chamadas"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string"
                  },
                  "isVideo": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "phone"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso"
          }
        }
      }
    },
    "/v1/quere/quere": {
      "get": {
        "summary": "Listar fila de mensagens",
        "tags": [
          "Fila"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Fila"
          }
        }
      }
    },
    "/v1/quere/delete-quere": {
      "delete": {
        "summary": "Limpar fila",
        "tags": [
          "Fila"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "deleted": 42
                }
              }
            }
          }
        }
      }
    },
    "/v1/integrator/create-instance": {
      "post": {
        "summary": "Criar instância (integrador)",
        "tags": [
          "Integrador"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "instanceName": {
                    "type": "string"
                  },
                  "rejectCalls": {
                    "type": "boolean"
                  },
                  "callMessage": {
                    "type": "string"
                  },
                  "useProxy": {
                    "type": "boolean",
                    "description": "Ativar uso de proxy customizado"
                  },
                  "proxyProtocol": {
                    "type": "string",
                    "example": "socks5"
                  },
                  "proxyHost": {
                    "type": "string"
                  },
                  "proxyPort": {
                    "type": "string"
                  },
                  "proxyUser": {
                    "type": "string"
                  },
                  "proxyPass": {
                    "type": "string"
                  }
                },
                "required": [
                  "instanceName",
                  "rejectCalls",
                  "callMessage"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Instância criada",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "inst_xyz789",
                  "token": "tok_abc...",
                  "instanceName": "Minha Instância"
                }
              }
            }
          }
        }
      }
    },
    "/v1/integrator/instances": {
      "get": {
        "summary": "Listar instâncias (integrador)",
        "tags": [
          "Integrador"
        ],
        "responses": {
          "200": {
            "description": "Lista"
          }
        }
      }
    },
    "/v1/instance/extension-token": {
      "post": {
        "summary": "Gerar Token de Extensão",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/instanceId"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "error": false,
                  "extensionToken": "4j9f82..."
                }
              }
            }
          },
          "400": {
            "description": "Erro",
            "content": {
              "application/json": {
                "example": {
                  "error": true,
                  "message": "O parâmetro instanceId é obrigatório."
                }
              }
            }
          }
        }
      }
    }
  }
}