@magnetcustomer/sdk 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/README.md +20 -3
  2. package/dist/client.d.ts +6 -1
  3. package/dist/client.js +5 -0
  4. package/dist/generated/api/contacts-api.d.ts +24 -24
  5. package/dist/generated/api/contacts-api.js +24 -24
  6. package/dist/generated/api/custom-fields-api.d.ts +1 -43
  7. package/dist/generated/api/custom-fields-api.js +1 -67
  8. package/dist/generated/api/customers-api.d.ts +4 -4
  9. package/dist/generated/api/customers-api.js +4 -4
  10. package/dist/generated/api/deals-api.d.ts +27 -27
  11. package/dist/generated/api/deals-api.js +27 -27
  12. package/dist/generated/api/journeys-api.d.ts +232 -0
  13. package/dist/generated/api/journeys-api.js +315 -0
  14. package/dist/generated/api/leads-api.d.ts +4 -4
  15. package/dist/generated/api/leads-api.js +4 -4
  16. package/dist/generated/api/meetings-api.d.ts +123 -27
  17. package/dist/generated/api/meetings-api.js +169 -27
  18. package/dist/generated/api/observations-api.d.ts +8 -8
  19. package/dist/generated/api/observations-api.js +8 -8
  20. package/dist/generated/api/organizations-api.d.ts +24 -24
  21. package/dist/generated/api/organizations-api.js +24 -24
  22. package/dist/generated/api/pipelines-api.d.ts +49 -1
  23. package/dist/generated/api/pipelines-api.js +72 -1
  24. package/dist/generated/api/prospects-api.d.ts +4 -4
  25. package/dist/generated/api/prospects-api.js +4 -4
  26. package/dist/generated/api/staffs-api.d.ts +1 -1
  27. package/dist/generated/api/staffs-api.js +1 -1
  28. package/dist/generated/api/task-types-api.d.ts +5 -5
  29. package/dist/generated/api/task-types-api.js +5 -5
  30. package/dist/generated/api/tasks-api.d.ts +32 -32
  31. package/dist/generated/api/tasks-api.js +32 -32
  32. package/dist/generated/api/teams-api.d.ts +130 -0
  33. package/dist/generated/api/teams-api.js +199 -0
  34. package/dist/generated/api/tickets-api.d.ts +610 -0
  35. package/dist/generated/api/tickets-api.js +860 -0
  36. package/dist/generated/api/treatments-api.d.ts +379 -0
  37. package/dist/generated/api/treatments-api.js +539 -0
  38. package/dist/generated/api/webhooks-api.d.ts +63 -0
  39. package/dist/generated/api/webhooks-api.js +116 -0
  40. package/dist/generated/api.d.ts +6 -1
  41. package/dist/generated/api.js +6 -1
  42. package/dist/generated/base.d.ts +1 -1
  43. package/dist/generated/base.js +1 -1
  44. package/dist/generated/common.d.ts +1 -1
  45. package/dist/generated/common.js +1 -1
  46. package/dist/generated/configuration.d.ts +1 -1
  47. package/dist/generated/configuration.js +1 -1
  48. package/dist/generated/index.d.ts +1 -1
  49. package/dist/generated/index.js +1 -1
  50. package/dist/generated/models/close-deal-request.d.ts +2 -2
  51. package/dist/generated/models/close-deal-request.js +1 -1
  52. package/dist/generated/models/contact-input-phones-inner.d.ts +1 -1
  53. package/dist/generated/models/contact-input-phones-inner.js +1 -1
  54. package/dist/generated/models/contact-input.d.ts +1 -1
  55. package/dist/generated/models/contact-input.js +1 -1
  56. package/dist/generated/models/contact-summary.d.ts +1 -1
  57. package/dist/generated/models/contact-summary.js +1 -1
  58. package/dist/generated/models/contact.d.ts +1 -1
  59. package/dist/generated/models/contact.js +1 -1
  60. package/dist/generated/models/create-observation-request.d.ts +1 -1
  61. package/dist/generated/models/create-observation-request.js +1 -1
  62. package/dist/generated/models/create-task-type-request.d.ts +1 -1
  63. package/dist/generated/models/create-task-type-request.js +1 -1
  64. package/dist/generated/models/create-ticket-message-request.d.ts +29 -0
  65. package/dist/generated/models/create-ticket-message-request.js +19 -0
  66. package/dist/generated/models/custom-field-settings.d.ts +1 -1
  67. package/dist/generated/models/custom-field-settings.js +1 -1
  68. package/dist/generated/models/custom-field-value.d.ts +1 -1
  69. package/dist/generated/models/custom-field-value.js +1 -1
  70. package/dist/generated/models/custom-field.d.ts +1 -1
  71. package/dist/generated/models/custom-field.js +1 -1
  72. package/dist/generated/models/deal-create.d.ts +1 -1
  73. package/dist/generated/models/deal-create.js +1 -1
  74. package/dist/generated/models/deal-input.d.ts +1 -1
  75. package/dist/generated/models/deal-input.js +1 -1
  76. package/dist/generated/models/deal-labels-inner.d.ts +1 -1
  77. package/dist/generated/models/deal-labels-inner.js +1 -1
  78. package/dist/generated/models/deal-organization.d.ts +1 -1
  79. package/dist/generated/models/deal-organization.js +1 -1
  80. package/dist/generated/models/deal-pipeline-one-of.d.ts +1 -1
  81. package/dist/generated/models/deal-pipeline-one-of.js +1 -1
  82. package/dist/generated/models/deal-pipeline.d.ts +1 -1
  83. package/dist/generated/models/deal-pipeline.js +1 -1
  84. package/dist/generated/models/deal-stage.d.ts +1 -1
  85. package/dist/generated/models/deal-stage.js +1 -1
  86. package/dist/generated/models/deal.d.ts +1 -1
  87. package/dist/generated/models/deal.js +1 -1
  88. package/dist/generated/models/delete-meetings-request.d.ts +1 -1
  89. package/dist/generated/models/delete-meetings-request.js +1 -1
  90. package/dist/generated/models/delete-meetings200-response.d.ts +1 -1
  91. package/dist/generated/models/delete-meetings200-response.js +1 -1
  92. package/dist/generated/models/delete-observations-request.d.ts +1 -1
  93. package/dist/generated/models/delete-observations-request.js +1 -1
  94. package/dist/generated/models/error-errors-inner.d.ts +1 -1
  95. package/dist/generated/models/error-errors-inner.js +1 -1
  96. package/dist/generated/models/finish-meeting-request.d.ts +1 -1
  97. package/dist/generated/models/finish-meeting-request.js +1 -1
  98. package/dist/generated/models/finish-tasks-request.d.ts +1 -1
  99. package/dist/generated/models/finish-tasks-request.js +1 -1
  100. package/dist/generated/models/get-deal-stage-history200-response-history-inner-stage.d.ts +1 -1
  101. package/dist/generated/models/get-deal-stage-history200-response-history-inner-stage.js +1 -1
  102. package/dist/generated/models/get-deal-stage-history200-response-history-inner.d.ts +1 -1
  103. package/dist/generated/models/get-deal-stage-history200-response-history-inner.js +1 -1
  104. package/dist/generated/models/get-deal-stage-history200-response-totals.d.ts +1 -1
  105. package/dist/generated/models/get-deal-stage-history200-response-totals.js +1 -1
  106. package/dist/generated/models/get-deal-stage-history200-response.d.ts +1 -1
  107. package/dist/generated/models/get-deal-stage-history200-response.js +1 -1
  108. package/dist/generated/models/get-journey-health-score200-response.d.ts +34 -0
  109. package/dist/generated/models/get-journey-health-score200-response.js +20 -0
  110. package/dist/generated/models/index.d.ts +27 -0
  111. package/dist/generated/models/index.js +27 -0
  112. package/dist/generated/models/journey.d.ts +111 -0
  113. package/dist/generated/models/journey.js +32 -0
  114. package/dist/generated/models/list-contacts200-response.d.ts +1 -1
  115. package/dist/generated/models/list-contacts200-response.js +1 -1
  116. package/dist/generated/models/list-custom-fields200-response.d.ts +1 -1
  117. package/dist/generated/models/list-custom-fields200-response.js +1 -1
  118. package/dist/generated/models/list-deals200-response.d.ts +1 -1
  119. package/dist/generated/models/list-deals200-response.js +1 -1
  120. package/dist/generated/models/list-deals401-response.d.ts +1 -1
  121. package/dist/generated/models/list-deals401-response.js +1 -1
  122. package/dist/generated/models/list-deals403-response.d.ts +1 -1
  123. package/dist/generated/models/list-deals403-response.js +1 -1
  124. package/dist/generated/models/list-journeys200-response.d.ts +16 -0
  125. package/dist/generated/models/list-journeys200-response.js +15 -0
  126. package/dist/generated/models/list-lost-reasons200-response.d.ts +16 -0
  127. package/dist/generated/models/list-lost-reasons200-response.js +15 -0
  128. package/dist/generated/models/list-meeting-rooms200-response.d.ts +16 -0
  129. package/dist/generated/models/list-meeting-rooms200-response.js +15 -0
  130. package/dist/generated/models/list-meeting-types200-response.d.ts +16 -0
  131. package/dist/generated/models/list-meeting-types200-response.js +15 -0
  132. package/dist/generated/models/list-meetings200-response.d.ts +1 -1
  133. package/dist/generated/models/list-meetings200-response.js +1 -1
  134. package/dist/generated/models/list-observations200-response.d.ts +1 -1
  135. package/dist/generated/models/list-observations200-response.js +1 -1
  136. package/dist/generated/models/list-organizations200-response.d.ts +1 -1
  137. package/dist/generated/models/list-organizations200-response.js +1 -1
  138. package/dist/generated/models/list-pipelines200-response.d.ts +1 -1
  139. package/dist/generated/models/list-pipelines200-response.js +1 -1
  140. package/dist/generated/models/list-staffs200-response.d.ts +1 -1
  141. package/dist/generated/models/list-staffs200-response.js +1 -1
  142. package/dist/generated/models/list-task-types200-response-one-of.d.ts +1 -1
  143. package/dist/generated/models/list-task-types200-response-one-of.js +1 -1
  144. package/dist/generated/models/list-task-types200-response.d.ts +1 -1
  145. package/dist/generated/models/list-task-types200-response.js +1 -1
  146. package/dist/generated/models/list-tasks200-response.d.ts +1 -1
  147. package/dist/generated/models/list-tasks200-response.js +1 -1
  148. package/dist/generated/models/list-teams200-response.d.ts +16 -0
  149. package/dist/generated/models/list-teams200-response.js +15 -0
  150. package/dist/generated/models/list-ticket-statuses200-response.d.ts +16 -0
  151. package/dist/generated/models/list-ticket-statuses200-response.js +15 -0
  152. package/dist/generated/models/list-tickets200-response.d.ts +16 -0
  153. package/dist/generated/models/list-tickets200-response.js +15 -0
  154. package/dist/generated/models/list-treatment-types200-response.d.ts +16 -0
  155. package/dist/generated/models/list-treatment-types200-response.js +15 -0
  156. package/dist/generated/models/list-treatments200-response.d.ts +16 -0
  157. package/dist/generated/models/list-treatments200-response.js +15 -0
  158. package/dist/generated/models/list-workspaces200-response.d.ts +16 -0
  159. package/dist/generated/models/list-workspaces200-response.js +15 -0
  160. package/dist/generated/models/lost-reason.d.ts +32 -0
  161. package/dist/generated/models/lost-reason.js +15 -0
  162. package/dist/generated/models/meeting-create.d.ts +1 -1
  163. package/dist/generated/models/meeting-create.js +1 -1
  164. package/dist/generated/models/meeting-deal.d.ts +1 -1
  165. package/dist/generated/models/meeting-deal.js +1 -1
  166. package/dist/generated/models/meeting-input.d.ts +1 -1
  167. package/dist/generated/models/meeting-input.js +1 -1
  168. package/dist/generated/models/meeting-room.d.ts +1 -1
  169. package/dist/generated/models/meeting-room.js +1 -1
  170. package/dist/generated/models/meeting-type.d.ts +1 -1
  171. package/dist/generated/models/meeting-type.js +1 -1
  172. package/dist/generated/models/meeting.d.ts +1 -1
  173. package/dist/generated/models/meeting.js +1 -1
  174. package/dist/generated/models/model-error.d.ts +1 -1
  175. package/dist/generated/models/model-error.js +1 -1
  176. package/dist/generated/models/move-deal-stage-request.d.ts +1 -1
  177. package/dist/generated/models/move-deal-stage-request.js +1 -1
  178. package/dist/generated/models/move-deal-stage200-response.d.ts +1 -1
  179. package/dist/generated/models/move-deal-stage200-response.js +1 -1
  180. package/dist/generated/models/observation-deal.d.ts +1 -1
  181. package/dist/generated/models/observation-deal.js +1 -1
  182. package/dist/generated/models/observation-input.d.ts +1 -1
  183. package/dist/generated/models/observation-input.js +1 -1
  184. package/dist/generated/models/observation-organization.d.ts +1 -1
  185. package/dist/generated/models/observation-organization.js +1 -1
  186. package/dist/generated/models/observation.d.ts +1 -1
  187. package/dist/generated/models/observation.js +1 -1
  188. package/dist/generated/models/organization-input.d.ts +1 -1
  189. package/dist/generated/models/organization-input.js +1 -1
  190. package/dist/generated/models/organization.d.ts +1 -1
  191. package/dist/generated/models/organization.js +1 -1
  192. package/dist/generated/models/page.d.ts +1 -1
  193. package/dist/generated/models/page.js +1 -1
  194. package/dist/generated/models/pipeline.d.ts +1 -1
  195. package/dist/generated/models/pipeline.js +1 -1
  196. package/dist/generated/models/reopen-deal-request.d.ts +1 -1
  197. package/dist/generated/models/reopen-deal-request.js +1 -1
  198. package/dist/generated/models/staff-summary.d.ts +1 -1
  199. package/dist/generated/models/staff-summary.js +1 -1
  200. package/dist/generated/models/staff.d.ts +1 -1
  201. package/dist/generated/models/staff.js +1 -1
  202. package/dist/generated/models/stage.d.ts +1 -1
  203. package/dist/generated/models/stage.js +1 -1
  204. package/dist/generated/models/task-create.d.ts +1 -1
  205. package/dist/generated/models/task-create.js +1 -1
  206. package/dist/generated/models/task-deal.d.ts +1 -1
  207. package/dist/generated/models/task-deal.js +1 -1
  208. package/dist/generated/models/task-input.d.ts +1 -1
  209. package/dist/generated/models/task-input.js +1 -1
  210. package/dist/generated/models/task-type.d.ts +1 -1
  211. package/dist/generated/models/task-type.js +1 -1
  212. package/dist/generated/models/task.d.ts +1 -1
  213. package/dist/generated/models/task.js +1 -1
  214. package/dist/generated/models/team.d.ts +27 -0
  215. package/dist/generated/models/team.js +15 -0
  216. package/dist/generated/models/ticket-create.d.ts +16 -0
  217. package/dist/generated/models/ticket-create.js +15 -0
  218. package/dist/generated/models/ticket-input.d.ts +77 -0
  219. package/dist/generated/models/ticket-input.js +22 -0
  220. package/dist/generated/models/ticket-message.d.ts +33 -0
  221. package/dist/generated/models/ticket-message.js +15 -0
  222. package/dist/generated/models/ticket-status-workspace.d.ts +18 -0
  223. package/dist/generated/models/ticket-status-workspace.js +15 -0
  224. package/dist/generated/models/ticket-status.d.ts +37 -0
  225. package/dist/generated/models/ticket-status.js +15 -0
  226. package/dist/generated/models/ticket.d.ts +87 -0
  227. package/dist/generated/models/ticket.js +22 -0
  228. package/dist/generated/models/treatment-input.d.ts +58 -0
  229. package/dist/generated/models/treatment-input.js +15 -0
  230. package/dist/generated/models/treatment-type.d.ts +43 -0
  231. package/dist/generated/models/treatment-type.js +15 -0
  232. package/dist/generated/models/treatment.d.ts +64 -0
  233. package/dist/generated/models/treatment.js +15 -0
  234. package/dist/generated/models/update-task-type-request.d.ts +1 -1
  235. package/dist/generated/models/update-task-type-request.js +1 -1
  236. package/dist/generated/models/validate-deal200-response-required-actions-pending.d.ts +1 -1
  237. package/dist/generated/models/validate-deal200-response-required-actions-pending.js +1 -1
  238. package/dist/generated/models/validate-deal200-response-required-field-pending.d.ts +1 -1
  239. package/dist/generated/models/validate-deal200-response-required-field-pending.js +1 -1
  240. package/dist/generated/models/validate-deal200-response.d.ts +1 -1
  241. package/dist/generated/models/validate-deal200-response.js +1 -1
  242. package/dist/generated/models/webhook-trigger-group-triggers-inner.d.ts +29 -0
  243. package/dist/generated/models/webhook-trigger-group-triggers-inner.js +15 -0
  244. package/dist/generated/models/webhook-trigger-group.d.ts +22 -0
  245. package/dist/generated/models/webhook-trigger-group.js +15 -0
  246. package/dist/generated/models/workspace.d.ts +23 -0
  247. package/dist/generated/models/workspace.js +15 -0
  248. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * API da Magnet Customer
3
- * A API REST da Magnet Customer permite ler e gravar os registros do CRM a partir dos seus sistemas. # Comece aqui ## 1. Crie um Service Account No CRM, abra **Configurações › Service Accounts** (apenas administradores), clique em **Novo service account**, escolha a validade e as permissões, e copie o **Client ID** e o **Client Secret**. O secret aparece uma única vez. ## 2. Solicite um token ```bash curl -X POST https://magnetcustomer.net/realms/platform/protocol/openid-connect/token \\ -H \"Content-Type: application/x-www-form-urlencoded\" \\ -d \"grant_type=client_credentials\" \\ -d \"client_id=SEU_CLIENT_ID\" \\ -d \"client_secret=SEU_CLIENT_SECRET\" ``` ```json { \"access_token\": \"eyJhbGciOiJSUzI1NiIs...\", \"expires_in\": 900, \"token_type\": \"Bearer\" } ``` O token vale 15 minutos e este fluxo não tem refresh token: quando vencer, ou ao receber `401`, repita o pedido. ## 3. Chame a API Cada conta tem o seu endereço. Troque `sua-conta` pelo subdomínio que você usa para abrir o CRM: ```bash curl \"https://sua-conta.platform-api.magnetcustomer.com/api/deals?page=1&limit=15\" \\ -H \"Authorization: Bearer SEU_TOKEN\" ``` Requisições com corpo levam também `Content-Type: application/json`. # Convenções ## Paginação Envie sempre `page`. Com ele, toda listagem devolve o mesmo envelope: ```json { \"docs\": [], \"total\": 132, \"pages\": 9, \"page\": 1, \"limit\": 15 } ``` | Parâmetro | Padrão | Descrição | |---|---|---| | `page` | — | Página, a partir de 1. **Obrigatório na prática** | | `limit` | 15 | Registros por página. Máximo 100: acima disso a API usa 100 | | `sortBy` | varia por recurso | Campo de ordenação | | `sortType` | `desc` | `asc` ou `desc` | | `search` | — | Busca textual, quando o recurso aceita | Sem `page`, a maioria das listagens devolve uma lista simples (`[...]`), sem o envelope, e ignora `limit`. Para percorrer tudo, peça `page=1` e avance até `page` ser igual a `pages`. Uma página além do fim devolve `docs` vazio. O tamanho de página padrão é 15, com duas exceções: 25 em Leads, Prospects e Clientes, e 100 em Usuários. Um `limit` inválido cai no padrão. ## Identificadores e datas Todo ID é um texto de 24 caracteres hexadecimais, como `507f1f77bcf86cd799439011`. Ao gravar, envie a referência como **ID em texto** — nunca o objeto. Um ID fora desse formato hoje é respondido com `500`, não `400`: valide o formato antes de enviar. No corpo e nas respostas, datas são ISO 8601 em UTC, como `2026-05-15T10:00:00Z`. Nos filtros de data da URL (`minDate`, `dateOfExpires_minDate`...), o valor é um **timestamp em milissegundos**, como `1798761600000`; uma data ISO ali não filtra o que você espera. ## Campos ausentes Campo sem valor costuma vir **ausente** da resposta, não como `null`. Trate a falta da chave como vazio. ## Campos personalizados Os campos criados pelo administrador da conta vão na lista `customFields`: ```json { \"customFields\": [ { \"customField\": \"507f1f77bcf86cd799439014\", \"k\": \"segmento\", \"v\": \"Tecnologia\" } ] } ``` O valor vai em **`v`**. Um item com `value` é aceito sem erro, mas o campo fica vazio. Descubra os campos e os IDs com `GET /api/customfields?page=1&feature=deal` (troque `deal` por `meeting`, `task`, `contact`...). Com `&required=true` vêm só os obrigatórios da conta. ## Erros ```json { \"reason\": \"Missing required parameters\", \"message\": \"Missing required parameters\", \"code\": \"VALIDATION_ERROR\", \"errors\": [ { \"field\": \"title\", \"message\": \"must NOT have fewer than 1 characters\", \"keyword\": \"minLength\" } ] } ``` | Status | Quando | |---|---| | `400` | Corpo inválido: campo obrigatório ausente, tipo errado, valor fora da lista | | `401` | Token ausente, inválido ou vencido. Corpo: `{\"reason\": \"Access Denied\"}` | | `403` | O Service Account não tem a permissão da rota (`type: SA_PERMISSION_DENIED`, com `requiredPermission`) ou a rota exige administrador (`type: ADMIN_REQUIRED`) | | `404` | Registro não encontrado | | `409` | O registro não está no estado que a operação exige | | `429` | Limite de requisições excedido. Espere o tempo de `Retry-After` | ## Limite de requisições Os limites são aplicados por conta. Ao receber `429`, espere os segundos indicados em `Retry-After` e tente de novo com intervalo crescente. ## Área de trabalho Em contas com áreas de trabalho, a API define a área do registro pela credencial ou pelo registro pai. Não envie `workspace`. # Cobertura Esta referência cobre Contatos (leads, prospects e clientes), Empresas, Oportunidades, Pipelines e etapas, Reuniões, Tarefas, Observações, Usuários e Campos personalizados. Tickets, Atendimentos e Webhooks entram nas próximas revisões.
3
+ * A API REST da Magnet Customer permite ler e gravar os registros do CRM a partir dos seus sistemas. # Comece aqui ## 1. Crie um Service Account No CRM, abra **Configurações › Service Accounts** (apenas administradores), clique em **Novo service account**, escolha a validade e as permissões, e copie o **Client ID** e o **Client Secret**. O secret aparece uma única vez. ## 2. Solicite um token ```bash curl -X POST https://magnetcustomer.net/realms/platform/protocol/openid-connect/token \\ -H \"Content-Type: application/x-www-form-urlencoded\" \\ -d \"grant_type=client_credentials\" \\ -d \"client_id=SEU_CLIENT_ID\" \\ -d \"client_secret=SEU_CLIENT_SECRET\" ``` ```json { \"access_token\": \"eyJhbGciOiJSUzI1NiIs...\", \"expires_in\": 900, \"token_type\": \"Bearer\" } ``` O token vale 15 minutos e este fluxo não tem refresh token: quando vencer, ou ao receber `401`, repita o pedido. ## 3. Chame a API Cada conta tem o seu endereço. Troque `sua-conta` pelo subdomínio que você usa para abrir o CRM: ```bash curl \"https://sua-conta.platform-api.magnetcustomer.com/api/deals?page=1&limit=15\" \\ -H \"Authorization: Bearer SEU_TOKEN\" ``` Requisições com corpo levam também `Content-Type: application/json`. # Convenções ## Paginação Envie sempre `page`. Com ele, toda listagem devolve o mesmo envelope: ```json { \"docs\": [], \"total\": 132, \"pages\": 9, \"page\": 1, \"limit\": 15 } ``` | Parâmetro | Padrão | Descrição | |---|---|---| | `page` | — | Página, a partir de 1. **Obrigatório na prática** | | `limit` | 15 | Registros por página. Máximo 100: acima disso a API usa 100 | | `sortBy` | varia por recurso | Campo de ordenação | | `sortType` | `desc` | `asc` ou `desc` | | `search` | — | Busca textual, quando o recurso aceita | Sem `page`, algumas listagens (Contatos, Pipelines, Campos personalizados e os cadastros de apoio, como tipos e situações) devolvem uma lista simples (`[...]`), sem o envelope, e ignoram `limit`. Para percorrer tudo, peça `page=1` e avance até `page` ser igual a `pages`. Uma página além do fim devolve `docs` vazio. O tamanho de página padrão é 15, com duas exceções: 25 em Leads, Prospects e Clientes, e 100 em Usuários. Um `limit` inválido cai no padrão. ## Identificadores e datas Todo ID é um texto de 24 caracteres hexadecimais, como `507f1f77bcf86cd799439011`. Ao gravar, envie a referência como **ID em texto** — nunca o objeto. Um ID fora desse formato hoje é respondido com `500`, não `400`: valide o formato antes de enviar. No corpo e nas respostas, datas são ISO 8601 em UTC, como `2026-05-15T10:00:00Z`. Nos filtros de data da URL (`minDate`, `createdAt_minDate`, `dateOfExpires_minDate`...), envie um **timestamp em milissegundos**, como `1798761600000`. ## Listas na URL Filtros que aceitam vários valores levam colchetes no nome, mesmo quando o valor é um só: ``` /api/contacts?page=1&staffs[]=507f191e810c19729de860eb&staffs[]=507f191e810c19729de860ec ``` Sem colchetes, um valor único é recusado com erro em parte das listagens. ## Campos ausentes Campo sem valor costuma vir **ausente** da resposta, não como `null`. Trate a falta da chave como vazio. ## Campos personalizados Os campos criados pelo administrador da conta vão na lista `customFields`: ```json { \"customFields\": [ { \"customField\": \"507f1f77bcf86cd799439014\", \"k\": \"segmento\", \"v\": \"Tecnologia\" } ] } ``` O valor vai em **`v`**. Um item com `value` é aceito sem erro, mas o campo fica vazio. Descubra os campos e os IDs com `GET /api/customfields?page=1&feature=deal` (troque `deal` por `meeting`, `task`, `contact`...). Com `&required=true` vêm só os obrigatórios da conta. ## Erros ```json { \"reason\": \"Missing required parameters\", \"message\": \"Missing required parameters\", \"code\": \"VALIDATION_ERROR\", \"errors\": [ { \"field\": \"title\", \"message\": \"must NOT have fewer than 1 characters\", \"keyword\": \"minLength\" } ] } ``` | Status | Quando | |---|---| | `400` | Corpo inválido: campo obrigatório ausente, tipo errado, valor fora da lista | | `401` | Token ausente, inválido ou vencido. Corpo: `{\"reason\": \"Access Denied\"}` | | `403` | O Service Account não tem a permissão da rota (`type: SA_PERMISSION_DENIED`, com `requiredPermission`) | | `404` | Registro não encontrado | | `409` | O registro não está no estado que a operação exige | | `429` | Limite de requisições excedido. Espere o tempo de `Retry-After` | ## Permissões Um Service Account só chama as rotas que as permissões dele liberam. Cada operação desta referência informa a permissão exigida, quando há uma: marque-a ao criar o Service Account. Uma chamada sem a permissão devolve `403` com o nome dela em `requiredPermission`. Rotas de administração da conta (usuários, perfis, criação de webhooks, configurações) exigem um usuário administrador e não estão disponíveis para Service Accounts; por isso não aparecem aqui. ## Limite de requisições Os limites são aplicados por conta. Ao receber `429`, espere os segundos indicados em `Retry-After` e tente de novo com intervalo crescente. ## Área de trabalho Em contas com áreas de trabalho, a API define a área do registro pela credencial ou pelo registro pai. Não envie `workspace`. # Webhooks Para ser avisado quando algo muda no CRM, em vez de consultar a API de tempos em tempos, use webhooks. Um administrador cria o webhook no CRM, em **Integrações › Webhooks**, informando a URL do seu sistema e os eventos. A lista de eventos está em `GET /api/webhooks/triggers`; o formato da entrega, a assinatura e os reenvios estão na seção Webhooks do portal. # Cobertura Esta referência cobre Contatos (leads, prospects e clientes), Empresas, Oportunidades, Pipelines, etapas e motivos de perda, Jornadas, Reuniões, Tarefas, Observações, Tickets, Atendimentos, Usuários, Equipes, Áreas de trabalho, Campos personalizados e os eventos de webhook.
4
4
  *
5
5
  * The version of the OpenAPI document: 2026-11
6
6
  * Contact: suporte@magnetcustomer.com
@@ -20,7 +20,7 @@ import type { OrganizationInput } from '../models';
20
20
  */
21
21
  export declare const OrganizationsApiAxiosParamCreator: (configuration?: Configuration) => {
22
22
  /**
23
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
23
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
24
24
  * @summary Criar empresa
25
25
  * @param {OrganizationInput} organizationInput
26
26
  * @param {*} [options] Override http request option.
@@ -28,7 +28,7 @@ export declare const OrganizationsApiAxiosParamCreator: (configuration?: Configu
28
28
  */
29
29
  createOrganization: (organizationInput: OrganizationInput, options?: RawAxiosRequestConfig) => Promise<RequestArgs>;
30
30
  /**
31
- *
31
+ * **Permissão do Service Account:** `organizations.delete`
32
32
  * @summary Excluir empresa
33
33
  * @param {string} id ID do registro.
34
34
  * @param {*} [options] Override http request option.
@@ -36,7 +36,7 @@ export declare const OrganizationsApiAxiosParamCreator: (configuration?: Configu
36
36
  */
37
37
  deleteOrganization: (id: string, options?: RawAxiosRequestConfig) => Promise<RequestArgs>;
38
38
  /**
39
- *
39
+ * **Permissão do Service Account:** `organizations.read`
40
40
  * @summary Obter empresa
41
41
  * @param {string} id ID do registro.
42
42
  * @param {*} [options] Override http request option.
@@ -44,20 +44,20 @@ export declare const OrganizationsApiAxiosParamCreator: (configuration?: Configu
44
44
  */
45
45
  getOrganization: (id: string, options?: RawAxiosRequestConfig) => Promise<RequestArgs>;
46
46
  /**
47
- *
47
+ * **Permissão do Service Account:** `organizations.list`
48
48
  * @summary Listar empresas
49
49
  * @param {number} [page] Página, a partir de 1. **Envie sempre**: sem &#x60;page&#x60;, a resposta vem como lista simples, sem o envelope de paginação, e &#x60;limit&#x60; é ignorado.
50
50
  * @param {number} [limit] Registros por página. Padrão: 15, salvo indicação na operação. Máximo: 100 — acima disso a API usa 100.
51
51
  * @param {string} [sortBy] Campo de ordenação. O padrão varia por recurso.
52
52
  * @param {ListOrganizationsSortTypeEnum} [sortType] Direção da ordenação.
53
- * @param {Array<string>} [staffs] Usuários responsáveis. Repita o parâmetro para enviar vários (&#x60;?staffs&#x3D;id1&amp;staffs&#x3D;id2&#x60;).
53
+ * @param {Array<string>} [staffs] Usuários responsáveis. Lista de IDs: envie com colchetes, mesmo para um só valor (&#x60;?staffs[]&#x3D;id1&amp;staffs[]&#x3D;id2&#x60;).
54
54
  * @param {string} [search] Busca em nome, e-mail e documento.
55
55
  * @param {*} [options] Override http request option.
56
56
  * @throws {RequiredError}
57
57
  */
58
58
  listOrganizations: (page?: number, limit?: number, sortBy?: string, sortType?: ListOrganizationsSortTypeEnum, staffs?: Array<string>, search?: string, options?: RawAxiosRequestConfig) => Promise<RequestArgs>;
59
59
  /**
60
- * Envie só os campos que mudam.
60
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
61
61
  * @summary Atualizar empresa
62
62
  * @param {string} id ID do registro.
63
63
  * @param {OrganizationInput} organizationInput
@@ -71,7 +71,7 @@ export declare const OrganizationsApiAxiosParamCreator: (configuration?: Configu
71
71
  */
72
72
  export declare const OrganizationsApiFp: (configuration?: Configuration) => {
73
73
  /**
74
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
74
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
75
75
  * @summary Criar empresa
76
76
  * @param {OrganizationInput} organizationInput
77
77
  * @param {*} [options] Override http request option.
@@ -79,7 +79,7 @@ export declare const OrganizationsApiFp: (configuration?: Configuration) => {
79
79
  */
80
80
  createOrganization(organizationInput: OrganizationInput, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Organization>>;
81
81
  /**
82
- *
82
+ * **Permissão do Service Account:** `organizations.delete`
83
83
  * @summary Excluir empresa
84
84
  * @param {string} id ID do registro.
85
85
  * @param {*} [options] Override http request option.
@@ -87,7 +87,7 @@ export declare const OrganizationsApiFp: (configuration?: Configuration) => {
87
87
  */
88
88
  deleteOrganization(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>>;
89
89
  /**
90
- *
90
+ * **Permissão do Service Account:** `organizations.read`
91
91
  * @summary Obter empresa
92
92
  * @param {string} id ID do registro.
93
93
  * @param {*} [options] Override http request option.
@@ -95,20 +95,20 @@ export declare const OrganizationsApiFp: (configuration?: Configuration) => {
95
95
  */
96
96
  getOrganization(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Organization>>;
97
97
  /**
98
- *
98
+ * **Permissão do Service Account:** `organizations.list`
99
99
  * @summary Listar empresas
100
100
  * @param {number} [page] Página, a partir de 1. **Envie sempre**: sem &#x60;page&#x60;, a resposta vem como lista simples, sem o envelope de paginação, e &#x60;limit&#x60; é ignorado.
101
101
  * @param {number} [limit] Registros por página. Padrão: 15, salvo indicação na operação. Máximo: 100 — acima disso a API usa 100.
102
102
  * @param {string} [sortBy] Campo de ordenação. O padrão varia por recurso.
103
103
  * @param {ListOrganizationsSortTypeEnum} [sortType] Direção da ordenação.
104
- * @param {Array<string>} [staffs] Usuários responsáveis. Repita o parâmetro para enviar vários (&#x60;?staffs&#x3D;id1&amp;staffs&#x3D;id2&#x60;).
104
+ * @param {Array<string>} [staffs] Usuários responsáveis. Lista de IDs: envie com colchetes, mesmo para um só valor (&#x60;?staffs[]&#x3D;id1&amp;staffs[]&#x3D;id2&#x60;).
105
105
  * @param {string} [search] Busca em nome, e-mail e documento.
106
106
  * @param {*} [options] Override http request option.
107
107
  * @throws {RequiredError}
108
108
  */
109
109
  listOrganizations(page?: number, limit?: number, sortBy?: string, sortType?: ListOrganizationsSortTypeEnum, staffs?: Array<string>, search?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ListOrganizations200Response>>;
110
110
  /**
111
- * Envie só os campos que mudam.
111
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
112
112
  * @summary Atualizar empresa
113
113
  * @param {string} id ID do registro.
114
114
  * @param {OrganizationInput} organizationInput
@@ -122,7 +122,7 @@ export declare const OrganizationsApiFp: (configuration?: Configuration) => {
122
122
  */
123
123
  export declare const OrganizationsApiFactory: (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) => {
124
124
  /**
125
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
125
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
126
126
  * @summary Criar empresa
127
127
  * @param {OrganizationsApiCreateOrganizationRequest} requestParameters Request parameters.
128
128
  * @param {*} [options] Override http request option.
@@ -130,7 +130,7 @@ export declare const OrganizationsApiFactory: (configuration?: Configuration, ba
130
130
  */
131
131
  createOrganization(requestParameters: OrganizationsApiCreateOrganizationRequest, options?: RawAxiosRequestConfig): AxiosPromise<Organization>;
132
132
  /**
133
- *
133
+ * **Permissão do Service Account:** `organizations.delete`
134
134
  * @summary Excluir empresa
135
135
  * @param {OrganizationsApiDeleteOrganizationRequest} requestParameters Request parameters.
136
136
  * @param {*} [options] Override http request option.
@@ -138,7 +138,7 @@ export declare const OrganizationsApiFactory: (configuration?: Configuration, ba
138
138
  */
139
139
  deleteOrganization(requestParameters: OrganizationsApiDeleteOrganizationRequest, options?: RawAxiosRequestConfig): AxiosPromise<void>;
140
140
  /**
141
- *
141
+ * **Permissão do Service Account:** `organizations.read`
142
142
  * @summary Obter empresa
143
143
  * @param {OrganizationsApiGetOrganizationRequest} requestParameters Request parameters.
144
144
  * @param {*} [options] Override http request option.
@@ -146,7 +146,7 @@ export declare const OrganizationsApiFactory: (configuration?: Configuration, ba
146
146
  */
147
147
  getOrganization(requestParameters: OrganizationsApiGetOrganizationRequest, options?: RawAxiosRequestConfig): AxiosPromise<Organization>;
148
148
  /**
149
- *
149
+ * **Permissão do Service Account:** `organizations.list`
150
150
  * @summary Listar empresas
151
151
  * @param {OrganizationsApiListOrganizationsRequest} requestParameters Request parameters.
152
152
  * @param {*} [options] Override http request option.
@@ -154,7 +154,7 @@ export declare const OrganizationsApiFactory: (configuration?: Configuration, ba
154
154
  */
155
155
  listOrganizations(requestParameters?: OrganizationsApiListOrganizationsRequest, options?: RawAxiosRequestConfig): AxiosPromise<ListOrganizations200Response>;
156
156
  /**
157
- * Envie só os campos que mudam.
157
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
158
158
  * @summary Atualizar empresa
159
159
  * @param {OrganizationsApiUpdateOrganizationRequest} requestParameters Request parameters.
160
160
  * @param {*} [options] Override http request option.
@@ -207,7 +207,7 @@ export interface OrganizationsApiListOrganizationsRequest {
207
207
  */
208
208
  readonly sortType?: ListOrganizationsSortTypeEnum;
209
209
  /**
210
- * Usuários responsáveis. Repita o parâmetro para enviar vários (&#x60;?staffs&#x3D;id1&amp;staffs&#x3D;id2&#x60;).
210
+ * Usuários responsáveis. Lista de IDs: envie com colchetes, mesmo para um só valor (&#x60;?staffs[]&#x3D;id1&amp;staffs[]&#x3D;id2&#x60;).
211
211
  */
212
212
  readonly staffs?: Array<string>;
213
213
  /**
@@ -230,7 +230,7 @@ export interface OrganizationsApiUpdateOrganizationRequest {
230
230
  */
231
231
  export declare class OrganizationsApi extends BaseAPI {
232
232
  /**
233
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
233
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
234
234
  * @summary Criar empresa
235
235
  * @param {OrganizationsApiCreateOrganizationRequest} requestParameters Request parameters.
236
236
  * @param {*} [options] Override http request option.
@@ -238,7 +238,7 @@ export declare class OrganizationsApi extends BaseAPI {
238
238
  */
239
239
  createOrganization(requestParameters: OrganizationsApiCreateOrganizationRequest, options?: RawAxiosRequestConfig): Promise<import("axios").AxiosResponse<Organization, any, {}, any>>;
240
240
  /**
241
- *
241
+ * **Permissão do Service Account:** `organizations.delete`
242
242
  * @summary Excluir empresa
243
243
  * @param {OrganizationsApiDeleteOrganizationRequest} requestParameters Request parameters.
244
244
  * @param {*} [options] Override http request option.
@@ -246,7 +246,7 @@ export declare class OrganizationsApi extends BaseAPI {
246
246
  */
247
247
  deleteOrganization(requestParameters: OrganizationsApiDeleteOrganizationRequest, options?: RawAxiosRequestConfig): Promise<import("axios").AxiosResponse<void, any, {}, any>>;
248
248
  /**
249
- *
249
+ * **Permissão do Service Account:** `organizations.read`
250
250
  * @summary Obter empresa
251
251
  * @param {OrganizationsApiGetOrganizationRequest} requestParameters Request parameters.
252
252
  * @param {*} [options] Override http request option.
@@ -254,7 +254,7 @@ export declare class OrganizationsApi extends BaseAPI {
254
254
  */
255
255
  getOrganization(requestParameters: OrganizationsApiGetOrganizationRequest, options?: RawAxiosRequestConfig): Promise<import("axios").AxiosResponse<Organization, any, {}, any>>;
256
256
  /**
257
- *
257
+ * **Permissão do Service Account:** `organizations.list`
258
258
  * @summary Listar empresas
259
259
  * @param {OrganizationsApiListOrganizationsRequest} requestParameters Request parameters.
260
260
  * @param {*} [options] Override http request option.
@@ -262,7 +262,7 @@ export declare class OrganizationsApi extends BaseAPI {
262
262
  */
263
263
  listOrganizations(requestParameters?: OrganizationsApiListOrganizationsRequest, options?: RawAxiosRequestConfig): Promise<import("axios").AxiosResponse<import("../models").Page, any, {}, any>>;
264
264
  /**
265
- * Envie só os campos que mudam.
265
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
266
266
  * @summary Atualizar empresa
267
267
  * @param {OrganizationsApiUpdateOrganizationRequest} requestParameters Request parameters.
268
268
  * @param {*} [options] Override http request option.
@@ -3,7 +3,7 @@
3
3
  /* eslint-disable */
4
4
  /**
5
5
  * API da Magnet Customer
6
- * A API REST da Magnet Customer permite ler e gravar os registros do CRM a partir dos seus sistemas. # Comece aqui ## 1. Crie um Service Account No CRM, abra **Configurações › Service Accounts** (apenas administradores), clique em **Novo service account**, escolha a validade e as permissões, e copie o **Client ID** e o **Client Secret**. O secret aparece uma única vez. ## 2. Solicite um token ```bash curl -X POST https://magnetcustomer.net/realms/platform/protocol/openid-connect/token \\ -H \"Content-Type: application/x-www-form-urlencoded\" \\ -d \"grant_type=client_credentials\" \\ -d \"client_id=SEU_CLIENT_ID\" \\ -d \"client_secret=SEU_CLIENT_SECRET\" ``` ```json { \"access_token\": \"eyJhbGciOiJSUzI1NiIs...\", \"expires_in\": 900, \"token_type\": \"Bearer\" } ``` O token vale 15 minutos e este fluxo não tem refresh token: quando vencer, ou ao receber `401`, repita o pedido. ## 3. Chame a API Cada conta tem o seu endereço. Troque `sua-conta` pelo subdomínio que você usa para abrir o CRM: ```bash curl \"https://sua-conta.platform-api.magnetcustomer.com/api/deals?page=1&limit=15\" \\ -H \"Authorization: Bearer SEU_TOKEN\" ``` Requisições com corpo levam também `Content-Type: application/json`. # Convenções ## Paginação Envie sempre `page`. Com ele, toda listagem devolve o mesmo envelope: ```json { \"docs\": [], \"total\": 132, \"pages\": 9, \"page\": 1, \"limit\": 15 } ``` | Parâmetro | Padrão | Descrição | |---|---|---| | `page` | — | Página, a partir de 1. **Obrigatório na prática** | | `limit` | 15 | Registros por página. Máximo 100: acima disso a API usa 100 | | `sortBy` | varia por recurso | Campo de ordenação | | `sortType` | `desc` | `asc` ou `desc` | | `search` | — | Busca textual, quando o recurso aceita | Sem `page`, a maioria das listagens devolve uma lista simples (`[...]`), sem o envelope, e ignora `limit`. Para percorrer tudo, peça `page=1` e avance até `page` ser igual a `pages`. Uma página além do fim devolve `docs` vazio. O tamanho de página padrão é 15, com duas exceções: 25 em Leads, Prospects e Clientes, e 100 em Usuários. Um `limit` inválido cai no padrão. ## Identificadores e datas Todo ID é um texto de 24 caracteres hexadecimais, como `507f1f77bcf86cd799439011`. Ao gravar, envie a referência como **ID em texto** — nunca o objeto. Um ID fora desse formato hoje é respondido com `500`, não `400`: valide o formato antes de enviar. No corpo e nas respostas, datas são ISO 8601 em UTC, como `2026-05-15T10:00:00Z`. Nos filtros de data da URL (`minDate`, `dateOfExpires_minDate`...), o valor é um **timestamp em milissegundos**, como `1798761600000`; uma data ISO ali não filtra o que você espera. ## Campos ausentes Campo sem valor costuma vir **ausente** da resposta, não como `null`. Trate a falta da chave como vazio. ## Campos personalizados Os campos criados pelo administrador da conta vão na lista `customFields`: ```json { \"customFields\": [ { \"customField\": \"507f1f77bcf86cd799439014\", \"k\": \"segmento\", \"v\": \"Tecnologia\" } ] } ``` O valor vai em **`v`**. Um item com `value` é aceito sem erro, mas o campo fica vazio. Descubra os campos e os IDs com `GET /api/customfields?page=1&feature=deal` (troque `deal` por `meeting`, `task`, `contact`...). Com `&required=true` vêm só os obrigatórios da conta. ## Erros ```json { \"reason\": \"Missing required parameters\", \"message\": \"Missing required parameters\", \"code\": \"VALIDATION_ERROR\", \"errors\": [ { \"field\": \"title\", \"message\": \"must NOT have fewer than 1 characters\", \"keyword\": \"minLength\" } ] } ``` | Status | Quando | |---|---| | `400` | Corpo inválido: campo obrigatório ausente, tipo errado, valor fora da lista | | `401` | Token ausente, inválido ou vencido. Corpo: `{\"reason\": \"Access Denied\"}` | | `403` | O Service Account não tem a permissão da rota (`type: SA_PERMISSION_DENIED`, com `requiredPermission`) ou a rota exige administrador (`type: ADMIN_REQUIRED`) | | `404` | Registro não encontrado | | `409` | O registro não está no estado que a operação exige | | `429` | Limite de requisições excedido. Espere o tempo de `Retry-After` | ## Limite de requisições Os limites são aplicados por conta. Ao receber `429`, espere os segundos indicados em `Retry-After` e tente de novo com intervalo crescente. ## Área de trabalho Em contas com áreas de trabalho, a API define a área do registro pela credencial ou pelo registro pai. Não envie `workspace`. # Cobertura Esta referência cobre Contatos (leads, prospects e clientes), Empresas, Oportunidades, Pipelines e etapas, Reuniões, Tarefas, Observações, Usuários e Campos personalizados. Tickets, Atendimentos e Webhooks entram nas próximas revisões.
6
+ * A API REST da Magnet Customer permite ler e gravar os registros do CRM a partir dos seus sistemas. # Comece aqui ## 1. Crie um Service Account No CRM, abra **Configurações › Service Accounts** (apenas administradores), clique em **Novo service account**, escolha a validade e as permissões, e copie o **Client ID** e o **Client Secret**. O secret aparece uma única vez. ## 2. Solicite um token ```bash curl -X POST https://magnetcustomer.net/realms/platform/protocol/openid-connect/token \\ -H \"Content-Type: application/x-www-form-urlencoded\" \\ -d \"grant_type=client_credentials\" \\ -d \"client_id=SEU_CLIENT_ID\" \\ -d \"client_secret=SEU_CLIENT_SECRET\" ``` ```json { \"access_token\": \"eyJhbGciOiJSUzI1NiIs...\", \"expires_in\": 900, \"token_type\": \"Bearer\" } ``` O token vale 15 minutos e este fluxo não tem refresh token: quando vencer, ou ao receber `401`, repita o pedido. ## 3. Chame a API Cada conta tem o seu endereço. Troque `sua-conta` pelo subdomínio que você usa para abrir o CRM: ```bash curl \"https://sua-conta.platform-api.magnetcustomer.com/api/deals?page=1&limit=15\" \\ -H \"Authorization: Bearer SEU_TOKEN\" ``` Requisições com corpo levam também `Content-Type: application/json`. # Convenções ## Paginação Envie sempre `page`. Com ele, toda listagem devolve o mesmo envelope: ```json { \"docs\": [], \"total\": 132, \"pages\": 9, \"page\": 1, \"limit\": 15 } ``` | Parâmetro | Padrão | Descrição | |---|---|---| | `page` | — | Página, a partir de 1. **Obrigatório na prática** | | `limit` | 15 | Registros por página. Máximo 100: acima disso a API usa 100 | | `sortBy` | varia por recurso | Campo de ordenação | | `sortType` | `desc` | `asc` ou `desc` | | `search` | — | Busca textual, quando o recurso aceita | Sem `page`, algumas listagens (Contatos, Pipelines, Campos personalizados e os cadastros de apoio, como tipos e situações) devolvem uma lista simples (`[...]`), sem o envelope, e ignoram `limit`. Para percorrer tudo, peça `page=1` e avance até `page` ser igual a `pages`. Uma página além do fim devolve `docs` vazio. O tamanho de página padrão é 15, com duas exceções: 25 em Leads, Prospects e Clientes, e 100 em Usuários. Um `limit` inválido cai no padrão. ## Identificadores e datas Todo ID é um texto de 24 caracteres hexadecimais, como `507f1f77bcf86cd799439011`. Ao gravar, envie a referência como **ID em texto** — nunca o objeto. Um ID fora desse formato hoje é respondido com `500`, não `400`: valide o formato antes de enviar. No corpo e nas respostas, datas são ISO 8601 em UTC, como `2026-05-15T10:00:00Z`. Nos filtros de data da URL (`minDate`, `createdAt_minDate`, `dateOfExpires_minDate`...), envie um **timestamp em milissegundos**, como `1798761600000`. ## Listas na URL Filtros que aceitam vários valores levam colchetes no nome, mesmo quando o valor é um só: ``` /api/contacts?page=1&staffs[]=507f191e810c19729de860eb&staffs[]=507f191e810c19729de860ec ``` Sem colchetes, um valor único é recusado com erro em parte das listagens. ## Campos ausentes Campo sem valor costuma vir **ausente** da resposta, não como `null`. Trate a falta da chave como vazio. ## Campos personalizados Os campos criados pelo administrador da conta vão na lista `customFields`: ```json { \"customFields\": [ { \"customField\": \"507f1f77bcf86cd799439014\", \"k\": \"segmento\", \"v\": \"Tecnologia\" } ] } ``` O valor vai em **`v`**. Um item com `value` é aceito sem erro, mas o campo fica vazio. Descubra os campos e os IDs com `GET /api/customfields?page=1&feature=deal` (troque `deal` por `meeting`, `task`, `contact`...). Com `&required=true` vêm só os obrigatórios da conta. ## Erros ```json { \"reason\": \"Missing required parameters\", \"message\": \"Missing required parameters\", \"code\": \"VALIDATION_ERROR\", \"errors\": [ { \"field\": \"title\", \"message\": \"must NOT have fewer than 1 characters\", \"keyword\": \"minLength\" } ] } ``` | Status | Quando | |---|---| | `400` | Corpo inválido: campo obrigatório ausente, tipo errado, valor fora da lista | | `401` | Token ausente, inválido ou vencido. Corpo: `{\"reason\": \"Access Denied\"}` | | `403` | O Service Account não tem a permissão da rota (`type: SA_PERMISSION_DENIED`, com `requiredPermission`) | | `404` | Registro não encontrado | | `409` | O registro não está no estado que a operação exige | | `429` | Limite de requisições excedido. Espere o tempo de `Retry-After` | ## Permissões Um Service Account só chama as rotas que as permissões dele liberam. Cada operação desta referência informa a permissão exigida, quando há uma: marque-a ao criar o Service Account. Uma chamada sem a permissão devolve `403` com o nome dela em `requiredPermission`. Rotas de administração da conta (usuários, perfis, criação de webhooks, configurações) exigem um usuário administrador e não estão disponíveis para Service Accounts; por isso não aparecem aqui. ## Limite de requisições Os limites são aplicados por conta. Ao receber `429`, espere os segundos indicados em `Retry-After` e tente de novo com intervalo crescente. ## Área de trabalho Em contas com áreas de trabalho, a API define a área do registro pela credencial ou pelo registro pai. Não envie `workspace`. # Webhooks Para ser avisado quando algo muda no CRM, em vez de consultar a API de tempos em tempos, use webhooks. Um administrador cria o webhook no CRM, em **Integrações › Webhooks**, informando a URL do seu sistema e os eventos. A lista de eventos está em `GET /api/webhooks/triggers`; o formato da entrega, a assinatura e os reenvios estão na seção Webhooks do portal. # Cobertura Esta referência cobre Contatos (leads, prospects e clientes), Empresas, Oportunidades, Pipelines, etapas e motivos de perda, Jornadas, Reuniões, Tarefas, Observações, Tickets, Atendimentos, Usuários, Equipes, Áreas de trabalho, Campos personalizados e os eventos de webhook.
7
7
  *
8
8
  * The version of the OpenAPI document: 2026-11
9
9
  * Contact: suporte@magnetcustomer.com
@@ -29,7 +29,7 @@ const base_1 = require("../base");
29
29
  const OrganizationsApiAxiosParamCreator = function (configuration) {
30
30
  return {
31
31
  /**
32
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
32
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
33
33
  * @summary Criar empresa
34
34
  * @param {OrganizationInput} organizationInput
35
35
  * @param {*} [options] Override http request option.
@@ -63,7 +63,7 @@ const OrganizationsApiAxiosParamCreator = function (configuration) {
63
63
  };
64
64
  },
65
65
  /**
66
- *
66
+ * **Permissão do Service Account:** `organizations.delete`
67
67
  * @summary Excluir empresa
68
68
  * @param {string} id ID do registro.
69
69
  * @param {*} [options] Override http request option.
@@ -96,7 +96,7 @@ const OrganizationsApiAxiosParamCreator = function (configuration) {
96
96
  };
97
97
  },
98
98
  /**
99
- *
99
+ * **Permissão do Service Account:** `organizations.read`
100
100
  * @summary Obter empresa
101
101
  * @param {string} id ID do registro.
102
102
  * @param {*} [options] Override http request option.
@@ -129,13 +129,13 @@ const OrganizationsApiAxiosParamCreator = function (configuration) {
129
129
  };
130
130
  },
131
131
  /**
132
- *
132
+ * **Permissão do Service Account:** `organizations.list`
133
133
  * @summary Listar empresas
134
134
  * @param {number} [page] Página, a partir de 1. **Envie sempre**: sem &#x60;page&#x60;, a resposta vem como lista simples, sem o envelope de paginação, e &#x60;limit&#x60; é ignorado.
135
135
  * @param {number} [limit] Registros por página. Padrão: 15, salvo indicação na operação. Máximo: 100 — acima disso a API usa 100.
136
136
  * @param {string} [sortBy] Campo de ordenação. O padrão varia por recurso.
137
137
  * @param {ListOrganizationsSortTypeEnum} [sortType] Direção da ordenação.
138
- * @param {Array<string>} [staffs] Usuários responsáveis. Repita o parâmetro para enviar vários (&#x60;?staffs&#x3D;id1&amp;staffs&#x3D;id2&#x60;).
138
+ * @param {Array<string>} [staffs] Usuários responsáveis. Lista de IDs: envie com colchetes, mesmo para um só valor (&#x60;?staffs[]&#x3D;id1&amp;staffs[]&#x3D;id2&#x60;).
139
139
  * @param {string} [search] Busca em nome, e-mail e documento.
140
140
  * @param {*} [options] Override http request option.
141
141
  * @throws {RequiredError}
@@ -167,7 +167,7 @@ const OrganizationsApiAxiosParamCreator = function (configuration) {
167
167
  localVarQueryParameter['sortType'] = sortType;
168
168
  }
169
169
  if (staffs) {
170
- localVarQueryParameter['staffs'] = staffs;
170
+ localVarQueryParameter['staffs[]'] = staffs;
171
171
  }
172
172
  if (search !== undefined) {
173
173
  localVarQueryParameter['search'] = search;
@@ -182,7 +182,7 @@ const OrganizationsApiAxiosParamCreator = function (configuration) {
182
182
  };
183
183
  },
184
184
  /**
185
- * Envie só os campos que mudam.
185
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
186
186
  * @summary Atualizar empresa
187
187
  * @param {string} id ID do registro.
188
188
  * @param {OrganizationInput} organizationInput
@@ -229,7 +229,7 @@ const OrganizationsApiFp = function (configuration) {
229
229
  const localVarAxiosParamCreator = (0, exports.OrganizationsApiAxiosParamCreator)(configuration);
230
230
  return {
231
231
  /**
232
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
232
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
233
233
  * @summary Criar empresa
234
234
  * @param {OrganizationInput} organizationInput
235
235
  * @param {*} [options] Override http request option.
@@ -242,7 +242,7 @@ const OrganizationsApiFp = function (configuration) {
242
242
  return (axios, basePath) => (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
243
243
  },
244
244
  /**
245
- *
245
+ * **Permissão do Service Account:** `organizations.delete`
246
246
  * @summary Excluir empresa
247
247
  * @param {string} id ID do registro.
248
248
  * @param {*} [options] Override http request option.
@@ -255,7 +255,7 @@ const OrganizationsApiFp = function (configuration) {
255
255
  return (axios, basePath) => (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
256
256
  },
257
257
  /**
258
- *
258
+ * **Permissão do Service Account:** `organizations.read`
259
259
  * @summary Obter empresa
260
260
  * @param {string} id ID do registro.
261
261
  * @param {*} [options] Override http request option.
@@ -268,13 +268,13 @@ const OrganizationsApiFp = function (configuration) {
268
268
  return (axios, basePath) => (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
269
269
  },
270
270
  /**
271
- *
271
+ * **Permissão do Service Account:** `organizations.list`
272
272
  * @summary Listar empresas
273
273
  * @param {number} [page] Página, a partir de 1. **Envie sempre**: sem &#x60;page&#x60;, a resposta vem como lista simples, sem o envelope de paginação, e &#x60;limit&#x60; é ignorado.
274
274
  * @param {number} [limit] Registros por página. Padrão: 15, salvo indicação na operação. Máximo: 100 — acima disso a API usa 100.
275
275
  * @param {string} [sortBy] Campo de ordenação. O padrão varia por recurso.
276
276
  * @param {ListOrganizationsSortTypeEnum} [sortType] Direção da ordenação.
277
- * @param {Array<string>} [staffs] Usuários responsáveis. Repita o parâmetro para enviar vários (&#x60;?staffs&#x3D;id1&amp;staffs&#x3D;id2&#x60;).
277
+ * @param {Array<string>} [staffs] Usuários responsáveis. Lista de IDs: envie com colchetes, mesmo para um só valor (&#x60;?staffs[]&#x3D;id1&amp;staffs[]&#x3D;id2&#x60;).
278
278
  * @param {string} [search] Busca em nome, e-mail e documento.
279
279
  * @param {*} [options] Override http request option.
280
280
  * @throws {RequiredError}
@@ -286,7 +286,7 @@ const OrganizationsApiFp = function (configuration) {
286
286
  return (axios, basePath) => (0, common_1.createRequestFunction)(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
287
287
  },
288
288
  /**
289
- * Envie só os campos que mudam.
289
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
290
290
  * @summary Atualizar empresa
291
291
  * @param {string} id ID do registro.
292
292
  * @param {OrganizationInput} organizationInput
@@ -309,7 +309,7 @@ const OrganizationsApiFactory = function (configuration, basePath, axios) {
309
309
  const localVarFp = (0, exports.OrganizationsApiFp)(configuration);
310
310
  return {
311
311
  /**
312
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
312
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
313
313
  * @summary Criar empresa
314
314
  * @param {OrganizationsApiCreateOrganizationRequest} requestParameters Request parameters.
315
315
  * @param {*} [options] Override http request option.
@@ -319,7 +319,7 @@ const OrganizationsApiFactory = function (configuration, basePath, axios) {
319
319
  return localVarFp.createOrganization(requestParameters.organizationInput, options).then((request) => request(axios, basePath));
320
320
  },
321
321
  /**
322
- *
322
+ * **Permissão do Service Account:** `organizations.delete`
323
323
  * @summary Excluir empresa
324
324
  * @param {OrganizationsApiDeleteOrganizationRequest} requestParameters Request parameters.
325
325
  * @param {*} [options] Override http request option.
@@ -329,7 +329,7 @@ const OrganizationsApiFactory = function (configuration, basePath, axios) {
329
329
  return localVarFp.deleteOrganization(requestParameters.id, options).then((request) => request(axios, basePath));
330
330
  },
331
331
  /**
332
- *
332
+ * **Permissão do Service Account:** `organizations.read`
333
333
  * @summary Obter empresa
334
334
  * @param {OrganizationsApiGetOrganizationRequest} requestParameters Request parameters.
335
335
  * @param {*} [options] Override http request option.
@@ -339,7 +339,7 @@ const OrganizationsApiFactory = function (configuration, basePath, axios) {
339
339
  return localVarFp.getOrganization(requestParameters.id, options).then((request) => request(axios, basePath));
340
340
  },
341
341
  /**
342
- *
342
+ * **Permissão do Service Account:** `organizations.list`
343
343
  * @summary Listar empresas
344
344
  * @param {OrganizationsApiListOrganizationsRequest} requestParameters Request parameters.
345
345
  * @param {*} [options] Override http request option.
@@ -349,7 +349,7 @@ const OrganizationsApiFactory = function (configuration, basePath, axios) {
349
349
  return localVarFp.listOrganizations(requestParameters.page, requestParameters.limit, requestParameters.sortBy, requestParameters.sortType, requestParameters.staffs, requestParameters.search, options).then((request) => request(axios, basePath));
350
350
  },
351
351
  /**
352
- * Envie só os campos que mudam.
352
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
353
353
  * @summary Atualizar empresa
354
354
  * @param {OrganizationsApiUpdateOrganizationRequest} requestParameters Request parameters.
355
355
  * @param {*} [options] Override http request option.
@@ -366,7 +366,7 @@ exports.OrganizationsApiFactory = OrganizationsApiFactory;
366
366
  */
367
367
  class OrganizationsApi extends base_1.BaseAPI {
368
368
  /**
369
- * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`.
369
+ * Os campos obrigatórios são definidos pelo administrador da conta: consulte `GET /api/customfields?feature=organization&required=true`. **Permissão do Service Account:** `organizations.create`
370
370
  * @summary Criar empresa
371
371
  * @param {OrganizationsApiCreateOrganizationRequest} requestParameters Request parameters.
372
372
  * @param {*} [options] Override http request option.
@@ -376,7 +376,7 @@ class OrganizationsApi extends base_1.BaseAPI {
376
376
  return (0, exports.OrganizationsApiFp)(this.configuration).createOrganization(requestParameters.organizationInput, options).then((request) => request(this.axios, this.basePath));
377
377
  }
378
378
  /**
379
- *
379
+ * **Permissão do Service Account:** `organizations.delete`
380
380
  * @summary Excluir empresa
381
381
  * @param {OrganizationsApiDeleteOrganizationRequest} requestParameters Request parameters.
382
382
  * @param {*} [options] Override http request option.
@@ -386,7 +386,7 @@ class OrganizationsApi extends base_1.BaseAPI {
386
386
  return (0, exports.OrganizationsApiFp)(this.configuration).deleteOrganization(requestParameters.id, options).then((request) => request(this.axios, this.basePath));
387
387
  }
388
388
  /**
389
- *
389
+ * **Permissão do Service Account:** `organizations.read`
390
390
  * @summary Obter empresa
391
391
  * @param {OrganizationsApiGetOrganizationRequest} requestParameters Request parameters.
392
392
  * @param {*} [options] Override http request option.
@@ -396,7 +396,7 @@ class OrganizationsApi extends base_1.BaseAPI {
396
396
  return (0, exports.OrganizationsApiFp)(this.configuration).getOrganization(requestParameters.id, options).then((request) => request(this.axios, this.basePath));
397
397
  }
398
398
  /**
399
- *
399
+ * **Permissão do Service Account:** `organizations.list`
400
400
  * @summary Listar empresas
401
401
  * @param {OrganizationsApiListOrganizationsRequest} requestParameters Request parameters.
402
402
  * @param {*} [options] Override http request option.
@@ -406,7 +406,7 @@ class OrganizationsApi extends base_1.BaseAPI {
406
406
  return (0, exports.OrganizationsApiFp)(this.configuration).listOrganizations(requestParameters.page, requestParameters.limit, requestParameters.sortBy, requestParameters.sortType, requestParameters.staffs, requestParameters.search, options).then((request) => request(this.axios, this.basePath));
407
407
  }
408
408
  /**
409
- * Envie só os campos que mudam.
409
+ * Envie só os campos que mudam. **Permissão do Service Account:** `organizations.update`
410
410
  * @summary Atualizar empresa
411
411
  * @param {OrganizationsApiUpdateOrganizationRequest} requestParameters Request parameters.
412
412
  * @param {*} [options] Override http request option.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * API da Magnet Customer
3
- * A API REST da Magnet Customer permite ler e gravar os registros do CRM a partir dos seus sistemas. # Comece aqui ## 1. Crie um Service Account No CRM, abra **Configurações › Service Accounts** (apenas administradores), clique em **Novo service account**, escolha a validade e as permissões, e copie o **Client ID** e o **Client Secret**. O secret aparece uma única vez. ## 2. Solicite um token ```bash curl -X POST https://magnetcustomer.net/realms/platform/protocol/openid-connect/token \\ -H \"Content-Type: application/x-www-form-urlencoded\" \\ -d \"grant_type=client_credentials\" \\ -d \"client_id=SEU_CLIENT_ID\" \\ -d \"client_secret=SEU_CLIENT_SECRET\" ``` ```json { \"access_token\": \"eyJhbGciOiJSUzI1NiIs...\", \"expires_in\": 900, \"token_type\": \"Bearer\" } ``` O token vale 15 minutos e este fluxo não tem refresh token: quando vencer, ou ao receber `401`, repita o pedido. ## 3. Chame a API Cada conta tem o seu endereço. Troque `sua-conta` pelo subdomínio que você usa para abrir o CRM: ```bash curl \"https://sua-conta.platform-api.magnetcustomer.com/api/deals?page=1&limit=15\" \\ -H \"Authorization: Bearer SEU_TOKEN\" ``` Requisições com corpo levam também `Content-Type: application/json`. # Convenções ## Paginação Envie sempre `page`. Com ele, toda listagem devolve o mesmo envelope: ```json { \"docs\": [], \"total\": 132, \"pages\": 9, \"page\": 1, \"limit\": 15 } ``` | Parâmetro | Padrão | Descrição | |---|---|---| | `page` | — | Página, a partir de 1. **Obrigatório na prática** | | `limit` | 15 | Registros por página. Máximo 100: acima disso a API usa 100 | | `sortBy` | varia por recurso | Campo de ordenação | | `sortType` | `desc` | `asc` ou `desc` | | `search` | — | Busca textual, quando o recurso aceita | Sem `page`, a maioria das listagens devolve uma lista simples (`[...]`), sem o envelope, e ignora `limit`. Para percorrer tudo, peça `page=1` e avance até `page` ser igual a `pages`. Uma página além do fim devolve `docs` vazio. O tamanho de página padrão é 15, com duas exceções: 25 em Leads, Prospects e Clientes, e 100 em Usuários. Um `limit` inválido cai no padrão. ## Identificadores e datas Todo ID é um texto de 24 caracteres hexadecimais, como `507f1f77bcf86cd799439011`. Ao gravar, envie a referência como **ID em texto** — nunca o objeto. Um ID fora desse formato hoje é respondido com `500`, não `400`: valide o formato antes de enviar. No corpo e nas respostas, datas são ISO 8601 em UTC, como `2026-05-15T10:00:00Z`. Nos filtros de data da URL (`minDate`, `dateOfExpires_minDate`...), o valor é um **timestamp em milissegundos**, como `1798761600000`; uma data ISO ali não filtra o que você espera. ## Campos ausentes Campo sem valor costuma vir **ausente** da resposta, não como `null`. Trate a falta da chave como vazio. ## Campos personalizados Os campos criados pelo administrador da conta vão na lista `customFields`: ```json { \"customFields\": [ { \"customField\": \"507f1f77bcf86cd799439014\", \"k\": \"segmento\", \"v\": \"Tecnologia\" } ] } ``` O valor vai em **`v`**. Um item com `value` é aceito sem erro, mas o campo fica vazio. Descubra os campos e os IDs com `GET /api/customfields?page=1&feature=deal` (troque `deal` por `meeting`, `task`, `contact`...). Com `&required=true` vêm só os obrigatórios da conta. ## Erros ```json { \"reason\": \"Missing required parameters\", \"message\": \"Missing required parameters\", \"code\": \"VALIDATION_ERROR\", \"errors\": [ { \"field\": \"title\", \"message\": \"must NOT have fewer than 1 characters\", \"keyword\": \"minLength\" } ] } ``` | Status | Quando | |---|---| | `400` | Corpo inválido: campo obrigatório ausente, tipo errado, valor fora da lista | | `401` | Token ausente, inválido ou vencido. Corpo: `{\"reason\": \"Access Denied\"}` | | `403` | O Service Account não tem a permissão da rota (`type: SA_PERMISSION_DENIED`, com `requiredPermission`) ou a rota exige administrador (`type: ADMIN_REQUIRED`) | | `404` | Registro não encontrado | | `409` | O registro não está no estado que a operação exige | | `429` | Limite de requisições excedido. Espere o tempo de `Retry-After` | ## Limite de requisições Os limites são aplicados por conta. Ao receber `429`, espere os segundos indicados em `Retry-After` e tente de novo com intervalo crescente. ## Área de trabalho Em contas com áreas de trabalho, a API define a área do registro pela credencial ou pelo registro pai. Não envie `workspace`. # Cobertura Esta referência cobre Contatos (leads, prospects e clientes), Empresas, Oportunidades, Pipelines e etapas, Reuniões, Tarefas, Observações, Usuários e Campos personalizados. Tickets, Atendimentos e Webhooks entram nas próximas revisões.
3
+ * A API REST da Magnet Customer permite ler e gravar os registros do CRM a partir dos seus sistemas. # Comece aqui ## 1. Crie um Service Account No CRM, abra **Configurações › Service Accounts** (apenas administradores), clique em **Novo service account**, escolha a validade e as permissões, e copie o **Client ID** e o **Client Secret**. O secret aparece uma única vez. ## 2. Solicite um token ```bash curl -X POST https://magnetcustomer.net/realms/platform/protocol/openid-connect/token \\ -H \"Content-Type: application/x-www-form-urlencoded\" \\ -d \"grant_type=client_credentials\" \\ -d \"client_id=SEU_CLIENT_ID\" \\ -d \"client_secret=SEU_CLIENT_SECRET\" ``` ```json { \"access_token\": \"eyJhbGciOiJSUzI1NiIs...\", \"expires_in\": 900, \"token_type\": \"Bearer\" } ``` O token vale 15 minutos e este fluxo não tem refresh token: quando vencer, ou ao receber `401`, repita o pedido. ## 3. Chame a API Cada conta tem o seu endereço. Troque `sua-conta` pelo subdomínio que você usa para abrir o CRM: ```bash curl \"https://sua-conta.platform-api.magnetcustomer.com/api/deals?page=1&limit=15\" \\ -H \"Authorization: Bearer SEU_TOKEN\" ``` Requisições com corpo levam também `Content-Type: application/json`. # Convenções ## Paginação Envie sempre `page`. Com ele, toda listagem devolve o mesmo envelope: ```json { \"docs\": [], \"total\": 132, \"pages\": 9, \"page\": 1, \"limit\": 15 } ``` | Parâmetro | Padrão | Descrição | |---|---|---| | `page` | — | Página, a partir de 1. **Obrigatório na prática** | | `limit` | 15 | Registros por página. Máximo 100: acima disso a API usa 100 | | `sortBy` | varia por recurso | Campo de ordenação | | `sortType` | `desc` | `asc` ou `desc` | | `search` | — | Busca textual, quando o recurso aceita | Sem `page`, algumas listagens (Contatos, Pipelines, Campos personalizados e os cadastros de apoio, como tipos e situações) devolvem uma lista simples (`[...]`), sem o envelope, e ignoram `limit`. Para percorrer tudo, peça `page=1` e avance até `page` ser igual a `pages`. Uma página além do fim devolve `docs` vazio. O tamanho de página padrão é 15, com duas exceções: 25 em Leads, Prospects e Clientes, e 100 em Usuários. Um `limit` inválido cai no padrão. ## Identificadores e datas Todo ID é um texto de 24 caracteres hexadecimais, como `507f1f77bcf86cd799439011`. Ao gravar, envie a referência como **ID em texto** — nunca o objeto. Um ID fora desse formato hoje é respondido com `500`, não `400`: valide o formato antes de enviar. No corpo e nas respostas, datas são ISO 8601 em UTC, como `2026-05-15T10:00:00Z`. Nos filtros de data da URL (`minDate`, `createdAt_minDate`, `dateOfExpires_minDate`...), envie um **timestamp em milissegundos**, como `1798761600000`. ## Listas na URL Filtros que aceitam vários valores levam colchetes no nome, mesmo quando o valor é um só: ``` /api/contacts?page=1&staffs[]=507f191e810c19729de860eb&staffs[]=507f191e810c19729de860ec ``` Sem colchetes, um valor único é recusado com erro em parte das listagens. ## Campos ausentes Campo sem valor costuma vir **ausente** da resposta, não como `null`. Trate a falta da chave como vazio. ## Campos personalizados Os campos criados pelo administrador da conta vão na lista `customFields`: ```json { \"customFields\": [ { \"customField\": \"507f1f77bcf86cd799439014\", \"k\": \"segmento\", \"v\": \"Tecnologia\" } ] } ``` O valor vai em **`v`**. Um item com `value` é aceito sem erro, mas o campo fica vazio. Descubra os campos e os IDs com `GET /api/customfields?page=1&feature=deal` (troque `deal` por `meeting`, `task`, `contact`...). Com `&required=true` vêm só os obrigatórios da conta. ## Erros ```json { \"reason\": \"Missing required parameters\", \"message\": \"Missing required parameters\", \"code\": \"VALIDATION_ERROR\", \"errors\": [ { \"field\": \"title\", \"message\": \"must NOT have fewer than 1 characters\", \"keyword\": \"minLength\" } ] } ``` | Status | Quando | |---|---| | `400` | Corpo inválido: campo obrigatório ausente, tipo errado, valor fora da lista | | `401` | Token ausente, inválido ou vencido. Corpo: `{\"reason\": \"Access Denied\"}` | | `403` | O Service Account não tem a permissão da rota (`type: SA_PERMISSION_DENIED`, com `requiredPermission`) | | `404` | Registro não encontrado | | `409` | O registro não está no estado que a operação exige | | `429` | Limite de requisições excedido. Espere o tempo de `Retry-After` | ## Permissões Um Service Account só chama as rotas que as permissões dele liberam. Cada operação desta referência informa a permissão exigida, quando há uma: marque-a ao criar o Service Account. Uma chamada sem a permissão devolve `403` com o nome dela em `requiredPermission`. Rotas de administração da conta (usuários, perfis, criação de webhooks, configurações) exigem um usuário administrador e não estão disponíveis para Service Accounts; por isso não aparecem aqui. ## Limite de requisições Os limites são aplicados por conta. Ao receber `429`, espere os segundos indicados em `Retry-After` e tente de novo com intervalo crescente. ## Área de trabalho Em contas com áreas de trabalho, a API define a área do registro pela credencial ou pelo registro pai. Não envie `workspace`. # Webhooks Para ser avisado quando algo muda no CRM, em vez de consultar a API de tempos em tempos, use webhooks. Um administrador cria o webhook no CRM, em **Integrações › Webhooks**, informando a URL do seu sistema e os eventos. A lista de eventos está em `GET /api/webhooks/triggers`; o formato da entrega, a assinatura e os reenvios estão na seção Webhooks do portal. # Cobertura Esta referência cobre Contatos (leads, prospects e clientes), Empresas, Oportunidades, Pipelines, etapas e motivos de perda, Jornadas, Reuniões, Tarefas, Observações, Tickets, Atendimentos, Usuários, Equipes, Áreas de trabalho, Campos personalizados e os eventos de webhook.
4
4
  *
5
5
  * The version of the OpenAPI document: 2026-11
6
6
  * Contact: suporte@magnetcustomer.com
@@ -12,6 +12,7 @@
12
12
  import type { Configuration } from '../configuration';
13
13
  import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios';
14
14
  import { type RequestArgs, BaseAPI } from '../base';
15
+ import type { ListLostReasons200Response } from '../models';
15
16
  import type { ListPipelines200Response } from '../models';
16
17
  import type { Pipeline } from '../models';
17
18
  import type { Stage } from '../models';
@@ -27,6 +28,15 @@ export declare const PipelinesApiAxiosParamCreator: (configuration?: Configurati
27
28
  * @throws {RequiredError}
28
29
  */
29
30
  getPipeline: (id: string, options?: RawAxiosRequestConfig) => Promise<RequestArgs>;
31
+ /**
32
+ * Cada motivo pertence a um pipeline. Use o `_id` em `lostReason` ao fechar uma oportunidade como perdida.
33
+ * @summary Listar motivos de perda
34
+ * @param {number} [page] Página, a partir de 1. **Envie sempre**: sem &#x60;page&#x60;, a resposta vem como lista simples, sem o envelope de paginação, e &#x60;limit&#x60; é ignorado.
35
+ * @param {number} [limit] Registros por página. Padrão: 15, salvo indicação na operação. Máximo: 100 — acima disso a API usa 100.
36
+ * @param {*} [options] Override http request option.
37
+ * @throws {RequiredError}
38
+ */
39
+ listLostReasons: (page?: number, limit?: number, options?: RawAxiosRequestConfig) => Promise<RequestArgs>;
30
40
  /**
31
41
  * Use para descobrir o `stage` de uma oportunidade. Devolve uma lista simples, sem envelope de paginação.
32
42
  * @summary Listar etapas do pipeline
@@ -60,6 +70,15 @@ export declare const PipelinesApiFp: (configuration?: Configuration) => {
60
70
  * @throws {RequiredError}
61
71
  */
62
72
  getPipeline(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Pipeline>>;
73
+ /**
74
+ * Cada motivo pertence a um pipeline. Use o `_id` em `lostReason` ao fechar uma oportunidade como perdida.
75
+ * @summary Listar motivos de perda
76
+ * @param {number} [page] Página, a partir de 1. **Envie sempre**: sem &#x60;page&#x60;, a resposta vem como lista simples, sem o envelope de paginação, e &#x60;limit&#x60; é ignorado.
77
+ * @param {number} [limit] Registros por página. Padrão: 15, salvo indicação na operação. Máximo: 100 — acima disso a API usa 100.
78
+ * @param {*} [options] Override http request option.
79
+ * @throws {RequiredError}
80
+ */
81
+ listLostReasons(page?: number, limit?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ListLostReasons200Response>>;
63
82
  /**
64
83
  * Use para descobrir o `stage` de uma oportunidade. Devolve uma lista simples, sem envelope de paginação.
65
84
  * @summary Listar etapas do pipeline
@@ -93,6 +112,14 @@ export declare const PipelinesApiFactory: (configuration?: Configuration, basePa
93
112
  * @throws {RequiredError}
94
113
  */
95
114
  getPipeline(requestParameters: PipelinesApiGetPipelineRequest, options?: RawAxiosRequestConfig): AxiosPromise<Pipeline>;
115
+ /**
116
+ * Cada motivo pertence a um pipeline. Use o `_id` em `lostReason` ao fechar uma oportunidade como perdida.
117
+ * @summary Listar motivos de perda
118
+ * @param {PipelinesApiListLostReasonsRequest} requestParameters Request parameters.
119
+ * @param {*} [options] Override http request option.
120
+ * @throws {RequiredError}
121
+ */
122
+ listLostReasons(requestParameters?: PipelinesApiListLostReasonsRequest, options?: RawAxiosRequestConfig): AxiosPromise<ListLostReasons200Response>;
96
123
  /**
97
124
  * Use para descobrir o `stage` de uma oportunidade. Devolve uma lista simples, sem envelope de paginação.
98
125
  * @summary Listar etapas do pipeline
@@ -119,6 +146,19 @@ export interface PipelinesApiGetPipelineRequest {
119
146
  */
120
147
  readonly id: string;
121
148
  }
149
+ /**
150
+ * Request parameters for listLostReasons operation in PipelinesApi.
151
+ */
152
+ export interface PipelinesApiListLostReasonsRequest {
153
+ /**
154
+ * Página, a partir de 1. **Envie sempre**: sem &#x60;page&#x60;, a resposta vem como lista simples, sem o envelope de paginação, e &#x60;limit&#x60; é ignorado.
155
+ */
156
+ readonly page?: number;
157
+ /**
158
+ * Registros por página. Padrão: 15, salvo indicação na operação. Máximo: 100 — acima disso a API usa 100.
159
+ */
160
+ readonly limit?: number;
161
+ }
122
162
  /**
123
163
  * Request parameters for listPipelineStages operation in PipelinesApi.
124
164
  */
@@ -165,6 +205,14 @@ export declare class PipelinesApi extends BaseAPI {
165
205
  * @throws {RequiredError}
166
206
  */
167
207
  getPipeline(requestParameters: PipelinesApiGetPipelineRequest, options?: RawAxiosRequestConfig): Promise<import("axios").AxiosResponse<Pipeline, any, {}, any>>;
208
+ /**
209
+ * Cada motivo pertence a um pipeline. Use o `_id` em `lostReason` ao fechar uma oportunidade como perdida.
210
+ * @summary Listar motivos de perda
211
+ * @param {PipelinesApiListLostReasonsRequest} requestParameters Request parameters.
212
+ * @param {*} [options] Override http request option.
213
+ * @throws {RequiredError}
214
+ */
215
+ listLostReasons(requestParameters?: PipelinesApiListLostReasonsRequest, options?: RawAxiosRequestConfig): Promise<import("axios").AxiosResponse<import("../models").Page, any, {}, any>>;
168
216
  /**
169
217
  * Use para descobrir o `stage` de uma oportunidade. Devolve uma lista simples, sem envelope de paginação.
170
218
  * @summary Listar etapas do pipeline