Este endpoint permite que um empregador insira os horários de trabalho dos colaboradores e vincule automaticamente o centro de custo a esses registros. A integração pode criar os apontamentos de entrada, saída e intervalo referentes a um dia de trabalho.
Importante: além de criar os apontamentos, a API cria o vínculo do colaborador com o centro de custo na data informada, caso ele ainda não exista.
Requisitos
Para realizar a integração, você precisa de:
- Token válido de usuário com acesso executivo. Caso não tenha, clique aqui.
- CPF do colaborador.
- Código de um centro de custo já cadastrado na TWO.
- Opcionalmente, os horários de intervalo e o código de um local já cadastrado na TWO.
Carga de Horário
Endpoint
POST https://api1.tradingworks.net/v1/timecardcostcenter/addattendance
Headers
AUTH-TOKEN: Token de autenticação de um usuário executivo
Content-Type: application/json
Validações
Data (BaseDate)
- deve ser informada e conter uma data válida;
- não pode ser posterior à data atual;
- pode ter, no máximo, 30 dias de diferença em relação à data atual.
CPF (PersonalDocument)
- deve ser informado;
- deve ser um CPF válido.
- caso o CPF válido informado não esteja cadastrado, irá ser feito o cadastro simplificado do colaborador com o seu nome como NOME INDEFINIDO.
Entrada (In)
- deve ser informada;
- deve conter um horário válido;
- a combinação da data com o horário de entrada não pode estar no futuro.
- pode ser usado para enviar únicos apontamentos no dia: Entrada, saída, ida e volta da pausa.
Saída (Out)
- campo opcional;
- deve conter um horário válido;
- a combinação da data com o horário de saída não pode estar no futuro;
- quando o horário for anterior à entrada, a saída será considerada como pertencente ao dia seguinte.
Intervalo (InPause e OutPause)
- Os dois campos são opcionais. Quando enviados, devem conter horários válidos e não podem representar um momento futuro.
Centro de custo (CostCenterCode)
- deve ser informado;
- deve existir no ambiente do usuário autenticado;
- deve pertencer a um empregador que o usuário tenha permissão para acessar.
Local (LocaleCode)
O campo é opcional. Quando enviado, o código deve corresponder a um local cadastrado no mesmo ambiente.
Request Body
Envie uma lista JSON. Cada item representa a jornada de um colaborador em uma data e em um centro de custo.
[
{
"PersonalDocument": "52998224725",
"BaseDate": "2026-08-04",
"In": "08:00",
"Out": "17:00",
"InPause": "12:00",
"OutPause": "13:00",
"CostCenterCode": "OBRA-HORIZONTE",
"LocaleCode": "TORRE-A"
},
{
"PersonalDocument": "11144477735",
"BaseDate": "2026-08-04",
"In": "07:30",
"Out": "16:30",
"CostCenterCode": "OBRA-PARQUE"
}
]
Campos
Campo | Tipo | Obrigatório | Descrição |
BaseDate | string | Sim | Data do vínculo. Recomendamos o formato AAAA-MM-DD. A data deve estar entre 30 dias antes e 30 dias depois da data atual. |
PersonalDocument | string | Sim | CPF válido do colaborador, com 11 dígitos |
In | string | Sim | Horário de entrada no formato HH:mm, como 08:00. Caso a requisição envie apenas um único apontamento, seja entrada, saída ou ida e volta do intervalo, este campo deve ser usado para tal requisição. |
Out | string | Não* | Horário de saída no formato HH:mm, como 17:00. Quando for anterior ao horário de entrada, a saída será registrada no dia seguinte. |
InPause | string | Não* | Horário de início do intervalo no formato HH:mm, como 12:00. |
OutPause | string | Não* | Horário de término do intervalo no formato HH:mm, como 13:00. |
CostCenterCode | string | Sim | Código do centro de custo cadastrado na TWO. |
LocaleCode | string | Não | Código do local cadastrado na TWO. Pode ser omitido quando o vínculo não precisar de um local. |
Jornadas que terminam no dia seguinte
Quando o horário de saída (Out) for anterior ao horário de entrada (In), entende-se que a jornada terminou no dia seguinte.
Por exemplo, para BaseDate igual a 2026-08-03, entrada às 22:00 e saída às 06:00, a saída será registrada às 06:00 do dia 4 de agosto.
Essa mesma regra é aplicada aos horários de intervalo: um horário de pausa anterior à entrada é considerado como pertencente ao dia seguinte.
Apontamentos individuais
Quando é enviado apenas um apontamento por requisição, como por exemplo: Apenas entrada, apenas ida ou volta da pausa, a propriedade Entrada (In) deve ser usada para isso.
Por exemplo: Para BaseDate igual a 2026-08-03, foi feita uma requisição com a Entrada (In) sendo 08:00, na ida para a o Intervalo, oque seria enviado na propriedade InPause, deve ser enviado propriedade In, garantindo uma única entrada. A tratativa interna da requisição entende esse processo.
Exemplo de entrada
{
{
"PersonalDocument": "11144477735",
"BaseDate": "2026-08-04",
"In": "07:30",
"CostCenterCode": "OBRA-PARQUE"
}
]Exemplo de intervalo
{
"PersonalDocument": "11144477735",
"BaseDate": "2026-08-04",
"In": "12:00",
"CostCenterCode": "OBRA-PARQUE"
}
]Exemplo de saída
{
"PersonalDocument": "11144477735",
"BaseDate": "2026-08-04",
"In": "18:30",
"CostCenterCode": "OBRA-PARQUE"
}
]
Apontamentos completos
Quando há todos os dados para o apontamento completo, como por exemplo: Entrada e saída ou Entrada, ida e volta da pausa e saída, a requisição deve ser preenchida com todas as suas propriedades.
Por exemplo: Para BaseDate igual a 2026-08-04, temos os dados do dia do apontamento do colaborador sendo: 08:00, 12:00, 13:00, 17:00. Nesse contexto, 08:00 iria para a propriedade In, 12:00 para InPause, 13:00 para OutPause e 18:00 para Out, sendo uma única requisição com esses dados.
Exemplo de um apontamento completo
[
{
"PersonalDocument": "52998224725",
"BaseDate": "2026-08-04",
"In": "08:00",
"Out": "17:00",
"InPause": "12:00",
"OutPause": "13:00",
"CostCenterCode": "OBRA-HORIZONTE",
"LocaleCode": "TORRE-A"
}
]
Response
A API retorna HTTP 200 OK quando termina o processamento, inclusive quando parte dos itens contém erros.
{
"totalRecords": 2,
"processedRecords": 2,
"errorCount": 0,
"errors": []
}
Campos da resposta
Campo | Tipo | Descrição |
totalRecords | int | Quantidade total de registros recebidos. |
processedRecords | int | Quantidade de registros processados com sucesso. |
errorCount | int | Quantidade de registros que não foram processados. |
errors | list | Detalhes dos registros que apresentaram erro. |
Exemplo de processamento parcial
No exemplo abaixo, a jornada da Obra Residencial Horizonte é processada, mas o segundo item é recusado porque contém um CPF inválido.
Request
[
{
"PersonalDocument": "52998224725",
"BaseDate": "2026-08-04",
"In": "08:00",
"Out": "17:00",
"InPause": "12:00",
"OutPause": "13:00",
"CostCenterCode": "OBRA-HORIZONTE",
"LocaleCode": "TORRE-A"
},
{
"PersonalDocument": "1234567890",
"BaseDate": "2026-08-04",
"In": "07:30",
"CostCenterCode": "OBRA-PARQUE"
}
]
Response
{
"totalRecords": 2,
"processedRecords": 1,
"errorCount": 1,
"errors": [
{
"personalDocument": "1234567890",
"baseDate": "2026-08-04",
"error": "CPF inválido"
}
]
}
Códigos HTTP
Código | Quando ocorre |
200 OK | O processamento foi concluído. Consulte processedRecords, errorCount e errors para verificar o resultado de cada item. |
400 Bad Request | A lista está vazia, não foi enviada ou o corpo da requisição é inválido. |
401 Unauthorized | O header AUTH-TOKEN está ausente ou contém um token inválido. |
500 Internal Server Error | Ocorreu um erro inesperado durante o processamento |
