Skip to content

Ocorrências ​

Abrir, consultar, atribuir e acompanhar ocorrências de um condomínio.

Leia primeiro onde estão as ocorrências desta empresa

O que uma ocorrência pode guardar depende do sistema que as gere nesta empresa. O ping diz qual é, e Ocorrências: GC ou GM diz o que muda. Vale meia hora de leitura e poupa-lhe descobrir as diferenças por tentativa e erro.

Listar ocorrências ​

GET /occurrences

Permissão · occurrences:read

Parâmetros ​

ParâmetroTipoPor omissãoGCGM
idBuildinginteirotodossimsim
statustextoallsimsim
idTaskStatusinteirotodossimsim
idPriorityinteirotodassimsim
openedFromdata—simsim
openedTodata—simsim
idMaintenanceNatureinteirotodassimnão
idServiceTypeinteirotodossimnão
idFractioninteirotodassimnão
includetexto—interventionsnão
limitinteiro100simsim
cursortexto—simsim

status aceita open, closed ou all. É um atalho para "está por fechar ou já fechou", sem ter de saber que estados desta empresa contam como fechados.

Um filtro que a origem não suporta responde 400 UNSUPPORTED_FILTER em vez de ser ignorado. O SupportedFilters do ping diz-lhe quais são, para não ter de os descobrir assim.

Pedido ​

bash
# as que estão por fechar num condomínio
curl "https://servidor.exemplo/api/integrations/v1/acme/occurrences?idBuilding=12&status=open" \
  -H "ApiKey: $GC_API_KEY"

# com o histórico incluído (só em GC)
curl "https://servidor.exemplo/api/integrations/v1/acme/occurrences?idBuilding=12&include=interventions" \
  -H "ApiKey: $GC_API_KEY"

Resposta · 200 ​

json
{
  "Items": [
    {
      "Source": "GC",
      "Id": 501,
      "Reference": "2026/0501",
      "IdBuilding": 12,
      "BuildingCode": "0012",
      "OpeningDate": "2026-09-20T09:14:00",
      "ClosingDate": null,
      "Status": { "Id": 1, "Description": "Em aberto" },
      "Closed": false,
      "Priority": { "Id": 3, "Description": "Normal" },
      "Nature": { "Id": 4, "Description": "Infiltrações" },
      "ServiceType": { "Id": 7, "Description": "Canalização" },
      "Location": null,
      "IdFraction": 340,
      "FractionCode": "A",
      "IdClient": 87,
      "OpenedByName": null,
      "AssignedTo": { "Kind": "supplier", "Id": 88, "Name": "Canalizações Sul, Lda." },
      "Description": "Infiltração no teto da garagem, junto ao lugar 14.",
      "IsVisibleToClients": true,
      "HasAttachment": true,
      "LastActivityDate": "2026-09-22T16:03:00",
      "Interventions": null,
      "Notes": null
    }
  ],
  "Paging": { "Limit": 100, "NextCursor": "NTAx", "HasMore": true }
}
CampoTipoDescrição
SourcetextoGC ou GM. Que sistema respondeu
IdinteiroIdentificador. Só tem significado dentro da sua origem
ReferencetextoReferência que a aplicação mostra ao utilizador
IdBuilding · BuildingCodeinteiro · textoO condomínio
OpeningDatedata e horaQuando foi aberta
ClosingDatedata e horaQuando fechou. null enquanto estiver aberta
StatusobjetoEstado. Ver /reference/task-statuses
ClosedbooleanoSe o estado atual a dá por terminada
PriorityobjetoPrioridade. Ver /reference/priorities
NatureobjetoNatureza
ServiceTypeobjetoTipo de serviço. null em GM
LocationtextoLocal dentro do edifício. Preenchido em GM
IdFraction · FractionCodeinteiro · textoA fração. null em GM
IdClientinteiroO condómino que a reportou. null em GM
OpenedByNametextoQuem reportou, em texto livre. Só em GM
AssignedToobjetoA quem está entregue. null se a ninguém
DescriptiontextoDescrição
IsVisibleToClientsbooleanoVisível no portal dos condóminos. null em GM
HasAttachmentbooleanoTem ficheiro anexo
LastActivityDatedata e horaData da última intervenção registada
InterventionslistaO histórico, quando pedido com include=interventions. null caso contrário
NotestextoNota livre da ocorrência. Só em GM

A ordem é da mais recente para a mais antiga.

Campos a null não significam "vazio"

Um campo que a origem desta empresa não tem vem sempre a null — ServiceType e IdFraction em GM, Location e OpenedByName em GC. A forma da resposta é a mesma nos dois casos, de propósito, para que o seu código não tenha de mudar de forma.

Erros ​

EstadoCódigoQuando
400INVALID_STATUSO status não é open, closed nem all
400INVALID_CURSORO cursor não foi emitido por esta API
400UNSUPPORTED_FILTERUm filtro que a origem desta empresa não suporta
400UNSUPPORTED_INCLUDEinclude desconhecido, ou interventions numa empresa em GM
401INVALID_KEY · KEY_REVOKED · KEY_EXPIREDVer Autenticação
403FORBIDDEN_SCOPEA credencial não tem occurrences:read
404BUILDING_NOT_FOUNDO idBuilding não existe
502UPSTREAM_UNAVAILABLENuma empresa em GM, esse sistema não respondeu

Obter uma ocorrência ​

GET /occurrences/{idOccurrence}

Permissão · occurrences:read

Parâmetros ​

ParâmetroTipoDescrição
idOccurrenceinteiroNo caminho
includetextointerventions para trazer o histórico. Aqui funciona também em GM

Pedido ​

bash
curl "https://servidor.exemplo/api/integrations/v1/acme/occurrences/501?include=interventions" \
  -H "ApiKey: $GC_API_KEY"

Resposta · 200 ​

O mesmo objeto da listagem, sem envelope, com interventions preenchido quando pedido:

json
{
  "Source": "GC",
  "Id": 501,
  "Reference": "2026/0501",
  "Interventions": [
    {
      "Id": 9012,
      "Date": "2026-09-22T16:03:00",
      "Description": "Contactado o fornecedor. Visita marcada para 25/09.",
      "CreatedBy": { "Kind": "user", "Id": 14, "Name": "Ana Costa" },
      "TransferredTo": { "Kind": "supplier", "Id": 88, "Name": "Canalizações Sul, Lda." },
      "HasAttachment": false
    }
  ]
}
Campo da intervençãoTipoDescrição
IdinteiroIdentificador da intervenção
Datedata e horaQuando foi registada
DescriptiontextoO que foi registado
CreatedByobjetoQuem a registou
TransferredToobjetoA quem a ocorrência passou nesse momento. null se não mudou de mãos
HasAttachmentbooleanoA intervenção tem ficheiro anexo

O histórico numa listagem só existe em GC

Numa empresa em GM, include=interventions funciona neste ponto mas não na listagem: aí obrigaria a uma chamada por linha. Percorra a listagem sem histórico e peça-o nas ocorrências que lhe interessarem.

Erros ​

EstadoCódigoQuando
400UNSUPPORTED_INCLUDEinclude diferente de interventions
401INVALID_KEY · KEY_REVOKED · KEY_EXPIREDVer Autenticação
403FORBIDDEN_SCOPEA credencial não tem occurrences:read
404OCCURRENCE_NOT_FOUNDNão existe, ou é um sinistro — esses leem-se em /claims
502UPSTREAM_UNAVAILABLENuma empresa em GM, esse sistema não respondeu

Descarregar um anexo ​

GET /occurrences/{idOccurrence}/attachment
GET /occurrences/{idOccurrence}/interventions/{idIntervention}/attachment

Permissão · occurrences:read

Devolve o ficheiro em si, com o seu tipo e nome — não um JSON com base64. Viaja um terço mais leve e pode entregar o fluxo diretamente a quem o consome.

bash
curl "https://servidor.exemplo/api/integrations/v1/acme/occurrences/501/attachment" \
  -H "ApiKey: $GC_API_KEY" \
  -o anexo.pdf

Confirme primeiro HasAttachment na ocorrência ou na intervenção; poupa um 404.

Um anexo por ocorrência, um por intervenção

Não há coleções de ficheiros. Uma ocorrência tem no máximo um anexo, e cada intervenção o seu. Para juntar mais documentos a um processo, registe intervenções — cada uma leva o seu ficheiro.

Erros ​

EstadoCódigoQuando
401INVALID_KEY · KEY_REVOKED · KEY_EXPIREDVer Autenticação
403FORBIDDEN_SCOPEA credencial não tem occurrences:read
404ATTACHMENT_NOT_FOUNDNão há anexo, ou está registado mas o ficheiro não está no arquivo

Abrir uma ocorrência ​

POST /occurrences

Permissão · occurrences:write · aceita Idempotency-Key

Corpo ​

CampoTipoGCGM
IdBuilding ou BuildingCodeinteiro / textoobrigatórioobrigatório
Descriptiontextoobrigatórioobrigatório
IdMaintenanceNatureinteiroobrigatórioobrigatório
IdServiceTypeinteiroobrigatóriorecusado
IdMaintenanceLocationinteiroopcionalobrigatório
IdFractioninteiroopcionalrecusado
IdClientinteiroopcionalrecusado
IdDescriptioninteiroopcionalrecusado
IdPriorityinteiroopcionalopcional
IsVisibleToClientsbooleanoopcionalrecusado
NotifyClientbooleanoopcionalrecusado
ReportedByNametextorecusadoopcional
AttachmentFileNametextoopcionalopcional
AttachmentBase64textoopcionalopcional

Pode dar o condomínio por IdBuilding ou por BuildingCode — o segundo evita ter de traduzir códigos do seu sistema para identificadores do GC.

Pedido ​

bash
curl -X POST "https://servidor.exemplo/api/integrations/v1/acme/occurrences" \
  -H "ApiKey: $GC_API_KEY" \
  -H "Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7" \
  -H "Content-Type: application/json" \
  -d '{
        "BuildingCode": "0012",
        "IdFraction": 340,
        "IdClient": 87,
        "IdMaintenanceNature": 4,
        "IdServiceType": 7,
        "IdPriority": 3,
        "Description": "Infiltração no teto da garagem, junto ao lugar 14.",
        "IsVisibleToClients": true,
        "NotifyClient": true
      }'

Resposta · 201 ​

json
{ "Source": "GC", "Id": 501, "Reference": "2026/0501" }

Guarde o Id e o Source: é assim que volta a esta ocorrência.

Anexar um ficheiro na abertura ​

O anexo viaja em base64, por ser um campo entre outros do mesmo pedido:

json
{
  "BuildingCode": "0012",
  "IdMaintenanceNature": 4,
  "IdServiceType": 7,
  "Description": "Infiltração no teto da garagem.",
  "AttachmentFileName": "foto-infiltracao.jpg",
  "AttachmentBase64": "/9j/4AAQSkZJRgABAQ..."
}

Dê sempre AttachmentFileName com a extensão correta — é dela que sai o tipo do ficheiro na descarga.

Erros ​

EstadoCódigoQuando
400INVALID_BODYCorpo em falta ou JSON inválido
400MISSING_FIELDFalta um campo obrigatório. field diz qual
400UNSUPPORTED_FIELDUm campo que a origem desta empresa não tem. field diz qual
400INVALID_REFERENCEUm identificador de tabela de referência não existe
401INVALID_KEY · KEY_REVOKED · KEY_EXPIREDVer Autenticação
403FORBIDDEN_SCOPEA credencial não tem occurrences:write
404BUILDING_NOT_FOUND · FRACTION_NOT_FOUNDO condomínio ou a fração não existem
409IDEMPOTENCY_KEY_REUSEDA chave já foi usada noutro pedido
422MAINTENANCE_NOT_LICENSEDA empresa não tem o módulo de manutenção
422OCCURRENCE_NOT_CREATEDNão chegou a ser criada. Reporte
502UPSTREAM_UNAVAILABLENuma empresa em GM, esse sistema não respondeu

Atribuir uma ocorrência ​

POST /occurrences/{idOccurrence}/assignment

Permissão · occurrences:write · aceita Idempotency-Key

Entrega a ocorrência a quem a vai tratar, e regista no histórico a razão.

Corpo ​

CampoTipoDescrição
AssignedToobjetoObrigatório. { kind, id }. Ver Destinatários
NotetextoO que fica no histórico
NotifybooleanoNotificar. Recusado em GM
AttachmentFileNametextoNome do ficheiro a anexar
AttachmentBase64textoConteúdo do ficheiro

Pedido ​

bash
curl -X POST "https://servidor.exemplo/api/integrations/v1/acme/occurrences/501/assignment" \
  -H "ApiKey: $GC_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
        "AssignedTo": { "Kind": "supplier", "Id": 88 },
        "Note": "Adjudicada a reparação conforme orçamento de 22/09.",
        "Notify": true
      }'

Resposta · 201 ​

json
{ "Id": 9013 }

O identificador da entrada criada no histórico.

Quem pode receber ​

OrigemKind aceites
GCsupplier (de /suppliers) ou user (de /assignees)
GMtechnician (de /assignees)

Um Kind que a origem não aceita responde 400 UNSUPPORTED_FIELD em AssignedTo.Kind.

Erros ​

EstadoCódigoQuando
400INVALID_BODY · MISSING_FIELDCorpo inválido, ou falta AssignedTo
400UNSUPPORTED_FIELDKind não aceite nesta origem, ou Notify em GM
401 · 403Ver Autenticação e Permissões
404OCCURRENCE_NOT_FOUND · SUPPLIER_NOT_FOUNDA ocorrência ou o destinatário não existem
409IDEMPOTENCY_KEY_REUSEDA chave já foi usada noutro pedido
502UPSTREAM_UNAVAILABLENuma empresa em GM, esse sistema não respondeu

Registar uma intervenção ​

POST /occurrences/{idOccurrence}/interventions

Permissão · occurrences:write · aceita Idempotency-Key

Acrescenta uma entrada ao histórico. A ocorrência não muda de estado nem de responsável — é a forma de registar o que se passou sem mexer no processo.

Corpo ​

CampoTipoDescrição
DescriptiontextoObrigatório. O que fica registado
NotifybooleanoNotificar. Recusado em GM
AttachmentFileNametextoNome do ficheiro a anexar
AttachmentBase64textoConteúdo do ficheiro

Pedido ​

bash
curl -X POST "https://servidor.exemplo/api/integrations/v1/acme/occurrences/501/interventions" \
  -H "ApiKey: $GC_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
        "Description": "Técnico no local. Identificada rutura na conduta do 2.º piso.",
        "Notify": false,
        "AttachmentFileName": "relatorio-visita.pdf",
        "AttachmentBase64": "JVBERi0xLjQKJ..."
      }'

Resposta · 201 ​

json
{ "Id": 9014 }

Não há notas internas

Tudo o que acrescenta ao histórico é matéria da ocorrência. Não existe distinção entre visível e reservado — se a nota não deve ser vista por ninguém de fora, não a registe aqui.

Erros ​

EstadoCódigoQuando
400INVALID_BODY · MISSING_DESCRIPTIONCorpo inválido, ou sem descrição
400UNSUPPORTED_FIELDNotify numa empresa em GM
401 · 403Ver Autenticação e Permissões
404OCCURRENCE_NOT_FOUNDNão existe ocorrência com esse identificador
409IDEMPOTENCY_KEY_REUSEDA chave já foi usada noutro pedido
502UPSTREAM_UNAVAILABLENuma empresa em GM, esse sistema não respondeu

Alterar estado ou prioridade ​

PATCH /occurrences/{idOccurrence}

Permissão · occurrences:write · aceita Idempotency-Key

Corpo ​

CampoTipoDescrição
IdStatusinteiroNovo estado. Ver /reference/task-statuses
IdPriorityinteiroNova prioridade. Ver /reference/priorities
ClosedAtdata e horaData de fecho. Só se aplica a um estado que fecha
NotetextoObrigatório. A razão, que fica no histórico
NotifybooleanoNotificar. Recusado em GM

Pelo menos um de IdStatus ou IdPriority é obrigatório. Os dois podem vir juntos — é uma única alteração, não duas.

Pedido ​

bash
# fechar
curl -X PATCH "https://servidor.exemplo/api/integrations/v1/acme/occurrences/501" \
  -H "ApiKey: $GC_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
        "IdStatus": 3,
        "ClosedAt": "2026-09-25T17:30:00",
        "Note": "Reparação concluída e confirmada pelo condómino.",
        "Notify": true
      }'

# subir a prioridade
curl -X PATCH "https://servidor.exemplo/api/integrations/v1/acme/occurrences/501" \
  -H "ApiKey: $GC_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "IdPriority": 1, "Note": "Agravamento: infiltração atingiu o quadro elétrico." }'

Resposta · 204 ​

Sem corpo.

Os identificadores de estado dependem da origem

Os valores de /reference/task-statuses de uma empresa em GC são recusados numa empresa em GM e vice-versa. Leia a tabela por empresa e não fixe números no código. Ver Tabelas de referência.

Erros ​

EstadoCódigoQuando
400INVALID_BODY · MISSING_FIELDCorpo inválido, ou sem IdStatus nem IdPriority, ou sem Note
400INVALID_REFERENCEO estado ou a prioridade não existem nesta origem
400UNSUPPORTED_FIELDNotify numa empresa em GM
401 · 403Ver Autenticação e Permissões
404OCCURRENCE_NOT_FOUNDNão existe ocorrência com esse identificador
409IDEMPOTENCY_KEY_REUSEDA chave já foi usada noutro pedido
502UPSTREAM_UNAVAILABLENuma empresa em GM, esse sistema não respondeu

Acompanhar alterações ​

GET /occurrences/changes

Para manter uma cópia atualizada sem varrer tudo de cada vez. Ver Sincronização incremental, onde o fluxo completo está explicado.

API de Integração GC