Atualizar Webhook
Descrição: Cadastra ou atualiza o gatilho de determinado evento (comportamento de upsert).
Este endpoint é um upsert. O registro é localizado por cooperativa + evento (
webhook_eventdo corpo; oiddo webhook não é usado). Se já existir um webhook ativo para aquele evento na cooperativa, ele é atualizado; se não existir, o webhook é criado — e nos dois casos a resposta é204 No Content. Um204portanto não confirma que existia um cadastro anterior.
Endpoint
Regras
| Atributo | Descrição | Tipo | Obrigatório | Validações |
|---|---|---|---|---|
| webhook_event | Evento que irá gerar o disparo do gatilho | string | Sim | Valores válidos: CREATE_PRODUCER, UPDATE_PRODUCER, DELETE_PRODUCER, CREATE_WAREHOUSE, UPDATE_WAREHOUSE, DELETE_WAREHOUSE, CREATE_FARM, UPDATE_FARM, DELETE_FARM, CREATE_GUEST_USER, UPDATE_GUEST_USER, DELETE_GUEST_USER, CREATE_DELIVERY_PLACE, UPDATE_DELIVERY_PLACE, DELETE_DELIVERY_PLACE, CREATE_ORDER_COMMITMENT, UPDATE_ORDER_COMMITMENT, DELETE_ORDER_COMMITMENT, CREATE_WALLET, UPDATE_WALLET, DELETE_WALLET, UPDATE_WORKFLOW_ORDER_COMMITMENT, CHANGE_PRODUCER_STATUS_ESG, CHANGE_FARM_STATUS_ESG, PRODUCER_PRODUCTION |
| url | URI do cliente que deverá ser acionada quando o evento ocorrer | string | Sim | Ex: https://api.cliente.com/api/v1/receive (Deverá aceitar requisições do tipo POST.) Máximo de 250 caracteres — a coluna é VARCHAR(250) e não há validação de tamanho na entrada: uma URL maior faz a requisição falhar com 500. |
| basic_authentication | Se preenchido, utilizaremos essa informação para passar no header via basic auth | string | Não |
Exemplo de Requisição
- cURL
- Java
- JavaScript
- Python
curl -X PUT \
-H "Authorization: {SUA_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"webhook_event": "CREATE_FARM",
"url": "https://api.cliente.com/api/v1/receive",
"basic_authentication": "usuário:senha"
}' \
"https://api.merx.tech/api/v1/integration/webhooks"
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String body = "{"
+ "\"webhook_event\": \"CREATE_FARM\","
+ "\"url\": \"https://api.cliente.com/api/v1/receive\","
+ "\"basic_authentication\": \"usuário:senha\""
+ "}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.merx.tech/api/v1/integration/webhooks"))
.header("Authorization", "{SUA_API_KEY}")
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpClient client = HttpClient.newHttpClient();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
} catch (Exception e) {
e.printStackTrace();
}
const response = await fetch(
'https://api.merx.tech/api/v1/integration/webhooks',
{
method: 'PUT',
headers: {
'Authorization': '{SUA_API_KEY}',
'Content-Type': 'application/json',
},
body: JSON.stringify({
webhook_event: 'CREATE_FARM',
url: 'https://api.cliente.com/api/v1/receive',
basic_authentication: 'usuário:senha',
}),
}
);
console.log(response.status);
import requests
url = "https://api.merx.tech/api/v1/integration/webhooks"
headers = {
"Authorization": "{SUA_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"webhook_event": "CREATE_FARM",
"url": "https://api.cliente.com/api/v1/receive",
"basic_authentication": "usuário:senha"
}
response = requests.put(url, json=payload, headers=headers)
print(response.status_code)
Parâmetros
Parâmetros de Cabeçalho
| Nome | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| Authorization | Chave de API obtida via support-api@merx.tech | String | Sim |
| Content-Type | application/json | String | Sim |
Parâmetros do Corpo
| Nome | Descrição | Tipo | Obrigatório |
|---|---|---|---|
| webhook_event | Evento que irá gerar o disparo do gatilho | String | Sim |
| url | URI do cliente que deverá ser acionada quando o evento ocorrer | String | Sim |
| basic_authentication | Credencial de autenticação básica para o header da chamada ao cliente (opcional) | String | Não |
Sobrescrita total:
urlebasic_authenticationsão sempre gravados com o que vier no corpo. Não há atualização parcial — omitirbasic_authentication(ou enviá-lo vazio) apaga a credencial que estava cadastrada. Para preservar a autenticação básica, reenvie-a a cadaPUT.Armazenamento: o valor de
basic_authenticationé codificado em Base64 antes de ser armazenado, e é esse Base64 que a Merx envia no headerAuthorization: Basic <base64>das entregas. Envie sempre no formato clarousuário:senha— codificar antes resultaria em uma credencial duplamente codificada. Nas consultas (GET), o campo retorna já em Base64.
Respostas
- 204 - No Content
Sem corpo. Devolvido tanto quando o webhook existente é atualizado quanto quando ele é criado por não existir cadastro para aquele evento.
- 400 - Bad Request
Campo obrigatório ausente ou vazio no corpo:
{
"messages": ["message.webhook-event.mandatory"]
}
{
"messages": ["message.url.mandatory"]
}
- 401 - Unauthorized
Devolvido pelo gateway quando o Authorization está ausente ou inválido — nesse caso a resposta traz corpo, no formato {"data": [], "error": {...}}. A mensagem dentro de error varia conforme o plugin de autenticação da rota, então não programe em cima do texto.
- 404 - Not Found
Ocorre apenas quando o valor de webhook_event não corresponde a nenhum evento cadastrado na plataforma:
{
"messages": ["message.event.not-found"]
}
Webhook inexistente nunca gera 404 neste endpoint: nesse caso o registro é criado e a resposta é
204.