Passar para o conteúdo principal

API - Carga de Horários

Neste artigo verá o uso do endpoint da API da TWO relacionados a Carga de Horários para o dia de trabalho de um colaborador para um Centro de Custo.

Escrito por Danilo Mucinato

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

Respondeu à sua pergunta?