@funnelchat-hq/sandbox 0.5.1 → 0.5.2

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.
@@ -356,7 +356,7 @@ var catalog_default = {
356
356
  connection: "qr",
357
357
  external_reference: "cliente-42"
358
358
  },
359
- disconnected_at: "2026-10-05T03:00:00+00:00",
359
+ disconnected_at: "2026-10-05T03:00:00Z",
360
360
  reason: "qr_logged_out",
361
361
  connect_link_id: 812,
362
362
  workspace_id: 37
@@ -382,7 +382,7 @@ var catalog_default = {
382
382
  connection: "qr",
383
383
  external_reference: "cliente-42"
384
384
  },
385
- connected_at: "2026-10-05T03:00:00+00:00",
385
+ connected_at: "2026-10-05T03:00:00Z",
386
386
  connect_link_id: 812,
387
387
  workspace_id: 37
388
388
  }
@@ -407,7 +407,7 @@ var catalog_default = {
407
407
  connection: "qr",
408
408
  external_reference: "cliente-42"
409
409
  },
410
- deleted_at: "2026-10-05T03:00:00+00:00",
410
+ deleted_at: "2026-10-05T03:00:00Z",
411
411
  connect_link_id: 812,
412
412
  workspace_id: 37
413
413
  }
@@ -434,7 +434,7 @@ var catalog_default = {
434
434
  },
435
435
  previous_state: "available",
436
436
  state: "limited",
437
- changed_at: "2026-10-05T03:00:00+00:00",
437
+ changed_at: "2026-10-05T03:00:00Z",
438
438
  connect_link_id: null,
439
439
  workspace_id: 37
440
440
  }
@@ -461,7 +461,7 @@ var catalog_default = {
461
461
  },
462
462
  previous: "GREEN",
463
463
  current: "YELLOW",
464
- changed_at: "2026-10-05T03:00:00+00:00",
464
+ changed_at: "2026-10-05T03:00:00Z",
465
465
  connect_link_id: null,
466
466
  workspace_id: 37
467
467
  }
@@ -488,7 +488,7 @@ var catalog_default = {
488
488
  },
489
489
  previous: "TIER_1K",
490
490
  current: "TIER_10K",
491
- changed_at: "2026-10-05T03:00:00+00:00",
491
+ changed_at: "2026-10-05T03:00:00Z",
492
492
  connect_link_id: null,
493
493
  workspace_id: 37
494
494
  }
@@ -518,7 +518,7 @@ var catalog_default = {
518
518
  status: "APPROVED",
519
519
  verified_name: "Soporte Lucky Shrub",
520
520
  rejection_reason: null,
521
- reviewed_at: "2026-10-05T03:00:00+00:00",
521
+ reviewed_at: "2026-10-05T03:00:00Z",
522
522
  connect_link_id: null,
523
523
  workspace_id: 37
524
524
  }
@@ -1375,7 +1375,7 @@ var catalog_default = {
1375
1375
  type: "pipeline.finished",
1376
1376
  area: "communities",
1377
1377
  status: "active",
1378
- description: "Termin\xF3 un pipeline de operaciones sobre grupos, con su resultado agregado y la clave de idempotencia del pedido que lo origin\xF3, cuando la hay.",
1378
+ description: "Termin\xF3 un pipeline de operaciones sobre los grupos de una campa\xF1a, con su resultado agregado y la clave de idempotencia del pedido que lo origin\xF3, cuando la hay; si despu\xE9s cambia el resultado de alguna de sus acciones (por ejemplo, por un reintento), sale otro, con otro `id` y los conteos nuevos.",
1379
1379
  subscribable: true,
1380
1380
  example: {
1381
1381
  id: "evt_0000000000000000000000000000000a",
@@ -1407,7 +1407,7 @@ var catalog_default = {
1407
1407
  type: "group.blocked",
1408
1408
  area: "communities",
1409
1409
  status: "active",
1410
- description: "Un grupo qued\xF3 inoperable: sin administrador conectado, con el link de invitaci\xF3n inv\xE1lido o suspendido por WhatsApp.",
1410
+ description: "Un grupo de una campa\xF1a qued\xF3 inoperable: sin administrador conectado, con el link de invitaci\xF3n inv\xE1lido o suspendido por WhatsApp; un grupo que no es de una campa\xF1a no lo genera.",
1411
1411
  subscribable: true,
1412
1412
  example: {
1413
1413
  id: "evt_00000000000000000000000000000005",
@@ -1431,7 +1431,7 @@ var catalog_default = {
1431
1431
  type: "group.recovered",
1432
1432
  area: "communities",
1433
1433
  status: "active",
1434
- description: "Un grupo que estaba bloqueado volvi\xF3 a operar.",
1434
+ description: "Un grupo de una campa\xF1a que estaba bloqueado volvi\xF3 a operar; un grupo que no es de una campa\xF1a no lo genera.",
1435
1435
  subscribable: true,
1436
1436
  example: {
1437
1437
  id: "evt_00000000000000000000000000000006",
@@ -3075,8 +3075,34 @@ var openapi_default = {
3075
3075
  content: {
3076
3076
  "application/json": {
3077
3077
  schema: {
3078
- type: "array",
3079
- items: {}
3078
+ type: "object",
3079
+ properties: {
3080
+ contactsCount: {
3081
+ type: "integer"
3082
+ },
3083
+ unreachableCount: {
3084
+ type: "integer"
3085
+ },
3086
+ pausedCount: {
3087
+ type: "integer"
3088
+ },
3089
+ optedOutCount: {
3090
+ type: "integer"
3091
+ },
3092
+ hardBouncedCount: {
3093
+ type: "integer"
3094
+ },
3095
+ blockedCount: {
3096
+ type: "integer"
3097
+ }
3098
+ },
3099
+ required: [
3100
+ "contactsCount",
3101
+ "unreachableCount",
3102
+ "pausedCount",
3103
+ "optedOutCount",
3104
+ "hardBouncedCount"
3105
+ ]
3080
3106
  }
3081
3107
  }
3082
3108
  }
@@ -5477,77 +5503,18 @@ var openapi_default = {
5477
5503
  schema: {
5478
5504
  type: "array",
5479
5505
  items: {
5480
- anyOf: [
5481
- {
5482
- type: "object",
5483
- properties: {
5484
- message: {
5485
- type: "string",
5486
- const: "No autorizado: el campo personalizado no pertenece al usuario autenticado."
5487
- },
5488
- status: {
5489
- type: "integer",
5490
- const: 403
5491
- }
5492
- },
5493
- required: [
5494
- "message",
5495
- "status"
5496
- ]
5497
- },
5498
- {
5499
- type: "object",
5500
- properties: {
5501
- message: {
5502
- type: "string",
5503
- const: "No autorizado: el contacto no pertenece al usuario autenticado."
5504
- },
5505
- status: {
5506
- type: "integer",
5507
- const: 403
5508
- }
5509
- },
5510
- required: [
5511
- "message",
5512
- "status"
5513
- ]
5514
- },
5515
- {
5516
- type: "object",
5517
- properties: {
5518
- message: {
5519
- type: [
5520
- "string",
5521
- "null"
5522
- ]
5523
- },
5524
- status: {
5525
- type: "integer",
5526
- const: 422
5527
- }
5528
- },
5529
- required: [
5530
- "message",
5531
- "status"
5532
- ]
5506
+ type: "object",
5507
+ properties: {
5508
+ message: {
5509
+ type: "string"
5533
5510
  },
5534
- {
5535
- type: "object",
5536
- properties: {
5537
- message: {
5538
- type: "string",
5539
- const: "Custom field value attached successfully."
5540
- },
5541
- status: {
5542
- type: "integer",
5543
- const: 201
5544
- }
5545
- },
5546
- required: [
5547
- "message",
5548
- "status"
5549
- ]
5511
+ status: {
5512
+ type: "integer"
5550
5513
  }
5514
+ },
5515
+ required: [
5516
+ "message",
5517
+ "status"
5551
5518
  ]
5552
5519
  }
5553
5520
  }
@@ -5795,210 +5762,203 @@ var openapi_default = {
5795
5762
  }
5796
5763
  }
5797
5764
  },
5765
+ responses: {
5766
+ "200": {
5767
+ description: "OK"
5768
+ },
5769
+ "401": {
5770
+ $ref: "#/components/responses/ConversationsAuthenticationException"
5771
+ },
5772
+ "402": {
5773
+ description: "Payment Required",
5774
+ content: {
5775
+ "application/json": {
5776
+ schema: {
5777
+ type: "object",
5778
+ properties: {
5779
+ error: {
5780
+ type: "string",
5781
+ enum: [
5782
+ "payment_required"
5783
+ ]
5784
+ },
5785
+ message: {
5786
+ type: "string"
5787
+ }
5788
+ },
5789
+ required: [
5790
+ "error",
5791
+ "message"
5792
+ ]
5793
+ }
5794
+ }
5795
+ }
5796
+ },
5797
+ "403": {
5798
+ $ref: "#/components/responses/ConversationsAuthorizationException"
5799
+ },
5800
+ "404": {
5801
+ $ref: "#/components/responses/ConversationsModelNotFoundException"
5802
+ },
5803
+ "422": {
5804
+ $ref: "#/components/responses/ConversationsValidationException"
5805
+ }
5806
+ },
5807
+ "x-fc-permission": "conversations:write",
5808
+ "x-fc-proposito": "Sirve para mantener al d\xEDa la ficha de un contacto desde tu sistema: nombre, email, tel\xE9fono, notas, asesor asignado, favorito o si puede ejecutar flujos.",
5809
+ "x-fc-domain": "conversations"
5810
+ }
5811
+ },
5812
+ "/api/v1/contacts/{contact}/tags": {
5813
+ get: {
5814
+ operationId: "contact.tags",
5815
+ description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Ver**",
5816
+ summary: "Ver las etiquetas de un contacto",
5817
+ tags: [
5818
+ "Etiquetas"
5819
+ ],
5820
+ parameters: [
5821
+ {
5822
+ name: "contact",
5823
+ in: "path",
5824
+ required: true,
5825
+ schema: {
5826
+ type: "integer"
5827
+ }
5828
+ },
5829
+ {
5830
+ name: "perPage",
5831
+ in: "query",
5832
+ schema: {
5833
+ type: "integer",
5834
+ default: 25,
5835
+ minimum: 1,
5836
+ maximum: 100
5837
+ }
5838
+ }
5839
+ ],
5798
5840
  responses: {
5799
5841
  "200": {
5800
5842
  description: "OK",
5801
5843
  content: {
5802
5844
  "application/json": {
5803
5845
  schema: {
5804
- type: "object"
5805
- }
5806
- }
5807
- }
5808
- },
5809
- "401": {
5810
- $ref: "#/components/responses/ConversationsAuthenticationException"
5811
- },
5812
- "402": {
5813
- description: "Payment Required",
5814
- content: {
5815
- "application/json": {
5816
- schema: {
5817
- type: "object",
5818
- properties: {
5819
- error: {
5820
- type: "string",
5821
- enum: [
5822
- "payment_required"
5823
- ]
5824
- },
5825
- message: {
5826
- type: "string"
5827
- }
5828
- },
5829
- required: [
5830
- "error",
5831
- "message"
5832
- ]
5833
- }
5834
- }
5835
- }
5836
- },
5837
- "403": {
5838
- $ref: "#/components/responses/ConversationsAuthorizationException"
5839
- },
5840
- "404": {
5841
- $ref: "#/components/responses/ConversationsModelNotFoundException"
5842
- },
5843
- "422": {
5844
- $ref: "#/components/responses/ConversationsValidationException"
5845
- }
5846
- },
5847
- "x-fc-permission": "conversations:write",
5848
- "x-fc-proposito": "Sirve para mantener al d\xEDa la ficha de un contacto desde tu sistema: nombre, email, tel\xE9fono, notas, asesor asignado, favorito o si puede ejecutar flujos.",
5849
- "x-fc-domain": "conversations"
5850
- }
5851
- },
5852
- "/api/v1/contacts/{contact}/tags": {
5853
- get: {
5854
- operationId: "contact.tags",
5855
- description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Ver**",
5856
- summary: "Ver las etiquetas de un contacto",
5857
- tags: [
5858
- "Etiquetas"
5859
- ],
5860
- parameters: [
5861
- {
5862
- name: "contact",
5863
- in: "path",
5864
- required: true,
5865
- schema: {
5866
- type: "integer"
5867
- }
5868
- },
5869
- {
5870
- name: "perPage",
5871
- in: "query",
5872
- schema: {
5873
- type: "integer",
5874
- default: 25,
5875
- minimum: 1,
5876
- maximum: 100
5877
- }
5878
- }
5879
- ],
5880
- responses: {
5881
- "200": {
5882
- description: "OK",
5883
- content: {
5884
- "application/json": {
5885
- schema: {
5886
- type: "object",
5887
- properties: {
5888
- data: {
5889
- type: "array",
5890
- items: {
5891
- $ref: "#/components/schemas/ContactTagResource"
5892
- }
5893
- },
5894
- links: {
5895
- type: "object",
5896
- properties: {
5897
- first: {
5898
- type: [
5899
- "string",
5900
- "null"
5901
- ]
5902
- },
5903
- last: {
5904
- type: [
5905
- "string",
5906
- "null"
5907
- ]
5908
- },
5909
- prev: {
5910
- type: [
5911
- "string",
5912
- "null"
5913
- ]
5914
- },
5915
- next: {
5916
- type: [
5917
- "string",
5918
- "null"
5919
- ]
5920
- }
5921
- },
5922
- required: [
5923
- "first",
5924
- "last",
5925
- "prev",
5926
- "next"
5927
- ]
5928
- },
5929
- meta: {
5930
- type: "object",
5931
- properties: {
5932
- current_page: {
5933
- type: "integer"
5934
- },
5935
- from: {
5936
- type: [
5937
- "integer",
5938
- "null"
5939
- ]
5940
- },
5941
- last_page: {
5942
- type: "integer"
5943
- },
5944
- links: {
5945
- type: "array",
5946
- items: {
5947
- type: "object",
5948
- properties: {
5949
- url: {
5950
- type: [
5951
- "string",
5952
- "null"
5953
- ]
5954
- },
5955
- label: {
5956
- type: "string"
5957
- },
5958
- active: {
5959
- type: "boolean"
5960
- }
5961
- },
5962
- required: [
5963
- "url",
5964
- "label",
5965
- "active"
5966
- ]
5967
- }
5968
- },
5969
- path: {
5970
- type: "string"
5971
- },
5972
- per_page: {
5973
- type: "integer"
5974
- },
5975
- to: {
5976
- type: [
5977
- "integer",
5978
- "null"
5979
- ]
5980
- },
5981
- total: {
5982
- type: "integer"
5983
- }
5984
- },
5985
- required: [
5986
- "current_page",
5987
- "from",
5988
- "last_page",
5989
- "links",
5990
- "path",
5991
- "per_page",
5992
- "to",
5993
- "total"
5994
- ]
5995
- }
5996
- },
5997
- required: [
5998
- "data",
5999
- "links",
6000
- "meta"
6001
- ]
5846
+ type: "object",
5847
+ properties: {
5848
+ data: {
5849
+ type: "array",
5850
+ items: {
5851
+ $ref: "#/components/schemas/ContactTagResource"
5852
+ }
5853
+ },
5854
+ links: {
5855
+ type: "object",
5856
+ properties: {
5857
+ first: {
5858
+ type: [
5859
+ "string",
5860
+ "null"
5861
+ ]
5862
+ },
5863
+ last: {
5864
+ type: [
5865
+ "string",
5866
+ "null"
5867
+ ]
5868
+ },
5869
+ prev: {
5870
+ type: [
5871
+ "string",
5872
+ "null"
5873
+ ]
5874
+ },
5875
+ next: {
5876
+ type: [
5877
+ "string",
5878
+ "null"
5879
+ ]
5880
+ }
5881
+ },
5882
+ required: [
5883
+ "first",
5884
+ "last",
5885
+ "prev",
5886
+ "next"
5887
+ ]
5888
+ },
5889
+ meta: {
5890
+ type: "object",
5891
+ properties: {
5892
+ current_page: {
5893
+ type: "integer"
5894
+ },
5895
+ from: {
5896
+ type: [
5897
+ "integer",
5898
+ "null"
5899
+ ]
5900
+ },
5901
+ last_page: {
5902
+ type: "integer"
5903
+ },
5904
+ links: {
5905
+ type: "array",
5906
+ items: {
5907
+ type: "object",
5908
+ properties: {
5909
+ url: {
5910
+ type: [
5911
+ "string",
5912
+ "null"
5913
+ ]
5914
+ },
5915
+ label: {
5916
+ type: "string"
5917
+ },
5918
+ active: {
5919
+ type: "boolean"
5920
+ }
5921
+ },
5922
+ required: [
5923
+ "url",
5924
+ "label",
5925
+ "active"
5926
+ ]
5927
+ }
5928
+ },
5929
+ path: {
5930
+ type: "string"
5931
+ },
5932
+ per_page: {
5933
+ type: "integer"
5934
+ },
5935
+ to: {
5936
+ type: [
5937
+ "integer",
5938
+ "null"
5939
+ ]
5940
+ },
5941
+ total: {
5942
+ type: "integer"
5943
+ }
5944
+ },
5945
+ required: [
5946
+ "current_page",
5947
+ "from",
5948
+ "last_page",
5949
+ "links",
5950
+ "path",
5951
+ "per_page",
5952
+ "to",
5953
+ "total"
5954
+ ]
5955
+ }
5956
+ },
5957
+ required: [
5958
+ "data",
5959
+ "links",
5960
+ "meta"
5961
+ ]
6002
5962
  }
6003
5963
  }
6004
5964
  }
@@ -6836,14 +6796,7 @@ var openapi_default = {
6836
6796
  },
6837
6797
  responses: {
6838
6798
  "200": {
6839
- description: "OK",
6840
- content: {
6841
- "application/json": {
6842
- schema: {
6843
- type: "null"
6844
- }
6845
- }
6846
- }
6799
+ description: "OK"
6847
6800
  },
6848
6801
  "401": {
6849
6802
  $ref: "#/components/responses/ConversationsAuthenticationException"
@@ -7154,7 +7107,7 @@ var openapi_default = {
7154
7107
  "/api/v1/contacts/{contact}/message/contact-card": {
7155
7108
  post: {
7156
7109
  operationId: "contactCard.store",
7157
- description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Enviar**\n\nSi el l\xEDmite de contactos activos (MAC) frena el env\xEDo, responde `429` con `error` = `mac_lockout_24h` o `mac_limit_reached` y sin `Retry-After`: reintentar no sirve hasta que sumes capacidad o empiece un ciclo nuevo. El env\xEDo no sale, pero queda en el historial del contacto un mensaje con estado de error que lleva tu `client_reference`. Detalle en \xABErrores y l\xEDmites\xBB.",
7110
+ description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Enviar**\n\nSi el l\xEDmite de contactos activos (MAC) frena el env\xEDo, responde `429` con `error` = `mac_lockout_24h` o `mac_limit_reached` y sin `Retry-After`: reintentar no sirve hasta que sumes capacidad o empiece un ciclo nuevo. El env\xEDo no sale y no se guarda ning\xFAn mensaje ni tu `client_reference`: no queda nada en el historial del contacto. Detalle en \xABErrores y l\xEDmites\xBB.",
7158
7111
  summary: "Mandar una tarjeta de contacto",
7159
7112
  tags: [
7160
7113
  "Atender una conversaci\xF3n"
@@ -7380,7 +7333,7 @@ var openapi_default = {
7380
7333
  properties: {
7381
7334
  error: {
7382
7335
  type: "string",
7383
- description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar.",
7336
+ description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar. Con este status, el portero tambi\xE9n puede devolver `gate_misconfigured`.",
7384
7337
  examples: [
7385
7338
  "internal_error"
7386
7339
  ]
@@ -8196,11 +8149,17 @@ var openapi_default = {
8196
8149
  properties: {
8197
8150
  error: {
8198
8151
  type: "string",
8199
- const: "No se pudieron cargar las conversaciones"
8152
+ enum: [
8153
+ "internal_error"
8154
+ ]
8155
+ },
8156
+ message: {
8157
+ type: "string"
8200
8158
  }
8201
8159
  },
8202
8160
  required: [
8203
- "error"
8161
+ "error",
8162
+ "message"
8204
8163
  ]
8205
8164
  }
8206
8165
  }
@@ -8459,11 +8418,18 @@ var openapi_default = {
8459
8418
  type: "object",
8460
8419
  properties: {
8461
8420
  count: {
8462
- type: [
8463
- "integer",
8464
- "null"
8465
- ],
8466
- minimum: 0
8421
+ anyOf: [
8422
+ {
8423
+ type: "null"
8424
+ },
8425
+ {
8426
+ type: "integer",
8427
+ minimum: 0
8428
+ },
8429
+ {
8430
+ type: "integer"
8431
+ }
8432
+ ]
8467
8433
  }
8468
8434
  },
8469
8435
  required: [
@@ -8800,7 +8766,7 @@ var openapi_default = {
8800
8766
  "/api/v1/contacts/{contact}/message": {
8801
8767
  post: {
8802
8768
  operationId: "conversation.sendMessage",
8803
- description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Enviar**\n\nSi el l\xEDmite de contactos activos (MAC) frena el env\xEDo, responde `429` con `error` = `mac_lockout_24h` o `mac_limit_reached` y sin `Retry-After`: reintentar no sirve hasta que sumes capacidad o empiece un ciclo nuevo. El env\xEDo no sale, pero queda en el historial del contacto un mensaje con estado de error que lleva tu `client_reference`. Detalle en \xABErrores y l\xEDmites\xBB.",
8769
+ description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Enviar**\n\nSi el l\xEDmite de contactos activos (MAC) frena el env\xEDo, responde `429` con `error` = `mac_lockout_24h` o `mac_limit_reached` y sin `Retry-After`: reintentar no sirve hasta que sumes capacidad o empiece un ciclo nuevo. El env\xEDo no sale y no se guarda ning\xFAn mensaje ni tu `client_reference`: no queda nada en el historial del contacto. Detalle en \xABErrores y l\xEDmites\xBB.",
8804
8770
  summary: "Mandar un mensaje a un contacto",
8805
8771
  tags: [
8806
8772
  "Atender una conversaci\xF3n"
@@ -8878,6 +8844,37 @@ var openapi_default = {
8878
8844
  "404": {
8879
8845
  $ref: "#/components/responses/ConversationsModelNotFoundException"
8880
8846
  },
8847
+ "415": {
8848
+ description: "Unsupported Media Type",
8849
+ content: {
8850
+ "application/json": {
8851
+ schema: {
8852
+ type: "object",
8853
+ properties: {
8854
+ error: {
8855
+ type: "string",
8856
+ enum: [
8857
+ "bad_request"
8858
+ ]
8859
+ },
8860
+ message: {
8861
+ type: "string"
8862
+ },
8863
+ supported_file_types: {
8864
+ type: "array",
8865
+ items: {
8866
+ type: "string"
8867
+ }
8868
+ }
8869
+ },
8870
+ required: [
8871
+ "error",
8872
+ "message"
8873
+ ]
8874
+ }
8875
+ }
8876
+ }
8877
+ },
8881
8878
  "422": {
8882
8879
  description: "Unprocessable Content",
8883
8880
  content: {
@@ -9001,7 +8998,7 @@ var openapi_default = {
9001
8998
  properties: {
9002
8999
  error: {
9003
9000
  type: "string",
9004
- description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar.",
9001
+ description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar. Con este status, el portero tambi\xE9n puede devolver `gate_misconfigured`.",
9005
9002
  examples: [
9006
9003
  "internal_error"
9007
9004
  ]
@@ -9574,14 +9571,7 @@ var openapi_default = {
9574
9571
  },
9575
9572
  responses: {
9576
9573
  "200": {
9577
- description: "OK",
9578
- content: {
9579
- "application/json": {
9580
- schema: {
9581
- type: "object"
9582
- }
9583
- }
9584
- }
9574
+ description: "OK"
9585
9575
  },
9586
9576
  "401": {
9587
9577
  $ref: "#/components/responses/ConversationsAuthenticationException"
@@ -11687,14 +11677,7 @@ var openapi_default = {
11687
11677
  },
11688
11678
  responses: {
11689
11679
  "200": {
11690
- description: "OK",
11691
- content: {
11692
- "application/json": {
11693
- schema: {
11694
- type: "object"
11695
- }
11696
- }
11697
- }
11680
+ description: "OK"
11698
11681
  },
11699
11682
  "401": {
11700
11683
  $ref: "#/components/responses/ConversationsAuthenticationException"
@@ -11757,14 +11740,7 @@ var openapi_default = {
11757
11740
  ],
11758
11741
  responses: {
11759
11742
  "200": {
11760
- description: "OK",
11761
- content: {
11762
- "application/json": {
11763
- schema: {
11764
- type: "object"
11765
- }
11766
- }
11767
- }
11743
+ description: "OK"
11768
11744
  },
11769
11745
  "401": {
11770
11746
  $ref: "#/components/responses/ConversationsAuthenticationException"
@@ -12053,7 +12029,7 @@ var openapi_default = {
12053
12029
  properties: {
12054
12030
  error: {
12055
12031
  type: "string",
12056
- description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar.",
12032
+ description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar. Con este status, el portero tambi\xE9n puede devolver `gate_misconfigured`.",
12057
12033
  examples: [
12058
12034
  "internal_error"
12059
12035
  ]
@@ -14110,9 +14086,6 @@ var openapi_default = {
14110
14086
  "application/json": {
14111
14087
  schema: {
14112
14088
  anyOf: [
14113
- {
14114
- type: "string"
14115
- },
14116
14089
  {
14117
14090
  type: "object",
14118
14091
  properties: {
@@ -14120,39 +14093,28 @@ var openapi_default = {
14120
14093
  type: "boolean"
14121
14094
  },
14122
14095
  unlimited: {
14123
- type: "string"
14096
+ type: "boolean"
14124
14097
  },
14125
14098
  current_count: {
14126
- type: "integer",
14127
- const: 0
14099
+ type: "integer"
14128
14100
  },
14129
14101
  limit: {
14130
14102
  type: [
14131
14103
  "integer",
14132
14104
  "null"
14133
- ],
14134
- enum: [
14135
- 0,
14136
- null
14137
14105
  ]
14138
14106
  },
14139
14107
  remaining: {
14140
14108
  type: [
14141
14109
  "integer",
14142
14110
  "null"
14143
- ],
14144
- enum: [
14145
- 0,
14146
- null
14147
14111
  ]
14148
14112
  },
14149
14113
  usage_percentage: {
14150
- type: "integer",
14151
- const: 0
14114
+ type: "integer"
14152
14115
  },
14153
14116
  state: {
14154
- type: "string",
14155
- const: "normal"
14117
+ type: "string"
14156
14118
  },
14157
14119
  grace: {
14158
14120
  type: "null"
@@ -14172,6 +14134,159 @@ var openapi_default = {
14172
14134
  "grace",
14173
14135
  "period_start"
14174
14136
  ]
14137
+ },
14138
+ {
14139
+ type: "object",
14140
+ properties: {
14141
+ mac_count: {
14142
+ type: "integer"
14143
+ },
14144
+ mac_limit: {
14145
+ type: [
14146
+ "integer",
14147
+ "null"
14148
+ ]
14149
+ },
14150
+ cycle_capacity: {
14151
+ type: [
14152
+ "integer",
14153
+ "null"
14154
+ ]
14155
+ },
14156
+ accumulated_available: {
14157
+ type: [
14158
+ "integer",
14159
+ "null"
14160
+ ]
14161
+ },
14162
+ total_available: {
14163
+ type: [
14164
+ "integer",
14165
+ "null"
14166
+ ]
14167
+ },
14168
+ usage_percentage: {
14169
+ type: "number"
14170
+ },
14171
+ enforcement_enabled: {
14172
+ type: "boolean"
14173
+ },
14174
+ alert_level: {
14175
+ type: [
14176
+ "string",
14177
+ "null"
14178
+ ]
14179
+ },
14180
+ expiring_buckets: {
14181
+ type: "array",
14182
+ items: {
14183
+ type: "object",
14184
+ properties: {
14185
+ amount: {
14186
+ type: "integer"
14187
+ },
14188
+ expires_in_days: {
14189
+ type: "integer"
14190
+ }
14191
+ },
14192
+ required: [
14193
+ "amount",
14194
+ "expires_in_days"
14195
+ ]
14196
+ }
14197
+ },
14198
+ buckets: {
14199
+ type: "array",
14200
+ items: {
14201
+ type: "object",
14202
+ properties: {
14203
+ source: {
14204
+ type: "string"
14205
+ },
14206
+ macs_remaining: {
14207
+ type: "integer"
14208
+ },
14209
+ expires_at: {
14210
+ type: "string"
14211
+ }
14212
+ },
14213
+ required: [
14214
+ "source",
14215
+ "macs_remaining",
14216
+ "expires_at"
14217
+ ]
14218
+ }
14219
+ },
14220
+ state: {
14221
+ type: "string"
14222
+ },
14223
+ grace: {
14224
+ type: [
14225
+ "object",
14226
+ "null"
14227
+ ],
14228
+ properties: {
14229
+ grace_period_id: {
14230
+ type: [
14231
+ "integer",
14232
+ "null"
14233
+ ]
14234
+ },
14235
+ started_at: {
14236
+ type: [
14237
+ "string",
14238
+ "null"
14239
+ ]
14240
+ },
14241
+ expires_at: {
14242
+ type: [
14243
+ "string",
14244
+ "null"
14245
+ ]
14246
+ },
14247
+ seconds_remaining: {
14248
+ type: "integer"
14249
+ },
14250
+ end_reason: {
14251
+ type: [
14252
+ "string",
14253
+ "null"
14254
+ ]
14255
+ }
14256
+ },
14257
+ required: [
14258
+ "grace_period_id",
14259
+ "started_at",
14260
+ "expires_at",
14261
+ "seconds_remaining",
14262
+ "end_reason"
14263
+ ]
14264
+ },
14265
+ unlimited: {
14266
+ type: "boolean"
14267
+ },
14268
+ workspace_id: {
14269
+ type: "integer"
14270
+ },
14271
+ inactive_contacts_count: {
14272
+ type: "integer"
14273
+ }
14274
+ },
14275
+ required: [
14276
+ "mac_count",
14277
+ "mac_limit",
14278
+ "cycle_capacity",
14279
+ "accumulated_available",
14280
+ "total_available",
14281
+ "usage_percentage",
14282
+ "enforcement_enabled",
14283
+ "alert_level",
14284
+ "expiring_buckets",
14285
+ "buckets",
14286
+ "state",
14287
+ "grace",
14288
+ "unlimited"
14289
+ ]
14175
14290
  }
14176
14291
  ]
14177
14292
  }
@@ -14680,7 +14795,7 @@ var openapi_default = {
14680
14795
  "/api/v1/message/send-message": {
14681
14796
  post: {
14682
14797
  operationId: "message.sendMessage",
14683
- description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Enviar**\n\nIndica a qui\xE9n env\xEDas con `phone`: el tel\xE9fono con c\xF3digo de pa\xEDs, por ejemplo `5491122334455`. No hace falta crear el contacto antes: si ese tel\xE9fono todav\xEDa no es un contacto de tu cuenta, se crea en el workspace de tu clave, igual que con `POST /contacts/update-or-create` y con el mismo permiso, que **Enviar** ya incluye. La respuesta trae su id en `message.contact_id`, el mismo que llevan los eventos `message.status_changed`. Si el tel\xE9fono no es v\xE1lido, o ya es un contacto de otro workspace de tu cuenta, la respuesta es la misma que dar\xEDa `POST /contacts/update-or-create`: 422, o 404 sin datos de ese contacto. Con un n\xFAmero oficial de WhatsApp (API Cloud) tambi\xE9n puedes indicar `whatsapp_id`, el BSUID que env\xEDa Meta (por ejemplo `US.13491208655302741918`), en lugar de `phone`; usado as\xED con un n\xFAmero conectado por QR, responde 422. En un n\xFAmero oficial, el primer mensaje a un contacto nuevo tiene que ser una plantilla: un mensaje libre solo sale dentro de las 24 horas desde que el contacto te escribi\xF3. Si ya tienes el `contact_id`, puedes seguir envi\xE1ndolo: si junto con \xE9l mandas `phone` o `whatsapp_id`, tienen que ser de ese mismo contacto (si no, 422 `recipient_mismatch`). En `send-template`, `phone` o `whatsapp_id` va siempre, con o sin `contact_id`.\n\nSi el l\xEDmite de contactos activos (MAC) frena el env\xEDo, responde `429` con `error` = `mac_lockout_24h` o `mac_limit_reached` y sin `Retry-After`: reintentar no sirve hasta que sumes capacidad o empiece un ciclo nuevo. El env\xEDo no sale, pero queda en el historial del contacto un mensaje con estado de error que lleva tu `client_reference`. Detalle en \xABErrores y l\xEDmites\xBB.",
14798
+ description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Enviar**\n\nIndica a qui\xE9n env\xEDas con `phone`: el tel\xE9fono con c\xF3digo de pa\xEDs, por ejemplo `5491122334455`. No hace falta crear el contacto antes: si ese tel\xE9fono todav\xEDa no es un contacto de tu cuenta, se crea en el workspace de tu clave, igual que con `POST /contacts/update-or-create` y con el mismo permiso, que **Enviar** ya incluye. La respuesta trae su id en `message.contact_id`, el mismo que llevan los eventos `message.status_changed`. Si el tel\xE9fono no es v\xE1lido, o ya es un contacto de otro workspace de tu cuenta, la respuesta es la misma que dar\xEDa `POST /contacts/update-or-create`: 422, o 404 sin datos de ese contacto. Con un n\xFAmero oficial de WhatsApp (API Cloud) tambi\xE9n puedes indicar `whatsapp_id`, el BSUID que env\xEDa Meta (por ejemplo `US.13491208655302741918`), en lugar de `phone`; usado as\xED con un n\xFAmero conectado por QR, responde 422. En un n\xFAmero oficial, el primer mensaje a un contacto nuevo tiene que ser una plantilla: un mensaje libre solo sale dentro de las 24 horas desde que el contacto te escribi\xF3. Si ya tienes el `contact_id`, puedes seguir envi\xE1ndolo: si junto con \xE9l mandas `phone` o `whatsapp_id`, tienen que ser de ese mismo contacto (si no, 422 `recipient_mismatch`). En `send-template`, `phone` o `whatsapp_id` va siempre, con o sin `contact_id`.\n\nSi el l\xEDmite de contactos activos (MAC) frena el env\xEDo, responde `429` con `error` = `mac_lockout_24h` o `mac_limit_reached` y sin `Retry-After`: reintentar no sirve hasta que sumes capacidad o empiece un ciclo nuevo. El env\xEDo no sale y no se guarda ning\xFAn mensaje ni tu `client_reference`: no queda nada en el historial del contacto. Detalle en \xABErrores y l\xEDmites\xBB.",
14684
14799
  summary: "Mandar un mensaje",
14685
14800
  tags: [
14686
14801
  "Mensajes"
@@ -14750,36 +14865,58 @@ var openapi_default = {
14750
14865
  content: {
14751
14866
  "application/json": {
14752
14867
  schema: {
14753
- anyOf: [
14754
- {
14755
- type: "object",
14756
- properties: {
14757
- status: {
14758
- type: "string",
14759
- enum: [
14760
- "error"
14761
- ]
14762
- },
14763
- error: {
14764
- type: "string"
14765
- }
14766
- },
14767
- required: [
14768
- "status",
14769
- "error"
14868
+ type: "object",
14869
+ properties: {
14870
+ error: {
14871
+ type: "string",
14872
+ enum: [
14873
+ "not_found"
14770
14874
  ]
14771
14875
  },
14772
- {
14773
- type: "object",
14774
- properties: {
14775
- message: {
14776
- type: "string"
14777
- }
14778
- },
14779
- required: [
14780
- "message"
14876
+ message: {
14877
+ type: "string"
14878
+ },
14879
+ status: {
14880
+ type: "string",
14881
+ enum: [
14882
+ "error"
14883
+ ]
14884
+ }
14885
+ },
14886
+ required: [
14887
+ "error",
14888
+ "message"
14889
+ ]
14890
+ }
14891
+ }
14892
+ }
14893
+ },
14894
+ "415": {
14895
+ description: "Unsupported Media Type",
14896
+ content: {
14897
+ "application/json": {
14898
+ schema: {
14899
+ type: "object",
14900
+ properties: {
14901
+ error: {
14902
+ type: "string",
14903
+ enum: [
14904
+ "bad_request"
14781
14905
  ]
14906
+ },
14907
+ message: {
14908
+ type: "string"
14909
+ },
14910
+ supported_file_types: {
14911
+ type: "array",
14912
+ items: {
14913
+ type: "string"
14914
+ }
14782
14915
  }
14916
+ },
14917
+ required: [
14918
+ "error",
14919
+ "message"
14783
14920
  ]
14784
14921
  }
14785
14922
  }
@@ -14908,7 +15045,7 @@ var openapi_default = {
14908
15045
  properties: {
14909
15046
  error: {
14910
15047
  type: "string",
14911
- description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar.",
15048
+ description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar. Con este status, el portero tambi\xE9n puede devolver `gate_misconfigured`.",
14912
15049
  examples: [
14913
15050
  "internal_error"
14914
15051
  ]
@@ -15247,6 +15384,12 @@ var openapi_default = {
15247
15384
  {
15248
15385
  type: "object",
15249
15386
  properties: {
15387
+ error: {
15388
+ type: "string",
15389
+ examples: [
15390
+ "validation_failed"
15391
+ ]
15392
+ },
15250
15393
  message: {
15251
15394
  type: "string"
15252
15395
  },
@@ -15255,6 +15398,7 @@ var openapi_default = {
15255
15398
  }
15256
15399
  },
15257
15400
  required: [
15401
+ "error",
15258
15402
  "message",
15259
15403
  "errors"
15260
15404
  ]
@@ -15801,31 +15945,21 @@ var openapi_default = {
15801
15945
  content: {
15802
15946
  "application/json": {
15803
15947
  schema: {
15804
- anyOf: [
15805
- {
15806
- type: "object",
15807
- properties: {
15808
- error: {
15809
- type: "string",
15810
- const: "Approved templates can be edited up to 10 times in a 30-day period or once in a 24-hour period."
15811
- }
15812
- },
15813
- required: [
15814
- "error"
15948
+ type: "object",
15949
+ properties: {
15950
+ error: {
15951
+ type: "string",
15952
+ enum: [
15953
+ "bad_request"
15815
15954
  ]
15816
15955
  },
15817
- {
15818
- type: "object",
15819
- properties: {
15820
- error: {
15821
- type: "string",
15822
- const: "Templates with pending status cannot be updated."
15823
- }
15824
- },
15825
- required: [
15826
- "error"
15827
- ]
15956
+ message: {
15957
+ type: "string"
15828
15958
  }
15959
+ },
15960
+ required: [
15961
+ "error",
15962
+ "message"
15829
15963
  ]
15830
15964
  }
15831
15965
  }
@@ -16263,50 +16397,22 @@ var openapi_default = {
16263
16397
  content: {
16264
16398
  "application/json": {
16265
16399
  schema: {
16266
- anyOf: [
16267
- {
16268
- type: "object",
16269
- properties: {
16270
- error: {
16271
- type: "string",
16272
- enum: [
16273
- "template_not_found"
16274
- ]
16275
- },
16276
- message: {
16277
- type: "string"
16278
- }
16279
- },
16280
- required: [
16281
- "error",
16282
- "message"
16283
- ]
16284
- },
16285
- {
16286
- type: "object",
16287
- properties: {
16288
- error: {
16289
- type: "string",
16290
- enum: [
16291
- "Contact not found"
16292
- ]
16293
- }
16294
- },
16295
- required: [
16296
- "error"
16400
+ type: "object",
16401
+ properties: {
16402
+ error: {
16403
+ type: "string",
16404
+ enum: [
16405
+ "template_not_found",
16406
+ "not_found"
16297
16407
  ]
16298
16408
  },
16299
- {
16300
- type: "object",
16301
- properties: {
16302
- message: {
16303
- type: "string"
16304
- }
16305
- },
16306
- required: [
16307
- "message"
16308
- ]
16409
+ message: {
16410
+ type: "string"
16309
16411
  }
16412
+ },
16413
+ required: [
16414
+ "error",
16415
+ "message"
16310
16416
  ]
16311
16417
  }
16312
16418
  }
@@ -16415,6 +16521,24 @@ var openapi_default = {
16415
16521
  "placeholders",
16416
16522
  "count"
16417
16523
  ]
16524
+ },
16525
+ {
16526
+ type: "object",
16527
+ properties: {
16528
+ error: {
16529
+ type: "string",
16530
+ enum: [
16531
+ "template_waba_mismatch"
16532
+ ]
16533
+ },
16534
+ message: {
16535
+ type: "string"
16536
+ }
16537
+ },
16538
+ required: [
16539
+ "error",
16540
+ "message"
16541
+ ]
16418
16542
  }
16419
16543
  ]
16420
16544
  }
@@ -16463,7 +16587,7 @@ var openapi_default = {
16463
16587
  properties: {
16464
16588
  error: {
16465
16589
  type: "string",
16466
- description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar.",
16590
+ description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar. Con este status, el portero tambi\xE9n puede devolver `gate_misconfigured`.",
16467
16591
  examples: [
16468
16592
  "internal_error"
16469
16593
  ]
@@ -16554,6 +16678,63 @@ var openapi_default = {
16554
16678
  },
16555
16679
  "404": {
16556
16680
  $ref: "#/components/responses/ConversationsModelNotFoundException"
16681
+ },
16682
+ "422": {
16683
+ description: "Unprocessable Content",
16684
+ content: {
16685
+ "application/json": {
16686
+ schema: {
16687
+ type: "object",
16688
+ properties: {
16689
+ error: {
16690
+ type: "string",
16691
+ enum: [
16692
+ "number_not_connected_to_meta",
16693
+ "meta_rejected"
16694
+ ]
16695
+ },
16696
+ message: {
16697
+ type: "string"
16698
+ },
16699
+ meta_code: {
16700
+ type: [
16701
+ "integer",
16702
+ "null"
16703
+ ]
16704
+ }
16705
+ },
16706
+ required: [
16707
+ "error",
16708
+ "message"
16709
+ ]
16710
+ }
16711
+ }
16712
+ }
16713
+ },
16714
+ "502": {
16715
+ description: "Bad Gateway",
16716
+ content: {
16717
+ "application/json": {
16718
+ schema: {
16719
+ type: "object",
16720
+ properties: {
16721
+ error: {
16722
+ type: "string",
16723
+ enum: [
16724
+ "meta_unavailable"
16725
+ ]
16726
+ },
16727
+ message: {
16728
+ type: "string"
16729
+ }
16730
+ },
16731
+ required: [
16732
+ "error",
16733
+ "message"
16734
+ ]
16735
+ }
16736
+ }
16737
+ }
16557
16738
  }
16558
16739
  },
16559
16740
  "x-fc-permission": "conversations:write",
@@ -18336,14 +18517,7 @@ var openapi_default = {
18336
18517
  },
18337
18518
  responses: {
18338
18519
  "200": {
18339
- description: "OK",
18340
- content: {
18341
- "application/json": {
18342
- schema: {
18343
- type: "object"
18344
- }
18345
- }
18346
- }
18520
+ description: "OK"
18347
18521
  },
18348
18522
  "400": {
18349
18523
  description: "Bad Request",
@@ -18680,14 +18854,7 @@ var openapi_default = {
18680
18854
  },
18681
18855
  responses: {
18682
18856
  "200": {
18683
- description: "OK",
18684
- content: {
18685
- "application/json": {
18686
- schema: {
18687
- type: "object"
18688
- }
18689
- }
18690
- }
18857
+ description: "OK"
18691
18858
  },
18692
18859
  "401": {
18693
18860
  $ref: "#/components/responses/ConversationsAuthenticationException"
@@ -18775,21 +18942,14 @@ var openapi_default = {
18775
18942
  content: {
18776
18943
  "application/json": {
18777
18944
  schema: {
18778
- anyOf: [
18779
- {
18780
- type: "object",
18781
- properties: {
18782
- data: {
18783
- $ref: "#/components/schemas/TemplateMetricsResource"
18784
- }
18785
- },
18786
- required: [
18787
- "data"
18788
- ]
18789
- },
18790
- {
18791
- type: "object"
18945
+ type: "object",
18946
+ properties: {
18947
+ data: {
18948
+ $ref: "#/components/schemas/TemplateMetricsResource"
18792
18949
  }
18950
+ },
18951
+ required: [
18952
+ "data"
18793
18953
  ]
18794
18954
  }
18795
18955
  }
@@ -19765,14 +19925,7 @@ var openapi_default = {
19765
19925
  content: {
19766
19926
  "application/json": {
19767
19927
  schema: {
19768
- anyOf: [
19769
- {
19770
- $ref: "#/components/schemas/UserResource"
19771
- },
19772
- {
19773
- type: "object"
19774
- }
19775
- ]
19928
+ $ref: "#/components/schemas/UserResource"
19776
19929
  }
19777
19930
  }
19778
19931
  }
@@ -22064,15 +22217,7 @@ var openapi_default = {
22064
22217
  ],
22065
22218
  responses: {
22066
22219
  "204": {
22067
- description: "No Content",
22068
- content: {
22069
- "application/json": {
22070
- schema: {
22071
- type: "array",
22072
- items: {}
22073
- }
22074
- }
22075
- }
22220
+ description: "No Content"
22076
22221
  },
22077
22222
  "401": {
22078
22223
  $ref: "#/components/responses/ConversationsAuthenticationException"
@@ -22304,75 +22449,177 @@ var openapi_default = {
22304
22449
  }
22305
22450
  }
22306
22451
  },
22307
- "401": {
22308
- $ref: "#/components/responses/ConversationsAuthenticationException"
22309
- },
22310
- "402": {
22311
- description: "Payment Required",
22452
+ "401": {
22453
+ $ref: "#/components/responses/ConversationsAuthenticationException"
22454
+ },
22455
+ "402": {
22456
+ description: "Payment Required",
22457
+ content: {
22458
+ "application/json": {
22459
+ schema: {
22460
+ type: "object",
22461
+ properties: {
22462
+ error: {
22463
+ type: "string",
22464
+ enum: [
22465
+ "payment_required"
22466
+ ]
22467
+ },
22468
+ message: {
22469
+ type: "string"
22470
+ }
22471
+ },
22472
+ required: [
22473
+ "error",
22474
+ "message"
22475
+ ]
22476
+ }
22477
+ }
22478
+ }
22479
+ },
22480
+ "403": {
22481
+ $ref: "#/components/responses/ConversationsAuthorizationException"
22482
+ },
22483
+ "422": {
22484
+ $ref: "#/components/responses/ConversationsValidationException"
22485
+ }
22486
+ },
22487
+ "x-fc-permission": "conversations:write",
22488
+ "x-fc-proposito": "\xDAsalo para sumar un n\xFAmero oficial a un formulario y poder mandarlo tambi\xE9n desde ah\xED; si ya est\xE1 publicado, se publica en ese n\xFAmero enseguida.",
22489
+ "x-fc-domain": "conversations"
22490
+ }
22491
+ },
22492
+ "/api/v1/forms/{id}/versions": {
22493
+ post: {
22494
+ operationId: "whatsappForm.storeVersion",
22495
+ description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Editar**\n\nCrea la versi\xF3n siguiente de un formulario publicado, como borrador, para poder cambiarlo. `{id}` es el `id` de la versi\xF3n desde la que partes. Responde 201 con la versi\xF3n nueva, o 200 con `created: false` si el formulario ya ten\xEDa un borrador (ese borrador es la respuesta). Responde 404 si la versi\xF3n no existe o no es de tu cuenta.",
22496
+ summary: "Crear una versi\xF3n de un formulario",
22497
+ tags: [
22498
+ "Formularios"
22499
+ ],
22500
+ parameters: [
22501
+ {
22502
+ name: "id",
22503
+ in: "path",
22504
+ required: true,
22505
+ schema: {
22506
+ type: "integer"
22507
+ }
22508
+ }
22509
+ ],
22510
+ responses: {
22511
+ "200": {
22512
+ description: "OK",
22513
+ content: {
22514
+ "application/json": {
22515
+ schema: {
22516
+ type: "object",
22517
+ properties: {
22518
+ data: {
22519
+ $ref: "#/components/schemas/WhatsappFormResource"
22520
+ },
22521
+ created: {
22522
+ type: "boolean"
22523
+ },
22524
+ lint: {
22525
+ type: "array",
22526
+ items: {}
22527
+ },
22528
+ numbers: {
22529
+ type: "array",
22530
+ prefixItems: [
22531
+ {
22532
+ type: "object",
22533
+ properties: {
22534
+ device_id: {},
22535
+ primary: {
22536
+ type: "boolean"
22537
+ },
22538
+ status: {
22539
+ type: "string"
22540
+ },
22541
+ error: {
22542
+ type: "string"
22543
+ }
22544
+ },
22545
+ required: [
22546
+ "device_id",
22547
+ "primary",
22548
+ "status",
22549
+ "error"
22550
+ ]
22551
+ }
22552
+ ],
22553
+ minItems: 1,
22554
+ maxItems: 1
22555
+ }
22556
+ },
22557
+ required: [
22558
+ "data",
22559
+ "created",
22560
+ "lint",
22561
+ "numbers"
22562
+ ]
22563
+ }
22564
+ }
22565
+ }
22566
+ },
22567
+ "201": {
22568
+ description: "Created",
22312
22569
  content: {
22313
22570
  "application/json": {
22314
22571
  schema: {
22315
22572
  type: "object",
22316
22573
  properties: {
22317
- error: {
22318
- type: "string",
22319
- enum: [
22320
- "payment_required"
22321
- ]
22574
+ data: {
22575
+ $ref: "#/components/schemas/WhatsappFormResource"
22322
22576
  },
22323
- message: {
22324
- type: "string"
22577
+ created: {
22578
+ type: "boolean"
22579
+ },
22580
+ lint: {
22581
+ type: "array",
22582
+ items: {}
22583
+ },
22584
+ numbers: {
22585
+ type: "array",
22586
+ prefixItems: [
22587
+ {
22588
+ type: "object",
22589
+ properties: {
22590
+ device_id: {},
22591
+ primary: {
22592
+ type: "boolean"
22593
+ },
22594
+ status: {
22595
+ type: "string"
22596
+ },
22597
+ error: {
22598
+ type: "string"
22599
+ }
22600
+ },
22601
+ required: [
22602
+ "device_id",
22603
+ "primary",
22604
+ "status",
22605
+ "error"
22606
+ ]
22607
+ }
22608
+ ],
22609
+ minItems: 1,
22610
+ maxItems: 1
22325
22611
  }
22326
22612
  },
22327
22613
  required: [
22328
- "error",
22329
- "message"
22614
+ "data",
22615
+ "created",
22616
+ "lint",
22617
+ "numbers"
22330
22618
  ]
22331
22619
  }
22332
22620
  }
22333
22621
  }
22334
22622
  },
22335
- "403": {
22336
- $ref: "#/components/responses/ConversationsAuthorizationException"
22337
- },
22338
- "422": {
22339
- $ref: "#/components/responses/ConversationsValidationException"
22340
- }
22341
- },
22342
- "x-fc-permission": "conversations:write",
22343
- "x-fc-proposito": "\xDAsalo para sumar un n\xFAmero oficial a un formulario y poder mandarlo tambi\xE9n desde ah\xED; si ya est\xE1 publicado, se publica en ese n\xFAmero enseguida.",
22344
- "x-fc-domain": "conversations"
22345
- }
22346
- },
22347
- "/api/v1/forms/{id}/versions": {
22348
- post: {
22349
- operationId: "whatsappForm.storeVersion",
22350
- description: "**Permiso requerido:** **Contactos y conversaciones \u2192 Editar**\n\nCrea la versi\xF3n siguiente de un formulario publicado, como borrador, para poder cambiarlo. `{id}` es el `id` de la versi\xF3n desde la que partes. Responde 201 con la versi\xF3n nueva, o 200 con `created: false` si el formulario ya ten\xEDa un borrador (ese borrador es la respuesta). Responde 404 si la versi\xF3n no existe o no es de tu cuenta.",
22351
- summary: "Crear una versi\xF3n de un formulario",
22352
- tags: [
22353
- "Formularios"
22354
- ],
22355
- parameters: [
22356
- {
22357
- name: "id",
22358
- in: "path",
22359
- required: true,
22360
- schema: {
22361
- type: "integer"
22362
- }
22363
- }
22364
- ],
22365
- responses: {
22366
- "200": {
22367
- description: "OK",
22368
- content: {
22369
- "application/json": {
22370
- schema: {
22371
- type: "string"
22372
- }
22373
- }
22374
- }
22375
- },
22376
22623
  "401": {
22377
22624
  $ref: "#/components/responses/ConversationsAuthenticationException"
22378
22625
  },
@@ -22968,36 +23215,22 @@ var openapi_default = {
22968
23215
  content: {
22969
23216
  "application/json": {
22970
23217
  schema: {
22971
- anyOf: [
22972
- {
22973
- type: "object",
22974
- properties: {
22975
- error: {
22976
- type: "string",
22977
- enum: [
22978
- "form_not_found"
22979
- ]
22980
- },
22981
- message: {
22982
- type: "string"
22983
- }
22984
- },
22985
- required: [
22986
- "error",
22987
- "message"
23218
+ type: "object",
23219
+ properties: {
23220
+ error: {
23221
+ type: "string",
23222
+ enum: [
23223
+ "form_not_found",
23224
+ "not_found"
22988
23225
  ]
22989
23226
  },
22990
- {
22991
- type: "object",
22992
- properties: {
22993
- message: {
22994
- type: "string"
22995
- }
22996
- },
22997
- required: [
22998
- "message"
22999
- ]
23227
+ message: {
23228
+ type: "string"
23000
23229
  }
23230
+ },
23231
+ required: [
23232
+ "error",
23233
+ "message"
23001
23234
  ]
23002
23235
  }
23003
23236
  }
@@ -23131,7 +23364,7 @@ var openapi_default = {
23131
23364
  properties: {
23132
23365
  error: {
23133
23366
  type: "string",
23134
- description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar.",
23367
+ description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar. Con este status, el portero tambi\xE9n puede devolver `gate_misconfigured`.",
23135
23368
  examples: [
23136
23369
  "internal_error"
23137
23370
  ]
@@ -25278,6 +25511,61 @@ var openapi_default = {
25278
25511
  "401": {
25279
25512
  $ref: "#/components/responses/CommunitiesAuthenticationException"
25280
25513
  },
25514
+ "402": {
25515
+ description: "La cuenta lleg\xF3 al tope de grupos oficiales de su plan. No se registra ninguna acci\xF3n.",
25516
+ content: {
25517
+ "application/json": {
25518
+ schema: {
25519
+ type: "object",
25520
+ properties: {
25521
+ error: {
25522
+ type: "string",
25523
+ description: "C\xF3digo estable del error: es lo que se compara. `message` es para personas y puede cambiar.",
25524
+ enum: [
25525
+ "plan_cap_reached"
25526
+ ]
25527
+ },
25528
+ message: {
25529
+ type: "string",
25530
+ examples: [
25531
+ "Alcanzaste el l\xEDmite de tu plan."
25532
+ ]
25533
+ },
25534
+ feature: {
25535
+ type: "string",
25536
+ description: "La funci\xF3n del plan que tiene el tope.",
25537
+ examples: [
25538
+ "cloud_api_groups"
25539
+ ]
25540
+ },
25541
+ parameter: {
25542
+ type: "string",
25543
+ description: "El tope que se alcanz\xF3: grupos oficiales creados.",
25544
+ examples: [
25545
+ "cloud_api_groups_created"
25546
+ ]
25547
+ },
25548
+ cap: {
25549
+ type: "integer",
25550
+ description: "El tope del plan."
25551
+ },
25552
+ used: {
25553
+ type: "integer",
25554
+ description: "Lo que la cuenta ya us\xF3 de ese tope."
25555
+ }
25556
+ },
25557
+ required: [
25558
+ "error",
25559
+ "message",
25560
+ "feature",
25561
+ "parameter",
25562
+ "cap",
25563
+ "used"
25564
+ ]
25565
+ }
25566
+ }
25567
+ }
25568
+ },
25281
25569
  "403": {
25282
25570
  $ref: "#/components/responses/CommunitiesAuthorizationException"
25283
25571
  },
@@ -26519,14 +26807,14 @@ var openapi_default = {
26519
26807
  ],
26520
26808
  responses: {
26521
26809
  "200": {
26522
- description: "The action.",
26810
+ description: "El estado de la acci\xF3n y, si termin\xF3 `completed`, su resultado.",
26523
26811
  content: {
26524
26812
  "application/json": {
26525
26813
  schema: {
26526
26814
  type: "object",
26527
26815
  properties: {
26528
26816
  data: {
26529
- $ref: "#/components/schemas/PendingGroupAction"
26817
+ $ref: "#/components/schemas/ApiGroupActionResource"
26530
26818
  }
26531
26819
  },
26532
26820
  required: [
@@ -26545,9 +26833,7 @@ var openapi_default = {
26545
26833
  },
26546
26834
  "x-fc-proposito": "Sirve para saber c\xF3mo termin\xF3 lo que le pediste a un grupo, como mandarle un mensaje: si sigue en cola, se est\xE1 haciendo, termin\xF3 o fall\xF3, y su resultado.",
26547
26835
  "x-fc-domain": "communities",
26548
- "x-fc-permission": "communities:read",
26549
- "x-fc-pending": "communities-group-action",
26550
- "x-fc-pending-response": "communities-group-action"
26836
+ "x-fc-permission": "communities:read"
26551
26837
  }
26552
26838
  },
26553
26839
  "/api/v1/groups/{group}/participants": {
@@ -26823,7 +27109,7 @@ var openapi_default = {
26823
27109
  "/api/v1/groups/{group}/description": {
26824
27110
  put: {
26825
27111
  operationId: "apiGroupAction.updateDescription",
26826
- description: "**Permiso requerido:** **Grupos y campa\xF1as \u2192 Administrar grupos**\n\n**Nota:** As\xEDncrona: responde 202 con `action_id`; consulta el resultado en `GET /groups/actions/{action}`. Hasta 2048 caracteres; una descripci\xF3n vac\xEDa la borra. Se ejecuta al ritmo de las campa\xF1as del n\xFAmero.",
27112
+ description: "**Permiso requerido:** **Grupos y campa\xF1as \u2192 Administrar grupos**\n\n**Nota:** As\xEDncrona: responde 202 con `action_id`; consulta el resultado en `GET /groups/actions/{action}`. Hasta 2048 caracteres. Con un n\xFAmero QR, una descripci\xF3n vac\xEDa la borra; con un n\xFAmero oficial responde `422 validation_failed`, porque WhatsApp no permite borrar la descripci\xF3n de un grupo oficial. Se ejecuta al ritmo de las campa\xF1as del n\xFAmero.",
26827
27113
  summary: "Cambiar la descripci\xF3n de un grupo",
26828
27114
  tags: [
26829
27115
  "Acciones de grupo"
@@ -34544,19 +34830,22 @@ var openapi_default = {
34544
34830
  }
34545
34831
  },
34546
34832
  "400": {
34547
- description: "El n\xFAmero no admite esta edici\xF3n.",
34833
+ description: "El n\xFAmero no admite esta edici\xF3n (`unsupported_provider`).",
34548
34834
  content: {
34549
34835
  "application/json": {
34550
34836
  schema: {
34551
34837
  type: "object",
34552
34838
  properties: {
34553
34839
  error: {
34554
- type: "string",
34555
- const: "Unsupported provider"
34840
+ type: "string"
34841
+ },
34842
+ message: {
34843
+ type: "string"
34556
34844
  }
34557
34845
  },
34558
34846
  required: [
34559
- "error"
34847
+ "error",
34848
+ "message"
34560
34849
  ]
34561
34850
  }
34562
34851
  }
@@ -36712,7 +37001,7 @@ var openapi_default = {
36712
37001
  "/api/v1/devices/{device}/username": {
36713
37002
  get: {
36714
37003
  operationId: "deviceUsername.show",
36715
- description: "**Lectura** \xB7 requiere **N\xFAmeros de WhatsApp \u2192 Ver**.\n\nLo consulta en Meta; si Meta no devuelve ninguno, responde el \xFAltimo que se reserv\xF3. Solo\npara n\xFAmeros oficiales.",
37004
+ description: "**Lectura** \xB7 requiere **N\xFAmeros de WhatsApp \u2192 Ver**.\n\nLo consulta en Meta; si Meta no devuelve ninguno, responde el \xFAltimo que se reserv\xF3. Solo\npara n\xFAmeros oficiales. Si Meta rechaza la consulta, la respuesta lleva el mismo c\xF3digo HTTP\nque dio Meta, `error` `meta_error` y el motivo de Meta en `message`.",
36716
37005
  summary: "Ver el nombre de usuario de un n\xFAmero",
36717
37006
  tags: [
36718
37007
  "N\xFAmeros"
@@ -36811,35 +37100,22 @@ var openapi_default = {
36811
37100
  $ref: "#/components/responses/AccountsModelNotFoundException"
36812
37101
  },
36813
37102
  "422": {
36814
- description: "El n\xFAmero no es oficial o no est\xE1 conectado.",
37103
+ description: "El n\xFAmero no es oficial (`device_not_meta`) o todav\xEDa no est\xE1 conectado a Meta (`device_not_ready`).",
36815
37104
  content: {
36816
37105
  "application/json": {
36817
37106
  schema: {
36818
- anyOf: [
36819
- {
36820
- type: "object",
36821
- properties: {
36822
- error: {
36823
- type: "string",
36824
- const: "El dispositivo no tiene credenciales Meta configuradas."
36825
- }
36826
- },
36827
- required: [
36828
- "error"
36829
- ]
37107
+ type: "object",
37108
+ properties: {
37109
+ error: {
37110
+ type: "string"
36830
37111
  },
36831
- {
36832
- type: "object",
36833
- properties: {
36834
- error: {
36835
- type: "string",
36836
- const: "Solo disponible para dispositivos WhatsApp Cloud API."
36837
- }
36838
- },
36839
- required: [
36840
- "error"
36841
- ]
37112
+ message: {
37113
+ type: "string"
36842
37114
  }
37115
+ },
37116
+ required: [
37117
+ "error",
37118
+ "message"
36843
37119
  ]
36844
37120
  }
36845
37121
  }
@@ -36880,11 +37156,23 @@ var openapi_default = {
36880
37156
  }
36881
37157
  },
36882
37158
  "502": {
36883
- description: "Meta no respondi\xF3. Vuelve a intentarlo.",
37159
+ description: "Meta no respondi\xF3 (`provider_error`). Vuelve a intentarlo.",
36884
37160
  content: {
36885
37161
  "application/json": {
36886
37162
  schema: {
36887
- type: "string"
37163
+ type: "object",
37164
+ properties: {
37165
+ error: {
37166
+ type: "string"
37167
+ },
37168
+ message: {
37169
+ type: "string"
37170
+ }
37171
+ },
37172
+ required: [
37173
+ "error",
37174
+ "message"
37175
+ ]
36888
37176
  }
36889
37177
  }
36890
37178
  }
@@ -36898,7 +37186,7 @@ var openapi_default = {
36898
37186
  },
36899
37187
  post: {
36900
37188
  operationId: "deviceUsername.store",
36901
- description: "**Escritura** \xB7 requiere **N\xFAmeros de WhatsApp \u2192 Editar**.\n\n`username` va de 3 a 35 caracteres: letras min\xFAsculas, n\xFAmeros, puntos y guiones bajos. Se\nreserva en Meta; si Meta lo rechaza (por ejemplo, porque ya est\xE1 tomado), la respuesta\ntrae su motivo en `message`. Solo para n\xFAmeros oficiales.",
37189
+ description: "**Escritura** \xB7 requiere **N\xFAmeros de WhatsApp \u2192 Editar**.\n\n`username` va de 3 a 35 caracteres: letras min\xFAsculas, n\xFAmeros, puntos y guiones bajos. Se\nreserva en Meta; si Meta lo rechaza (por ejemplo, porque ya est\xE1 tomado), la respuesta\nlleva el mismo c\xF3digo HTTP que dio Meta, `error` `meta_error` y su motivo en `message`. Solo\npara n\xFAmeros oficiales.",
36902
37190
  summary: "Reservar un nombre de usuario",
36903
37191
  tags: [
36904
37192
  "N\xFAmeros"
@@ -37025,35 +37313,22 @@ var openapi_default = {
37025
37313
  $ref: "#/components/responses/AccountsModelNotFoundException"
37026
37314
  },
37027
37315
  "422": {
37028
- description: "El nombre no es v\xE1lido, o el n\xFAmero no es oficial o no est\xE1 conectado.",
37316
+ description: "El nombre no es v\xE1lido (`validation_failed`, con `errors`), el n\xFAmero no es oficial (`device_not_meta`) o todav\xEDa no est\xE1 conectado a Meta (`device_not_ready`).",
37029
37317
  content: {
37030
37318
  "application/json": {
37031
37319
  schema: {
37032
- anyOf: [
37033
- {
37034
- type: "object",
37035
- properties: {
37036
- error: {
37037
- type: "string",
37038
- const: "El dispositivo no tiene credenciales Meta configuradas."
37039
- }
37040
- },
37041
- required: [
37042
- "error"
37043
- ]
37320
+ type: "object",
37321
+ properties: {
37322
+ error: {
37323
+ type: "string"
37044
37324
  },
37045
- {
37046
- type: "object",
37047
- properties: {
37048
- error: {
37049
- type: "string",
37050
- const: "Solo disponible para dispositivos WhatsApp Cloud API."
37051
- }
37052
- },
37053
- required: [
37054
- "error"
37055
- ]
37325
+ message: {
37326
+ type: "string"
37056
37327
  }
37328
+ },
37329
+ required: [
37330
+ "error",
37331
+ "message"
37057
37332
  ]
37058
37333
  }
37059
37334
  }
@@ -37094,11 +37369,23 @@ var openapi_default = {
37094
37369
  }
37095
37370
  },
37096
37371
  "502": {
37097
- description: "Meta no respondi\xF3. Vuelve a intentarlo.",
37372
+ description: "Meta no respondi\xF3 (`provider_error`). Vuelve a intentarlo.",
37098
37373
  content: {
37099
37374
  "application/json": {
37100
37375
  schema: {
37101
- type: "string"
37376
+ type: "object",
37377
+ properties: {
37378
+ error: {
37379
+ type: "string"
37380
+ },
37381
+ message: {
37382
+ type: "string"
37383
+ }
37384
+ },
37385
+ required: [
37386
+ "error",
37387
+ "message"
37388
+ ]
37102
37389
  }
37103
37390
  }
37104
37391
  }
@@ -37114,7 +37401,7 @@ var openapi_default = {
37114
37401
  "/api/v1/devices/{device}/username/suggestions": {
37115
37402
  get: {
37116
37403
  operationId: "deviceUsername.suggestions",
37117
- description: "**Lectura** \xB7 requiere **N\xFAmeros de WhatsApp \u2192 Ver**.\n\nLas sugerencias que da Meta para ese n\xFAmero. Solo para n\xFAmeros oficiales.",
37404
+ description: "**Lectura** \xB7 requiere **N\xFAmeros de WhatsApp \u2192 Ver**.\n\nLas sugerencias que da Meta para ese n\xFAmero. Solo para n\xFAmeros oficiales. Si Meta rechaza la\nconsulta, la respuesta lleva el mismo c\xF3digo HTTP que dio Meta, `error` `meta_error` y el\nmotivo de Meta en `message`.",
37118
37405
  summary: "Ver nombres de usuario sugeridos",
37119
37406
  tags: [
37120
37407
  "N\xFAmeros"
@@ -37213,35 +37500,22 @@ var openapi_default = {
37213
37500
  $ref: "#/components/responses/AccountsModelNotFoundException"
37214
37501
  },
37215
37502
  "422": {
37216
- description: "El n\xFAmero no es oficial o no est\xE1 conectado.",
37503
+ description: "El n\xFAmero no es oficial (`device_not_meta`) o todav\xEDa no est\xE1 conectado a Meta (`device_not_ready`).",
37217
37504
  content: {
37218
37505
  "application/json": {
37219
37506
  schema: {
37220
- anyOf: [
37221
- {
37222
- type: "object",
37223
- properties: {
37224
- error: {
37225
- type: "string",
37226
- const: "El dispositivo no tiene credenciales Meta configuradas."
37227
- }
37228
- },
37229
- required: [
37230
- "error"
37231
- ]
37507
+ type: "object",
37508
+ properties: {
37509
+ error: {
37510
+ type: "string"
37232
37511
  },
37233
- {
37234
- type: "object",
37235
- properties: {
37236
- error: {
37237
- type: "string",
37238
- const: "Solo disponible para dispositivos WhatsApp Cloud API."
37239
- }
37240
- },
37241
- required: [
37242
- "error"
37243
- ]
37512
+ message: {
37513
+ type: "string"
37244
37514
  }
37515
+ },
37516
+ required: [
37517
+ "error",
37518
+ "message"
37245
37519
  ]
37246
37520
  }
37247
37521
  }
@@ -37282,11 +37556,23 @@ var openapi_default = {
37282
37556
  }
37283
37557
  },
37284
37558
  "502": {
37285
- description: "Meta no respondi\xF3. Vuelve a intentarlo.",
37559
+ description: "Meta no respondi\xF3 (`provider_error`). Vuelve a intentarlo.",
37286
37560
  content: {
37287
37561
  "application/json": {
37288
37562
  schema: {
37289
- type: "string"
37563
+ type: "object",
37564
+ properties: {
37565
+ error: {
37566
+ type: "string"
37567
+ },
37568
+ message: {
37569
+ type: "string"
37570
+ }
37571
+ },
37572
+ required: [
37573
+ "error",
37574
+ "message"
37575
+ ]
37290
37576
  }
37291
37577
  }
37292
37578
  }
@@ -37671,7 +37957,7 @@ var openapi_default = {
37671
37957
  },
37672
37958
  post: {
37673
37959
  operationId: "webhookSubscription.store",
37674
- description: "**Escritura** \xB7 requiere **Avisos (webhooks) \u2192 Administrar**.\n\nCon una clave de API, cada tipo de `events` exige adem\xE1s el permiso\n**N\xFAmeros de WhatsApp \u2192 Ver**, **Contactos y conversaciones \u2192 Ver** o\n**Grupos y campa\xF1as \u2192 Ver**, seg\xFAn su \xE1rea; si falta, 422.",
37960
+ description: "**Escritura** \xB7 requiere **Avisos (webhooks) \u2192 Administrar**.\n\nCon una clave de API, cada tipo de `events` exige adem\xE1s el permiso\n**N\xFAmeros de WhatsApp \u2192 Ver**, **Contactos y conversaciones \u2192 Ver** o\n**Grupos y campa\xF1as \u2192 Ver**, seg\xFAn su \xE1rea; si falta, 422.\n\nHay un tope de 50 suscripciones por workspace (por cuenta, si no usas workspaces), sea\ncual sea su estado: con 50, crear otra responde `422` con `error`\n`webhooks_limit_reached`.\n\nNo acepta `Idempotency-Key`: reintentar una creaci\xF3n que s\xED lleg\xF3 crea otra suscripci\xF3n,\ncon otro secreto.",
37675
37961
  summary: "Crear un webhook",
37676
37962
  tags: [
37677
37963
  "Webhooks"
@@ -38866,7 +39152,7 @@ var openapi_default = {
38866
39152
  ],
38867
39153
  responses: {
38868
39154
  "200": {
38869
- description: "`WhatsAppBusinessAccountResource`",
39155
+ description: "La WABA, con sus n\xFAmeros y su l\xEDmite de mensajes.",
38870
39156
  content: {
38871
39157
  "application/json": {
38872
39158
  schema: {
@@ -40519,7 +40805,7 @@ var openapi_default = {
40519
40805
  post: {
40520
40806
  operationId: "webhook.group_blocked",
40521
40807
  summary: "group.blocked",
40522
- description: "Un grupo qued\xF3 inoperable: sin administrador conectado, con el link de invitaci\xF3n inv\xE1lido o suspendido por WhatsApp.",
40808
+ description: "Un grupo de una campa\xF1a qued\xF3 inoperable: sin administrador conectado, con el link de invitaci\xF3n inv\xE1lido o suspendido por WhatsApp; un grupo que no es de una campa\xF1a no lo genera.",
40523
40809
  tags: [
40524
40810
  "Webhooks"
40525
40811
  ],
@@ -40609,7 +40895,7 @@ var openapi_default = {
40609
40895
  post: {
40610
40896
  operationId: "webhook.group_recovered",
40611
40897
  summary: "group.recovered",
40612
- description: "Un grupo que estaba bloqueado volvi\xF3 a operar.",
40898
+ description: "Un grupo de una campa\xF1a que estaba bloqueado volvi\xF3 a operar; un grupo que no es de una campa\xF1a no lo genera.",
40613
40899
  tags: [
40614
40900
  "Webhooks"
40615
40901
  ],
@@ -40979,7 +41265,7 @@ var openapi_default = {
40979
41265
  post: {
40980
41266
  operationId: "webhook.pipeline_finished",
40981
41267
  summary: "pipeline.finished",
40982
- description: "Termin\xF3 un pipeline de operaciones sobre grupos, con su resultado agregado y la clave de idempotencia del pedido que lo origin\xF3, cuando la hay.",
41268
+ description: "Termin\xF3 un pipeline de operaciones sobre los grupos de una campa\xF1a, con su resultado agregado y la clave de idempotencia del pedido que lo origin\xF3, cuando la hay; si despu\xE9s cambia el resultado de alguna de sus acciones (por ejemplo, por un reintento), sale otro, con otro `id` y los conteos nuevos.",
40983
41269
  tags: [
40984
41270
  "Webhooks"
40985
41271
  ],
@@ -42180,7 +42466,7 @@ var openapi_default = {
42180
42466
  connection: "qr",
42181
42467
  external_reference: "cliente-42"
42182
42468
  },
42183
- connected_at: "2026-10-05T03:00:00+00:00",
42469
+ connected_at: "2026-10-05T03:00:00Z",
42184
42470
  connect_link_id: 812,
42185
42471
  workspace_id: 37
42186
42472
  }
@@ -42267,7 +42553,7 @@ var openapi_default = {
42267
42553
  connection: "qr",
42268
42554
  external_reference: "cliente-42"
42269
42555
  },
42270
- disconnected_at: "2026-10-05T03:00:00+00:00",
42556
+ disconnected_at: "2026-10-05T03:00:00Z",
42271
42557
  reason: "qr_logged_out",
42272
42558
  connect_link_id: 812,
42273
42559
  workspace_id: 37
@@ -43133,7 +43419,7 @@ var openapi_default = {
43133
43419
  connection: "qr",
43134
43420
  external_reference: "cliente-42"
43135
43421
  },
43136
- deleted_at: "2026-10-05T03:00:00+00:00",
43422
+ deleted_at: "2026-10-05T03:00:00Z",
43137
43423
  connect_link_id: 812,
43138
43424
  workspace_id: 37
43139
43425
  }
@@ -43230,7 +43516,7 @@ var openapi_default = {
43230
43516
  },
43231
43517
  previous_state: "available",
43232
43518
  state: "limited",
43233
- changed_at: "2026-10-05T03:00:00+00:00",
43519
+ changed_at: "2026-10-05T03:00:00Z",
43234
43520
  connect_link_id: null,
43235
43521
  workspace_id: 37
43236
43522
  }
@@ -43315,7 +43601,7 @@ var openapi_default = {
43315
43601
  },
43316
43602
  previous: "GREEN",
43317
43603
  current: "YELLOW",
43318
- changed_at: "2026-10-05T03:00:00+00:00",
43604
+ changed_at: "2026-10-05T03:00:00Z",
43319
43605
  connect_link_id: null,
43320
43606
  workspace_id: 37
43321
43607
  }
@@ -43400,7 +43686,7 @@ var openapi_default = {
43400
43686
  },
43401
43687
  previous: "TIER_1K",
43402
43688
  current: "TIER_10K",
43403
- changed_at: "2026-10-05T03:00:00+00:00",
43689
+ changed_at: "2026-10-05T03:00:00Z",
43404
43690
  connect_link_id: null,
43405
43691
  workspace_id: 37
43406
43692
  }
@@ -43513,7 +43799,7 @@ var openapi_default = {
43513
43799
  status: "APPROVED",
43514
43800
  verified_name: "Soporte Lucky Shrub",
43515
43801
  rejection_reason: null,
43516
- reviewed_at: "2026-10-05T03:00:00+00:00",
43802
+ reviewed_at: "2026-10-05T03:00:00Z",
43517
43803
  connect_link_id: null,
43518
43804
  workspace_id: 37
43519
43805
  }
@@ -45109,6 +45395,251 @@ var openapi_default = {
45109
45395
  ],
45110
45396
  title: "ApiGroupActionAcceptedResource"
45111
45397
  },
45398
+ ApiGroupActionResource: {
45399
+ type: "object",
45400
+ properties: {
45401
+ action_id: {
45402
+ type: "string",
45403
+ description: "Id de la acci\xF3n: el `action_id` del `202`."
45404
+ },
45405
+ type: {
45406
+ type: "string",
45407
+ description: "Tipo de acci\xF3n.",
45408
+ enum: [
45409
+ "create_group",
45410
+ "add_participants",
45411
+ "remove_participants",
45412
+ "promote_admins",
45413
+ "demote_admins",
45414
+ "update_name",
45415
+ "update_description",
45416
+ "update_photo",
45417
+ "update_settings",
45418
+ "renew_invite_link",
45419
+ "send_message",
45420
+ "approve_join_requests",
45421
+ "reject_join_requests"
45422
+ ]
45423
+ },
45424
+ status: {
45425
+ type: "string",
45426
+ description: "Estado de la acci\xF3n.",
45427
+ enum: [
45428
+ "queued",
45429
+ "running",
45430
+ "completed",
45431
+ "failed"
45432
+ ]
45433
+ },
45434
+ device_id: {
45435
+ type: [
45436
+ "integer",
45437
+ "null"
45438
+ ],
45439
+ description: "N\xFAmero que ejecuta la acci\xF3n; `null` si es de otro workspace que el de la key."
45440
+ },
45441
+ group: {
45442
+ type: [
45443
+ "object",
45444
+ "null"
45445
+ ],
45446
+ description: "Grupo de la acci\xF3n; `null` si todav\xEDa no existe (una creaci\xF3n sin terminar) o es de otro workspace que el de la key.",
45447
+ properties: {
45448
+ uid: {
45449
+ type: "string"
45450
+ },
45451
+ name: {
45452
+ type: [
45453
+ "string",
45454
+ "null"
45455
+ ]
45456
+ }
45457
+ },
45458
+ required: [
45459
+ "uid",
45460
+ "name"
45461
+ ]
45462
+ },
45463
+ result: {
45464
+ description: 'Resultado de una acci\xF3n `completed`; `null` mientras est\xE1 `queued` o `running` y cuando termina `failed`. Su forma depende de `type`: `{"participants": [...]}` (una lista, en el orden del pedido) para las acciones con lista de tel\xE9fonos; `{"group": {"uid", "name"}, "invite_link"}` para `create_group`; `{"invite_link"}` para `renew_invite_link`; `{"message": {"uid"}}` para `send_message`; `{}` para las dem\xE1s. Es el mismo `result` del evento `group_action.completed`.',
45465
+ anyOf: [
45466
+ {
45467
+ type: "object",
45468
+ properties: {
45469
+ participants: {
45470
+ type: "array",
45471
+ items: {
45472
+ type: "object",
45473
+ properties: {
45474
+ identity: {
45475
+ type: [
45476
+ "string",
45477
+ "null"
45478
+ ]
45479
+ },
45480
+ identity_type: {
45481
+ type: [
45482
+ "string",
45483
+ "null"
45484
+ ]
45485
+ },
45486
+ status: {
45487
+ type: "string",
45488
+ enum: [
45489
+ "added",
45490
+ "invited",
45491
+ "removed",
45492
+ "promoted",
45493
+ "demoted",
45494
+ "approved",
45495
+ "rejected",
45496
+ "failed"
45497
+ ]
45498
+ },
45499
+ reason: {
45500
+ type: [
45501
+ "string",
45502
+ "null"
45503
+ ]
45504
+ }
45505
+ },
45506
+ required: [
45507
+ "identity",
45508
+ "identity_type",
45509
+ "status",
45510
+ "reason"
45511
+ ]
45512
+ }
45513
+ }
45514
+ },
45515
+ required: [
45516
+ "participants"
45517
+ ]
45518
+ },
45519
+ {
45520
+ type: "object",
45521
+ properties: {
45522
+ group: {
45523
+ type: "object",
45524
+ properties: {
45525
+ uid: {
45526
+ type: "string"
45527
+ },
45528
+ name: {
45529
+ type: [
45530
+ "string",
45531
+ "null"
45532
+ ]
45533
+ }
45534
+ },
45535
+ required: [
45536
+ "uid",
45537
+ "name"
45538
+ ]
45539
+ },
45540
+ invite_link: {
45541
+ type: [
45542
+ "string",
45543
+ "null"
45544
+ ]
45545
+ }
45546
+ },
45547
+ required: [
45548
+ "group",
45549
+ "invite_link"
45550
+ ]
45551
+ },
45552
+ {
45553
+ type: "object",
45554
+ properties: {
45555
+ invite_link: {
45556
+ type: [
45557
+ "string",
45558
+ "null"
45559
+ ]
45560
+ }
45561
+ },
45562
+ required: [
45563
+ "invite_link"
45564
+ ]
45565
+ },
45566
+ {
45567
+ type: "object",
45568
+ properties: {
45569
+ message: {
45570
+ type: "object",
45571
+ properties: {
45572
+ uid: {
45573
+ type: [
45574
+ "string",
45575
+ "null"
45576
+ ]
45577
+ }
45578
+ },
45579
+ required: [
45580
+ "uid"
45581
+ ]
45582
+ }
45583
+ },
45584
+ required: [
45585
+ "message"
45586
+ ]
45587
+ },
45588
+ {
45589
+ type: "object"
45590
+ },
45591
+ {
45592
+ type: "null"
45593
+ }
45594
+ ]
45595
+ },
45596
+ reason: {
45597
+ type: [
45598
+ "string",
45599
+ "null"
45600
+ ],
45601
+ description: "Motivo de una acci\xF3n `failed`; `null` en los dem\xE1s estados. Vocabulario cerrado: la secci\xF3n \xABMotivos\xBB de \xABAcciones de grupo\xBB."
45602
+ },
45603
+ created_at: {
45604
+ type: [
45605
+ "string",
45606
+ "null"
45607
+ ]
45608
+ },
45609
+ started_at: {
45610
+ type: [
45611
+ "string",
45612
+ "null"
45613
+ ]
45614
+ },
45615
+ completed_at: {
45616
+ type: [
45617
+ "string",
45618
+ "null"
45619
+ ]
45620
+ },
45621
+ failed_at: {
45622
+ type: [
45623
+ "string",
45624
+ "null"
45625
+ ]
45626
+ }
45627
+ },
45628
+ required: [
45629
+ "action_id",
45630
+ "type",
45631
+ "status",
45632
+ "device_id",
45633
+ "group",
45634
+ "result",
45635
+ "reason",
45636
+ "created_at",
45637
+ "started_at",
45638
+ "completed_at",
45639
+ "failed_at"
45640
+ ],
45641
+ title: "ApiGroupActionResource"
45642
+ },
45112
45643
  ApiGroupDescriptionRequest: {
45113
45644
  type: "object",
45114
45645
  description: "Cuerpo de `PUT /groups/{group}/description`: una descripci\xF3n vac\xEDa la borra, salvo con un n\xFAmero oficial,\nen el que WhatsApp no permite borrarla. Los campos que no figuran se ignoran.",
@@ -48774,7 +49305,7 @@ var openapi_default = {
48774
49305
  "integer",
48775
49306
  "null"
48776
49307
  ],
48777
- description: "additive last-computed snapshot, always present\n(not nulled when overloaded=false). No state row => counts null, flags false."
49308
+ description: "En la \xFAltima evaluaci\xF3n, cu\xE1ntos grupos ten\xEDa el n\xFAmero; `null` si nunca se evalu\xF3."
48778
49309
  },
48779
49310
  overloaded_one_to_one_count: {
48780
49311
  type: [
@@ -48793,7 +49324,7 @@ var openapi_default = {
48793
49324
  },
48794
49325
  overloaded_alert_level: {
48795
49326
  type: "string",
48796
- description: "additive, always present. No row => none / null."
49327
+ description: "El evento de n\xFAmero sobrecargado: `loud` (sin descartar), `latent` (descartado en este\nepisodio) o `none` (no est\xE1 sobrecargado o nunca se evalu\xF3)."
48797
49328
  },
48798
49329
  overloaded_dismissed_at: {
48799
49330
  type: [
@@ -55227,7 +55758,7 @@ var openapi_default = {
55227
55758
  generated_by: "scripts/generate.mjs",
55228
55759
  note: "GENERATED: do not edit it. The portal's snapshot plus the pending layers.",
55229
55760
  inputs: {
55230
- "spec/funnelchat.json": "3e5bc8ef01a2c74650a2581beb9bcfee4dd14252bec8ab52542fa3240ab60475",
55761
+ "spec/funnelchat.json": "7db2ead826697c80fd8feef3f0ea556b5374dd3d2cb5e02f3cfe4584af79e33c",
55231
55762
  "spec/pending.json": "dd7b8cf6e5be45ddf1c0c00a9f4480cceec11b364adec083bbf989fa11944d9d",
55232
55763
  "spec/pending-sandbox.json": "32bcbfef902fbabd57e1626f4d97e964b89f3c561c7b0f0e21531c8576019aaf"
55233
55764
  },
@@ -55241,7 +55772,6 @@ var openapi_default = {
55241
55772
  "GET /api/v1/devices/{device}/qr (respuestas: 200) [pending.json]",
55242
55773
  "GET /api/v1/templates (respuestas: 200) [pending.json]",
55243
55774
  "PUT /api/v1/webhooks/{id} (respuestas: 200) [pending.json]",
55244
- "GET /api/v1/groups/actions/{action} (respuestas: 200) [pending.json]",
55245
55775
  "webhook device.connected [pending.json]",
55246
55776
  "webhook device.disconnected [pending.json]",
55247
55777
  "webhook billing.payment_failed [pending.json]",
@@ -56275,11 +56805,8 @@ function resolveFile(body2, style) {
56275
56805
  if (fileType !== null) return { file, type: fileType, fileName };
56276
56806
  const type = SUPPORTED_EXTENSIONS[extension];
56277
56807
  if (type) return { file, type, fileName };
56278
- const error = `Unsupported file type: ${extension}`;
56279
- throw new RawApiError(
56280
- 415,
56281
- style === "conversation" ? { error, supported_file_types: Object.keys(SUPPORTED_EXTENSIONS) } : { status: "error", error }
56282
- );
56808
+ const message = `Unsupported file type: ${extension}`;
56809
+ throw new ApiError(415, "bad_request", message, style === "conversation" ? { supported_file_types: Object.keys(SUPPORTED_EXTENSIONS) } : {});
56283
56810
  }
56284
56811
 
56285
56812
  // src/openapi/shape.ts
@@ -56305,7 +56832,7 @@ function shapeOnlyAnswer(op) {
56305
56832
 
56306
56833
  // package.json
56307
56834
  var package_default = {
56308
- version: "0.5.1"};
56835
+ version: "0.5.2"};
56309
56836
 
56310
56837
  // src/version.ts
56311
56838
  var VERSION = package_default.version;
@@ -57456,27 +57983,27 @@ function connectDevice(app, device, options = {}) {
57456
57983
  device.connected = true;
57457
57984
  device.firstConnectedAt ??= at;
57458
57985
  if (device.kind === "cloud" && (device.health === null || device.health === "unknown")) device.health = "available";
57459
- return app.webhooks.emit("device.connected", eventData(device, { connected_at: iso8601(at) }, connectLinkId), { occurredAt: at, workspaceId: device.workspaceId });
57986
+ return app.webhooks.emit("device.connected", eventData(device, { connected_at: isoSeconds(at) }, connectLinkId), { occurredAt: at, workspaceId: device.workspaceId });
57460
57987
  }
57461
57988
  function disconnectDevice(app, device, reason) {
57462
57989
  if (!device.connected) return null;
57463
57990
  const at = /* @__PURE__ */ new Date();
57464
57991
  device.connected = false;
57465
- return app.webhooks.emit("device.disconnected", eventData(device, { disconnected_at: iso8601(at), reason }), { occurredAt: at, workspaceId: device.workspaceId });
57992
+ return app.webhooks.emit("device.disconnected", eventData(device, { disconnected_at: isoSeconds(at), reason }), { occurredAt: at, workspaceId: device.workspaceId });
57466
57993
  }
57467
57994
  function setHealth(app, device, state2) {
57468
57995
  const previous = device.health ?? "unknown";
57469
57996
  if (previous === state2) return null;
57470
57997
  device.health = state2;
57471
57998
  const at = /* @__PURE__ */ new Date();
57472
- return app.webhooks.emit("device.health_changed", eventData(device, { previous_state: previous, state: state2, changed_at: iso8601(at) }), {
57999
+ return app.webhooks.emit("device.health_changed", eventData(device, { previous_state: previous, state: state2, changed_at: isoSeconds(at) }), {
57473
58000
  occurredAt: at,
57474
58001
  workspaceId: device.workspaceId
57475
58002
  });
57476
58003
  }
57477
58004
  function deleteDevice(app, device) {
57478
58005
  const at = /* @__PURE__ */ new Date();
57479
- const event = app.webhooks.emit("device.deleted", eventData(device, { deleted_at: iso8601(at) }), { occurredAt: at, workspaceId: device.workspaceId });
58006
+ const event = app.webhooks.emit("device.deleted", eventData(device, { deleted_at: isoSeconds(at) }), { occurredAt: at, workspaceId: device.workspaceId });
57480
58007
  app.store.devices.delete(device.id);
57481
58008
  for (const link of app.store.connectLinks.values()) {
57482
58009
  if (link.reconnect && link.deviceId === device.id && link.status === "pending") {
@@ -58478,13 +59005,13 @@ function sendTemplate(ctx) {
58478
59005
  if (!template) throw new ApiError(404, "template_not_found", "No se envi\xF3: la plantilla no existe en tu cuenta. Revisa el identificador de la plantilla.");
58479
59006
  const device = ctx.app.store.devices.get(Number(ctx.path.device));
58480
59007
  if (!device) throw rejection("device_unavailable");
58481
- if (template.deviceId !== device.id) throw new RawApiError(422, { error: "La plantilla no pertenece al n\xFAmero actual", error_code: "template_waba_mismatch" });
59008
+ if (template.deviceId !== device.id) throw new ApiError(422, "template_waba_mismatch", "La plantilla no pertenece al n\xFAmero actual");
58482
59009
  if (template.status !== "APPROVED") throw fieldError("template", `La plantilla est\xE1 ${template.status}: solo se env\xEDan plantillas aprobadas.`);
58483
59010
  assertUsable(b, device);
58484
59011
  const identity = byIdentity(b);
58485
59012
  const contactId = identity ? sendRecipient(ctx, b).id : Number(b.contact_id);
58486
59013
  const contact = ctx.app.store.contacts.get(contactId);
58487
- if (!contact || !sees(ctx.workspace, contact.workspaceId)) throw new RawApiError(404, { error: "Contact not found" });
59014
+ if (!contact || !sees(ctx.workspace, contact.workspaceId)) throw new ApiError(404, "not_found", "Contact not found");
58488
59015
  if (!device.connected) throw rejection("device_unavailable");
58489
59016
  const variables = b.template_variables?.body;
58490
59017
  const phone = identity ? void 0 : b.phone;
@@ -58515,9 +59042,9 @@ var messageHandlers = {
58515
59042
  let contact = null;
58516
59043
  if (!byIdentity(b)) {
58517
59044
  contact = ctx.app.store.contacts.get(Number(b.contact_id)) ?? null;
58518
- if (!contact || !sees(ctx.workspace, contact.workspaceId)) throw new RawApiError(404, { status: "error", error: "Contacto no encontrado." });
59045
+ if (!contact || !sees(ctx.workspace, contact.workspaceId)) throw new ApiError(404, "not_found", "Contacto no encontrado.", { status: "error" });
58519
59046
  }
58520
- if (!ctx.app.store.devices.has(Number(b.device_id))) throw new RawApiError(403, { status: "error", error: "No autorizado" });
59047
+ if (!ctx.app.store.devices.has(Number(b.device_id))) throw new ApiError(403, "forbidden", "No autorizado");
58521
59048
  return sendToContact(ctx, contact, "direct");
58522
59049
  },
58523
59050
  // The spec of the portal names the parameter `{template}`; conversations, `{template_id}`. Same URL.
@@ -59690,7 +60217,7 @@ var webhookHandlers = {
59690
60217
  const b = body(ctx);
59691
60218
  checkSubscriptionBody(ctx.app, b);
59692
60219
  if (ofWorkspace(ctx).length >= SUBSCRIPTION_LIMIT) {
59693
- throw new ApiError(422, "validation_failed", `Alcanzaste el l\xEDmite de ${SUBSCRIPTION_LIMIT} suscripciones de webhook.`);
60220
+ throw new ApiError(422, "webhooks_limit_reached", `Alcanzaste el l\xEDmite de ${SUBSCRIPTION_LIMIT} suscripciones de webhook.`);
59694
60221
  }
59695
60222
  const now = /* @__PURE__ */ new Date();
59696
60223
  const subscription = {
@@ -60823,5 +61350,5 @@ function createSandbox(options = {}) {
60823
61350
  }
60824
61351
 
60825
61352
  export { ConfigError, DEFAULT_CONFIG_FILE, DEFAULT_PORT, DELIVERY_HEADER, EDGE_ERRORS, EVENT_HEADER, FAILURE_REASONS, FORM_TEMPLATES, META_ERRORS, REJECTIONS, REQUEST_ID_HEADER, SEND_FILE_TYPES, SIGNATURE_HEADER, SIMULATED_HEADER, SUPPORTED_EXTENSIONS, VERSION, catalog, createSandbox, defaultConfig, mergeConfig, parseArgs, resolveConfig, signature };
60826
- //# sourceMappingURL=chunk-NSON4OUU.js.map
60827
- //# sourceMappingURL=chunk-NSON4OUU.js.map
61353
+ //# sourceMappingURL=chunk-4ELMG644.js.map
61354
+ //# sourceMappingURL=chunk-4ELMG644.js.map