Skip to main content

API de Missões

Os exemplos abaixo mostram o cabeçalho no formato de rede Authorization: P2S-SIGN-V1 API_KEY:TIMESTAMP:SIGNATURE. Para calcular a assinatura no seu código, use o helper signedRequest em Autenticação.
A API de Missões permite que o seu backend leia o estado das missões de gamificação dos seus vendedores no SalesOS — quais objetivos estão abertos hoje, quanto já avançou cada um, o que já foi concluído e qual missão destacar em seguida. Ela foi feita para compor as suas próprias telas (por exemplo, um bloco na home mostrando “3 de 6 missões concluídas”) antes mesmo de o usuário abrir o módulo do SalesOS. É uma API somente leitura, servidor a servidor: você consulta colaboradores por CPF ou e-mail, em lote, e o SalesOS responde com as missões cuja janela de período contém o dia de hoje, calculado no fuso horário da sua empresa.

Como funciona

  1. Você recebe uma API Key com o escopo missions:read (Admin > Integrações > API Keys)
  2. Seu backend consulta o estado das missões de um ou vários colaboradores (por CPF ou e-mail)
  3. O SalesOS responde com as missões de hoje por colaborador — contadores de progresso, a lista completa e a próxima missão ativa
As missões avançam pela atividade dentro do SalesOS: o motor escuta eventos (uma visita agendada, uma venda fechada) e incrementa a missão correspondente. Esta API é para ler esse estado — combine com um deep link para o módulo do SalesOS na hora da ação.
Este endpoint nunca cria missões. Se as missões do dia de um colaborador ainda não foram provisionadas, a resposta é uma lista vazia com progress.total = 0 — não é erro, e não é uma escrita silenciosa.

Autenticação

Todas as requisições exigem uma API Key no cabeçalho Authorization:
Veja a página de Autenticação para detalhes sobre criar e gerenciar API Keys.

Ambientes

URL base: https://api.play2sell.com

Referência do endpoint

O endpoint aceita duas ações no campo action: missions_status e missions_summary. Cada colaborador é identificado por CPF (em qualquer formato — os dígitos são normalizados) ou e-mail. Quando os dois são enviados, o CPF prevalece.

Ação: missions_status

As missões cuja janela de período contém o dia de hoje, por colaborador. “Hoje” é calculado no fuso horário da sua empresa (devolvido em timezone / reference_date na resposta) — nunca em UTC.

Esquema da requisição

string
obrigatório
Deve ser "missions_status"
array
obrigatório
Lista de referências de colaboradores (máximo 500 — 100 quando include_missions está ligado)
boolean
padrão:"false"
Devolve a lista completa missions[]. Desligado por padrão: cada colaborador tem várias missões, então um lote grande com a lista ligada vira uma resposta de megabytes. progress e next_mission vêm sempre.
string
CPF, em qualquer formato (52998224725 ou 529.982.247-25). Deve conter exatamente 11 dígitos.
string
E-mail — usado apenas quando o cpf está ausente

Exemplo

Resposta (200):

Campos da resposta

A lista completa é opt-in. Por padrão a resposta traz apenas progress e next_mission — o suficiente para desenhar uma tela inicial. Peça include_missions: true quando precisar de todas as missões, e conte com um limite de lote menor (100 em vez de 500), porque cada colaborador carrega várias missões.
As recompensas são personalizadas — exiba sempre points_reward, nunca nominal_reward. O alvo de uma missão pode ser adaptado por colaborador, e a recompensa acompanha: quem teve o alvo reduzido pela metade ganha metade dos pontos. points_reward é o que será realmente creditado; nominal_reward é o número configurado na definição, enviado só para você poder indicar “meta reduzida” se quiser. São os mesmos nomes de campo que o webhook mission.completed usa, então os dois canais concordam.
A recompensa é paga em parcelas, então “conquistado” e “ainda a conquistar” são números diferentes. Uma missão de 100 pontos com meta 5 credita 20 a cada passo. Depois de um passo, o colaborador conquistou 20 e ainda tem 80 a conquistarpoints_earned conta os 20, points_available conta os 80. Somar os 100 cheios nos dois lados contaria os mesmos pontos duas vezes.
pending_approval não é completed. Algumas missões exigem aprovação do gestor antes de creditar os pontos, e o crédito acontece na data da aprovação. Reportar em separado permite exibir “aguardando aprovação” sem inventar a distinção.
Nomes de missão, categorias, ícones, recompensas, metas e ordem de exibição são configurados por empresa. Nunca deixe esses valores fixos no seu cliente — renderize o que vier na resposta, para que uma mudança no SalesOS não exija uma nova versão do app.

Ação: missions_summary

Tudo o que missions_status devolve, mais os contadores de conclusão da semana e do mês. Útil para uma faixa de “seu mês até aqui”. As missões são contadas no período a que pertencem (a janela delas), não na data em que foram aprovadas — então uma missão aprovada com atraso continua contando na semana em que foi conquistada.

Exemplo

Resposta (200) — bloco adicional por colaborador:
missions_summary varre um mês de registros por colaborador, por isso o limite de lote é 100 em vez de 500.

Modo self (sessão federada)

Quando o seu app já tem um token de usuário federado do SalesOS, envie-o como Authorization: Bearer <jwt> e omita collaborators. A resposta cobre apenas o próprio usuário do token.
Enviar collaborators junto com um token de usuário é rejeitado com SELF_MODE_NO_COLLABORATORS. Consultas em lote exigem uma API Key de parceiro — do contrário, qualquer usuário logado poderia ler o progresso de outras pessoas por CPF.

Tratamento de erros

Todos os erros seguem a mesma estrutura:
São dois formatos, não um. O bloco acima é o erro do endpoint. Falhas na camada de autenticação respondem antes de o endpoint rodar, com error como string:
Código que assume error.codeundefined em toda falha de autenticação. Ramifique pelo tipo — veja Convenções da API.
Corpo inválido, lote acima do limite, CPF sem 11 dígitos, ou item sem cpf e sem email. A lista details aponta o index do item.
Uma lista collaborators foi enviada junto com um token de usuário. Omita-a, ou use uma API Key de parceiro.
API Key ausente, inválida ou expirada, ou assinatura que não confere.
API Key válida, mas sem o escopo missions:read.
Apenas POST é aceito.
Requisições demais nesta hora. Aguarde retry_after segundos e tente de novo.
Erro interno. Tente novamente com espera progressiva (2s, 4s, 8s).
Um colaborador desconhecido não é erro. A requisição é bem-sucedida com found: false para aquele item, então um CPF errado nunca derruba a renderização da tela inteira.

Limites de uso


Segurança

  • Somente leitura: esta API nunca cria, avança ou provisiona missões
  • Cada chave pertence a uma única empresa — um CPF de outra empresa responde found: false
  • As requisições são assinadas por HMAC (P2S-SIGN-V1) e registradas para auditoria; documentos nunca são gravados nos logs
Nunca exponha sua API Key em código do lado do cliente. Esta API deve ser chamada apenas pelo seu servidor.

Próximos passos

API de Check-in

Leia a presença em serviço para completar a mesma tela inicial

Autenticação

Aprenda a criar e gerenciar API Keys