Altera um ticket
curl --request PATCH \ --url https://public-api.mspdesk.com.br/v1/tickets/1 \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "agentId": 7, "assetId": null, "customFields": { "12": "valor novo", "15": null }, "priority": "HIGH", "priorityChangeReason": "Cliente parado", "tagIds": [ 1, 2 ] }'Escopo exigido: tickets:write. JSON Merge Patch (RFC 7396) aplicado sobre o estado atual do ticket: só o que vier no corpo muda, e null limpa o campo. Aceita application/merge-patch+json e application/json. Campo desconhecido — inclusive os só de leitura do ticket, como id e status — é recusado. tagIds SUBSTITUI o conjunto de tags ([] e null removem todas; para manter as tags, não envie o campo), e customFields faz merge POR CHAVE: campo não citado fica intacto. Trocar customerId passa pelas regras da troca de cliente (escopo, mesclagem, item faturável pendente e coerência de contato, ativo e unidade), e a recusa traz o motivo em violation; trocar só o contato, o ativo ou a unidade não passa por elas. Mudar priority exige priorityChangeReason. Ticket concluído, fechado ou na lixeira não aceita alteração. Agente só é atribuído a ticket com grupo de atendimento: agentId num ticket sem grupo, ou serviceGroupId: null mantendo o agente, é 422 validation_failed com inconsistent_reference em agentId. Um patch que não muda nada devolve o ticket como está, sem registrar alteração.
Autorizações
Seção intitulada “Authorizations”Parâmetros
Seção intitulada “Parameters”Parâmetros de caminho
Seção intitulada “Path Parameters”Corpo da requisiçãorequired
Seção intitulada “Request Bodyrequired”Campos a alterar no ticket
Alterações a aplicar no ticket (JSON Merge Patch, RFC 7396).
object
ID do agente responsável. Precisa estar ativo e ser membro do grupo; agente só é atribuído a ticket com grupo de atendimento (o serviceGroupId do corpo ou o já gravado).
ID do ativo. null desvincula o ativo.
ID da unidade de negócio. null desvincula a unidade.
ID da categoria. Precisa pertencer ao serviço do catálogo do ticket.
ID do contato do ticket. Sem troca de cliente, precisa pertencer ao cliente atual.
Valores dos campos personalizados, por ID do campo. O merge é POR CHAVE: um campo não citado fica intacto, e null limpa o valor daquele campo. customFields: null limpa TODOS os campos (pela RFC 7396, como tagIds: null); um campo obrigatório continua recusando a limpeza. Para manter os campos como estão, não envie customFields. Limites: TEXT até 255 caracteres e TEXT_AREA até 65535 bytes (senão too_long); DECIMAL entre -99999999.99 e 99999999.99, gravado com duas casas decimais (senão out_of_range).
object
Valor JSON livre.
object
ID do cliente do ticket. Trocar o cliente passa pelas regras da troca de cliente (escopo, mesclagem, faturamento pendente e coerência de contato, ativo e unidade).
Descrição da abertura. Aceita HTML.
Canal de origem do ticket.
Prioridade do ticket. Mudar a prioridade exige priorityChangeReason.
Justificativa da mudança de prioridade. Só de escrita: nunca aparece na representação do ticket. É exigida quando priority muda, e recusada quando não muda — informá-la sozinha é 422 validation_failed com not_applicable neste campo.
ID do serviço do catálogo. Precisa estar vinculado ao grupo do ticket.
ID do grupo de atendimento. Trocar o grupo pode reavaliar o fluxo de trabalho do ticket.
ID da subcategoria. Precisa pertencer à categoria do ticket.
Assunto do ticket.
IDs das tags do ticket. A lista SUBSTITUI o conjunto atual; [] remove todas, e null também — pela RFC 7396 null remove o campo, e um ticket sem o campo tagIds é um ticket sem tag. Para manter as tags como estão, não envie o campo.
ID do tipo do ticket.
Exemplo
{ "agentId": 7, "assetId": null, "customFields": { "12": "valor novo", "15": null }, "priority": "HIGH", "priorityChangeReason": "Cliente parado", "tagIds": [ 1, 2 ]}Alterações a aplicar no ticket (JSON Merge Patch, RFC 7396).
object
ID do agente responsável. Precisa estar ativo e ser membro do grupo; agente só é atribuído a ticket com grupo de atendimento (o serviceGroupId do corpo ou o já gravado).
ID do ativo. null desvincula o ativo.
ID da unidade de negócio. null desvincula a unidade.
ID da categoria. Precisa pertencer ao serviço do catálogo do ticket.
ID do contato do ticket. Sem troca de cliente, precisa pertencer ao cliente atual.
Valores dos campos personalizados, por ID do campo. O merge é POR CHAVE: um campo não citado fica intacto, e null limpa o valor daquele campo. customFields: null limpa TODOS os campos (pela RFC 7396, como tagIds: null); um campo obrigatório continua recusando a limpeza. Para manter os campos como estão, não envie customFields. Limites: TEXT até 255 caracteres e TEXT_AREA até 65535 bytes (senão too_long); DECIMAL entre -99999999.99 e 99999999.99, gravado com duas casas decimais (senão out_of_range).
object
Valor JSON livre.
object
ID do cliente do ticket. Trocar o cliente passa pelas regras da troca de cliente (escopo, mesclagem, faturamento pendente e coerência de contato, ativo e unidade).
Descrição da abertura. Aceita HTML.
Canal de origem do ticket.
Prioridade do ticket. Mudar a prioridade exige priorityChangeReason.
Justificativa da mudança de prioridade. Só de escrita: nunca aparece na representação do ticket. É exigida quando priority muda, e recusada quando não muda — informá-la sozinha é 422 validation_failed com not_applicable neste campo.
ID do serviço do catálogo. Precisa estar vinculado ao grupo do ticket.
ID do grupo de atendimento. Trocar o grupo pode reavaliar o fluxo de trabalho do ticket.
ID da subcategoria. Precisa pertencer à categoria do ticket.
Assunto do ticket.
IDs das tags do ticket. A lista SUBSTITUI o conjunto atual; [] remove todas, e null também — pela RFC 7396 null remove o campo, e um ticket sem o campo tagIds é um ticket sem tag. Para manter as tags como estão, não envie o campo.
ID do tipo do ticket.
Exemplo
{ "agentId": 7, "assetId": null, "customFields": { "12": "valor novo", "15": null }, "priority": "HIGH", "priorityChangeReason": "Cliente parado", "tagIds": [ 1, 2 ]}Respostas
Seção intitulada “Responses”Ticket alterado
Ticket da empresa da chave.
object
ID do agente responsável pelo ticket; null se não atribuído.
Indica se o ticket já foi respondido ao menos uma vez.
ID do ativo vinculado ao ticket; null se não vinculado a um ativo.
ID da unidade de negócio do cliente; null se o ticket não está vinculado a uma unidade.
ID da categoria do ticket; null se não categorizado.
Data e hora do fechamento do ticket, em UTC; null se ainda não fechado.
Número do ticket, visível ao agente e ao cliente (diferente do id).
ID do contato que abriu ou representa o ticket; null se não houver contato.
Data e hora de criação do ticket, em UTC.
ID do usuário que criou o ticket; null se criado sem um usuário (ex.: por e-mail).
Valores dos campos personalizados do ticket. Só entra um item por campo com valor preenchido; campo sem valor não aparece na lista.
Valor de um campo personalizado do ticket.
object
ID do campo personalizado.
Nome do campo personalizado.
Tipo do campo personalizado — governa o formato de value.
Valor do campo, no formato do tipo (type):
| Tipo | Formato de value |
|---|---|
TEXT, TEXT_AREA |
string |
INTEGER |
integer |
DECIMAL |
number |
DATETIME |
string date-time, com o offset da empresa no instante do valor |
CHECKBOX |
boolean |
DROPDOWN |
objeto {id, label} da opção selecionada; {id: null, label: <valor gravado>} quando a opção não existe mais |
object
ID do cliente do ticket; null se não vinculado a um cliente.
Indica se o ticket foi excluído. Sem filter[deleted][eq], a listagem só traz false; GET /v1/tickets/{id} devolve também o excluído, com deleted: true.
Data e hora da exclusão do ticket, em UTC; null se não excluído.
Descrição da abertura do ticket.
ID do ticket original, quando este é um desdobramento (follow-up); null caso contrário.
Identificador interno do ticket.
Última atividade no ticket: mudança na linha do ticket ou escrita em nota, resposta, encaminhamento, apontamento, tarefa, item faturável, anexo, seguidor, conversa do MSP Talks, pausa de SLA, campo personalizado ou tags. Precisão de segundo. Pode vir nulo por alguns milissegundos logo após a criação do ticket.
ID do ticket no qual este foi mesclado; null se não foi mesclado.
Canal de origem do ticket (e-mail, portal, telefone etc.).
Prioridade do ticket.
Indica se o ticket já foi reaberto.
Data e hora da primeira resposta ao ticket, em UTC; null se ainda não respondido.
ID do serviço do catálogo vinculado ao ticket; null se não vinculado.
ID do grupo de atendimento do ticket; null se não vinculado a um grupo.
Prazo do SLA de resposta, em UTC; null se o ticket não tem SLA de resposta.
Status do SLA de resposta; null se o ticket não tem SLA de resposta.
Prazo do SLA de solução, em UTC; null se o ticket não tem SLA de solução.
Status do SLA de solução; null se o ticket não tem SLA de solução.
Data e hora da solução do ticket, em UTC; null se ainda não solucionado.
ID da etapa atual do ticket dentro do fluxo; null se o ticket não estiver em um fluxo.
Status atual do ticket.
ID da subcategoria do ticket; null se não vinculado a uma subcategoria.
Assunto do ticket.
IDs das tags aplicadas ao ticket.
ID do tipo do ticket; null se não definido.
Data e hora da última atualização da linha do ticket, em UTC.
ID do fluxo de trabalho aplicado ao ticket; null se nenhum fluxo estiver aplicado.
Exemplo
{ "agentId": 42, "answered": true, "assetId": 310, "businessUnitId": 3, "categoryId": 6, "closedAt": null, "code": 18342, "contactId": 88, "createdAt": "2026-01-10T12:00:00Z", "createdById": null, "customFields": [ { "id": 12, "name": "Patrimônio", "type": "TEXT", "value": "PAT-00731" } ], "customerId": 15, "deleted": false, "deletedAt": null, "description": "<p>A impressora do financeiro não aparece na rede desde a troca do roteador.</p>", "followUpOfId": null, "id": 1042, "lastActivityAt": "2026-01-10T14:05:00Z", "mergedIntoId": null, "origin": "EMAIL", "priority": "HIGH", "reopened": false, "respondedAt": "2026-01-10T12:40:00Z", "serviceCatalogId": 9, "serviceGroupId": 4, "slaResponseDueAt": "2026-01-10T13:00:00Z", "slaResponseStatus": "FULLFILLED", "slaSolutionDueAt": "2026-01-10T20:00:00Z", "slaSolutionStatus": "WITHIN", "solvedAt": null, "stageId": 12, "status": "IN_PROGRESS", "subcategoryId": 21, "subject": "Impressora sem conexão", "tagIds": [ 1 ], "ticketTypeId": 2, "updatedAt": "2026-01-10T14:05:00Z", "workflowId": 5}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
Requisição malformada ou parâmetros de consulta inválidos
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
Chave de API ausente, inválida, revogada ou expirada
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Acesso negado: empresa inativa (account_inactive), API pública desabilitada para a empresa (public_api_disabled), escopo liberado só com a API pública (scope_requires_public_api) ou escopo insuficiente (insufficient_scope)
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
not_found: o ticket não existe nesta empresa, ou uma referência do corpo não existe — nesse caso errors[0].field diz qual
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
concurrent_modification: o ticket foi alterado por outra requisição no meio desta. Releia o ticket e reaplique as alterações
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
Corpo da requisição acima de 1 MB
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
Content-Type não suportado
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
validation_failed: campo esvaziado que é obrigatório, campo desconhecido, referência inativa (inactive) ou incoerente (inconsistent_reference), ou valor inválido de campo personalizado. ticket_not_editable: o ticket está concluído — reabra antes de alterar — ou fechado, e ticket fechado não é editável. ticket_deleted: o ticket está na lixeira. business_rule_violation: uma regra do ticket recusou a operação
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
Limite de uso atingido (rate_limited); o campo layer indica a camada: ip, company, key, operation ou concurrency
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo
Segundos até poder repetir
Erro interno inesperado
Erro no formato RFC 9457 (application/problem+json).
object
Código estável do erro, para tratamento programático.
Explicação legível deste erro específico.
Erros de campo — presente quando a falha vem de validação de campo.
object
Código estável do erro de campo.
Campo com erro, em notação de ponto/colchete. Ausente quando o erro não é de um campo específico.
Mensagem traduzida no locale da requisição.
Presente só no 429
Presente só quando layer=operation
Identificador da requisição — informe-o ao suporte ao reportar um erro.
Presente só no 403 insufficient_scope
Status HTTP da resposta.
Título curto e legível do erro.
URI que identifica o tipo do erro.
Exemplo
{ "code": "not_found", "detail": "O recurso solicitado não foi encontrado.", "errors": [ { "code": "required" } ], "layer": "ip", "operation": "report", "requestId": "7f3a9c2e-4b1d-4f7a-9e0c-2b8d6a1f3c55", "status": 404, "title": "Recurso não encontrado", "type": "https://developers.mspdesk.com.br/erros/#not_found"}Cabeçalhos
Seção intitulada “Headers”Capacidade do balde mais restritivo consumido nesta requisição
Requisições restantes nesse balde
Segundos até o balde encher de novo