Dependendo da consulta que esteja realizando, isso pode ocorrer pois está tentando buscar muitos dados ou aplicando muitos filtros de uma só vez, sobrecarregando o sistema.
Existem alguns métodos para tratar este problema.
Exemplo 1: Tenho a intenção de baixar todos os tickets da base
Esta consulta deve ser realizada em várias etapas. A API, por padrão, retorna 1000 resultados e são ordenados por id. Para realizar a paginação pode-se usar skip, mas pode ser mais performático utilizar filtro por id, sendo o id o último id retornado da consulta anterior.
Outro ponto, também não é performático buscar muitos dados de uma só vez, no $select e no $expand, caso queira buscar muitos dados, deve-se buscar em etapas e no seu software de integração, com os dados em memória fazer a junção das informações.
O campo id do ticket será retornado em todas as etapas para que possa ser usado como referência na lógica para juntar as informações.
Segue exemplo de consultas:
Primeira parte:
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,type,subject,category,urgency,status,baseStatus,justification,origin,createdDate,originEmailAccount,ownerTeam,serviceFirstLevelId,serviceFirstLevel,serviceSecondLevel,serviceThirdLevel,resolvedIn,reopenedIn,closedIn,lastActionDate,actionCount,lastUpdate,lifeTimeWorkingTime,stoppedTime,slaAgreement,slaAgreementRule,slaSolutionTime,slaResponseTime,slaSolutionChangedByUser,slaSolutionDate,slaSolutionDateIsPaused,slaResponseDate,slaRealResponseDate&$filter=id gt 2044
Segunda parte:
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id&$filter=id gt 2044&$expand=createdBy($select=id,personType,profileType,businessName,email,phone),clients($select=id,personType,profileType,businessName,email,phone;$expand=organization($select=id,personType,profileType,businessName,email,phone)),parentTickets($select=id,subject)
Terceira parte:
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id&$filter=id gt 2044&$expand=actions($select=id,type,origin,description,status,justification,createdDate;$expand=createdBy($select=id),timeAppointments($select=id,activity,date,periodStart,periodEnd,workTime,workTypeName;$expand=createdBy($select=id),createdByTeam($select=id)))
Exemplo 2: Preciso de poucas informações dos últimos tickets alterados ou criados
Adicione ranges de data de criação (createdDate) ou alteração (LastUpdate) para aumentar a performance da consulta de no máximo um mês. Se precisar de um período maior, realize mais de uma consulta dividindo em períodos menores.
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,serviceFull,type,origin,category,subject,baseStatus,urgency,createdDate,slaSolutionDate,lastActionDate,closedIn&$filter=(createdDate ge 2020-04-09T00:00:00.00z and createdDate le 2020-04-10T23:59:59.99z) or ((LastUpdate ge 2020-04-09T00:00:00.00z and LastUpdate le 2020-04-10T23:59:59.99z) and (lastActionDate ge 2020-04-09T00:00:00.00z and lastActionDate le 2020-04-10T23:59:59.99z))&$expand=clients($select=id,businessName),clients($expand=organization($select=id,businessName)),createdBy($select=id,businessName),owner($select=id,businessName)
Exemplo 3: Filtrar por campo customizado
Por se tratar de filtros mais complexos, uma otimização da busca seria dividir a consulta em mais de uma com partes do filtro original e fazer a junção dos dados em memória.
Neste exemplo, deseja-se consultar tickets que possuem um campo customizado A de valor diferente de ‘sim’ ou que possuem um apontamento de horas da atividade 'Atividade'.
Separe as consultas pelo filtro onde existe ‘and’ ou ‘or’.
- Campo customizado A de valor diferente de ‘sim’
- Apontamento de horas de atividade ‘Atividade’
Primeiramente, adicione um período de datas e separe as consultas desta forma:
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,subject,status,justification,type,createdDate&$filter=(createdDate ge 2021-09-01T00:00:00.00z and createdDate le 2021-09-30T23:59:59.00z ) and (customFieldValues/any(a: a/customFieldId eq 99999 and a/items/any(b: b/customFieldItem ne 'Sim')))
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,subject,status,justification,type,createdDate&$filter=(actions/any(e: e/timeAppointments/any(f: f/activity eq 'Atividade'))))
Com os dados em memória, o resultado final são os tickets em qualquer um dos retornos. Se o filtro fosse and, a lista final seriam os tickets que estão em ambos os retornos.
Caso queira buscar mais dados sobre estes tickets já filtrados, pode consultar com base nos ids. Exemplo:
https://api.movidesk.com/public/v1/tickets?token=XXX&$select=id,subject,createdDate&$expand=actions($select=origin,id),actions($expand=timeAppointments($expand=createdBy))&$filter=((id eq 17099) or (id eq 23744) or (id eq 28447) or (id eq 34345) or (id eq 34438))