diff --git a/docs.json b/docs.json index 27b654f..282cdc6 100644 --- a/docs.json +++ b/docs.json @@ -122,7 +122,11 @@ "pages/v2/referencia/notificacao/endpoint/post-push", "pages/v2/referencia/notificacao/endpoint/post-push-individual", "pages/v2/referencia/notificacao/endpoint/post-in-app-messaging", - "pages/v2/referencia/notificacao/endpoint/post-in-app-messaging-individual" + "pages/v2/referencia/notificacao/endpoint/post-in-app-messaging-individual", + "pages/v2/referencia/notificacao/endpoint/post-condutor-push", + "pages/v2/referencia/notificacao/endpoint/post-condutor-push-individual", + "pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging", + "pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging-individual" ] }, { diff --git a/pages/v2/changelog.mdx b/pages/v2/changelog.mdx index 72fcce2..74fe338 100644 --- a/pages/v2/changelog.mdx +++ b/pages/v2/changelog.mdx @@ -220,6 +220,80 @@ export const EndpointBadge = ({ method, path, href }) => ( + +

+ Envio de notificação para condutores +

+

+ Novos endpoints para notificar condutores, em lote ou individualmente, com push comum e in-app messaging. + Recebem a notificação os condutores da bandeira da sua chave de API (ou de suas filiais) que tenham + aplicativo com token de notificação registrado. +

+ + + + +

Campos aceitos no corpo da requisição:

+
    +
  • — obrigatório. Lista de identificadores dos condutores, limite de 1000 itens.
  • +
  • — opcional. Título da notificação, limite de 40 caracteres.
  • +
  • — obrigatório. Mensagem da notificação, limite de 255 caracteres.
  • +
+
+ +
+ + + +

Campos aceitos no corpo da requisição:

+
    +
  • — obrigatório. Identificador numérico do condutor que receberá a notificação.
  • +
  • — opcional. Título da notificação, limite de 40 caracteres.
  • +
  • — obrigatório. Mensagem da notificação, limite de 255 caracteres.
  • +
+
+
+ +
+ + + +

Campos aceitos no corpo da requisição:

+
    +
  • — obrigatório. Lista de identificadores dos condutores, limite de 1000 itens.
  • +
  • — obrigatório. Título da notificação, limite de 40 caracteres.
  • +
  • — obrigatório. Conteúdo principal da notificação, limite de 255 caracteres.
  • +
  • — opcional. URL de imagem exibida na notificação.
  • +
  • — opcional. Vincula a notificação a uma solicitação; quando informado, só é exibida se a solicitação estiver em andamento.
  • +
  • — opcional. Título do botão de redirecionamento, limite de 20 caracteres.
  • +
  • — opcional. Link acionado pelo botão de redirecionamento.
  • +
+
+
+ +
+ + + +

+ Mesmos campos do envio em lote, trocando por . +

+
+
+ +
+ Nota: informar ou torna os dois obrigatórios. Quando nenhum condutor informado tem token de notificação registrado, a resposta é 404 e nada é enviado. Uma falha ao resolver o projeto de notificação do app do condutor devolve 503. +
+
+

Envio de notificação para um único passageiro diff --git a/pages/v2/openapi-corridas.json b/pages/v2/openapi-corridas.json index 9ce2704..422736e 100644 --- a/pages/v2/openapi-corridas.json +++ b/pages/v2/openapi-corridas.json @@ -6408,6 +6408,772 @@ } } }, + "/notificacoes/condutor/push": { + "post": { + "summary": "Enviar notificação push para condutores", + "description": "Envia notificação push para uma lista de condutores. Só recebem a notificação os condutores da bandeira da chave de API (ou de suas filiais) que tenham aplicativo com token de notificação registrado.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "condutores", + "mensagem" + ], + "properties": { + "condutores": { + "type": "array", + "description": "Lista de condutores que receberão a notificação. Deve conter ao menos um item e todos os itens devem ser numéricos. Limite máximo de 1000 itens.", + "minItems": 1, + "maxItems": 1000, + "items": { + "type": "integer" + } + }, + "titulo": { + "type": "string", + "description": "Título da notificação.", + "maxLength": 40 + }, + "mensagem": { + "type": "string", + "description": "Mensagem da notificação.", + "maxLength": 255 + } + } + }, + "example": { + "condutores": [ + 123, + 456, + 789 + ], + "titulo": "Aviso da central", + "mensagem": "Nova regra de escala a partir de segunda." + } + } + } + }, + "responses": { + "200": { + "description": "Notificação enviada com sucesso", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": true, + "message": "Push enviado com sucesso", + "__links": [ + { + "rel": "self", + "href": "api/v2/integracao/notificacoes/condutor/push", + "metodo": "post" + }, + { + "rel": "enviar-push-condutor-individual", + "href": "api/v2/integracao/notificacoes/condutor/push/individual", + "metodo": "post" + }, + { + "rel": "enviar-in-app-messaging-condutores", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging", + "metodo": "post" + }, + { + "rel": "enviar-in-app-messaging-condutor-individual", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging/individual", + "metodo": "post" + } + ] + } + } + } + }, + "400": { + "description": "Erro de validação", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "examples": { + "condutores_obrigatorio": { + "summary": "Lista de condutores ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'condutores': Preenchimento obrigatório" + } + ] + } + }, + "condutores_vazio": { + "summary": "Lista de condutores vazia", + "value": { + "success": false, + "errors": [ + { + "code": 0, + "message": "'condutores': Informe ao menos um condutor." + } + ] + } + }, + "condutor_invalido": { + "summary": "Item da lista não é numérico", + "value": { + "success": false, + "errors": [ + { + "code": 0, + "message": "'condutores.1': Deve ser numérico." + } + ] + } + }, + "mensagem_obrigatoria": { + "summary": "Campo mensagem ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'mensagem': Preenchimento obrigatório" + } + ] + } + } + } + } + } + }, + "404": { + "description": "Nenhum condutor informado possui token de notificação registrado", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Nenhum token FCM encontrado para os condutores informados" + } + ] + } + } + } + }, + "503": { + "description": "Não foi possível resolver o projeto de notificação do aplicativo do condutor", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Não foi possível resolver o projeto Firebase do aplicativo do condutor" + } + ] + } + } + } + } + } + } + }, + "/notificacoes/condutor/push/individual": { + "post": { + "summary": "Enviar notificação push para um condutor", + "description": "Envia notificação push para um único condutor identificado pelo `condutor_id`.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "condutor_id", + "mensagem" + ], + "properties": { + "condutor_id": { + "type": "integer", + "description": "Identificador do condutor que receberá a notificação. Deve ser numérico." + }, + "titulo": { + "type": "string", + "description": "Título da notificação.", + "maxLength": 40 + }, + "mensagem": { + "type": "string", + "description": "Mensagem da notificação.", + "maxLength": 255 + } + } + }, + "example": { + "condutor_id": 123, + "titulo": "Aviso da central", + "mensagem": "Nova regra de escala a partir de segunda." + } + } + } + }, + "responses": { + "200": { + "description": "Notificação enviada com sucesso", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": true, + "message": "Push enviado com sucesso", + "__links": [ + { + "rel": "self", + "href": "api/v2/integracao/notificacoes/condutor/push/individual", + "metodo": "post" + }, + { + "rel": "enviar-push-condutores", + "href": "api/v2/integracao/notificacoes/condutor/push", + "metodo": "post" + }, + { + "rel": "enviar-in-app-messaging-condutores", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging", + "metodo": "post" + }, + { + "rel": "enviar-in-app-messaging-condutor-individual", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging/individual", + "metodo": "post" + } + ] + } + } + } + }, + "400": { + "description": "Erro de validação", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "examples": { + "condutor_id_obrigatorio": { + "summary": "Campo condutor_id ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'condutor_id': Preenchimento obrigatório" + } + ] + } + }, + "condutor_invalido": { + "summary": "condutor_id não é numérico", + "value": { + "success": false, + "errors": [ + { + "code": 0, + "message": "'condutor_id': Deve ser numérico." + } + ] + } + }, + "mensagem_obrigatoria": { + "summary": "Campo mensagem ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'mensagem': Preenchimento obrigatório" + } + ] + } + } + } + } + } + }, + "404": { + "description": "Nenhum condutor informado possui token de notificação registrado", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Nenhum token FCM encontrado para os condutores informados" + } + ] + } + } + } + }, + "503": { + "description": "Não foi possível resolver o projeto de notificação do aplicativo do condutor", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Não foi possível resolver o projeto Firebase do aplicativo do condutor" + } + ] + } + } + } + } + } + } + }, + "/notificacoes/condutor/in-app-messaging": { + "post": { + "summary": "Enviar notificação in-app para condutores", + "description": "Envia notificação in-app para uma lista de condutores. A notificação é silenciosa: é o aplicativo do condutor que a exibe.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "condutores", + "titulo", + "body" + ], + "properties": { + "condutores": { + "type": "array", + "description": "Lista de condutores que receberão a notificação. Deve conter ao menos um item e todos os itens devem ser numéricos. Limite máximo de 1000 itens.", + "minItems": 1, + "maxItems": 1000, + "items": { + "type": "integer" + } + }, + "titulo": { + "type": "string", + "description": "Título da notificação.", + "maxLength": 40 + }, + "body": { + "type": "string", + "description": "Conteúdo principal da notificação.", + "maxLength": 255 + }, + "url_imagem": { + "type": "string", + "format": "uri", + "description": "URL de imagem exibida na notificação." + }, + "solicitacao_id": { + "type": "integer", + "description": "Vincula a notificação a uma solicitação. Quando informado, a notificação só é exibida se a solicitação estiver em andamento." + }, + "titulo_botao_redirecionamento": { + "type": "string", + "description": "Título do botão de redirecionamento. Obrigatório quando `link_redirecionamento` é informado.", + "maxLength": 20 + }, + "link_redirecionamento": { + "type": "string", + "description": "Link acionado pelo botão de redirecionamento. Obrigatório quando `titulo_botao_redirecionamento` é informado." + } + } + }, + "example": { + "condutores": [ + 123, + 456 + ], + "titulo": "Bônus da semana", + "body": "Complete 20 corridas e receba um bônus.", + "url_imagem": "https://exemplo.com/banner.png", + "titulo_botao_redirecionamento": "Ver regras", + "link_redirecionamento": "https://exemplo.com/bonus" + } + } + } + }, + "responses": { + "200": { + "description": "Notificação enviada com sucesso", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": true, + "message": "In-App Messaging enviado com sucesso", + "__links": [ + { + "rel": "self", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging", + "metodo": "post" + }, + { + "rel": "enviar-push-condutores", + "href": "api/v2/integracao/notificacoes/condutor/push", + "metodo": "post" + }, + { + "rel": "enviar-push-condutor-individual", + "href": "api/v2/integracao/notificacoes/condutor/push/individual", + "metodo": "post" + }, + { + "rel": "enviar-in-app-messaging-condutor-individual", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging/individual", + "metodo": "post" + } + ] + } + } + } + }, + "400": { + "description": "Erro de validação", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "examples": { + "titulo_obrigatorio": { + "summary": "Campo titulo ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'titulo': Preenchimento obrigatório" + } + ] + } + }, + "body_obrigatorio": { + "summary": "Campo body ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'body': Preenchimento obrigatório" + } + ] + } + }, + "url_imagem_invalida": { + "summary": "url_imagem não é uma URL", + "value": { + "success": false, + "errors": [ + { + "code": 0, + "message": "'url_imagem': URL inválida." + } + ] + } + }, + "redirecionamento_incompleto": { + "summary": "Par de redirecionamento incompleto", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'titulo_botao_redirecionamento': Preenchimento obrigatório" + } + ] + } + } + } + } + } + }, + "404": { + "description": "Nenhum condutor informado possui token de notificação registrado", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Nenhum token FCM encontrado para os condutores informados" + } + ] + } + } + } + }, + "503": { + "description": "Não foi possível resolver o projeto de notificação do aplicativo do condutor", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Não foi possível resolver o projeto Firebase do aplicativo do condutor" + } + ] + } + } + } + } + } + } + }, + "/notificacoes/condutor/in-app-messaging/individual": { + "post": { + "summary": "Enviar notificação in-app para um condutor", + "description": "Envia notificação in-app para um único condutor identificado pelo `condutor_id`. A notificação é silenciosa: é o aplicativo do condutor que a exibe.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "condutor_id", + "titulo", + "body" + ], + "properties": { + "condutor_id": { + "type": "integer", + "description": "Identificador do condutor que receberá a notificação. Deve ser numérico." + }, + "titulo": { + "type": "string", + "description": "Título da notificação.", + "maxLength": 40 + }, + "body": { + "type": "string", + "description": "Conteúdo principal da notificação.", + "maxLength": 255 + }, + "url_imagem": { + "type": "string", + "format": "uri", + "description": "URL de imagem exibida na notificação." + }, + "solicitacao_id": { + "type": "integer", + "description": "Vincula a notificação a uma solicitação. Quando informado, a notificação só é exibida se a solicitação estiver em andamento." + }, + "titulo_botao_redirecionamento": { + "type": "string", + "description": "Título do botão de redirecionamento. Obrigatório quando `link_redirecionamento` é informado.", + "maxLength": 20 + }, + "link_redirecionamento": { + "type": "string", + "description": "Link acionado pelo botão de redirecionamento. Obrigatório quando `titulo_botao_redirecionamento` é informado." + } + } + }, + "example": { + "condutor_id": 123, + "titulo": "Bônus da semana", + "body": "Complete 20 corridas e receba um bônus." + } + } + } + }, + "responses": { + "200": { + "description": "Notificação enviada com sucesso", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": true, + "message": "In-App Messaging enviado com sucesso", + "__links": [ + { + "rel": "self", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging/individual", + "metodo": "post" + }, + { + "rel": "enviar-push-condutores", + "href": "api/v2/integracao/notificacoes/condutor/push", + "metodo": "post" + }, + { + "rel": "enviar-push-condutor-individual", + "href": "api/v2/integracao/notificacoes/condutor/push/individual", + "metodo": "post" + }, + { + "rel": "enviar-in-app-messaging-condutores", + "href": "api/v2/integracao/notificacoes/condutor/in-app-messaging", + "metodo": "post" + } + ] + } + } + } + }, + "400": { + "description": "Erro de validação", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "examples": { + "condutor_id_obrigatorio": { + "summary": "Campo condutor_id ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'condutor_id': Preenchimento obrigatório" + } + ] + } + }, + "titulo_obrigatorio": { + "summary": "Campo titulo ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'titulo': Preenchimento obrigatório" + } + ] + } + }, + "body_obrigatorio": { + "summary": "Campo body ausente", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'body': Preenchimento obrigatório" + } + ] + } + }, + "url_imagem_invalida": { + "summary": "url_imagem não é uma URL", + "value": { + "success": false, + "errors": [ + { + "code": 0, + "message": "'url_imagem': URL inválida." + } + ] + } + }, + "redirecionamento_incompleto": { + "summary": "Par de redirecionamento incompleto", + "value": { + "success": false, + "errors": [ + { + "code": 2, + "message": "'titulo_botao_redirecionamento': Preenchimento obrigatório" + } + ] + } + } + } + } + } + }, + "404": { + "description": "Nenhum condutor informado possui token de notificação registrado", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Nenhum token FCM encontrado para os condutores informados" + } + ] + } + } + } + }, + "503": { + "description": "Não foi possível resolver o projeto de notificação do aplicativo do condutor", + "content": { + "application/json": { + "schema": { + "type": "object" + }, + "example": { + "success": false, + "errors": [ + { + "code": 0, + "message": "Não foi possível resolver o projeto Firebase do aplicativo do condutor" + } + ] + } + } + } + } + } + } + }, "/webhooks": { "get": { "summary": "Listar webhooks", diff --git a/pages/v2/referencia/introducao.mdx b/pages/v2/referencia/introducao.mdx index 577c85f..c07ca1e 100644 --- a/pages/v2/referencia/introducao.mdx +++ b/pages/v2/referencia/introducao.mdx @@ -287,8 +287,13 @@ Os valores da tabela são **limites base**. O limite efetivo de cada grupo é o | Notificações (in-app e push) | `/api/v2/integracao/notificacoes/in-app-messaging`
`/api/v2/integracao/notificacoes/push` | 20 * fator requisições por minuto | | In-app messaging (individual) | `/api/v2/integracao/notificacoes/in-app-messaging/individual` | 200 * fator requisições por minuto | | Push (individual) | `/api/v2/integracao/notificacoes/push/individual` | 200 * fator requisições por minuto | +| In-app messaging para condutores | `/api/v2/integracao/notificacoes/condutor/in-app-messaging` | 100 * fator requisições por minuto | +| In-app messaging para condutores (individual) | `/api/v2/integracao/notificacoes/condutor/in-app-messaging/individual` | 200 * fator requisições por minuto | +| Push para condutores (individual) | `/api/v2/integracao/notificacoes/condutor/push/individual` | 200 * fator requisições por minuto | | Padrão | `/api/v2/integracao/*` | 1000 * fator requisições por minuto | +O envio em massa de push para condutores (`/api/v2/integracao/notificacoes/condutor/push`) não possui regra dedicada e segue o limite do grupo Padrão. + --- diff --git a/pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging-individual.mdx b/pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging-individual.mdx new file mode 100644 index 0000000..d1c7030 --- /dev/null +++ b/pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging-individual.mdx @@ -0,0 +1,5 @@ +--- +title: 'Enviar notificação in-app para um condutor' +tag: '2026-08-05' +openapi: 'pages/v2/openapi-corridas.json POST /notificacoes/condutor/in-app-messaging/individual' +--- diff --git a/pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging.mdx b/pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging.mdx new file mode 100644 index 0000000..a51f694 --- /dev/null +++ b/pages/v2/referencia/notificacao/endpoint/post-condutor-in-app-messaging.mdx @@ -0,0 +1,5 @@ +--- +title: 'Enviar notificação in-app para condutores' +tag: '2026-08-05' +openapi: 'pages/v2/openapi-corridas.json POST /notificacoes/condutor/in-app-messaging' +--- diff --git a/pages/v2/referencia/notificacao/endpoint/post-condutor-push-individual.mdx b/pages/v2/referencia/notificacao/endpoint/post-condutor-push-individual.mdx new file mode 100644 index 0000000..e8bf72a --- /dev/null +++ b/pages/v2/referencia/notificacao/endpoint/post-condutor-push-individual.mdx @@ -0,0 +1,5 @@ +--- +title: 'Enviar notificação push para um condutor' +tag: '2026-08-05' +openapi: 'pages/v2/openapi-corridas.json POST /notificacoes/condutor/push/individual' +--- diff --git a/pages/v2/referencia/notificacao/endpoint/post-condutor-push.mdx b/pages/v2/referencia/notificacao/endpoint/post-condutor-push.mdx new file mode 100644 index 0000000..6e24642 --- /dev/null +++ b/pages/v2/referencia/notificacao/endpoint/post-condutor-push.mdx @@ -0,0 +1,5 @@ +--- +title: 'Enviar notificação push para condutores' +tag: '2026-08-05' +openapi: 'pages/v2/openapi-corridas.json POST /notificacoes/condutor/push' +---