@hablala/api-contract 0.9.0 → 0.9.1

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 (3) hide show
  1. package/dist/index.d.ts +706 -704
  2. package/openapi.json +365 -355
  3. package/package.json +1 -1
package/openapi.json CHANGED
@@ -9780,7 +9780,8 @@
9780
9780
  "read",
9781
9781
  "create",
9782
9782
  "update",
9783
- "delete"
9783
+ "delete",
9784
+ "signal"
9784
9785
  ],
9785
9786
  "type": "string",
9786
9787
  "x-struct": null,
@@ -9824,6 +9825,8 @@
9824
9825
  "x-validate": null
9825
9826
  },
9826
9827
  "principalId": {
9828
+ "description": "null para los principales de clase (public/end_user/access_token).",
9829
+ "nullable": true,
9827
9830
  "type": "string",
9828
9831
  "x-struct": null,
9829
9832
  "x-validate": null
@@ -9832,7 +9835,10 @@
9832
9835
  "enum": [
9833
9836
  "role",
9834
9837
  "user",
9835
- "agent"
9838
+ "agent",
9839
+ "public",
9840
+ "end_user",
9841
+ "access_token"
9836
9842
  ],
9837
9843
  "type": "string",
9838
9844
  "x-struct": null,
@@ -9867,7 +9873,6 @@
9867
9873
  "effect",
9868
9874
  "action",
9869
9875
  "principalType",
9870
- "principalId",
9871
9876
  "resourceType"
9872
9877
  ],
9873
9878
  "title": "Policy",
@@ -9882,7 +9887,8 @@
9882
9887
  "read",
9883
9888
  "create",
9884
9889
  "update",
9885
- "delete"
9890
+ "delete",
9891
+ "signal"
9886
9892
  ],
9887
9893
  "type": "string",
9888
9894
  "x-struct": null,
@@ -9915,6 +9921,8 @@
9915
9921
  "x-validate": null
9916
9922
  },
9917
9923
  "principalId": {
9924
+ "description": "null/omitido para los principales de clase (public/end_user/access_token).",
9925
+ "nullable": true,
9918
9926
  "type": "string",
9919
9927
  "x-struct": null,
9920
9928
  "x-validate": null
@@ -9923,7 +9931,10 @@
9923
9931
  "enum": [
9924
9932
  "role",
9925
9933
  "user",
9926
- "agent"
9934
+ "agent",
9935
+ "public",
9936
+ "end_user",
9937
+ "access_token"
9927
9938
  ],
9928
9939
  "type": "string",
9929
9940
  "x-struct": null,
@@ -9955,7 +9966,6 @@
9955
9966
  "effect",
9956
9967
  "action",
9957
9968
  "principalType",
9958
- "principalId",
9959
9969
  "resourceType"
9960
9970
  ],
9961
9971
  "title": "PolicyInput",
@@ -13365,7 +13375,7 @@
13365
13375
  "get": {
13366
13376
  "callbacks": {},
13367
13377
  "description": "Como el GET humano, pero la cuenta sale del access token. Es lo que `hablala pull`/`init` llama.",
13368
- "operationId": "HablalaApiWeb.Machine.AccountConfigController.show",
13378
+ "operationId": "get /v1/account-config",
13369
13379
  "parameters": [],
13370
13380
  "responses": {
13371
13381
  "200": {
@@ -13397,7 +13407,7 @@
13397
13407
  "put": {
13398
13408
  "callbacks": {},
13399
13409
  "description": "Como el PUT humano: reconciliación transaccional crear/actualizar/archivar; `?dry_run=true` devuelve el diff sin aplicar. Con un access token no hay usuario creador: los agentes nuevos deben declarar `ownerUserId`.",
13400
- "operationId": "HablalaApiWeb.Machine.AccountConfigController.update",
13410
+ "operationId": "put /v1/account-config",
13401
13411
  "parameters": [
13402
13412
  {
13403
13413
  "description": "Devuelve el plan (diff) sin aplicar nada.",
@@ -13475,7 +13485,7 @@
13475
13485
  "get": {
13476
13486
  "callbacks": {},
13477
13487
  "description": "Devuelve el catálogo de activities declarables (enum cerrado, con su contrato de `config`) y los tipos de estado. El agente lo lee ANTES de escribir el manifiesto para no adivinar nombres ni claves — el espacio válido vive en el contrato, no en su memoria.",
13478
- "operationId": "HablalaApiWeb.Machine.AccountConfigController.capabilities",
13488
+ "operationId": "get /v1/account-config/capabilities",
13479
13489
  "parameters": [],
13480
13490
  "responses": {
13481
13491
  "200": {
@@ -13509,7 +13519,7 @@
13509
13519
  "post": {
13510
13520
  "callbacks": {},
13511
13521
  "description": "Corre los casos `evals` de cada agente del manifiesto (patrón promptfoo): valida el manifiesto, resuelve cada agente aplicado y comprueba las aserciones sobre su comportamiento. Determinista por defecto (proveedor stub); `?live=true` corre contra el LLM real del agente. Es lo que `hablala eval` llama.",
13512
- "operationId": "HablalaApiWeb.Machine.AccountConfigController.eval",
13522
+ "operationId": "post /v1/account-config/eval",
13513
13523
  "parameters": [
13514
13524
  {
13515
13525
  "description": "Corre contra el LLM real (no determinista) en vez del stub.",
@@ -13576,7 +13586,7 @@
13576
13586
  "post": {
13577
13587
  "callbacks": {},
13578
13588
  "description": "Inicia la vinculación de la web: devuelve un `linkCode` para pintar el QR que el teléfono escaneará. Público (es un flujo de login). El teléfono es la raíz de identidad; la web hereda la sesión al aprobarse (modelo WhatsApp *linked devices*).",
13579
- "operationId": "HablalaApiWeb.Accounts.DeviceLinkController.create",
13589
+ "operationId": "post /v1/device-links",
13580
13590
  "parameters": [],
13581
13591
  "requestBody": {
13582
13592
  "content": {
@@ -13622,7 +13632,7 @@
13622
13632
  "get": {
13623
13633
  "callbacks": {},
13624
13634
  "description": "Devuelve `pending` (sigue esperando), `linked` (aprobado: incluye `user` y el `token` de sesión web, SOLO en el primer poll) o `denied`. Público: el `linkCode` es la credencial.",
13625
- "operationId": "HablalaApiWeb.Accounts.DeviceLinkController.status",
13635
+ "operationId": "get /v1/device-links/{link_code}",
13626
13636
  "parameters": [
13627
13637
  {
13628
13638
  "description": "El `linkCode` del QR (`dlnk_…`).",
@@ -13679,7 +13689,7 @@
13679
13689
  "post": {
13680
13690
  "callbacks": {},
13681
13691
  "description": "El teléfono AUTENTICADO aprueba la vinculación de la web (tras escanear el QR). Crea la sesión web y emite su token. Acción sensible: la app debe mostrar qué se está vinculando.",
13682
- "operationId": "HablalaApiWeb.Accounts.DeviceLinkController.approve",
13692
+ "operationId": "post /v1/device-links/{link_code}/approve",
13683
13693
  "parameters": [
13684
13694
  {
13685
13695
  "description": "El `linkCode` escaneado.",
@@ -13728,7 +13738,7 @@
13728
13738
  "post": {
13729
13739
  "callbacks": {},
13730
13740
  "description": "El teléfono AUTENTICADO rechaza la vinculación de la web.",
13731
- "operationId": "HablalaApiWeb.Accounts.DeviceLinkController.deny",
13741
+ "operationId": "post /v1/device-links/{link_code}/deny",
13732
13742
  "parameters": [
13733
13743
  {
13734
13744
  "description": "El `linkCode` escaneado.",
@@ -13777,7 +13787,7 @@
13777
13787
  "post": {
13778
13788
  "callbacks": {},
13779
13789
  "description": "Conecta dos records vía un tipo de relación (`relationship` = slug). Idempotente: crear la misma arista dos veces no falla.",
13780
- "operationId": "HablalaApiWeb.Machine.EdgeController.create",
13790
+ "operationId": "post /v1/edges",
13781
13791
  "parameters": [],
13782
13792
  "requestBody": {
13783
13793
  "content": {
@@ -13831,7 +13841,7 @@
13831
13841
  "/v1/edges/{id}": {
13832
13842
  "delete": {
13833
13843
  "callbacks": {},
13834
- "operationId": "HablalaApiWeb.Machine.EdgeController.delete",
13844
+ "operationId": "delete /v1/edges/{id}",
13835
13845
  "parameters": [
13836
13846
  {
13837
13847
  "description": "",
@@ -13860,7 +13870,7 @@
13860
13870
  "post": {
13861
13871
  "callbacks": {},
13862
13872
  "description": "Devuelve el grafo de datos del tenant como `nodes` + `edges` planos (knowledge graph), acotado por `limit` y ordenado por grado desc (los nodos más conectados primero). Filtra por el ABAC del scope. Base de la vista de grafo global.",
13863
- "operationId": "HablalaApiWeb.Machine.GraphController.overview",
13873
+ "operationId": "post /v1/graph",
13864
13874
  "parameters": [],
13865
13875
  "requestBody": {
13866
13876
  "content": {
@@ -13905,7 +13915,7 @@
13905
13915
  "post": {
13906
13916
  "callbacks": {},
13907
13917
  "description": "Devuelve el vecindario de un nodo — sus vecinos directos (1 salto) + las aristas que los unen — como `nodes` + `edges`. Es el *expand-on-demand* (progressive disclosure) para explorar el grafo sin cargarlo entero.",
13908
- "operationId": "HablalaApiWeb.Machine.GraphController.expand",
13918
+ "operationId": "post /v1/graph/expand",
13909
13919
  "parameters": [],
13910
13920
  "requestBody": {
13911
13921
  "content": {
@@ -13960,7 +13970,7 @@
13960
13970
  "post": {
13961
13971
  "callbacks": {},
13962
13972
  "description": "Canjea el token de una invitación (enviado por email) para unirse a la organización. Requiere que el email autenticado coincida con el invitado.",
13963
- "operationId": "HablalaApiWeb.Orgs.InvitationController.accept",
13973
+ "operationId": "post /v1/invitations/accept",
13964
13974
  "parameters": [],
13965
13975
  "requestBody": {
13966
13976
  "content": {
@@ -14025,7 +14035,7 @@
14025
14035
  "get": {
14026
14036
  "callbacks": {},
14027
14037
  "description": "Devuelve los datos públicos de una invitación (organización y quién invita) a partir de su token, sin consumirla ni requerir sesión. Sirve para mostrar el contexto antes de que el invitado entre.",
14028
- "operationId": "HablalaApiWeb.Orgs.InvitationController.preview",
14038
+ "operationId": "get /v1/invitations/preview",
14029
14039
  "parameters": [
14030
14040
  {
14031
14041
  "description": "",
@@ -14072,7 +14082,7 @@
14072
14082
  "post": {
14073
14083
  "callbacks": {},
14074
14084
  "description": "Canjea el secreto de un organization invite link para unirse a la organización con el rol configurado en el link. A diferencia de la invitación por email, no requiere email-match: el link es el secreto.",
14075
- "operationId": "HablalaApiWeb.Orgs.InviteLinkController.accept",
14085
+ "operationId": "post /v1/invite-links/accept",
14076
14086
  "parameters": [],
14077
14087
  "requestBody": {
14078
14088
  "content": {
@@ -14127,7 +14137,7 @@
14127
14137
  "get": {
14128
14138
  "callbacks": {},
14129
14139
  "description": "Devuelve la organización (nombre + icono) a la que lleva un organization invite link, sin consumirlo ni requerir sesión. Sirve para mostrar a dónde te unes en `/join` antes de confirmar. Siempre 200: el `status` del cuerpo distingue `valid` de `invalid`.",
14130
- "operationId": "HablalaApiWeb.Orgs.InviteLinkController.preview",
14140
+ "operationId": "get /v1/invite-links/preview",
14131
14141
  "parameters": [
14132
14142
  {
14133
14143
  "description": "",
@@ -14164,7 +14174,7 @@
14164
14174
  "get": {
14165
14175
  "callbacks": {},
14166
14176
  "description": "Lista las sesiones web/desktop vinculadas del usuario autenticado.",
14167
- "operationId": "HablalaApiWeb.Accounts.DeviceLinkController.index",
14177
+ "operationId": "get /v1/linked-devices",
14168
14178
  "parameters": [],
14169
14179
  "responses": {
14170
14180
  "200": {
@@ -14188,7 +14198,7 @@
14188
14198
  "delete": {
14189
14199
  "callbacks": {},
14190
14200
  "description": "Mata la sesión web/desktop de un dispositivo vinculado (borra su token en cascada). Idempotente. Solo dispositivos propios.",
14191
- "operationId": "HablalaApiWeb.Accounts.DeviceLinkController.revoke",
14201
+ "operationId": "delete /v1/linked-devices/{id}",
14192
14202
  "parameters": [
14193
14203
  {
14194
14204
  "description": "Id público del dispositivo (`dev_…`).",
@@ -14226,7 +14236,7 @@
14226
14236
  "/v1/me/blocks": {
14227
14237
  "get": {
14228
14238
  "callbacks": {},
14229
- "operationId": "HablalaApiWeb.Me.BlockController.index",
14239
+ "operationId": "get /v1/me/blocks",
14230
14240
  "parameters": [],
14231
14241
  "responses": {
14232
14242
  "200": {
@@ -14248,7 +14258,7 @@
14248
14258
  "post": {
14249
14259
  "callbacks": {},
14250
14260
  "description": "Idempotente: bloquear a quien ya está bloqueado no falla. Corta el DM en ambos sentidos.",
14251
- "operationId": "HablalaApiWeb.Me.BlockController.create",
14261
+ "operationId": "post /v1/me/blocks",
14252
14262
  "parameters": [],
14253
14263
  "requestBody": {
14254
14264
  "content": {
@@ -14285,7 +14295,7 @@
14285
14295
  "/v1/me/blocks/{user_id}": {
14286
14296
  "delete": {
14287
14297
  "callbacks": {},
14288
- "operationId": "HablalaApiWeb.Me.BlockController.delete",
14298
+ "operationId": "delete /v1/me/blocks/{user_id}",
14289
14299
  "parameters": [
14290
14300
  {
14291
14301
  "description": "",
@@ -14313,7 +14323,7 @@
14313
14323
  "/v1/me/conversations": {
14314
14324
  "get": {
14315
14325
  "callbacks": {},
14316
- "operationId": "HablalaApiWeb.Me.ConversationController.index",
14326
+ "operationId": "get /v1/me/conversations",
14317
14327
  "parameters": [],
14318
14328
  "responses": {
14319
14329
  "200": {
@@ -14335,7 +14345,7 @@
14335
14345
  "post": {
14336
14346
  "callbacks": {},
14337
14347
  "description": "Grupo de consumo (estilo app de consumo): un grupo con nombre + foto SIN organización. Los miembros iniciales se validan por bloqueos (no por tenant). Nace visible para sus miembros.",
14338
- "operationId": "HablalaApiWeb.Me.ConversationController.create",
14348
+ "operationId": "post /v1/me/conversations",
14339
14349
  "parameters": [],
14340
14350
  "requestBody": {
14341
14351
  "content": {
@@ -14380,7 +14390,7 @@
14380
14390
  "post": {
14381
14391
  "callbacks": {},
14382
14392
  "description": "Idempotente por conjunto de participantes en toda la plataforma. Destinatarios validados por bloqueos (default abierto), no por membresía de organización.",
14383
- "operationId": "HablalaApiWeb.Me.ConversationController.create_direct",
14393
+ "operationId": "post /v1/me/conversations/direct",
14384
14394
  "parameters": [],
14385
14395
  "requestBody": {
14386
14396
  "content": {
@@ -14425,7 +14435,7 @@
14425
14435
  "post": {
14426
14436
  "callbacks": {},
14427
14437
  "description": "Flujo de 'nueva conversación' de consumo (estilo app de consumo): el DM personal no existe hasta su primer mensaje. Idempotente por conjunto de participantes en toda la plataforma. Los destinatarios se validan por bloqueos (default abierto), no por membresía de organización.",
14428
- "operationId": "HablalaApiWeb.Me.ConversationController.create_direct_message",
14438
+ "operationId": "post /v1/me/conversations/direct/messages",
14429
14439
  "parameters": [],
14430
14440
  "requestBody": {
14431
14441
  "content": {
@@ -14470,7 +14480,7 @@
14470
14480
  "get": {
14471
14481
  "callbacks": {},
14472
14482
  "description": "Las conversaciones donde un no-contacto te escribió (estilo Instagram): aparte del inbox, no marcan no-leídos hasta que las aceptas. Ver ADR-022.",
14473
- "operationId": "HablalaApiWeb.Me.ConversationController.requests",
14483
+ "operationId": "get /v1/me/conversations/requests",
14474
14484
  "parameters": [],
14475
14485
  "responses": {
14476
14486
  "200": {
@@ -14493,7 +14503,7 @@
14493
14503
  "/v1/me/conversations/{conversation_id}/accept": {
14494
14504
  "post": {
14495
14505
  "callbacks": {},
14496
- "operationId": "HablalaApiWeb.Me.ConversationController.accept_request",
14506
+ "operationId": "post /v1/me/conversations/{conversation_id}/accept",
14497
14507
  "parameters": [
14498
14508
  {
14499
14509
  "description": "",
@@ -14538,7 +14548,7 @@
14538
14548
  "/v1/me/conversations/{conversation_id}/archive": {
14539
14549
  "delete": {
14540
14550
  "callbacks": {},
14541
- "operationId": "HablalaApiWeb.Me.ConversationController.unarchive",
14551
+ "operationId": "delete /v1/me/conversations/{conversation_id}/archive",
14542
14552
  "parameters": [
14543
14553
  {
14544
14554
  "description": "",
@@ -14571,7 +14581,7 @@
14571
14581
  },
14572
14582
  "post": {
14573
14583
  "callbacks": {},
14574
- "operationId": "HablalaApiWeb.Me.ConversationController.archive",
14584
+ "operationId": "post /v1/me/conversations/{conversation_id}/archive",
14575
14585
  "parameters": [
14576
14586
  {
14577
14587
  "description": "",
@@ -14606,7 +14616,7 @@
14606
14616
  "/v1/me/conversations/{conversation_id}/media": {
14607
14617
  "get": {
14608
14618
  "callbacks": {},
14609
- "operationId": "HablalaApiWeb.Me.ConversationController.media",
14619
+ "operationId": "get /v1/me/conversations/{conversation_id}/media",
14610
14620
  "parameters": [
14611
14621
  {
14612
14622
  "description": "",
@@ -14674,7 +14684,7 @@
14674
14684
  "/v1/me/conversations/{conversation_id}/members": {
14675
14685
  "get": {
14676
14686
  "callbacks": {},
14677
- "operationId": "HablalaApiWeb.Me.ConversationController.members",
14687
+ "operationId": "get /v1/me/conversations/{conversation_id}/members",
14678
14688
  "parameters": [
14679
14689
  {
14680
14690
  "description": "",
@@ -14708,7 +14718,7 @@
14708
14718
  "post": {
14709
14719
  "callbacks": {},
14710
14720
  "description": "Idempotente. El destinatario debe ser alcanzable: existente/activo y sin bloqueo con quien invita (gate simétrico de consumo).",
14711
- "operationId": "HablalaApiWeb.Me.ConversationController.add_member",
14721
+ "operationId": "post /v1/me/conversations/{conversation_id}/members",
14712
14722
  "parameters": [
14713
14723
  {
14714
14724
  "description": "",
@@ -14764,7 +14774,7 @@
14764
14774
  "/v1/me/conversations/{conversation_id}/members/{user_id}": {
14765
14775
  "delete": {
14766
14776
  "callbacks": {},
14767
- "operationId": "HablalaApiWeb.Me.ConversationController.remove_member",
14777
+ "operationId": "delete /v1/me/conversations/{conversation_id}/members/{user_id}",
14768
14778
  "parameters": [
14769
14779
  {
14770
14780
  "description": "",
@@ -14813,7 +14823,7 @@
14813
14823
  "/v1/me/conversations/{conversation_id}/members/{user_id}/ban": {
14814
14824
  "delete": {
14815
14825
  "callbacks": {},
14816
- "operationId": "HablalaApiWeb.Me.ConversationController.unban",
14826
+ "operationId": "delete /v1/me/conversations/{conversation_id}/members/{user_id}/ban",
14817
14827
  "parameters": [
14818
14828
  {
14819
14829
  "description": "",
@@ -14861,7 +14871,7 @@
14861
14871
  "post": {
14862
14872
  "callbacks": {},
14863
14873
  "description": "Solo admins. Bloquea al usuario: no puede volver ni ser re-agregado mientras el ban siga vigente. Sin `until` = permanente; con `until` (ISO 8601) = temporal.",
14864
- "operationId": "HablalaApiWeb.Me.ConversationController.ban",
14874
+ "operationId": "post /v1/me/conversations/{conversation_id}/members/{user_id}/ban",
14865
14875
  "parameters": [
14866
14876
  {
14867
14877
  "description": "",
@@ -14921,7 +14931,7 @@
14921
14931
  "/v1/me/conversations/{conversation_id}/members/{user_id}/role": {
14922
14932
  "patch": {
14923
14933
  "callbacks": {},
14924
- "operationId": "HablalaApiWeb.Me.ConversationController.change_role",
14934
+ "operationId": "patch /v1/me/conversations/{conversation_id}/members/{user_id}/role",
14925
14935
  "parameters": [
14926
14936
  {
14927
14937
  "description": "",
@@ -14988,7 +14998,7 @@
14988
14998
  "/v1/me/conversations/{conversation_id}/messages": {
14989
14999
  "get": {
14990
15000
  "callbacks": {},
14991
- "operationId": "HablalaApiWeb.Me.MessageController.index",
15001
+ "operationId": "get /v1/me/conversations/{conversation_id}/messages",
14992
15002
  "parameters": [
14993
15003
  {
14994
15004
  "description": "",
@@ -15032,7 +15042,7 @@
15032
15042
  },
15033
15043
  "post": {
15034
15044
  "callbacks": {},
15035
- "operationId": "HablalaApiWeb.Me.MessageController.create",
15045
+ "operationId": "post /v1/me/conversations/{conversation_id}/messages",
15036
15046
  "parameters": [
15037
15047
  {
15038
15048
  "description": "",
@@ -15088,7 +15098,7 @@
15088
15098
  "/v1/me/conversations/{conversation_id}/messages/changes": {
15089
15099
  "get": {
15090
15100
  "callbacks": {},
15091
- "operationId": "HablalaApiWeb.Me.MessageController.changes",
15101
+ "operationId": "get /v1/me/conversations/{conversation_id}/messages/changes",
15092
15102
  "parameters": [
15093
15103
  {
15094
15104
  "description": "",
@@ -15144,7 +15154,7 @@
15144
15154
  "/v1/me/conversations/{conversation_id}/messages/{id}": {
15145
15155
  "delete": {
15146
15156
  "callbacks": {},
15147
- "operationId": "HablalaApiWeb.Me.MessageController.delete",
15157
+ "operationId": "delete /v1/me/conversations/{conversation_id}/messages/{id}",
15148
15158
  "parameters": [
15149
15159
  {
15150
15160
  "description": "",
@@ -15191,7 +15201,7 @@
15191
15201
  },
15192
15202
  "patch": {
15193
15203
  "callbacks": {},
15194
- "operationId": "HablalaApiWeb.Me.MessageController.update (2)",
15204
+ "operationId": "patch /v1/me/conversations/{conversation_id}/messages/{id}",
15195
15205
  "parameters": [
15196
15206
  {
15197
15207
  "description": "",
@@ -15256,7 +15266,7 @@
15256
15266
  },
15257
15267
  "put": {
15258
15268
  "callbacks": {},
15259
- "operationId": "HablalaApiWeb.Me.MessageController.update",
15269
+ "operationId": "put /v1/me/conversations/{conversation_id}/messages/{id}",
15260
15270
  "parameters": [
15261
15271
  {
15262
15272
  "description": "",
@@ -15323,7 +15333,7 @@
15323
15333
  "/v1/me/conversations/{conversation_id}/messages/{message_id}/reactions": {
15324
15334
  "post": {
15325
15335
  "callbacks": {},
15326
- "operationId": "HablalaApiWeb.Me.ReactionController.create",
15336
+ "operationId": "post /v1/me/conversations/{conversation_id}/messages/{message_id}/reactions",
15327
15337
  "parameters": [
15328
15338
  {
15329
15339
  "description": "",
@@ -15383,7 +15393,7 @@
15383
15393
  "/v1/me/conversations/{conversation_id}/messages/{message_id}/reactions/{emoji}": {
15384
15394
  "delete": {
15385
15395
  "callbacks": {},
15386
- "operationId": "HablalaApiWeb.Me.ReactionController.delete",
15396
+ "operationId": "delete /v1/me/conversations/{conversation_id}/messages/{message_id}/reactions/{emoji}",
15387
15397
  "parameters": [
15388
15398
  {
15389
15399
  "description": "",
@@ -15443,7 +15453,7 @@
15443
15453
  "/v1/me/conversations/{conversation_id}/mute": {
15444
15454
  "delete": {
15445
15455
  "callbacks": {},
15446
- "operationId": "HablalaApiWeb.Me.ConversationController.unmute",
15456
+ "operationId": "delete /v1/me/conversations/{conversation_id}/mute",
15447
15457
  "parameters": [
15448
15458
  {
15449
15459
  "description": "",
@@ -15476,7 +15486,7 @@
15476
15486
  },
15477
15487
  "post": {
15478
15488
  "callbacks": {},
15479
- "operationId": "HablalaApiWeb.Me.ConversationController.mute",
15489
+ "operationId": "post /v1/me/conversations/{conversation_id}/mute",
15480
15490
  "parameters": [
15481
15491
  {
15482
15492
  "description": "",
@@ -15522,7 +15532,7 @@
15522
15532
  "/v1/me/conversations/{conversation_id}/pin": {
15523
15533
  "delete": {
15524
15534
  "callbacks": {},
15525
- "operationId": "HablalaApiWeb.Me.ConversationController.unpin",
15535
+ "operationId": "delete /v1/me/conversations/{conversation_id}/pin",
15526
15536
  "parameters": [
15527
15537
  {
15528
15538
  "description": "",
@@ -15555,7 +15565,7 @@
15555
15565
  },
15556
15566
  "post": {
15557
15567
  "callbacks": {},
15558
- "operationId": "HablalaApiWeb.Me.ConversationController.pin",
15568
+ "operationId": "post /v1/me/conversations/{conversation_id}/pin",
15559
15569
  "parameters": [
15560
15570
  {
15561
15571
  "description": "",
@@ -15590,7 +15600,7 @@
15590
15600
  "/v1/me/conversations/{conversation_id}/read": {
15591
15601
  "put": {
15592
15602
  "callbacks": {},
15593
- "operationId": "HablalaApiWeb.Me.ConversationController.mark_read",
15603
+ "operationId": "put /v1/me/conversations/{conversation_id}/read",
15594
15604
  "parameters": [
15595
15605
  {
15596
15606
  "description": "",
@@ -15629,7 +15639,7 @@
15629
15639
  "/v1/me/conversations/{conversation_id}/report": {
15630
15640
  "post": {
15631
15641
  "callbacks": {},
15632
- "operationId": "HablalaApiWeb.Me.ConversationController.report",
15642
+ "operationId": "post /v1/me/conversations/{conversation_id}/report",
15633
15643
  "parameters": [
15634
15644
  {
15635
15645
  "description": "",
@@ -15669,7 +15679,7 @@
15669
15679
  "delete": {
15670
15680
  "callbacks": {},
15671
15681
  "description": "Estilo Instagram 'Eliminar': quita la conversación de MI bandeja de solicitudes (borra mi membresía de solicitud). No la borra para quien la envió. Ver ADR-022.",
15672
- "operationId": "HablalaApiWeb.Me.ConversationController.decline_request",
15682
+ "operationId": "delete /v1/me/conversations/{conversation_id}/request",
15673
15683
  "parameters": [
15674
15684
  {
15675
15685
  "description": "",
@@ -15707,7 +15717,7 @@
15707
15717
  "/v1/me/conversations/{id}": {
15708
15718
  "get": {
15709
15719
  "callbacks": {},
15710
- "operationId": "HablalaApiWeb.Me.ConversationController.show",
15720
+ "operationId": "get /v1/me/conversations/{id}",
15711
15721
  "parameters": [
15712
15722
  {
15713
15723
  "description": "",
@@ -15750,7 +15760,7 @@
15750
15760
  },
15751
15761
  "patch": {
15752
15762
  "callbacks": {},
15753
- "operationId": "HablalaApiWeb.Me.ConversationController.update",
15763
+ "operationId": "patch /v1/me/conversations/{id}",
15754
15764
  "parameters": [
15755
15765
  {
15756
15766
  "description": "",
@@ -15806,7 +15816,7 @@
15806
15816
  "/v1/me/friends": {
15807
15817
  "get": {
15808
15818
  "callbacks": {},
15809
- "operationId": "HablalaApiWeb.Me.FriendController.index",
15819
+ "operationId": "get /v1/me/friends",
15810
15820
  "parameters": [],
15811
15821
  "responses": {
15812
15822
  "200": {
@@ -15830,7 +15840,7 @@
15830
15840
  "get": {
15831
15841
  "callbacks": {},
15832
15842
  "description": "Devuelve las relaciones (libreta + solicitudes entrantes) mutadas desde `since`, INCLUYENDO tombstones (`deletedAt` no nulo) para propagar borrados. Es el carril de sincronización del cliente local-first (ADR-021/022): pinta desde su caché y aplica este delta detrás. Sin `since`, equivale al primer sync completo.",
15833
- "operationId": "HablalaApiWeb.Me.FriendController.changes",
15843
+ "operationId": "get /v1/me/friends/changes",
15834
15844
  "parameters": [
15835
15845
  {
15836
15846
  "description": "Cursor ISO-8601 (UTC): trae solo lo mutado después de este instante.",
@@ -15865,7 +15875,7 @@
15865
15875
  "/v1/me/friends/requests": {
15866
15876
  "get": {
15867
15877
  "callbacks": {},
15868
- "operationId": "HablalaApiWeb.Me.FriendController.requests",
15878
+ "operationId": "get /v1/me/friends/requests",
15869
15879
  "parameters": [],
15870
15880
  "responses": {
15871
15881
  "200": {
@@ -15886,7 +15896,7 @@
15886
15896
  },
15887
15897
  "post": {
15888
15898
  "callbacks": {},
15889
- "operationId": "HablalaApiWeb.Me.FriendController.send_request",
15899
+ "operationId": "post /v1/me/friends/requests",
15890
15900
  "parameters": [],
15891
15901
  "requestBody": {
15892
15902
  "content": {
@@ -15930,7 +15940,7 @@
15930
15940
  "/v1/me/friends/requests/{id}/accept": {
15931
15941
  "post": {
15932
15942
  "callbacks": {},
15933
- "operationId": "HablalaApiWeb.Me.FriendController.accept_request",
15943
+ "operationId": "post /v1/me/friends/requests/{id}/accept",
15934
15944
  "parameters": [
15935
15945
  {
15936
15946
  "description": "",
@@ -15958,7 +15968,7 @@
15958
15968
  "/v1/me/friends/requests/{id}/reject": {
15959
15969
  "post": {
15960
15970
  "callbacks": {},
15961
- "operationId": "HablalaApiWeb.Me.FriendController.reject_request",
15971
+ "operationId": "post /v1/me/friends/requests/{id}/reject",
15962
15972
  "parameters": [
15963
15973
  {
15964
15974
  "description": "",
@@ -15987,7 +15997,7 @@
15987
15997
  "post": {
15988
15998
  "callbacks": {},
15989
15999
  "description": "El cliente sube hashes de pares (base64 de SHA-256 de 32 bytes) de su agenda —NO números—. Devuelve los amigos que también lo tienen agendado (match mutuo, consentimiento mutuo). El servidor no ve ni almacena números de contactos. Rate-limited.",
15990
- "operationId": "HablalaApiWeb.Me.FriendController.sync",
16000
+ "operationId": "post /v1/me/friends/sync",
15991
16001
  "parameters": [],
15992
16002
  "requestBody": {
15993
16003
  "content": {
@@ -16021,7 +16031,7 @@
16021
16031
  "/v1/me/friends/{id}": {
16022
16032
  "delete": {
16023
16033
  "callbacks": {},
16024
- "operationId": "HablalaApiWeb.Me.FriendController.delete",
16034
+ "operationId": "delete /v1/me/friends/{id}",
16025
16035
  "parameters": [
16026
16036
  {
16027
16037
  "description": "",
@@ -16050,7 +16060,7 @@
16050
16060
  "get": {
16051
16061
  "callbacks": {},
16052
16062
  "description": "Lista las invitaciones de organización vigentes (pendientes, no caducadas) que otras personas me enviaron por mi username. Las acepto o rechazo desde la app.",
16053
- "operationId": "HablalaApiWeb.Me.InvitationController.index",
16063
+ "operationId": "get /v1/me/invitations",
16054
16064
  "parameters": [],
16055
16065
  "responses": {
16056
16066
  "200": {
@@ -16074,7 +16084,7 @@
16074
16084
  "post": {
16075
16085
  "callbacks": {},
16076
16086
  "description": "Me une a la organización que me invitó (crea la membresía y asigna el rol ofrecido).",
16077
- "operationId": "HablalaApiWeb.Me.InvitationController.accept",
16087
+ "operationId": "post /v1/me/invitations/{id}/accept",
16078
16088
  "parameters": [
16079
16089
  {
16080
16090
  "description": "",
@@ -16130,7 +16140,7 @@
16130
16140
  "post": {
16131
16141
  "callbacks": {},
16132
16142
  "description": "Descarta la invitación sin unirme (no crea membresía). Doctrina anti-spam.",
16133
- "operationId": "HablalaApiWeb.Me.InvitationController.decline",
16143
+ "operationId": "post /v1/me/invitations/{id}/decline",
16134
16144
  "parameters": [
16135
16145
  {
16136
16146
  "description": "",
@@ -16169,7 +16179,7 @@
16169
16179
  "get": {
16170
16180
  "callbacks": {},
16171
16181
  "description": "Descubrimiento personal. Manda **o** `username` (handle público, estilo Discord; identifier principal independiente del método de login) **o** `phone` (E.164; raíz de identidad de consumo, ADR-022). Devuelve la persona a la que puedes enviar una solicitud, o `data: null` si no corresponde a nadie alcanzable (no existe, inactivo o bloqueo). La indistinción es deliberada (no filtra existencia de cuentas). Rate-limited contra enumeración.",
16172
- "operationId": "HablalaApiWeb.Me.PeopleController.lookup",
16182
+ "operationId": "get /v1/me/people/lookup",
16173
16183
  "parameters": [
16174
16184
  {
16175
16185
  "description": "Handle público a resolver (case-insensitive).",
@@ -16216,7 +16226,7 @@
16216
16226
  "get": {
16217
16227
  "callbacks": {},
16218
16228
  "description": "Búsqueda estilo red social. Manda `q`. Si `q` es un `@username` (o coincide exacto con un handle), resuelve esa persona globalmente (clave exacta, alcanza a cualquiera). Además busca por **nombre** —substring, case-insensitive— pero **solo entre gente con la que ya compartes contexto** (contactos, orgs, chats): el nombre no enumera desconocidos, por privacidad (ADR-022/024). Devuelve una lista (posiblemente vacía). Rate-limited.",
16219
- "operationId": "HablalaApiWeb.Me.PeopleController.search",
16229
+ "operationId": "get /v1/me/people/search",
16220
16230
  "parameters": [
16221
16231
  {
16222
16232
  "description": "Texto a buscar: un `@username` (exacto) y/o un nombre (substring en contexto).",
@@ -16267,7 +16277,7 @@
16267
16277
  "/v1/me/reports/users/{user_id}": {
16268
16278
  "post": {
16269
16279
  "callbacks": {},
16270
- "operationId": "HablalaApiWeb.Me.ReportController.report_user",
16280
+ "operationId": "post /v1/me/reports/users/{user_id}",
16271
16281
  "parameters": [
16272
16282
  {
16273
16283
  "description": "",
@@ -16317,7 +16327,7 @@
16317
16327
  "post": {
16318
16328
  "callbacks": {},
16319
16329
  "description": "Como el presign de organización, pero el blob se namespacea por usuario. Devuelve un sobre auto-descriptivo (`method`/`url`/`fields`/`headers`); el cliente sube según `method` y referencia `fileUrl` en los adjuntos del mensaje.",
16320
- "operationId": "HablalaApiWeb.Me.UploadController.presign",
16330
+ "operationId": "post /v1/me/uploads/presign",
16321
16331
  "parameters": [],
16322
16332
  "requestBody": {
16323
16333
  "content": {
@@ -16361,7 +16371,7 @@
16361
16371
  "/v1/me/usernames/available": {
16362
16372
  "get": {
16363
16373
  "callbacks": {},
16364
- "operationId": "HablalaApiWeb.Me.PeopleController.available",
16374
+ "operationId": "get /v1/me/usernames/available",
16365
16375
  "parameters": [
16366
16376
  {
16367
16377
  "description": "Handle a comprobar.",
@@ -16397,7 +16407,7 @@
16397
16407
  "post": {
16398
16408
  "callbacks": {},
16399
16409
  "description": "Crea un device authorization grant y devuelve `device_code` + `user_code` + `verification_uri`. El CLI muestra el código, abre la URI y sondea el token endpoint.",
16400
- "operationId": "HablalaApiWeb.Oauth.DeviceAuthorizationController.create",
16410
+ "operationId": "post /v1/oauth/device/code",
16401
16411
  "parameters": [],
16402
16412
  "requestBody": {
16403
16413
  "content": {
@@ -16442,7 +16452,7 @@
16442
16452
  "get": {
16443
16453
  "callbacks": {},
16444
16454
  "description": "Devuelve el login del CLI pendiente detrás de un `user_code` para que la web pinte el consent (cliente, dispositivo, expiración). 404 si no existe, 410 si venció, 409 si ya se procesó.",
16445
- "operationId": "HablalaApiWeb.Oauth.GrantController.show",
16455
+ "operationId": "get /v1/oauth/grants/{user_code}",
16446
16456
  "parameters": [
16447
16457
  {
16448
16458
  "description": "",
@@ -16508,7 +16518,7 @@
16508
16518
  "post": {
16509
16519
  "callbacks": {},
16510
16520
  "description": "El CLI que sondea recibe `access_denied` y termina.",
16511
- "operationId": "HablalaApiWeb.Oauth.GrantController.deny",
16521
+ "operationId": "post /v1/oauth/grants/{user_code}/deny",
16512
16522
  "parameters": [
16513
16523
  {
16514
16524
  "description": "",
@@ -16554,7 +16564,7 @@
16554
16564
  "post": {
16555
16565
  "callbacks": {},
16556
16566
  "description": "`grant_type=authorization_code` (loopback + PKCE) o `grant_type=urn:ietf:params:oauth:grant-type:device_code` (polling del device flow). El `access_token` devuelto es un `mat_…` normal; guárdalo, no se puede recuperar.",
16557
- "operationId": "HablalaApiWeb.Oauth.TokenController.create",
16567
+ "operationId": "post /v1/oauth/token",
16558
16568
  "parameters": [],
16559
16569
  "requestBody": {
16560
16570
  "content": {
@@ -16608,7 +16618,7 @@
16608
16618
  "/v1/objects": {
16609
16619
  "get": {
16610
16620
  "callbacks": {},
16611
- "operationId": "HablalaApiWeb.Machine.ObjectController.index",
16621
+ "operationId": "get /v1/objects",
16612
16622
  "parameters": [],
16613
16623
  "responses": {
16614
16624
  "200": {
@@ -16629,7 +16639,7 @@
16629
16639
  },
16630
16640
  "post": {
16631
16641
  "callbacks": {},
16632
- "operationId": "HablalaApiWeb.Machine.ObjectController.create",
16642
+ "operationId": "post /v1/objects",
16633
16643
  "parameters": [],
16634
16644
  "requestBody": {
16635
16645
  "content": {
@@ -16674,7 +16684,7 @@
16674
16684
  "delete": {
16675
16685
  "callbacks": {},
16676
16686
  "description": "Soft delete: marca `isArchived` en vez de borrar (los records persisten).",
16677
- "operationId": "HablalaApiWeb.Machine.ObjectController.delete",
16687
+ "operationId": "delete /v1/objects/{id}",
16678
16688
  "parameters": [
16679
16689
  {
16680
16690
  "description": "",
@@ -16700,7 +16710,7 @@
16700
16710
  },
16701
16711
  "get": {
16702
16712
  "callbacks": {},
16703
- "operationId": "HablalaApiWeb.Machine.ObjectController.show",
16713
+ "operationId": "get /v1/objects/{id}",
16704
16714
  "parameters": [
16705
16715
  {
16706
16716
  "description": "",
@@ -16743,7 +16753,7 @@
16743
16753
  },
16744
16754
  "patch": {
16745
16755
  "callbacks": {},
16746
- "operationId": "HablalaApiWeb.Machine.ObjectController.update (2)",
16756
+ "operationId": "patch /v1/objects/{id}",
16747
16757
  "parameters": [
16748
16758
  {
16749
16759
  "description": "",
@@ -16797,7 +16807,7 @@
16797
16807
  },
16798
16808
  "put": {
16799
16809
  "callbacks": {},
16800
- "operationId": "HablalaApiWeb.Machine.ObjectController.update",
16810
+ "operationId": "put /v1/objects/{id}",
16801
16811
  "parameters": [
16802
16812
  {
16803
16813
  "description": "",
@@ -16853,7 +16863,7 @@
16853
16863
  "/v1/objects/{object_id}/attributes": {
16854
16864
  "get": {
16855
16865
  "callbacks": {},
16856
- "operationId": "HablalaApiWeb.Machine.AttributeController.index",
16866
+ "operationId": "get /v1/objects/{object_id}/attributes",
16857
16867
  "parameters": [
16858
16868
  {
16859
16869
  "description": "",
@@ -16886,7 +16896,7 @@
16886
16896
  },
16887
16897
  "post": {
16888
16898
  "callbacks": {},
16889
- "operationId": "HablalaApiWeb.Machine.AttributeController.create",
16899
+ "operationId": "post /v1/objects/{object_id}/attributes",
16890
16900
  "parameters": [
16891
16901
  {
16892
16902
  "description": "",
@@ -16942,7 +16952,7 @@
16942
16952
  "/v1/objects/{object_id}/attributes/{id}": {
16943
16953
  "patch": {
16944
16954
  "callbacks": {},
16945
- "operationId": "HablalaApiWeb.Machine.AttributeController.update (2)",
16955
+ "operationId": "patch /v1/objects/{object_id}/attributes/{id}",
16946
16956
  "parameters": [
16947
16957
  {
16948
16958
  "description": "",
@@ -17007,7 +17017,7 @@
17007
17017
  },
17008
17018
  "put": {
17009
17019
  "callbacks": {},
17010
- "operationId": "HablalaApiWeb.Machine.AttributeController.update",
17020
+ "operationId": "put /v1/objects/{object_id}/attributes/{id}",
17011
17021
  "parameters": [
17012
17022
  {
17013
17023
  "description": "",
@@ -17074,7 +17084,7 @@
17074
17084
  "/v1/objects/{object_slug}/records": {
17075
17085
  "post": {
17076
17086
  "callbacks": {},
17077
- "operationId": "HablalaApiWeb.Machine.RecordController.create",
17087
+ "operationId": "post /v1/objects/{object_slug}/records",
17078
17088
  "parameters": [
17079
17089
  {
17080
17090
  "description": "",
@@ -17141,7 +17151,7 @@
17141
17151
  "get": {
17142
17152
  "callbacks": {},
17143
17153
  "description": "Lista los records SOFT-DELETED del objeto (`deleted_at IS NOT NULL`), para restaurarlos. Misma lectura gobernada que `POST /query` (RBAC + ABAC por fila + field_mask + paginación keyset), sobre el otro lado de `deleted_at`. Gate RBAC: `records:delete`.",
17144
- "operationId": "HablalaApiWeb.Machine.RecordController.trash",
17154
+ "operationId": "get /v1/objects/{object_slug}/records/trash",
17145
17155
  "parameters": [
17146
17156
  {
17147
17157
  "description": "",
@@ -17218,7 +17228,7 @@
17218
17228
  "/v1/objects/{object_slug}/records/{id}": {
17219
17229
  "delete": {
17220
17230
  "callbacks": {},
17221
- "operationId": "HablalaApiWeb.Machine.RecordController.delete",
17231
+ "operationId": "delete /v1/objects/{object_slug}/records/{id}",
17222
17232
  "parameters": [
17223
17233
  {
17224
17234
  "description": "",
@@ -17275,7 +17285,7 @@
17275
17285
  },
17276
17286
  "get": {
17277
17287
  "callbacks": {},
17278
- "operationId": "HablalaApiWeb.Machine.RecordController.show",
17288
+ "operationId": "get /v1/objects/{object_slug}/records/{id}",
17279
17289
  "parameters": [
17280
17290
  {
17281
17291
  "description": "",
@@ -17339,7 +17349,7 @@
17339
17349
  },
17340
17350
  "patch": {
17341
17351
  "callbacks": {},
17342
- "operationId": "HablalaApiWeb.Machine.RecordController.update (2)",
17352
+ "operationId": "patch /v1/objects/{object_slug}/records/{id}",
17343
17353
  "parameters": [
17344
17354
  {
17345
17355
  "description": "",
@@ -17424,7 +17434,7 @@
17424
17434
  },
17425
17435
  "put": {
17426
17436
  "callbacks": {},
17427
- "operationId": "HablalaApiWeb.Machine.RecordController.update",
17437
+ "operationId": "put /v1/objects/{object_slug}/records/{id}",
17428
17438
  "parameters": [
17429
17439
  {
17430
17440
  "description": "",
@@ -17512,7 +17522,7 @@
17512
17522
  "get": {
17513
17523
  "callbacks": {},
17514
17524
  "description": "Devuelve cuántos edges se desvincularían y qué referencias core BLOQUEARÍAN el borrado (restrict-on-delete), sin mutar nada. Alimenta la confirmación dependent-aware de la UI. Misma fuente que el guard del borrado real, así que preview y borrado no divergen. Gate `records:delete` + ABAC de escritura por fila.",
17515
- "operationId": "HablalaApiWeb.Machine.RecordController.dependencies",
17525
+ "operationId": "get /v1/objects/{object_slug}/records/{record_id}/dependencies",
17516
17526
  "parameters": [
17517
17527
  {
17518
17528
  "description": "",
@@ -17578,7 +17588,7 @@
17578
17588
  "/v1/objects/{object_slug}/records/{record_id}/events": {
17579
17589
  "get": {
17580
17590
  "callbacks": {},
17581
- "operationId": "HablalaApiWeb.Machine.EventController.index",
17591
+ "operationId": "get /v1/objects/{object_slug}/records/{record_id}/events",
17582
17592
  "parameters": [
17583
17593
  {
17584
17594
  "description": "",
@@ -17624,7 +17634,7 @@
17624
17634
  "/v1/objects/{object_slug}/records/{record_id}/restore": {
17625
17635
  "post": {
17626
17636
  "callbacks": {},
17627
- "operationId": "HablalaApiWeb.Machine.RecordController.restore",
17637
+ "operationId": "post /v1/objects/{object_slug}/records/{record_id}/restore",
17628
17638
  "parameters": [
17629
17639
  {
17630
17640
  "description": "",
@@ -17701,7 +17711,7 @@
17701
17711
  "post": {
17702
17712
  "callbacks": {},
17703
17713
  "description": "Fase 1 del flujo de archivos de un record: valida el archivo declarado contra el config del attribute `file` (`accepted_content_types` con comodines `image/*`, `max_size_bytes`) y devuelve el destino de subida prefirmado. Luego: (2) `PUT` del blob crudo a `uploadUrl` con `headers`; (3) confirmar escribiendo el record con `fileUrl` en el envelope del attribute (`{\"url\": fileUrl, …}`) — el servidor verifica el blob contra el storage (tamaño/tipo REALES) y lo promueve a su ubicación definitiva. Un blob nunca confirmado expira solo. Gate `records:create`.",
17704
- "operationId": "HablalaApiWeb.Machine.UploadController.create",
17714
+ "operationId": "post /v1/objects/{object_slug}/uploads",
17705
17715
  "parameters": [
17706
17716
  {
17707
17717
  "description": "",
@@ -17768,7 +17778,7 @@
17768
17778
  "get": {
17769
17779
  "callbacks": {},
17770
17780
  "description": "La organización a la que pertenece la credencial de máquina, con su `status` (`active`/`unclaimed`/`claimed`) y sus relojes. Es el endpoint de polling del agente que provisionó una claimable org: mientras responda `unclaimed`, nadie la reclamó; un `401` posterior significa que se reclamó (los tokens del agente se rotaron) o venció.",
17771
- "operationId": "HablalaApiWeb.Machine.OrganizationController.show",
17781
+ "operationId": "get /v1/organization",
17772
17782
  "parameters": [],
17773
17783
  "responses": {
17774
17784
  "200": {
@@ -17802,7 +17812,7 @@
17802
17812
  "post": {
17803
17813
  "callbacks": {},
17804
17814
  "description": "Emite un claim link nuevo (el anterior deja de canjear al instante) con su TTL corto, SIN extender el TTL del recurso. Falla si la org ya fue reclamada (`409`) o si el recurso venció (`410`).",
17805
- "operationId": "HablalaApiWeb.Machine.OrganizationController.refresh_claim_url",
17815
+ "operationId": "post /v1/organization/refresh-claim-url",
17806
17816
  "parameters": [],
17807
17817
  "responses": {
17808
17818
  "200": {
@@ -17845,7 +17855,7 @@
17845
17855
  "/v1/organizations": {
17846
17856
  "get": {
17847
17857
  "callbacks": {},
17848
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.index",
17858
+ "operationId": "get /v1/organizations",
17849
17859
  "parameters": [],
17850
17860
  "responses": {
17851
17861
  "200": {
@@ -17866,7 +17876,7 @@
17866
17876
  },
17867
17877
  "post": {
17868
17878
  "callbacks": {},
17869
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.create",
17879
+ "operationId": "post /v1/organizations",
17870
17880
  "parameters": [],
17871
17881
  "requestBody": {
17872
17882
  "content": {
@@ -17911,7 +17921,7 @@
17911
17921
  "post": {
17912
17922
  "callbacks": {},
17913
17923
  "description": "Consuma la **transferencia**: el usuario autenticado se vuelve `owner` de la org del claim token, la org pasa a `claimed` y los secretos del agente se ROTAN (todos los `mat_` y API keys activos se revocan; se emite un par nuevo que se revela aquí una única vez). Registra el evento `organization.claimed`.",
17914
- "operationId": "HablalaApiWeb.Orgs.ClaimableOrganizationController.claim",
17924
+ "operationId": "post /v1/organizations/claim",
17915
17925
  "parameters": [],
17916
17926
  "requestBody": {
17917
17927
  "content": {
@@ -17966,7 +17976,7 @@
17966
17976
  "post": {
17967
17977
  "callbacks": {},
17968
17978
  "description": "El **signup invertido** para agentes: crea una organización real `unclaimed` (sin dueño) y devuelve — UNA sola vez — el par de API keys (`pk_`/`sk_`), el machine access token (`mat_`, preset `account_as_code`) y el `claimUrl` con el que un humano la reclama. La org caduca (`expiresAt`, 72 h) si nadie la reclama; el claim link tiene su propio TTL renovable. Al reclamarse, los secretos del agente se ROTAN. Sin autenticación; rate limit estricto por IP.",
17969
- "operationId": "HablalaApiWeb.Orgs.ClaimableOrganizationController.create",
17979
+ "operationId": "post /v1/organizations/claimable",
17970
17980
  "parameters": [],
17971
17981
  "requestBody": {
17972
17982
  "content": {
@@ -18021,7 +18031,7 @@
18021
18031
  "get": {
18022
18032
  "callbacks": {},
18023
18033
  "description": "A qué organización lleva un claim token, sin consumirlo ni requerir sesión (la pantalla de claim lo muestra antes de pedir login). Siempre `200`: `status` distingue un token válido de uno inválido/vencido/ya reclamado (sin filtrar el motivo).",
18024
- "operationId": "HablalaApiWeb.Orgs.ClaimableOrganizationController.preview",
18034
+ "operationId": "get /v1/organizations/claimable/preview",
18025
18035
  "parameters": [
18026
18036
  {
18027
18037
  "description": "",
@@ -18056,7 +18066,7 @@
18056
18066
  "/v1/organizations/{id}": {
18057
18067
  "delete": {
18058
18068
  "callbacks": {},
18059
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.delete",
18069
+ "operationId": "delete /v1/organizations/{id}",
18060
18070
  "parameters": [
18061
18071
  {
18062
18072
  "description": "",
@@ -18082,7 +18092,7 @@
18082
18092
  },
18083
18093
  "get": {
18084
18094
  "callbacks": {},
18085
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.show",
18095
+ "operationId": "get /v1/organizations/{id}",
18086
18096
  "parameters": [
18087
18097
  {
18088
18098
  "description": "",
@@ -18125,7 +18135,7 @@
18125
18135
  },
18126
18136
  "patch": {
18127
18137
  "callbacks": {},
18128
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.update (2)",
18138
+ "operationId": "patch /v1/organizations/{id}",
18129
18139
  "parameters": [
18130
18140
  {
18131
18141
  "description": "",
@@ -18179,7 +18189,7 @@
18179
18189
  },
18180
18190
  "put": {
18181
18191
  "callbacks": {},
18182
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.update",
18192
+ "operationId": "put /v1/organizations/{id}",
18183
18193
  "parameters": [
18184
18194
  {
18185
18195
  "description": "",
@@ -18236,7 +18246,7 @@
18236
18246
  "post": {
18237
18247
  "callbacks": {},
18238
18248
  "description": "El owner/admin envía los datos legales del negocio (razón social, tax id, email de contacto) y la organización pasa a estado `pending`. La aprueba/rechaza un admin de plataforma. Requiere el permiso `organizations:update`.",
18239
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.request_verification",
18249
+ "operationId": "post /v1/organizations/{id}/verification",
18240
18250
  "parameters": [
18241
18251
  {
18242
18252
  "description": "",
@@ -18303,7 +18313,7 @@
18303
18313
  "post": {
18304
18314
  "callbacks": {},
18305
18315
  "description": "Marca el negocio como `verified`. Requiere el permiso de plataforma `organizations:verify` (un owner NO puede autoverificarse).",
18306
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.approve_verification",
18316
+ "operationId": "post /v1/organizations/{id}/verification/approve",
18307
18317
  "parameters": [
18308
18318
  {
18309
18319
  "description": "",
@@ -18359,7 +18369,7 @@
18359
18369
  "post": {
18360
18370
  "callbacks": {},
18361
18371
  "description": "Marca el negocio como `rejected` con un motivo legible. Requiere `organizations:verify`.",
18362
- "operationId": "HablalaApiWeb.Orgs.OrganizationController.reject_verification",
18372
+ "operationId": "post /v1/organizations/{id}/verification/reject",
18363
18373
  "parameters": [
18364
18374
  {
18365
18375
  "description": "",
@@ -18426,7 +18436,7 @@
18426
18436
  "get": {
18427
18437
  "callbacks": {},
18428
18438
  "description": "Los access tokens de máquina de la organización (solo metadatos; el secreto no se recupera).",
18429
- "operationId": "HablalaApiWeb.AccessTokens.TokenController.index",
18439
+ "operationId": "get /v1/organizations/{organization_id}/access-tokens",
18430
18440
  "parameters": [
18431
18441
  {
18432
18442
  "description": "",
@@ -18460,7 +18470,7 @@
18460
18470
  "post": {
18461
18471
  "callbacks": {},
18462
18472
  "description": "Emite una credencial de máquina (`mat_…`) con la que un agente (Claude Code) o un script CI escribe el modelo de datos por HTTP. La respuesta incluye el secreto en claro UNA sola vez (`token`); guárdalo, no se puede recuperar. Los permisos se intersectan con los del creador (un token nunca puede más que quien lo emite).",
18463
- "operationId": "HablalaApiWeb.AccessTokens.TokenController.create",
18473
+ "operationId": "post /v1/organizations/{organization_id}/access-tokens",
18464
18474
  "parameters": [
18465
18475
  {
18466
18476
  "description": "",
@@ -18527,7 +18537,7 @@
18527
18537
  "get": {
18528
18538
  "callbacks": {},
18529
18539
  "description": "Los conjuntos de permisos nombrados que la UI ofrece al emitir un token (lenguaje humano, sin permisos RBAC crudos). El `key` de un preset se manda como `preset` en el create.",
18530
- "operationId": "HablalaApiWeb.AccessTokens.TokenController.presets",
18540
+ "operationId": "get /v1/organizations/{organization_id}/access-tokens/presets",
18531
18541
  "parameters": [
18532
18542
  {
18533
18543
  "description": "",
@@ -18563,7 +18573,7 @@
18563
18573
  "delete": {
18564
18574
  "callbacks": {},
18565
18575
  "description": "Revoca la credencial (irreversible). Las requests que la usen dejan de autenticar.",
18566
- "operationId": "HablalaApiWeb.AccessTokens.TokenController.delete",
18576
+ "operationId": "delete /v1/organizations/{organization_id}/access-tokens/{id}",
18567
18577
  "parameters": [
18568
18578
  {
18569
18579
  "description": "",
@@ -18613,7 +18623,7 @@
18613
18623
  "get": {
18614
18624
  "callbacks": {},
18615
18625
  "description": "Los agentes activos de la organización.",
18616
- "operationId": "HablalaApiWeb.Agents.AgentController.index",
18626
+ "operationId": "get /v1/organizations/{organization_id}/agents",
18617
18627
  "parameters": [
18618
18628
  {
18619
18629
  "description": "",
@@ -18657,7 +18667,7 @@
18657
18667
  "post": {
18658
18668
  "callbacks": {},
18659
18669
  "description": "Crea un agente por dato: su bot user (identidad de mensajería), su fila core y su proyección en el diccionario. El agent loop que lo corre es una definición de sistema.",
18660
- "operationId": "HablalaApiWeb.Agents.AgentController.create",
18670
+ "operationId": "post /v1/organizations/{organization_id}/agents",
18661
18671
  "parameters": [
18662
18672
  {
18663
18673
  "description": "",
@@ -18724,7 +18734,7 @@
18724
18734
  "delete": {
18725
18735
  "callbacks": {},
18726
18736
  "description": "Soft-delete + revocación: el agente deja de correr (fail-closed) y su bot user se desactiva.",
18727
- "operationId": "HablalaApiWeb.Agents.AgentController.delete",
18737
+ "operationId": "delete /v1/organizations/{organization_id}/agents/{id}",
18728
18738
  "parameters": [
18729
18739
  {
18730
18740
  "description": "",
@@ -18771,7 +18781,7 @@
18771
18781
  },
18772
18782
  "get": {
18773
18783
  "callbacks": {},
18774
- "operationId": "HablalaApiWeb.Agents.AgentController.show",
18784
+ "operationId": "get /v1/organizations/{organization_id}/agents/{id}",
18775
18785
  "parameters": [
18776
18786
  {
18777
18787
  "description": "",
@@ -18826,7 +18836,7 @@
18826
18836
  "patch": {
18827
18837
  "callbacks": {},
18828
18838
  "description": "Edita prompt/tools/modelo/permisos/nombre. El handle y la identidad no cambian.",
18829
- "operationId": "HablalaApiWeb.Agents.AgentController.update (2)",
18839
+ "operationId": "patch /v1/organizations/{organization_id}/agents/{id}",
18830
18840
  "parameters": [
18831
18841
  {
18832
18842
  "description": "",
@@ -18892,7 +18902,7 @@
18892
18902
  "put": {
18893
18903
  "callbacks": {},
18894
18904
  "description": "Edita prompt/tools/modelo/permisos/nombre. El handle y la identidad no cambian.",
18895
- "operationId": "HablalaApiWeb.Agents.AgentController.update",
18905
+ "operationId": "put /v1/organizations/{organization_id}/agents/{id}",
18896
18906
  "parameters": [
18897
18907
  {
18898
18908
  "description": "",
@@ -18960,7 +18970,7 @@
18960
18970
  "get": {
18961
18971
  "callbacks": {},
18962
18972
  "description": "Las API keys de la organización (solo metadatos; el secreto no se recupera).",
18963
- "operationId": "HablalaApiWeb.PublicApi.ApiKeyController.index",
18973
+ "operationId": "get /v1/organizations/{organization_id}/api-keys",
18964
18974
  "parameters": [
18965
18975
  {
18966
18976
  "description": "",
@@ -18994,7 +19004,7 @@
18994
19004
  "post": {
18995
19005
  "callbacks": {},
18996
19006
  "description": "Emite el **par** de API keys del canal público en una operación: una **publishable** (`pk_`, client-side) y una **secret** (`sk_`, server-side). La respuesta incluye el secreto en claro de AMBAS una sola vez (`publishable.token`/`secret.token`); guárdalos, no se pueden recuperar. Es el flujo del panel: se muestran completos para copiar/pegar en el `.env` de la app cliente. `name` por defecto \"Default\".",
18997
- "operationId": "HablalaApiWeb.PublicApi.ApiKeyController.create",
19007
+ "operationId": "post /v1/organizations/{organization_id}/api-keys",
18998
19008
  "parameters": [
18999
19009
  {
19000
19010
  "description": "",
@@ -19061,7 +19071,7 @@
19061
19071
  "delete": {
19062
19072
  "callbacks": {},
19063
19073
  "description": "Revoca la credencial (irreversible). Las requests que la usen dejan de autenticar.",
19064
- "operationId": "HablalaApiWeb.PublicApi.ApiKeyController.delete",
19074
+ "operationId": "delete /v1/organizations/{organization_id}/api-keys/{id}",
19065
19075
  "parameters": [
19066
19076
  {
19067
19077
  "description": "",
@@ -19111,7 +19121,7 @@
19111
19121
  "post": {
19112
19122
  "callbacks": {},
19113
19123
  "description": "Rota la key (modelo Stripe *roll*): emite un reemplazo del mismo tipo y nombre y revoca la original de inmediato. La respuesta incluye el nuevo secreto en claro UNA sola vez (`token`); guárdalo. Las requests que usaban la key vieja dejan de autenticar.",
19114
- "operationId": "HablalaApiWeb.PublicApi.ApiKeyController.rotate",
19124
+ "operationId": "post /v1/organizations/{organization_id}/api-keys/{id}/rotate",
19115
19125
  "parameters": [
19116
19126
  {
19117
19127
  "description": "",
@@ -19167,7 +19177,7 @@
19167
19177
  "/v1/organizations/{organization_id}/appointments": {
19168
19178
  "get": {
19169
19179
  "callbacks": {},
19170
- "operationId": "HablalaApiWeb.Scheduling.AppointmentController.index",
19180
+ "operationId": "get /v1/organizations/{organization_id}/appointments",
19171
19181
  "parameters": [
19172
19182
  {
19173
19183
  "description": "",
@@ -19233,7 +19243,7 @@
19233
19243
  },
19234
19244
  "post": {
19235
19245
  "callbacks": {},
19236
- "operationId": "HablalaApiWeb.Scheduling.AppointmentController.create",
19246
+ "operationId": "post /v1/organizations/{organization_id}/appointments",
19237
19247
  "parameters": [
19238
19248
  {
19239
19249
  "description": "",
@@ -19289,7 +19299,7 @@
19289
19299
  "/v1/organizations/{organization_id}/appointments/{id}": {
19290
19300
  "get": {
19291
19301
  "callbacks": {},
19292
- "operationId": "HablalaApiWeb.Scheduling.AppointmentController.show",
19302
+ "operationId": "get /v1/organizations/{organization_id}/appointments/{id}",
19293
19303
  "parameters": [
19294
19304
  {
19295
19305
  "description": "",
@@ -19345,7 +19355,7 @@
19345
19355
  "/v1/organizations/{organization_id}/appointments/{id}/cancel": {
19346
19356
  "post": {
19347
19357
  "callbacks": {},
19348
- "operationId": "HablalaApiWeb.Scheduling.AppointmentController.cancel",
19358
+ "operationId": "post /v1/organizations/{organization_id}/appointments/{id}/cancel",
19349
19359
  "parameters": [
19350
19360
  {
19351
19361
  "description": "",
@@ -19412,7 +19422,7 @@
19412
19422
  "/v1/organizations/{organization_id}/appointments/{id}/confirm": {
19413
19423
  "post": {
19414
19424
  "callbacks": {},
19415
- "operationId": "HablalaApiWeb.Scheduling.AppointmentController.confirm",
19425
+ "operationId": "post /v1/organizations/{organization_id}/appointments/{id}/confirm",
19416
19426
  "parameters": [
19417
19427
  {
19418
19428
  "description": "",
@@ -19469,7 +19479,7 @@
19469
19479
  "post": {
19470
19480
  "callbacks": {},
19471
19481
  "description": "Flag ortogonal al estado; la cita no libera su hueco.",
19472
- "operationId": "HablalaApiWeb.Scheduling.AppointmentController.no_show",
19482
+ "operationId": "post /v1/organizations/{organization_id}/appointments/{id}/no-show",
19473
19483
  "parameters": [
19474
19484
  {
19475
19485
  "description": "",
@@ -19527,7 +19537,7 @@
19527
19537
  "post": {
19528
19538
  "callbacks": {},
19529
19539
  "description": "Cancela la cita y crea una nueva enlazada, en una transacción: si el hueco nuevo está tomado, la original queda intacta.",
19530
- "operationId": "HablalaApiWeb.Scheduling.AppointmentController.reschedule",
19540
+ "operationId": "post /v1/organizations/{organization_id}/appointments/{id}/reschedule",
19531
19541
  "parameters": [
19532
19542
  {
19533
19543
  "description": "",
@@ -19594,7 +19604,7 @@
19594
19604
  "/v1/organizations/{organization_id}/bookings": {
19595
19605
  "get": {
19596
19606
  "callbacks": {},
19597
- "operationId": "HablalaApiWeb.Bookings.BookingController.index",
19607
+ "operationId": "get /v1/organizations/{organization_id}/bookings",
19598
19608
  "parameters": [
19599
19609
  {
19600
19610
  "description": "",
@@ -19671,7 +19681,7 @@
19671
19681
  },
19672
19682
  "post": {
19673
19683
  "callbacks": {},
19674
- "operationId": "HablalaApiWeb.Bookings.BookingController.create",
19684
+ "operationId": "post /v1/organizations/{organization_id}/bookings",
19675
19685
  "parameters": [
19676
19686
  {
19677
19687
  "description": "",
@@ -19728,7 +19738,7 @@
19728
19738
  "get": {
19729
19739
  "callbacks": {},
19730
19740
  "description": "Derivado de las reservas bloqueantes (pending/reserved/picked_up), turnaround incluido. Lectura de conveniencia: la garantía real ante carreras es el constraint al crear.",
19731
- "operationId": "HablalaApiWeb.Bookings.BookingController.availability",
19741
+ "operationId": "get /v1/organizations/{organization_id}/bookings/availability",
19732
19742
  "parameters": [
19733
19743
  {
19734
19744
  "description": "",
@@ -19817,7 +19827,7 @@
19817
19827
  "/v1/organizations/{organization_id}/bookings/{id}": {
19818
19828
  "get": {
19819
19829
  "callbacks": {},
19820
- "operationId": "HablalaApiWeb.Bookings.BookingController.show",
19830
+ "operationId": "get /v1/organizations/{organization_id}/bookings/{id}",
19821
19831
  "parameters": [
19822
19832
  {
19823
19833
  "description": "",
@@ -19873,7 +19883,7 @@
19873
19883
  "/v1/organizations/{organization_id}/bookings/{id}/cancel": {
19874
19884
  "post": {
19875
19885
  "callbacks": {},
19876
- "operationId": "HablalaApiWeb.Bookings.BookingController.cancel",
19886
+ "operationId": "post /v1/organizations/{organization_id}/bookings/{id}/cancel",
19877
19887
  "parameters": [
19878
19888
  {
19879
19889
  "description": "",
@@ -19929,7 +19939,7 @@
19929
19939
  "/v1/organizations/{organization_id}/bookings/{id}/pick-up": {
19930
19940
  "post": {
19931
19941
  "callbacks": {},
19932
- "operationId": "HablalaApiWeb.Bookings.BookingController.pick_up",
19942
+ "operationId": "post /v1/organizations/{organization_id}/bookings/{id}/pick-up",
19933
19943
  "parameters": [
19934
19944
  {
19935
19945
  "description": "",
@@ -19985,7 +19995,7 @@
19985
19995
  "/v1/organizations/{organization_id}/bookings/{id}/reserve": {
19986
19996
  "post": {
19987
19997
  "callbacks": {},
19988
- "operationId": "HablalaApiWeb.Bookings.BookingController.reserve",
19998
+ "operationId": "post /v1/organizations/{organization_id}/bookings/{id}/reserve",
19989
19999
  "parameters": [
19990
20000
  {
19991
20001
  "description": "",
@@ -20041,7 +20051,7 @@
20041
20051
  "/v1/organizations/{organization_id}/bookings/{id}/return": {
20042
20052
  "post": {
20043
20053
  "callbacks": {},
20044
- "operationId": "HablalaApiWeb.Bookings.BookingController.return",
20054
+ "operationId": "post /v1/organizations/{organization_id}/bookings/{id}/return",
20045
20055
  "parameters": [
20046
20056
  {
20047
20057
  "description": "",
@@ -20098,7 +20108,7 @@
20098
20108
  "get": {
20099
20109
  "callbacks": {},
20100
20110
  "description": "El estado real de lo declarable (objetos, workflows, agentes) como manifiesto. Es lo que `hablala pull`/`init` baja a archivos.",
20101
- "operationId": "HablalaApiWeb.Data.AccountConfigController.show",
20111
+ "operationId": "get /v1/organizations/{organization_id}/config",
20102
20112
  "parameters": [
20103
20113
  {
20104
20114
  "description": "",
@@ -20142,7 +20152,7 @@
20142
20152
  "put": {
20143
20153
  "callbacks": {},
20144
20154
  "description": "Reconcilia el manifiesto contra la cuenta: crear / actualizar / archivar (nunca borrar), en UNA transacción síncrona. `?dry_run=true` devuelve el diff sin tocar nada (es lo que `hablala plan` llama). El mismo manifiesto dos veces = no-op (idempotencia estructural; el header `Idempotency-Key` se acepta por consistencia pero no hace falta deduplicar).",
20145
- "operationId": "HablalaApiWeb.Data.AccountConfigController.update",
20155
+ "operationId": "put /v1/organizations/{organization_id}/config",
20146
20156
  "parameters": [
20147
20157
  {
20148
20158
  "description": "",
@@ -20230,7 +20240,7 @@
20230
20240
  "/v1/organizations/{organization_id}/conversations": {
20231
20241
  "get": {
20232
20242
  "callbacks": {},
20233
- "operationId": "HablalaApiWeb.Messaging.ConversationController.index",
20243
+ "operationId": "get /v1/organizations/{organization_id}/conversations",
20234
20244
  "parameters": [
20235
20245
  {
20236
20246
  "description": "",
@@ -20263,7 +20273,7 @@
20263
20273
  },
20264
20274
  "post": {
20265
20275
  "callbacks": {},
20266
- "operationId": "HablalaApiWeb.Messaging.ConversationController.create",
20276
+ "operationId": "post /v1/organizations/{organization_id}/conversations",
20267
20277
  "parameters": [
20268
20278
  {
20269
20279
  "description": "",
@@ -20320,7 +20330,7 @@
20320
20330
  "post": {
20321
20331
  "callbacks": {},
20322
20332
  "description": "Idempotente por conjunto de participantes (patrón estándar de mensajería): abrir un DM con las mismas personas —1:1 o grupo— reabre el existente en vez de duplicarlo.",
20323
- "operationId": "HablalaApiWeb.Messaging.ConversationController.create_direct",
20333
+ "operationId": "post /v1/organizations/{organization_id}/conversations/direct",
20324
20334
  "parameters": [
20325
20335
  {
20326
20336
  "description": "",
@@ -20377,7 +20387,7 @@
20377
20387
  "post": {
20378
20388
  "callbacks": {},
20379
20389
  "description": "Flujo estándar de 'nueva conversación': el DM no existe para nadie hasta su primer mensaje. Resuelve el DM (idempotente por conjunto de miembros) y envía el mensaje en una sola operación; solo entonces la conversación aparece —en vivo— en el sidebar de todos sus miembros. Devuelve la conversación y el mensaje creado.",
20380
- "operationId": "HablalaApiWeb.Messaging.ConversationController.create_direct_message",
20390
+ "operationId": "post /v1/organizations/{organization_id}/conversations/direct/messages",
20381
20391
  "parameters": [
20382
20392
  {
20383
20393
  "description": "",
@@ -20433,7 +20443,7 @@
20433
20443
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/archive": {
20434
20444
  "delete": {
20435
20445
  "callbacks": {},
20436
- "operationId": "HablalaApiWeb.Messaging.ConversationController.unarchive",
20446
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{conversation_id}/archive",
20437
20447
  "parameters": [
20438
20448
  {
20439
20449
  "description": "",
@@ -20477,7 +20487,7 @@
20477
20487
  },
20478
20488
  "post": {
20479
20489
  "callbacks": {},
20480
- "operationId": "HablalaApiWeb.Messaging.ConversationController.archive",
20490
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/archive",
20481
20491
  "parameters": [
20482
20492
  {
20483
20493
  "description": "",
@@ -20524,7 +20534,7 @@
20524
20534
  "get": {
20525
20535
  "callbacks": {},
20526
20536
  "description": "Adjuntos de la conversación (imágenes/documentos), más recientes primero.",
20527
- "operationId": "HablalaApiWeb.Messaging.ConversationController.media",
20537
+ "operationId": "get /v1/organizations/{organization_id}/conversations/{conversation_id}/media",
20528
20538
  "parameters": [
20529
20539
  {
20530
20540
  "description": "",
@@ -20603,7 +20613,7 @@
20603
20613
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/members": {
20604
20614
  "get": {
20605
20615
  "callbacks": {},
20606
- "operationId": "HablalaApiWeb.Messaging.ConversationController.members",
20616
+ "operationId": "get /v1/organizations/{organization_id}/conversations/{conversation_id}/members",
20607
20617
  "parameters": [
20608
20618
  {
20609
20619
  "description": "",
@@ -20658,7 +20668,7 @@
20658
20668
  "post": {
20659
20669
  "callbacks": {},
20660
20670
  "description": "Invita a un usuario del tenant a un canal (flujo estándar: crear y luego 'añadir personas'). Idempotente: si ya es miembro, devuelve la membresía existente.",
20661
- "operationId": "HablalaApiWeb.Messaging.ConversationController.add_member",
20671
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/members",
20662
20672
  "parameters": [
20663
20673
  {
20664
20674
  "description": "",
@@ -20735,7 +20745,7 @@
20735
20745
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/members/{user_id}": {
20736
20746
  "delete": {
20737
20747
  "callbacks": {},
20738
- "operationId": "HablalaApiWeb.Messaging.ConversationController.remove_member",
20748
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{conversation_id}/members/{user_id}",
20739
20749
  "parameters": [
20740
20750
  {
20741
20751
  "description": "",
@@ -20795,7 +20805,7 @@
20795
20805
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/members/{user_id}/ban": {
20796
20806
  "delete": {
20797
20807
  "callbacks": {},
20798
- "operationId": "HablalaApiWeb.Messaging.ConversationController.unban",
20808
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{conversation_id}/members/{user_id}/ban",
20799
20809
  "parameters": [
20800
20810
  {
20801
20811
  "description": "",
@@ -20854,7 +20864,7 @@
20854
20864
  "post": {
20855
20865
  "callbacks": {},
20856
20866
  "description": "Solo admins (owner/admin). Bloquea al usuario: no puede volver ni ser re-agregado mientras el ban siga vigente. Sin `until` = permanente; con `until` (ISO 8601) = temporal.",
20857
- "operationId": "HablalaApiWeb.Messaging.ConversationController.ban",
20867
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/members/{user_id}/ban",
20858
20868
  "parameters": [
20859
20869
  {
20860
20870
  "description": "",
@@ -20926,7 +20936,7 @@
20926
20936
  "patch": {
20927
20937
  "callbacks": {},
20928
20938
  "description": "Solo el owner. No se puede tocar al owner.",
20929
- "operationId": "HablalaApiWeb.Messaging.ConversationController.change_role",
20939
+ "operationId": "patch /v1/organizations/{organization_id}/conversations/{conversation_id}/members/{user_id}/role",
20930
20940
  "parameters": [
20931
20941
  {
20932
20942
  "description": "",
@@ -21004,7 +21014,7 @@
21004
21014
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/messages": {
21005
21015
  "get": {
21006
21016
  "callbacks": {},
21007
- "operationId": "HablalaApiWeb.Messaging.MessageController.index",
21017
+ "operationId": "get /v1/organizations/{organization_id}/conversations/{conversation_id}/messages",
21008
21018
  "parameters": [
21009
21019
  {
21010
21020
  "description": "",
@@ -21059,7 +21069,7 @@
21059
21069
  },
21060
21070
  "post": {
21061
21071
  "callbacks": {},
21062
- "operationId": "HablalaApiWeb.Messaging.MessageController.create",
21072
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/messages",
21063
21073
  "parameters": [
21064
21074
  {
21065
21075
  "description": "",
@@ -21126,7 +21136,7 @@
21126
21136
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/messages/changes": {
21127
21137
  "get": {
21128
21138
  "callbacks": {},
21129
- "operationId": "HablalaApiWeb.Messaging.MessageController.changes",
21139
+ "operationId": "get /v1/organizations/{organization_id}/conversations/{conversation_id}/messages/changes",
21130
21140
  "parameters": [
21131
21141
  {
21132
21142
  "description": "",
@@ -21193,7 +21203,7 @@
21193
21203
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{id}": {
21194
21204
  "delete": {
21195
21205
  "callbacks": {},
21196
- "operationId": "HablalaApiWeb.Messaging.MessageController.delete",
21206
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{id}",
21197
21207
  "parameters": [
21198
21208
  {
21199
21209
  "description": "",
@@ -21251,7 +21261,7 @@
21251
21261
  },
21252
21262
  "patch": {
21253
21263
  "callbacks": {},
21254
- "operationId": "HablalaApiWeb.Messaging.MessageController.update (2)",
21264
+ "operationId": "patch /v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{id}",
21255
21265
  "parameters": [
21256
21266
  {
21257
21267
  "description": "",
@@ -21327,7 +21337,7 @@
21327
21337
  },
21328
21338
  "put": {
21329
21339
  "callbacks": {},
21330
- "operationId": "HablalaApiWeb.Messaging.MessageController.update",
21340
+ "operationId": "put /v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{id}",
21331
21341
  "parameters": [
21332
21342
  {
21333
21343
  "description": "",
@@ -21405,7 +21415,7 @@
21405
21415
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{message_id}/reactions": {
21406
21416
  "post": {
21407
21417
  "callbacks": {},
21408
- "operationId": "HablalaApiWeb.Messaging.ReactionController.create",
21418
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{message_id}/reactions",
21409
21419
  "parameters": [
21410
21420
  {
21411
21421
  "description": "",
@@ -21476,7 +21486,7 @@
21476
21486
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{message_id}/reactions/{emoji}": {
21477
21487
  "delete": {
21478
21488
  "callbacks": {},
21479
- "operationId": "HablalaApiWeb.Messaging.ReactionController.delete",
21489
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{conversation_id}/messages/{message_id}/reactions/{emoji}",
21480
21490
  "parameters": [
21481
21491
  {
21482
21492
  "description": "",
@@ -21547,7 +21557,7 @@
21547
21557
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/mute": {
21548
21558
  "delete": {
21549
21559
  "callbacks": {},
21550
- "operationId": "HablalaApiWeb.Messaging.ConversationController.unmute",
21560
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{conversation_id}/mute",
21551
21561
  "parameters": [
21552
21562
  {
21553
21563
  "description": "",
@@ -21591,7 +21601,7 @@
21591
21601
  },
21592
21602
  "post": {
21593
21603
  "callbacks": {},
21594
- "operationId": "HablalaApiWeb.Messaging.ConversationController.mute",
21604
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/mute",
21595
21605
  "parameters": [
21596
21606
  {
21597
21607
  "description": "",
@@ -21648,7 +21658,7 @@
21648
21658
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/pin": {
21649
21659
  "delete": {
21650
21660
  "callbacks": {},
21651
- "operationId": "HablalaApiWeb.Messaging.ConversationController.unpin",
21661
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{conversation_id}/pin",
21652
21662
  "parameters": [
21653
21663
  {
21654
21664
  "description": "",
@@ -21692,7 +21702,7 @@
21692
21702
  },
21693
21703
  "post": {
21694
21704
  "callbacks": {},
21695
- "operationId": "HablalaApiWeb.Messaging.ConversationController.pin",
21705
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/pin",
21696
21706
  "parameters": [
21697
21707
  {
21698
21708
  "description": "",
@@ -21738,7 +21748,7 @@
21738
21748
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/read": {
21739
21749
  "put": {
21740
21750
  "callbacks": {},
21741
- "operationId": "HablalaApiWeb.Messaging.ConversationController.mark_read",
21751
+ "operationId": "put /v1/organizations/{organization_id}/conversations/{conversation_id}/read",
21742
21752
  "parameters": [
21743
21753
  {
21744
21754
  "description": "",
@@ -21788,7 +21798,7 @@
21788
21798
  "/v1/organizations/{organization_id}/conversations/{conversation_id}/report": {
21789
21799
  "post": {
21790
21800
  "callbacks": {},
21791
- "operationId": "HablalaApiWeb.Messaging.ConversationController.report",
21801
+ "operationId": "post /v1/organizations/{organization_id}/conversations/{conversation_id}/report",
21792
21802
  "parameters": [
21793
21803
  {
21794
21804
  "description": "",
@@ -21848,7 +21858,7 @@
21848
21858
  "/v1/organizations/{organization_id}/conversations/{id}": {
21849
21859
  "delete": {
21850
21860
  "callbacks": {},
21851
- "operationId": "HablalaApiWeb.Messaging.ConversationController.delete",
21861
+ "operationId": "delete /v1/organizations/{organization_id}/conversations/{id}",
21852
21862
  "parameters": [
21853
21863
  {
21854
21864
  "description": "",
@@ -21885,7 +21895,7 @@
21885
21895
  },
21886
21896
  "get": {
21887
21897
  "callbacks": {},
21888
- "operationId": "HablalaApiWeb.Messaging.ConversationController.show",
21898
+ "operationId": "get /v1/organizations/{organization_id}/conversations/{id}",
21889
21899
  "parameters": [
21890
21900
  {
21891
21901
  "description": "",
@@ -21940,7 +21950,7 @@
21940
21950
  "patch": {
21941
21951
  "callbacks": {},
21942
21952
  "description": "Solo admins (owner/admin). Los campos ausentes no se tocan.",
21943
- "operationId": "HablalaApiWeb.Messaging.ConversationController.update (2)",
21953
+ "operationId": "patch /v1/organizations/{organization_id}/conversations/{id}",
21944
21954
  "parameters": [
21945
21955
  {
21946
21956
  "description": "",
@@ -22016,7 +22026,7 @@
22016
22026
  "put": {
22017
22027
  "callbacks": {},
22018
22028
  "description": "Solo admins (owner/admin). Los campos ausentes no se tocan.",
22019
- "operationId": "HablalaApiWeb.Messaging.ConversationController.update",
22029
+ "operationId": "put /v1/organizations/{organization_id}/conversations/{id}",
22020
22030
  "parameters": [
22021
22031
  {
22022
22032
  "description": "",
@@ -22094,7 +22104,7 @@
22094
22104
  "get": {
22095
22105
  "callbacks": {},
22096
22106
  "description": "Los dominios propios solicitados por la organización, con su estado de verificación.",
22097
- "operationId": "HablalaApiWeb.Domains.CustomDomainController.index",
22107
+ "operationId": "get /v1/organizations/{organization_id}/domains",
22098
22108
  "parameters": [
22099
22109
  {
22100
22110
  "description": "",
@@ -22128,7 +22138,7 @@
22128
22138
  "post": {
22129
22139
  "callbacks": {},
22130
22140
  "description": "Registra un dominio para la organización en estado `pending` y arranca el workflow de verificación (aprovisiona en el proveedor → verifica DNS → emite TLS → activa). La respuesta incluye el reto DNS que el cliente debe publicar (cuando el proveedor lo emite).",
22131
- "operationId": "HablalaApiWeb.Domains.CustomDomainController.create",
22141
+ "operationId": "post /v1/organizations/{organization_id}/domains",
22132
22142
  "parameters": [
22133
22143
  {
22134
22144
  "description": "",
@@ -22195,7 +22205,7 @@
22195
22205
  "delete": {
22196
22206
  "callbacks": {},
22197
22207
  "description": "Des-aprovisiona el dominio en el proveedor y lo borra.",
22198
- "operationId": "HablalaApiWeb.Domains.CustomDomainController.delete",
22208
+ "operationId": "delete /v1/organizations/{organization_id}/domains/{id}",
22199
22209
  "parameters": [
22200
22210
  {
22201
22211
  "description": "",
@@ -22242,7 +22252,7 @@
22242
22252
  },
22243
22253
  "get": {
22244
22254
  "callbacks": {},
22245
- "operationId": "HablalaApiWeb.Domains.CustomDomainController.show",
22255
+ "operationId": "get /v1/organizations/{organization_id}/domains/{id}",
22246
22256
  "parameters": [
22247
22257
  {
22248
22258
  "description": "",
@@ -22299,7 +22309,7 @@
22299
22309
  "post": {
22300
22310
  "callbacks": {},
22301
22311
  "description": "Conecta dos records vía un tipo de relación (`relationship` = slug). Idempotente: crear la misma arista dos veces no falla.",
22302
- "operationId": "HablalaApiWeb.Data.EdgeController.create",
22312
+ "operationId": "post /v1/organizations/{organization_id}/edges",
22303
22313
  "parameters": [
22304
22314
  {
22305
22315
  "description": "",
@@ -22365,7 +22375,7 @@
22365
22375
  "/v1/organizations/{organization_id}/edges/{id}": {
22366
22376
  "delete": {
22367
22377
  "callbacks": {},
22368
- "operationId": "HablalaApiWeb.Data.EdgeController.delete",
22378
+ "operationId": "delete /v1/organizations/{organization_id}/edges/{id}",
22369
22379
  "parameters": [
22370
22380
  {
22371
22381
  "description": "",
@@ -22405,7 +22415,7 @@
22405
22415
  "post": {
22406
22416
  "callbacks": {},
22407
22417
  "description": "Devuelve el grafo de datos del tenant como `nodes` + `edges` planos (knowledge graph), acotado por `limit` y ordenado por grado desc (los nodos más conectados primero). Filtra por el ABAC del scope. Base de la vista de grafo global.",
22408
- "operationId": "HablalaApiWeb.Data.GraphController.overview",
22418
+ "operationId": "post /v1/organizations/{organization_id}/graph",
22409
22419
  "parameters": [
22410
22420
  {
22411
22421
  "description": "",
@@ -22462,7 +22472,7 @@
22462
22472
  "post": {
22463
22473
  "callbacks": {},
22464
22474
  "description": "Devuelve el vecindario de un nodo — sus vecinos directos (1 salto) + las aristas que los unen — como `nodes` + `edges`. Es el *expand-on-demand* (progressive disclosure) para explorar el grafo sin cargarlo entero.",
22465
- "operationId": "HablalaApiWeb.Data.GraphController.expand",
22475
+ "operationId": "post /v1/organizations/{organization_id}/graph/expand",
22466
22476
  "parameters": [
22467
22477
  {
22468
22478
  "description": "",
@@ -22528,7 +22538,7 @@
22528
22538
  "/v1/organizations/{organization_id}/invitations": {
22529
22539
  "get": {
22530
22540
  "callbacks": {},
22531
- "operationId": "HablalaApiWeb.Orgs.InvitationController.index",
22541
+ "operationId": "get /v1/organizations/{organization_id}/invitations",
22532
22542
  "parameters": [
22533
22543
  {
22534
22544
  "description": "",
@@ -22572,7 +22582,7 @@
22572
22582
  "post": {
22573
22583
  "callbacks": {},
22574
22584
  "description": "Dos modalidades según el cuerpo:\n\n* `{ \"invitation\": { \"email\": \"…\", \"roleId\": \"role_…\" } }` — invitación por **correo** (o para reenviar/onboarding de equipo). Se acepta canjeando el token del email.\n* `{ \"invitation\": { \"userId\": \"user_…\", \"roleId\": \"role_…\" } }` — invitación **dirigida** a un usuario ya existente (encontrado por su username en el buscador). Le llega a su bandeja (`GET /me/invitations`) y la acepta/rechaza desde la app: NO se le añade sin consentimiento (patrón *message request*, doctrina anti-spam).",
22575
- "operationId": "HablalaApiWeb.Orgs.InvitationController.create",
22585
+ "operationId": "post /v1/organizations/{organization_id}/invitations",
22576
22586
  "parameters": [
22577
22587
  {
22578
22588
  "description": "",
@@ -22649,7 +22659,7 @@
22649
22659
  "post": {
22650
22660
  "callbacks": {},
22651
22661
  "description": "Crea (o reenvía) invitaciones para una lista de emails, todos con el mismo rol opcional. No es todo-o-nada: cada email se procesa aparte y su resultado se refleja por separado (`sent` / `already` / `invalid`).",
22652
- "operationId": "HablalaApiWeb.Orgs.InvitationController.bulk",
22662
+ "operationId": "post /v1/organizations/{organization_id}/invitations/bulk",
22653
22663
  "parameters": [
22654
22664
  {
22655
22665
  "description": "",
@@ -22715,7 +22725,7 @@
22715
22725
  "/v1/organizations/{organization_id}/invitations/{id}": {
22716
22726
  "delete": {
22717
22727
  "callbacks": {},
22718
- "operationId": "HablalaApiWeb.Orgs.InvitationController.delete",
22728
+ "operationId": "delete /v1/organizations/{organization_id}/invitations/{id}",
22719
22729
  "parameters": [
22720
22730
  {
22721
22731
  "description": "",
@@ -22762,7 +22772,7 @@
22762
22772
  },
22763
22773
  "get": {
22764
22774
  "callbacks": {},
22765
- "operationId": "HablalaApiWeb.Orgs.InvitationController.show",
22775
+ "operationId": "get /v1/organizations/{organization_id}/invitations/{id}",
22766
22776
  "parameters": [
22767
22777
  {
22768
22778
  "description": "",
@@ -22818,7 +22828,7 @@
22818
22828
  "/v1/organizations/{organization_id}/invite-link": {
22819
22829
  "delete": {
22820
22830
  "callbacks": {},
22821
- "operationId": "HablalaApiWeb.Orgs.InviteLinkController.delete",
22831
+ "operationId": "delete /v1/organizations/{organization_id}/invite-link",
22822
22832
  "parameters": [
22823
22833
  {
22824
22834
  "description": "",
@@ -22855,7 +22865,7 @@
22855
22865
  "get": {
22856
22866
  "callbacks": {},
22857
22867
  "description": "Devuelve el link activo, creándolo si no existe (lazy). El secreto en claro (`url`) solo viaja cuando se acaba de crear; en llamadas siguientes se devuelve el link sin el claro (que no se puede recuperar).",
22858
- "operationId": "HablalaApiWeb.Orgs.InviteLinkController.show",
22868
+ "operationId": "get /v1/organizations/{organization_id}/invite-link",
22859
22869
  "parameters": [
22860
22870
  {
22861
22871
  "description": "",
@@ -22901,7 +22911,7 @@
22901
22911
  "post": {
22902
22912
  "callbacks": {},
22903
22913
  "description": "Revoca el link activo (si hay) y crea uno nuevo. El secreto anterior deja de canjear al instante; el nuevo claro (`url`) viaja en la respuesta.",
22904
- "operationId": "HablalaApiWeb.Orgs.InviteLinkController.rotate",
22914
+ "operationId": "post /v1/organizations/{organization_id}/invite-link/rotate",
22905
22915
  "parameters": [
22906
22916
  {
22907
22917
  "description": "",
@@ -22946,7 +22956,7 @@
22946
22956
  "/v1/organizations/{organization_id}/invoices": {
22947
22957
  "get": {
22948
22958
  "callbacks": {},
22949
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.index",
22959
+ "operationId": "get /v1/organizations/{organization_id}/invoices",
22950
22960
  "parameters": [
22951
22961
  {
22952
22962
  "description": "",
@@ -22990,7 +23000,7 @@
22990
23000
  },
22991
23001
  "post": {
22992
23002
  "callbacks": {},
22993
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.create",
23003
+ "operationId": "post /v1/organizations/{organization_id}/invoices",
22994
23004
  "parameters": [
22995
23005
  {
22996
23006
  "description": "",
@@ -23046,7 +23056,7 @@
23046
23056
  "/v1/organizations/{organization_id}/invoices/{id}": {
23047
23057
  "delete": {
23048
23058
  "callbacks": {},
23049
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.delete",
23059
+ "operationId": "delete /v1/organizations/{organization_id}/invoices/{id}",
23050
23060
  "parameters": [
23051
23061
  {
23052
23062
  "description": "",
@@ -23093,7 +23103,7 @@
23093
23103
  },
23094
23104
  "get": {
23095
23105
  "callbacks": {},
23096
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.show",
23106
+ "operationId": "get /v1/organizations/{organization_id}/invoices/{id}",
23097
23107
  "parameters": [
23098
23108
  {
23099
23109
  "description": "",
@@ -23147,7 +23157,7 @@
23147
23157
  },
23148
23158
  "patch": {
23149
23159
  "callbacks": {},
23150
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.update (2)",
23160
+ "operationId": "patch /v1/organizations/{organization_id}/invoices/{id}",
23151
23161
  "parameters": [
23152
23162
  {
23153
23163
  "description": "",
@@ -23212,7 +23222,7 @@
23212
23222
  },
23213
23223
  "put": {
23214
23224
  "callbacks": {},
23215
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.update",
23225
+ "operationId": "put /v1/organizations/{organization_id}/invoices/{id}",
23216
23226
  "parameters": [
23217
23227
  {
23218
23228
  "description": "",
@@ -23279,7 +23289,7 @@
23279
23289
  "/v1/organizations/{organization_id}/invoices/{id}/finalize": {
23280
23290
  "post": {
23281
23291
  "callbacks": {},
23282
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.finalize",
23292
+ "operationId": "post /v1/organizations/{organization_id}/invoices/{id}/finalize",
23283
23293
  "parameters": [
23284
23294
  {
23285
23295
  "description": "",
@@ -23335,7 +23345,7 @@
23335
23345
  "/v1/organizations/{organization_id}/invoices/{id}/mark-uncollectible": {
23336
23346
  "post": {
23337
23347
  "callbacks": {},
23338
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.mark_uncollectible",
23348
+ "operationId": "post /v1/organizations/{organization_id}/invoices/{id}/mark-uncollectible",
23339
23349
  "parameters": [
23340
23350
  {
23341
23351
  "description": "",
@@ -23391,7 +23401,7 @@
23391
23401
  "/v1/organizations/{organization_id}/invoices/{id}/void": {
23392
23402
  "post": {
23393
23403
  "callbacks": {},
23394
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.void",
23404
+ "operationId": "post /v1/organizations/{organization_id}/invoices/{id}/void",
23395
23405
  "parameters": [
23396
23406
  {
23397
23407
  "description": "",
@@ -23447,7 +23457,7 @@
23447
23457
  "/v1/organizations/{organization_id}/invoices/{invoice_id}/line-items": {
23448
23458
  "post": {
23449
23459
  "callbacks": {},
23450
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.add_line_item",
23460
+ "operationId": "post /v1/organizations/{organization_id}/invoices/{invoice_id}/line-items",
23451
23461
  "parameters": [
23452
23462
  {
23453
23463
  "description": "",
@@ -23514,7 +23524,7 @@
23514
23524
  "/v1/organizations/{organization_id}/invoices/{invoice_id}/line-items/{id}": {
23515
23525
  "delete": {
23516
23526
  "callbacks": {},
23517
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.remove_line_item",
23527
+ "operationId": "delete /v1/organizations/{organization_id}/invoices/{invoice_id}/line-items/{id}",
23518
23528
  "parameters": [
23519
23529
  {
23520
23530
  "description": "",
@@ -23572,7 +23582,7 @@
23572
23582
  },
23573
23583
  "patch": {
23574
23584
  "callbacks": {},
23575
- "operationId": "HablalaApiWeb.Invoicing.InvoiceController.update_line_item",
23585
+ "operationId": "patch /v1/organizations/{organization_id}/invoices/{invoice_id}/line-items/{id}",
23576
23586
  "parameters": [
23577
23587
  {
23578
23588
  "description": "",
@@ -23650,7 +23660,7 @@
23650
23660
  "/v1/organizations/{organization_id}/locations": {
23651
23661
  "get": {
23652
23662
  "callbacks": {},
23653
- "operationId": "HablalaApiWeb.Inventory.LocationController.index",
23663
+ "operationId": "get /v1/organizations/{organization_id}/locations",
23654
23664
  "parameters": [
23655
23665
  {
23656
23666
  "description": "",
@@ -23683,7 +23693,7 @@
23683
23693
  },
23684
23694
  "post": {
23685
23695
  "callbacks": {},
23686
- "operationId": "HablalaApiWeb.Inventory.LocationController.create",
23696
+ "operationId": "post /v1/organizations/{organization_id}/locations",
23687
23697
  "parameters": [
23688
23698
  {
23689
23699
  "description": "",
@@ -23740,7 +23750,7 @@
23740
23750
  "post": {
23741
23751
  "callbacks": {},
23742
23752
  "description": "Crea, si no existen, la internal inicial (Almacén) y las tres virtuales (Proveedores, Clientes, Ajustes de inventario) que balancean la doble entrada.",
23743
- "operationId": "HablalaApiWeb.Inventory.LocationController.ensure_defaults",
23753
+ "operationId": "post /v1/organizations/{organization_id}/locations/ensure-defaults",
23744
23754
  "parameters": [
23745
23755
  {
23746
23756
  "description": "",
@@ -23775,7 +23785,7 @@
23775
23785
  "/v1/organizations/{organization_id}/locations/{id}": {
23776
23786
  "get": {
23777
23787
  "callbacks": {},
23778
- "operationId": "HablalaApiWeb.Inventory.LocationController.show",
23788
+ "operationId": "get /v1/organizations/{organization_id}/locations/{id}",
23779
23789
  "parameters": [
23780
23790
  {
23781
23791
  "description": "",
@@ -23829,7 +23839,7 @@
23829
23839
  },
23830
23840
  "patch": {
23831
23841
  "callbacks": {},
23832
- "operationId": "HablalaApiWeb.Inventory.LocationController.update (2)",
23842
+ "operationId": "patch /v1/organizations/{organization_id}/locations/{id}",
23833
23843
  "parameters": [
23834
23844
  {
23835
23845
  "description": "",
@@ -23894,7 +23904,7 @@
23894
23904
  },
23895
23905
  "put": {
23896
23906
  "callbacks": {},
23897
- "operationId": "HablalaApiWeb.Inventory.LocationController.update",
23907
+ "operationId": "put /v1/organizations/{organization_id}/locations/{id}",
23898
23908
  "parameters": [
23899
23909
  {
23900
23910
  "description": "",
@@ -23961,7 +23971,7 @@
23961
23971
  "/v1/organizations/{organization_id}/mentions": {
23962
23972
  "get": {
23963
23973
  "callbacks": {},
23964
- "operationId": "HablalaApiWeb.Messaging.MentionController.index",
23974
+ "operationId": "get /v1/organizations/{organization_id}/mentions",
23965
23975
  "parameters": [
23966
23976
  {
23967
23977
  "description": "",
@@ -23997,7 +24007,7 @@
23997
24007
  "post": {
23998
24008
  "callbacks": {},
23999
24009
  "description": "La web lo llama al aprobar `…/oauth/authorize`: crea el grant aprobado y devuelve el `code` de un solo uso que el navegador reenvía al CLI vía redirect a `127.0.0.1`.",
24000
- "operationId": "HablalaApiWeb.Oauth.GrantController.create",
24010
+ "operationId": "post /v1/organizations/{organization_id}/oauth/grants",
24001
24011
  "parameters": [
24002
24012
  {
24003
24013
  "description": "",
@@ -24064,7 +24074,7 @@
24064
24074
  "post": {
24065
24075
  "callbacks": {},
24066
24076
  "description": "El consent: fija la organización del path y los permisos elegidos (intersectados con los del aprobador) en el grant. El CLI que sondea recibirá su `mat_…` en el siguiente poll.",
24067
- "operationId": "HablalaApiWeb.Oauth.GrantController.approve",
24077
+ "operationId": "post /v1/organizations/{organization_id}/oauth/grants/{user_code}/approve",
24068
24078
  "parameters": [
24069
24079
  {
24070
24080
  "description": "",
@@ -24151,7 +24161,7 @@
24151
24161
  "/v1/organizations/{organization_id}/objects": {
24152
24162
  "get": {
24153
24163
  "callbacks": {},
24154
- "operationId": "HablalaApiWeb.Data.ObjectController.index",
24164
+ "operationId": "get /v1/organizations/{organization_id}/objects",
24155
24165
  "parameters": [
24156
24166
  {
24157
24167
  "description": "",
@@ -24184,7 +24194,7 @@
24184
24194
  },
24185
24195
  "post": {
24186
24196
  "callbacks": {},
24187
- "operationId": "HablalaApiWeb.Data.ObjectController.create",
24197
+ "operationId": "post /v1/organizations/{organization_id}/objects",
24188
24198
  "parameters": [
24189
24199
  {
24190
24200
  "description": "",
@@ -24241,7 +24251,7 @@
24241
24251
  "delete": {
24242
24252
  "callbacks": {},
24243
24253
  "description": "Soft delete: marca `isArchived` en vez de borrar (los records persisten).",
24244
- "operationId": "HablalaApiWeb.Data.ObjectController.delete",
24254
+ "operationId": "delete /v1/organizations/{organization_id}/objects/{id}",
24245
24255
  "parameters": [
24246
24256
  {
24247
24257
  "description": "",
@@ -24278,7 +24288,7 @@
24278
24288
  },
24279
24289
  "get": {
24280
24290
  "callbacks": {},
24281
- "operationId": "HablalaApiWeb.Data.ObjectController.show",
24291
+ "operationId": "get /v1/organizations/{organization_id}/objects/{id}",
24282
24292
  "parameters": [
24283
24293
  {
24284
24294
  "description": "",
@@ -24332,7 +24342,7 @@
24332
24342
  },
24333
24343
  "patch": {
24334
24344
  "callbacks": {},
24335
- "operationId": "HablalaApiWeb.Data.ObjectController.update (2)",
24345
+ "operationId": "patch /v1/organizations/{organization_id}/objects/{id}",
24336
24346
  "parameters": [
24337
24347
  {
24338
24348
  "description": "",
@@ -24397,7 +24407,7 @@
24397
24407
  },
24398
24408
  "put": {
24399
24409
  "callbacks": {},
24400
- "operationId": "HablalaApiWeb.Data.ObjectController.update",
24410
+ "operationId": "put /v1/organizations/{organization_id}/objects/{id}",
24401
24411
  "parameters": [
24402
24412
  {
24403
24413
  "description": "",
@@ -24464,7 +24474,7 @@
24464
24474
  "/v1/organizations/{organization_id}/objects/{object_id}/attributes": {
24465
24475
  "get": {
24466
24476
  "callbacks": {},
24467
- "operationId": "HablalaApiWeb.Data.AttributeController.index",
24477
+ "operationId": "get /v1/organizations/{organization_id}/objects/{object_id}/attributes",
24468
24478
  "parameters": [
24469
24479
  {
24470
24480
  "description": "",
@@ -24508,7 +24518,7 @@
24508
24518
  },
24509
24519
  "post": {
24510
24520
  "callbacks": {},
24511
- "operationId": "HablalaApiWeb.Data.AttributeController.create",
24521
+ "operationId": "post /v1/organizations/{organization_id}/objects/{object_id}/attributes",
24512
24522
  "parameters": [
24513
24523
  {
24514
24524
  "description": "",
@@ -24575,7 +24585,7 @@
24575
24585
  "/v1/organizations/{organization_id}/objects/{object_id}/attributes/{id}": {
24576
24586
  "patch": {
24577
24587
  "callbacks": {},
24578
- "operationId": "HablalaApiWeb.Data.AttributeController.update (2)",
24588
+ "operationId": "patch /v1/organizations/{organization_id}/objects/{object_id}/attributes/{id}",
24579
24589
  "parameters": [
24580
24590
  {
24581
24591
  "description": "",
@@ -24651,7 +24661,7 @@
24651
24661
  },
24652
24662
  "put": {
24653
24663
  "callbacks": {},
24654
- "operationId": "HablalaApiWeb.Data.AttributeController.update",
24664
+ "operationId": "put /v1/organizations/{organization_id}/objects/{object_id}/attributes/{id}",
24655
24665
  "parameters": [
24656
24666
  {
24657
24667
  "description": "",
@@ -24729,7 +24739,7 @@
24729
24739
  "/v1/organizations/{organization_id}/objects/{object_slug}/records": {
24730
24740
  "post": {
24731
24741
  "callbacks": {},
24732
- "operationId": "HablalaApiWeb.Data.RecordController.create",
24742
+ "operationId": "post /v1/organizations/{organization_id}/objects/{object_slug}/records",
24733
24743
  "parameters": [
24734
24744
  {
24735
24745
  "description": "",
@@ -24807,7 +24817,7 @@
24807
24817
  "get": {
24808
24818
  "callbacks": {},
24809
24819
  "description": "Lista los records SOFT-DELETED del objeto (`deleted_at IS NOT NULL`), para restaurarlos. Misma lectura gobernada que `POST /query` (RBAC + ABAC por fila + field_mask + paginación keyset), sobre el otro lado de `deleted_at`. Gate RBAC: `records:delete`.",
24810
- "operationId": "HablalaApiWeb.Data.RecordController.trash",
24820
+ "operationId": "get /v1/organizations/{organization_id}/objects/{object_slug}/records/trash",
24811
24821
  "parameters": [
24812
24822
  {
24813
24823
  "description": "",
@@ -24895,7 +24905,7 @@
24895
24905
  "/v1/organizations/{organization_id}/objects/{object_slug}/records/{id}": {
24896
24906
  "delete": {
24897
24907
  "callbacks": {},
24898
- "operationId": "HablalaApiWeb.Data.RecordController.delete",
24908
+ "operationId": "delete /v1/organizations/{organization_id}/objects/{object_slug}/records/{id}",
24899
24909
  "parameters": [
24900
24910
  {
24901
24911
  "description": "",
@@ -24963,7 +24973,7 @@
24963
24973
  },
24964
24974
  "get": {
24965
24975
  "callbacks": {},
24966
- "operationId": "HablalaApiWeb.Data.RecordController.show",
24976
+ "operationId": "get /v1/organizations/{organization_id}/objects/{object_slug}/records/{id}",
24967
24977
  "parameters": [
24968
24978
  {
24969
24979
  "description": "",
@@ -25038,7 +25048,7 @@
25038
25048
  },
25039
25049
  "patch": {
25040
25050
  "callbacks": {},
25041
- "operationId": "HablalaApiWeb.Data.RecordController.update (2)",
25051
+ "operationId": "patch /v1/organizations/{organization_id}/objects/{object_slug}/records/{id}",
25042
25052
  "parameters": [
25043
25053
  {
25044
25054
  "description": "",
@@ -25134,7 +25144,7 @@
25134
25144
  },
25135
25145
  "put": {
25136
25146
  "callbacks": {},
25137
- "operationId": "HablalaApiWeb.Data.RecordController.update",
25147
+ "operationId": "put /v1/organizations/{organization_id}/objects/{object_slug}/records/{id}",
25138
25148
  "parameters": [
25139
25149
  {
25140
25150
  "description": "",
@@ -25233,7 +25243,7 @@
25233
25243
  "get": {
25234
25244
  "callbacks": {},
25235
25245
  "description": "Devuelve cuántos edges se desvincularían y qué referencias core BLOQUEARÍAN el borrado (restrict-on-delete), sin mutar nada. Alimenta la confirmación dependent-aware de la UI. Misma fuente que el guard del borrado real, así que preview y borrado no divergen. Gate `records:delete` + ABAC de escritura por fila.",
25236
- "operationId": "HablalaApiWeb.Data.RecordController.dependencies",
25246
+ "operationId": "get /v1/organizations/{organization_id}/objects/{object_slug}/records/{record_id}/dependencies",
25237
25247
  "parameters": [
25238
25248
  {
25239
25249
  "description": "",
@@ -25310,7 +25320,7 @@
25310
25320
  "/v1/organizations/{organization_id}/objects/{object_slug}/records/{record_id}/events": {
25311
25321
  "get": {
25312
25322
  "callbacks": {},
25313
- "operationId": "HablalaApiWeb.Data.EventController.index",
25323
+ "operationId": "get /v1/organizations/{organization_id}/objects/{object_slug}/records/{record_id}/events",
25314
25324
  "parameters": [
25315
25325
  {
25316
25326
  "description": "",
@@ -25367,7 +25377,7 @@
25367
25377
  "/v1/organizations/{organization_id}/objects/{object_slug}/records/{record_id}/restore": {
25368
25378
  "post": {
25369
25379
  "callbacks": {},
25370
- "operationId": "HablalaApiWeb.Data.RecordController.restore",
25380
+ "operationId": "post /v1/organizations/{organization_id}/objects/{object_slug}/records/{record_id}/restore",
25371
25381
  "parameters": [
25372
25382
  {
25373
25383
  "description": "",
@@ -25454,7 +25464,7 @@
25454
25464
  "/v1/organizations/{organization_id}/organization_membership": {
25455
25465
  "delete": {
25456
25466
  "callbacks": {},
25457
- "operationId": "HablalaApiWeb.Orgs.MembershipController.leave",
25467
+ "operationId": "delete /v1/organizations/{organization_id}/organization_membership",
25458
25468
  "parameters": [
25459
25469
  {
25460
25470
  "description": "",
@@ -25492,7 +25502,7 @@
25492
25502
  "/v1/organizations/{organization_id}/organization_memberships": {
25493
25503
  "get": {
25494
25504
  "callbacks": {},
25495
- "operationId": "HablalaApiWeb.Orgs.MembershipController.index",
25505
+ "operationId": "get /v1/organizations/{organization_id}/organization_memberships",
25496
25506
  "parameters": [
25497
25507
  {
25498
25508
  "description": "",
@@ -25538,7 +25548,7 @@
25538
25548
  "get": {
25539
25549
  "callbacks": {},
25540
25550
  "description": "Paridad con el descubrimiento personal (`/v1/me/people/lookup`): resuelve un miembro del tenant por email exacto sin listar a todos. Devuelve `data: null` si nadie coincide.",
25541
- "operationId": "HablalaApiWeb.Orgs.MembershipController.lookup",
25551
+ "operationId": "get /v1/organizations/{organization_id}/organization_memberships/lookup",
25542
25552
  "parameters": [
25543
25553
  {
25544
25554
  "description": "",
@@ -25584,7 +25594,7 @@
25584
25594
  "/v1/organizations/{organization_id}/organization_memberships/{id}": {
25585
25595
  "delete": {
25586
25596
  "callbacks": {},
25587
- "operationId": "HablalaApiWeb.Orgs.MembershipController.delete",
25597
+ "operationId": "delete /v1/organizations/{organization_id}/organization_memberships/{id}",
25588
25598
  "parameters": [
25589
25599
  {
25590
25600
  "description": "",
@@ -25631,7 +25641,7 @@
25631
25641
  },
25632
25642
  "get": {
25633
25643
  "callbacks": {},
25634
- "operationId": "HablalaApiWeb.Orgs.MembershipController.show",
25644
+ "operationId": "get /v1/organizations/{organization_id}/organization_memberships/{id}",
25635
25645
  "parameters": [
25636
25646
  {
25637
25647
  "description": "",
@@ -25686,7 +25696,7 @@
25686
25696
  "patch": {
25687
25697
  "callbacks": {},
25688
25698
  "description": "Perfil por-organización: nombre visible, puesto, avatar y estado. Editar el propio siempre se permite; el de otro miembro requiere `organization_memberships:update`.",
25689
- "operationId": "HablalaApiWeb.Orgs.MembershipController.update (2)",
25699
+ "operationId": "patch /v1/organizations/{organization_id}/organization_memberships/{id}",
25690
25700
  "parameters": [
25691
25701
  {
25692
25702
  "description": "",
@@ -25762,7 +25772,7 @@
25762
25772
  "put": {
25763
25773
  "callbacks": {},
25764
25774
  "description": "Perfil por-organización: nombre visible, puesto, avatar y estado. Editar el propio siempre se permite; el de otro miembro requiere `organization_memberships:update`.",
25765
- "operationId": "HablalaApiWeb.Orgs.MembershipController.update",
25775
+ "operationId": "put /v1/organizations/{organization_id}/organization_memberships/{id}",
25766
25776
  "parameters": [
25767
25777
  {
25768
25778
  "description": "",
@@ -25840,7 +25850,7 @@
25840
25850
  "put": {
25841
25851
  "callbacks": {},
25842
25852
  "description": "Acción de administración (requiere `organization_memberships:update`). Semántica PUT: la membresía queda con exactamente los roles indicados. Los ids de rol de otra organización se ignoran.",
25843
- "operationId": "HablalaApiWeb.Orgs.MembershipController.update_roles",
25853
+ "operationId": "put /v1/organizations/{organization_id}/organization_memberships/{membership_id}/roles",
25844
25854
  "parameters": [
25845
25855
  {
25846
25856
  "description": "",
@@ -25917,7 +25927,7 @@
25917
25927
  "/v1/organizations/{organization_id}/payments": {
25918
25928
  "get": {
25919
25929
  "callbacks": {},
25920
- "operationId": "HablalaApiWeb.Invoicing.PaymentController.index",
25930
+ "operationId": "get /v1/organizations/{organization_id}/payments",
25921
25931
  "parameters": [
25922
25932
  {
25923
25933
  "description": "",
@@ -25961,7 +25971,7 @@
25961
25971
  },
25962
25972
  "post": {
25963
25973
  "callbacks": {},
25964
- "operationId": "HablalaApiWeb.Invoicing.PaymentController.create",
25974
+ "operationId": "post /v1/organizations/{organization_id}/payments",
25965
25975
  "parameters": [
25966
25976
  {
25967
25977
  "description": "",
@@ -26028,7 +26038,7 @@
26028
26038
  "/v1/organizations/{organization_id}/payments/{id}": {
26029
26039
  "get": {
26030
26040
  "callbacks": {},
26031
- "operationId": "HablalaApiWeb.Invoicing.PaymentController.show",
26041
+ "operationId": "get /v1/organizations/{organization_id}/payments/{id}",
26032
26042
  "parameters": [
26033
26043
  {
26034
26044
  "description": "",
@@ -26084,7 +26094,7 @@
26084
26094
  "/v1/organizations/{organization_id}/payments/{id}/attach": {
26085
26095
  "post": {
26086
26096
  "callbacks": {},
26087
- "operationId": "HablalaApiWeb.Invoicing.PaymentController.attach",
26097
+ "operationId": "post /v1/organizations/{organization_id}/payments/{id}/attach",
26088
26098
  "parameters": [
26089
26099
  {
26090
26100
  "description": "",
@@ -26151,7 +26161,7 @@
26151
26161
  "/v1/organizations/{organization_id}/payments/{id}/cancel": {
26152
26162
  "post": {
26153
26163
  "callbacks": {},
26154
- "operationId": "HablalaApiWeb.Invoicing.PaymentController.cancel",
26164
+ "operationId": "post /v1/organizations/{organization_id}/payments/{id}/cancel",
26155
26165
  "parameters": [
26156
26166
  {
26157
26167
  "description": "",
@@ -26207,7 +26217,7 @@
26207
26217
  "/v1/organizations/{organization_id}/payments/{id}/succeed": {
26208
26218
  "post": {
26209
26219
  "callbacks": {},
26210
- "operationId": "HablalaApiWeb.Invoicing.PaymentController.succeed",
26220
+ "operationId": "post /v1/organizations/{organization_id}/payments/{id}/succeed",
26211
26221
  "parameters": [
26212
26222
  {
26213
26223
  "description": "",
@@ -26264,7 +26274,7 @@
26264
26274
  "get": {
26265
26275
  "callbacks": {},
26266
26276
  "description": "El conjunto completo de permisos posibles (`recurso:accion`) que puede tener un rol. Lo consume el editor de roles para pintar cada toggle on/off.",
26267
- "operationId": "HablalaApiWeb.Orgs.RoleController.permissions",
26277
+ "operationId": "get /v1/organizations/{organization_id}/permissions",
26268
26278
  "parameters": [
26269
26279
  {
26270
26280
  "description": "",
@@ -26309,7 +26319,7 @@
26309
26319
  "/v1/organizations/{organization_id}/policies": {
26310
26320
  "get": {
26311
26321
  "callbacks": {},
26312
- "operationId": "HablalaApiWeb.Orgs.PolicyController.index",
26322
+ "operationId": "get /v1/organizations/{organization_id}/policies",
26313
26323
  "parameters": [
26314
26324
  {
26315
26325
  "description": "",
@@ -26352,7 +26362,7 @@
26352
26362
  },
26353
26363
  "post": {
26354
26364
  "callbacks": {},
26355
- "operationId": "HablalaApiWeb.Orgs.PolicyController.create",
26365
+ "operationId": "post /v1/organizations/{organization_id}/policies",
26356
26366
  "parameters": [
26357
26367
  {
26358
26368
  "description": "",
@@ -26418,7 +26428,7 @@
26418
26428
  "/v1/organizations/{organization_id}/policies/{id}": {
26419
26429
  "delete": {
26420
26430
  "callbacks": {},
26421
- "operationId": "HablalaApiWeb.Orgs.PolicyController.delete",
26431
+ "operationId": "delete /v1/organizations/{organization_id}/policies/{id}",
26422
26432
  "parameters": [
26423
26433
  {
26424
26434
  "description": "",
@@ -26465,7 +26475,7 @@
26465
26475
  },
26466
26476
  "get": {
26467
26477
  "callbacks": {},
26468
- "operationId": "HablalaApiWeb.Orgs.PolicyController.show",
26478
+ "operationId": "get /v1/organizations/{organization_id}/policies/{id}",
26469
26479
  "parameters": [
26470
26480
  {
26471
26481
  "description": "",
@@ -26519,7 +26529,7 @@
26519
26529
  },
26520
26530
  "patch": {
26521
26531
  "callbacks": {},
26522
- "operationId": "HablalaApiWeb.Orgs.PolicyController.update (2)",
26532
+ "operationId": "patch /v1/organizations/{organization_id}/policies/{id}",
26523
26533
  "parameters": [
26524
26534
  {
26525
26535
  "description": "",
@@ -26584,7 +26594,7 @@
26584
26594
  },
26585
26595
  "put": {
26586
26596
  "callbacks": {},
26587
- "operationId": "HablalaApiWeb.Orgs.PolicyController.update",
26597
+ "operationId": "put /v1/organizations/{organization_id}/policies/{id}",
26588
26598
  "parameters": [
26589
26599
  {
26590
26600
  "description": "",
@@ -26652,7 +26662,7 @@
26652
26662
  "post": {
26653
26663
  "callbacks": {},
26654
26664
  "description": "Compila una consulta lógica (object/select/where/include/semantic/order_by) a SQL con permisos inyectados y devuelve las filas mapeadas a slugs. Único camino de lectura rica.",
26655
- "operationId": "HablalaApiWeb.Data.QueryController.create",
26665
+ "operationId": "post /v1/organizations/{organization_id}/query",
26656
26666
  "parameters": [
26657
26667
  {
26658
26668
  "description": "",
@@ -26728,7 +26738,7 @@
26728
26738
  "/v1/organizations/{organization_id}/relationships": {
26729
26739
  "get": {
26730
26740
  "callbacks": {},
26731
- "operationId": "HablalaApiWeb.Data.RelationshipController.index",
26741
+ "operationId": "get /v1/organizations/{organization_id}/relationships",
26732
26742
  "parameters": [
26733
26743
  {
26734
26744
  "description": "",
@@ -26761,7 +26771,7 @@
26761
26771
  },
26762
26772
  "post": {
26763
26773
  "callbacks": {},
26764
- "operationId": "HablalaApiWeb.Data.RelationshipController.create",
26774
+ "operationId": "post /v1/organizations/{organization_id}/relationships",
26765
26775
  "parameters": [
26766
26776
  {
26767
26777
  "description": "",
@@ -26817,7 +26827,7 @@
26817
26827
  "/v1/organizations/{organization_id}/relationships/{id}": {
26818
26828
  "get": {
26819
26829
  "callbacks": {},
26820
- "operationId": "HablalaApiWeb.Data.RelationshipController.show",
26830
+ "operationId": "get /v1/organizations/{organization_id}/relationships/{id}",
26821
26831
  "parameters": [
26822
26832
  {
26823
26833
  "description": "",
@@ -26873,7 +26883,7 @@
26873
26883
  "/v1/organizations/{organization_id}/roles": {
26874
26884
  "get": {
26875
26885
  "callbacks": {},
26876
- "operationId": "HablalaApiWeb.Orgs.RoleController.index",
26886
+ "operationId": "get /v1/organizations/{organization_id}/roles",
26877
26887
  "parameters": [
26878
26888
  {
26879
26889
  "description": "",
@@ -26916,7 +26926,7 @@
26916
26926
  },
26917
26927
  "post": {
26918
26928
  "callbacks": {},
26919
- "operationId": "HablalaApiWeb.Orgs.RoleController.create",
26929
+ "operationId": "post /v1/organizations/{organization_id}/roles",
26920
26930
  "parameters": [
26921
26931
  {
26922
26932
  "description": "",
@@ -26982,7 +26992,7 @@
26982
26992
  "/v1/organizations/{organization_id}/roles/{id}": {
26983
26993
  "delete": {
26984
26994
  "callbacks": {},
26985
- "operationId": "HablalaApiWeb.Orgs.RoleController.delete",
26995
+ "operationId": "delete /v1/organizations/{organization_id}/roles/{id}",
26986
26996
  "parameters": [
26987
26997
  {
26988
26998
  "description": "",
@@ -27029,7 +27039,7 @@
27029
27039
  },
27030
27040
  "get": {
27031
27041
  "callbacks": {},
27032
- "operationId": "HablalaApiWeb.Orgs.RoleController.show",
27042
+ "operationId": "get /v1/organizations/{organization_id}/roles/{id}",
27033
27043
  "parameters": [
27034
27044
  {
27035
27045
  "description": "",
@@ -27083,7 +27093,7 @@
27083
27093
  },
27084
27094
  "patch": {
27085
27095
  "callbacks": {},
27086
- "operationId": "HablalaApiWeb.Orgs.RoleController.update (2)",
27096
+ "operationId": "patch /v1/organizations/{organization_id}/roles/{id}",
27087
27097
  "parameters": [
27088
27098
  {
27089
27099
  "description": "",
@@ -27148,7 +27158,7 @@
27148
27158
  },
27149
27159
  "put": {
27150
27160
  "callbacks": {},
27151
- "operationId": "HablalaApiWeb.Orgs.RoleController.update",
27161
+ "operationId": "put /v1/organizations/{organization_id}/roles/{id}",
27152
27162
  "parameters": [
27153
27163
  {
27154
27164
  "description": "",
@@ -27215,7 +27225,7 @@
27215
27225
  "/v1/organizations/{organization_id}/schedules": {
27216
27226
  "get": {
27217
27227
  "callbacks": {},
27218
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.index",
27228
+ "operationId": "get /v1/organizations/{organization_id}/schedules",
27219
27229
  "parameters": [
27220
27230
  {
27221
27231
  "description": "",
@@ -27258,7 +27268,7 @@
27258
27268
  },
27259
27269
  "post": {
27260
27270
  "callbacks": {},
27261
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.create",
27271
+ "operationId": "post /v1/organizations/{organization_id}/schedules",
27262
27272
  "parameters": [
27263
27273
  {
27264
27274
  "description": "",
@@ -27314,7 +27324,7 @@
27314
27324
  "/v1/organizations/{organization_id}/schedules/{id}": {
27315
27325
  "delete": {
27316
27326
  "callbacks": {},
27317
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.delete",
27327
+ "operationId": "delete /v1/organizations/{organization_id}/schedules/{id}",
27318
27328
  "parameters": [
27319
27329
  {
27320
27330
  "description": "",
@@ -27351,7 +27361,7 @@
27351
27361
  },
27352
27362
  "get": {
27353
27363
  "callbacks": {},
27354
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.show",
27364
+ "operationId": "get /v1/organizations/{organization_id}/schedules/{id}",
27355
27365
  "parameters": [
27356
27366
  {
27357
27367
  "description": "",
@@ -27405,7 +27415,7 @@
27405
27415
  },
27406
27416
  "patch": {
27407
27417
  "callbacks": {},
27408
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.update (2)",
27418
+ "operationId": "patch /v1/organizations/{organization_id}/schedules/{id}",
27409
27419
  "parameters": [
27410
27420
  {
27411
27421
  "description": "",
@@ -27470,7 +27480,7 @@
27470
27480
  },
27471
27481
  "put": {
27472
27482
  "callbacks": {},
27473
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.update",
27483
+ "operationId": "put /v1/organizations/{organization_id}/schedules/{id}",
27474
27484
  "parameters": [
27475
27485
  {
27476
27486
  "description": "",
@@ -27537,7 +27547,7 @@
27537
27547
  "/v1/organizations/{organization_id}/schedules/{schedule_id}/availabilities": {
27538
27548
  "post": {
27539
27549
  "callbacks": {},
27540
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.add_availability",
27550
+ "operationId": "post /v1/organizations/{organization_id}/schedules/{schedule_id}/availabilities",
27541
27551
  "parameters": [
27542
27552
  {
27543
27553
  "description": "",
@@ -27604,7 +27614,7 @@
27604
27614
  "/v1/organizations/{organization_id}/schedules/{schedule_id}/availabilities/{id}": {
27605
27615
  "delete": {
27606
27616
  "callbacks": {},
27607
- "operationId": "HablalaApiWeb.Scheduling.ScheduleController.remove_availability",
27617
+ "operationId": "delete /v1/organizations/{organization_id}/schedules/{schedule_id}/availabilities/{id}",
27608
27618
  "parameters": [
27609
27619
  {
27610
27620
  "description": "",
@@ -27654,7 +27664,7 @@
27654
27664
  "/v1/organizations/{organization_id}/stock-movements": {
27655
27665
  "get": {
27656
27666
  "callbacks": {},
27657
- "operationId": "HablalaApiWeb.Inventory.StockMovementController.index",
27667
+ "operationId": "get /v1/organizations/{organization_id}/stock-movements",
27658
27668
  "parameters": [
27659
27669
  {
27660
27670
  "description": "",
@@ -27731,7 +27741,7 @@
27731
27741
  },
27732
27742
  "post": {
27733
27743
  "callbacks": {},
27734
- "operationId": "HablalaApiWeb.Inventory.StockMovementController.create",
27744
+ "operationId": "post /v1/organizations/{organization_id}/stock-movements",
27735
27745
  "parameters": [
27736
27746
  {
27737
27747
  "description": "",
@@ -27798,7 +27808,7 @@
27798
27808
  "/v1/organizations/{organization_id}/stock-movements/adjust": {
27799
27809
  "post": {
27800
27810
  "callbacks": {},
27801
- "operationId": "HablalaApiWeb.Inventory.StockMovementController.adjust",
27811
+ "operationId": "post /v1/organizations/{organization_id}/stock-movements/adjust",
27802
27812
  "parameters": [
27803
27813
  {
27804
27814
  "description": "",
@@ -27854,7 +27864,7 @@
27854
27864
  "/v1/organizations/{organization_id}/stock-movements/levels": {
27855
27865
  "get": {
27856
27866
  "callbacks": {},
27857
- "operationId": "HablalaApiWeb.Inventory.StockMovementController.stock_levels",
27867
+ "operationId": "get /v1/organizations/{organization_id}/stock-movements/levels",
27858
27868
  "parameters": [
27859
27869
  {
27860
27870
  "description": "",
@@ -27900,7 +27910,7 @@
27900
27910
  "/v1/organizations/{organization_id}/stock-movements/{id}": {
27901
27911
  "get": {
27902
27912
  "callbacks": {},
27903
- "operationId": "HablalaApiWeb.Inventory.StockMovementController.show",
27913
+ "operationId": "get /v1/organizations/{organization_id}/stock-movements/{id}",
27904
27914
  "parameters": [
27905
27915
  {
27906
27916
  "description": "",
@@ -27957,7 +27967,7 @@
27957
27967
  "post": {
27958
27968
  "callbacks": {},
27959
27969
  "description": "Devuelve un sobre auto-descriptivo para subir un archivo directo al object storage. Según `method`: `POST` → form multipart con `fields` + el archivo como campo `file` (S3/R2 POST policy, con tope de tamaño firmado en el borde); `PUT` → PUT del blob a `url` con `headers` (adaptador local de dev). Luego se referencia `fileUrl`. (El camino personal usa `HablalaApiWeb.Me.UploadController` en `/v1/me/uploads/presign`.)",
27960
- "operationId": "HablalaApiWeb.UploadController.presign",
27970
+ "operationId": "post /v1/organizations/{organization_id}/uploads/presign",
27961
27971
  "parameters": [
27962
27972
  {
27963
27973
  "description": "",
@@ -28014,7 +28024,7 @@
28014
28024
  "get": {
28015
28025
  "callbacks": {},
28016
28026
  "description": "Los webhook endpoints de la organización (solo metadatos; el signing secret se obtiene con `GET .../:id/secret`).",
28017
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.index",
28027
+ "operationId": "get /v1/organizations/{organization_id}/webhooks",
28018
28028
  "parameters": [
28019
28029
  {
28020
28030
  "description": "",
@@ -28048,7 +28058,7 @@
28048
28058
  "post": {
28049
28059
  "callbacks": {},
28050
28060
  "description": "Suscribe una URL a eventos del event store. La plataforma genera el **signing secret** (`whsec_…`) y lo incluye en esta respuesta (`secret`); con él el receptor verifica la firma de cada entrega (spec Standard Webhooks). También puede recuperarse después con `GET .../:id/secret`.",
28051
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.create",
28061
+ "operationId": "post /v1/organizations/{organization_id}/webhooks",
28052
28062
  "parameters": [
28053
28063
  {
28054
28064
  "description": "",
@@ -28115,7 +28125,7 @@
28115
28125
  "delete": {
28116
28126
  "callbacks": {},
28117
28127
  "description": "Elimina el endpoint y su historial de deliveries. Deja de recibir entregas.",
28118
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.delete",
28128
+ "operationId": "delete /v1/organizations/{organization_id}/webhooks/{id}",
28119
28129
  "parameters": [
28120
28130
  {
28121
28131
  "description": "",
@@ -28162,7 +28172,7 @@
28162
28172
  },
28163
28173
  "get": {
28164
28174
  "callbacks": {},
28165
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.show",
28175
+ "operationId": "get /v1/organizations/{organization_id}/webhooks/{id}",
28166
28176
  "parameters": [
28167
28177
  {
28168
28178
  "description": "",
@@ -28217,7 +28227,7 @@
28217
28227
  "patch": {
28218
28228
  "callbacks": {},
28219
28229
  "description": "Cambia `url`/`enabledEvents`/`status`. Reactivar (`status: \"enabled\"`) un endpoint auto-deshabilitado limpia el motivo del disable. El slug y el secret no se tocan aquí.",
28220
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.update (2)",
28230
+ "operationId": "patch /v1/organizations/{organization_id}/webhooks/{id}",
28221
28231
  "parameters": [
28222
28232
  {
28223
28233
  "description": "",
@@ -28283,7 +28293,7 @@
28283
28293
  "put": {
28284
28294
  "callbacks": {},
28285
28295
  "description": "Cambia `url`/`enabledEvents`/`status`. Reactivar (`status: \"enabled\"`) un endpoint auto-deshabilitado limpia el motivo del disable. El slug y el secret no se tocan aquí.",
28286
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.update",
28296
+ "operationId": "put /v1/organizations/{organization_id}/webhooks/{id}",
28287
28297
  "parameters": [
28288
28298
  {
28289
28299
  "description": "",
@@ -28351,7 +28361,7 @@
28351
28361
  "get": {
28352
28362
  "callbacks": {},
28353
28363
  "description": "La bitácora de entregas (canónico GitHub): qué eventos se entregaron, cuántos intentos costaron y con qué respondió el receptor. Más recientes primero (máx. 50).",
28354
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.deliveries",
28364
+ "operationId": "get /v1/organizations/{organization_id}/webhooks/{id}/deliveries",
28355
28365
  "parameters": [
28356
28366
  {
28357
28367
  "description": "",
@@ -28398,7 +28408,7 @@
28398
28408
  "post": {
28399
28409
  "callbacks": {},
28400
28410
  "description": "Genera un `whsec_…` nuevo para el MISMO endpoint (el historial no cambia). El secret viejo deja de firmar de inmediato: actualiza la copia del receptor. La respuesta incluye el nuevo secret.",
28401
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.rotate",
28411
+ "operationId": "post /v1/organizations/{organization_id}/webhooks/{id}/rotate",
28402
28412
  "parameters": [
28403
28413
  {
28404
28414
  "description": "",
@@ -28445,7 +28455,7 @@
28445
28455
  "get": {
28446
28456
  "callbacks": {},
28447
28457
  "description": "El `whsec_…` del endpoint, para configurarlo en el receptor (modelo Svix `GET .../secret` / Stripe dashboard \"Reveal\"). Es una llave de firma compartida, no una credencial de autenticación entrante: por eso es recuperable, a diferencia de `sk_`/`mat_`.",
28448
- "operationId": "HablalaApiWeb.Webhooks.WebhookController.secret",
28458
+ "operationId": "get /v1/organizations/{organization_id}/webhooks/{id}/secret",
28449
28459
  "parameters": [
28450
28460
  {
28451
28461
  "description": "",
@@ -28492,7 +28502,7 @@
28492
28502
  "get": {
28493
28503
  "callbacks": {},
28494
28504
  "description": "Corridas de la organización, más recientes primero (máx. 50).",
28495
- "operationId": "HablalaApiWeb.Workflows.WorkflowExecutionController.index",
28505
+ "operationId": "get /v1/organizations/{organization_id}/workflow-executions",
28496
28506
  "parameters": [
28497
28507
  {
28498
28508
  "description": "",
@@ -28559,7 +28569,7 @@
28559
28569
  "/v1/organizations/{organization_id}/workflow-executions/{id}": {
28560
28570
  "get": {
28561
28571
  "callbacks": {},
28562
- "operationId": "HablalaApiWeb.Workflows.WorkflowExecutionController.show",
28572
+ "operationId": "get /v1/organizations/{organization_id}/workflow-executions/{id}",
28563
28573
  "parameters": [
28564
28574
  {
28565
28575
  "description": "",
@@ -28616,7 +28626,7 @@
28616
28626
  "post": {
28617
28627
  "callbacks": {},
28618
28628
  "description": "Entrega una señal externa a una ejecución detenida en un estado de espera (patrón human task, ADR-017). Requiere `workflows:signal`; si el estado de espera declara la tarea (`task_key`), además se evalúa la policy ABAC `signal` sobre ese record. La ejecución avanza de forma asíncrona: la respuesta confirma la entrega del signal.",
28619
- "operationId": "HablalaApiWeb.Workflows.WorkflowExecutionController.signal",
28629
+ "operationId": "post /v1/organizations/{organization_id}/workflow-executions/{id}/signals",
28620
28630
  "parameters": [
28621
28631
  {
28622
28632
  "description": "",
@@ -28714,7 +28724,7 @@
28714
28724
  "get": {
28715
28725
  "callbacks": {},
28716
28726
  "description": "Todas las definiciones de la organización (incluye archivadas).",
28717
- "operationId": "HablalaApiWeb.Workflows.WorkflowDefinitionController.index",
28727
+ "operationId": "get /v1/organizations/{organization_id}/workflows",
28718
28728
  "parameters": [
28719
28729
  {
28720
28730
  "description": "",
@@ -28757,7 +28767,7 @@
28757
28767
  },
28758
28768
  "post": {
28759
28769
  "callbacks": {},
28760
- "operationId": "HablalaApiWeb.Workflows.WorkflowDefinitionController.create",
28770
+ "operationId": "post /v1/organizations/{organization_id}/workflows",
28761
28771
  "parameters": [
28762
28772
  {
28763
28773
  "description": "",
@@ -28824,7 +28834,7 @@
28824
28834
  "delete": {
28825
28835
  "callbacks": {},
28826
28836
  "description": "Soft-delete: marca la definición como archivada. Deja de disparar triggers nuevos; sus ejecuciones históricas se conservan.",
28827
- "operationId": "HablalaApiWeb.Workflows.WorkflowDefinitionController.delete",
28837
+ "operationId": "delete /v1/organizations/{organization_id}/workflows/{id}",
28828
28838
  "parameters": [
28829
28839
  {
28830
28840
  "description": "",
@@ -28871,7 +28881,7 @@
28871
28881
  },
28872
28882
  "get": {
28873
28883
  "callbacks": {},
28874
- "operationId": "HablalaApiWeb.Workflows.WorkflowDefinitionController.show",
28884
+ "operationId": "get /v1/organizations/{organization_id}/workflows/{id}",
28875
28885
  "parameters": [
28876
28886
  {
28877
28887
  "description": "",
@@ -28925,7 +28935,7 @@
28925
28935
  },
28926
28936
  "patch": {
28927
28937
  "callbacks": {},
28928
- "operationId": "HablalaApiWeb.Workflows.WorkflowDefinitionController.update (2)",
28938
+ "operationId": "patch /v1/organizations/{organization_id}/workflows/{id}",
28929
28939
  "parameters": [
28930
28940
  {
28931
28941
  "description": "",
@@ -28990,7 +29000,7 @@
28990
29000
  },
28991
29001
  "put": {
28992
29002
  "callbacks": {},
28993
- "operationId": "HablalaApiWeb.Workflows.WorkflowDefinitionController.update",
29003
+ "operationId": "put /v1/organizations/{organization_id}/workflows/{id}",
28994
29004
  "parameters": [
28995
29005
  {
28996
29006
  "description": "",
@@ -29057,7 +29067,7 @@
29057
29067
  "/v1/policies": {
29058
29068
  "get": {
29059
29069
  "callbacks": {},
29060
- "operationId": "HablalaApiWeb.Machine.PolicyController.index",
29070
+ "operationId": "get /v1/policies",
29061
29071
  "parameters": [],
29062
29072
  "responses": {
29063
29073
  "200": {
@@ -29088,7 +29098,7 @@
29088
29098
  },
29089
29099
  "post": {
29090
29100
  "callbacks": {},
29091
- "operationId": "HablalaApiWeb.Machine.PolicyController.create",
29101
+ "operationId": "post /v1/policies",
29092
29102
  "parameters": [],
29093
29103
  "requestBody": {
29094
29104
  "content": {
@@ -29142,7 +29152,7 @@
29142
29152
  "/v1/policies/{id}": {
29143
29153
  "delete": {
29144
29154
  "callbacks": {},
29145
- "operationId": "HablalaApiWeb.Machine.PolicyController.delete",
29155
+ "operationId": "delete /v1/policies/{id}",
29146
29156
  "parameters": [
29147
29157
  {
29148
29158
  "description": "",
@@ -29178,7 +29188,7 @@
29178
29188
  },
29179
29189
  "get": {
29180
29190
  "callbacks": {},
29181
- "operationId": "HablalaApiWeb.Machine.PolicyController.show",
29191
+ "operationId": "get /v1/policies/{id}",
29182
29192
  "parameters": [
29183
29193
  {
29184
29194
  "description": "",
@@ -29221,7 +29231,7 @@
29221
29231
  },
29222
29232
  "patch": {
29223
29233
  "callbacks": {},
29224
- "operationId": "HablalaApiWeb.Machine.PolicyController.update (2)",
29234
+ "operationId": "patch /v1/policies/{id}",
29225
29235
  "parameters": [
29226
29236
  {
29227
29237
  "description": "",
@@ -29275,7 +29285,7 @@
29275
29285
  },
29276
29286
  "put": {
29277
29287
  "callbacks": {},
29278
- "operationId": "HablalaApiWeb.Machine.PolicyController.update",
29288
+ "operationId": "put /v1/policies/{id}",
29279
29289
  "parameters": [
29280
29290
  {
29281
29291
  "description": "",
@@ -29332,7 +29342,7 @@
29332
29342
  "post": {
29333
29343
  "callbacks": {},
29334
29344
  "description": "Crea el record `customer` y su credencial de login (email + password), y devuelve un end-user session token (`sess_…`). Si la request trae un end-user session token anónimo, la sesión se identifica (merge del carrito). La organización sale de la API key.",
29335
- "operationId": "HablalaApiWeb.PublicApi.EndUserSessionController.register",
29345
+ "operationId": "post /v1/public/end-users",
29336
29346
  "parameters": [],
29337
29347
  "requestBody": {
29338
29348
  "content": {
@@ -29402,7 +29412,7 @@
29402
29412
  "delete": {
29403
29413
  "callbacks": {},
29404
29414
  "description": "Revoca el end-user session token de la request. Idempotente.",
29405
- "operationId": "HablalaApiWeb.PublicApi.EndUserSessionController.delete",
29415
+ "operationId": "delete /v1/public/end-users/session",
29406
29416
  "parameters": [],
29407
29417
  "responses": {
29408
29418
  "204": {
@@ -29422,7 +29432,7 @@
29422
29432
  "post": {
29423
29433
  "callbacks": {},
29424
29434
  "description": "Verifica email + password y devuelve un end-user session token (`sess_…`). Si la request trae un end-user session token anónimo, la sesión se identifica (merge). La organización sale de la API key.",
29425
- "operationId": "HablalaApiWeb.PublicApi.EndUserSessionController.create",
29435
+ "operationId": "post /v1/public/end-users/session",
29426
29436
  "parameters": [],
29427
29437
  "requestBody": {
29428
29438
  "content": {
@@ -29472,7 +29482,7 @@
29472
29482
  "post": {
29473
29483
  "callbacks": {},
29474
29484
  "description": "Crea un pedido atómicamente: valida stock por variante, numera (#1001), crea el `order` (source = web, financial_status = pending) + sus renglones con snapshots de precio, y decrementa el inventario. Autenticado por end-user session token; el comprador sale de la sesión (no del cuerpo). Idempotente vía el header `Idempotency-Key`.",
29475
- "operationId": "HablalaApiWeb.PublicApi.CheckoutController.create",
29485
+ "operationId": "post /v1/public/me/checkout",
29476
29486
  "parameters": [
29477
29487
  {
29478
29488
  "description": "Clave de idempotencia (estándar Stripe): dos envíos con la misma → un pedido.",
@@ -29563,7 +29573,7 @@
29563
29573
  "/v1/public/me/objects/{object_slug}/records": {
29564
29574
  "post": {
29565
29575
  "callbacks": {},
29566
- "operationId": "HablalaApiWeb.PublicApi.RecordController.create (2)",
29576
+ "operationId": "post /v1/public/me/objects/{object_slug}/records",
29567
29577
  "parameters": [
29568
29578
  {
29569
29579
  "description": "",
@@ -29629,7 +29639,7 @@
29629
29639
  "/v1/public/me/objects/{object_slug}/records/{id}": {
29630
29640
  "delete": {
29631
29641
  "callbacks": {},
29632
- "operationId": "HablalaApiWeb.PublicApi.RecordController.delete",
29642
+ "operationId": "delete /v1/public/me/objects/{object_slug}/records/{id}",
29633
29643
  "parameters": [
29634
29644
  {
29635
29645
  "description": "",
@@ -29686,7 +29696,7 @@
29686
29696
  },
29687
29697
  "patch": {
29688
29698
  "callbacks": {},
29689
- "operationId": "HablalaApiWeb.PublicApi.RecordController.update (2)",
29699
+ "operationId": "patch /v1/public/me/objects/{object_slug}/records/{id}",
29690
29700
  "parameters": [
29691
29701
  {
29692
29702
  "description": "",
@@ -29771,7 +29781,7 @@
29771
29781
  },
29772
29782
  "put": {
29773
29783
  "callbacks": {},
29774
- "operationId": "HablalaApiWeb.PublicApi.RecordController.update",
29784
+ "operationId": "put /v1/public/me/objects/{object_slug}/records/{id}",
29775
29785
  "parameters": [
29776
29786
  {
29777
29787
  "description": "",
@@ -29859,7 +29869,7 @@
29859
29869
  "post": {
29860
29870
  "callbacks": {},
29861
29871
  "description": "Como el staged upload del canal de máquina (`POST /v1/objects/{object_slug}/uploads`), pero gobernado por el ABAC default-deny del canal público: exige una policy `allow` de `create` o `update` para el principal (`public` con la API key; `end_user` con el session token en la variante `/me`) sobre el object — sin policy, 403. Flujo: presign → `PUT` del blob a `uploadUrl` → confirmar escribiendo el record con `fileUrl` en el envelope del attribute `file`.",
29862
- "operationId": "HablalaApiWeb.PublicApi.UploadController.create",
29872
+ "operationId": "post /v1/public/me/objects/{object_slug}/uploads",
29863
29873
  "parameters": [
29864
29874
  {
29865
29875
  "description": "",
@@ -29936,7 +29946,7 @@
29936
29946
  "post": {
29937
29947
  "callbacks": {},
29938
29948
  "description": "Ejecuta una consulta lógica (object/select/where/include/order_by) autenticada por una API key read-only. La organización sale del token (no de la URL). Devuelve solo lo que las policies ABAC exponen al principal `public` (contenido publicado). Único camino de lectura pública.",
29939
- "operationId": "HablalaApiWeb.PublicApi.QueryController.create (2)",
29949
+ "operationId": "post /v1/public/me/query",
29940
29950
  "parameters": [],
29941
29951
  "requestBody": {
29942
29952
  "content": {
@@ -30015,7 +30025,7 @@
30015
30025
  "/v1/public/objects/{object_slug}/records": {
30016
30026
  "post": {
30017
30027
  "callbacks": {},
30018
- "operationId": "HablalaApiWeb.PublicApi.RecordController.create",
30028
+ "operationId": "post /v1/public/objects/{object_slug}/records",
30019
30029
  "parameters": [
30020
30030
  {
30021
30031
  "description": "",
@@ -30081,7 +30091,7 @@
30081
30091
  "/v1/public/objects/{object_slug}/records/{id}": {
30082
30092
  "delete": {
30083
30093
  "callbacks": {},
30084
- "operationId": "HablalaApiWeb.PublicApi.RecordController.delete (2)",
30094
+ "operationId": "delete /v1/public/objects/{object_slug}/records/{id}",
30085
30095
  "parameters": [
30086
30096
  {
30087
30097
  "description": "",
@@ -30138,7 +30148,7 @@
30138
30148
  },
30139
30149
  "patch": {
30140
30150
  "callbacks": {},
30141
- "operationId": "HablalaApiWeb.PublicApi.RecordController.update (4)",
30151
+ "operationId": "patch /v1/public/objects/{object_slug}/records/{id}",
30142
30152
  "parameters": [
30143
30153
  {
30144
30154
  "description": "",
@@ -30223,7 +30233,7 @@
30223
30233
  },
30224
30234
  "put": {
30225
30235
  "callbacks": {},
30226
- "operationId": "HablalaApiWeb.PublicApi.RecordController.update (3)",
30236
+ "operationId": "put /v1/public/objects/{object_slug}/records/{id}",
30227
30237
  "parameters": [
30228
30238
  {
30229
30239
  "description": "",
@@ -30311,7 +30321,7 @@
30311
30321
  "post": {
30312
30322
  "callbacks": {},
30313
30323
  "description": "Como el staged upload del canal de máquina (`POST /v1/objects/{object_slug}/uploads`), pero gobernado por el ABAC default-deny del canal público: exige una policy `allow` de `create` o `update` para el principal (`public` con la API key; `end_user` con el session token en la variante `/me`) sobre el object — sin policy, 403. Flujo: presign → `PUT` del blob a `uploadUrl` → confirmar escribiendo el record con `fileUrl` en el envelope del attribute `file`.",
30314
- "operationId": "HablalaApiWeb.PublicApi.UploadController.create (2)",
30324
+ "operationId": "post /v1/public/objects/{object_slug}/uploads",
30315
30325
  "parameters": [
30316
30326
  {
30317
30327
  "description": "",
@@ -30388,7 +30398,7 @@
30388
30398
  "post": {
30389
30399
  "callbacks": {},
30390
30400
  "description": "Ejecuta una consulta lógica (object/select/where/include/order_by) autenticada por una API key read-only. La organización sale del token (no de la URL). Devuelve solo lo que las policies ABAC exponen al principal `public` (contenido publicado). Único camino de lectura pública.",
30391
- "operationId": "HablalaApiWeb.PublicApi.QueryController.create",
30401
+ "operationId": "post /v1/public/query",
30392
30402
  "parameters": [],
30393
30403
  "requestBody": {
30394
30404
  "content": {
@@ -30468,7 +30478,7 @@
30468
30478
  "get": {
30469
30479
  "callbacks": {},
30470
30480
  "description": "Devuelve la forma del diccionario del tenant (objetos + atributos + relaciones) para que el SDK genere tipos TS por tenant (`hablala codegen`). La organización sale del token (no de la URL). Read-only; nunca datos de records.",
30471
- "operationId": "HablalaApiWeb.PublicApi.SchemaController.show",
30481
+ "operationId": "get /v1/public/schema",
30472
30482
  "parameters": [],
30473
30483
  "responses": {
30474
30484
  "200": {
@@ -30507,7 +30517,7 @@
30507
30517
  "post": {
30508
30518
  "callbacks": {},
30509
30519
  "description": "Devuelve un end-user session token anónimo (`sess_…`, sin usuario final): el carrito/actividad antes de identificarse. Al hacer login/signup con este token, la sesión se identifica (merge). La organización sale de la API key.",
30510
- "operationId": "HablalaApiWeb.PublicApi.EndUserSessionController.create_anonymous",
30520
+ "operationId": "post /v1/public/sessions/anonymous",
30511
30521
  "parameters": [],
30512
30522
  "responses": {
30513
30523
  "201": {
@@ -30546,7 +30556,7 @@
30546
30556
  "post": {
30547
30557
  "callbacks": {},
30548
30558
  "description": "Dado un lote de ids de `product_variant`, devuelve por variante si es comprable (activa y con stock > 0) — el booleano del badge \"Agotado\". Autenticado por API key. Se expone el booleano derivado, no el conteo de stock.",
30549
- "operationId": "HablalaApiWeb.PublicApi.AvailabilityController.create",
30559
+ "operationId": "post /v1/public/variants/availability",
30550
30560
  "parameters": [],
30551
30561
  "requestBody": {
30552
30562
  "content": {
@@ -30606,7 +30616,7 @@
30606
30616
  "post": {
30607
30617
  "callbacks": {},
30608
30618
  "description": "Registra (upsert) el token de push de este dispositivo para el usuario autenticado. Idempotente por `token`: re-registrar en cada arranque es correcto y revive un token que se había dado de baja.",
30609
- "operationId": "HablalaApiWeb.Notifications.PushTokenController.create",
30619
+ "operationId": "post /v1/push-tokens",
30610
30620
  "parameters": [],
30611
30621
  "requestBody": {
30612
30622
  "content": {
@@ -30651,7 +30661,7 @@
30651
30661
  "delete": {
30652
30662
  "callbacks": {},
30653
30663
  "description": "Borra el device token de este dispositivo (logout): el dispositivo deja de recibir push de esta cuenta. Idempotente (204 aunque el token ya no existiera).",
30654
- "operationId": "HablalaApiWeb.Notifications.PushTokenController.delete",
30664
+ "operationId": "delete /v1/push-tokens/{token}",
30655
30665
  "parameters": [
30656
30666
  {
30657
30667
  "description": "El device token a eliminar.",
@@ -30680,7 +30690,7 @@
30680
30690
  "post": {
30681
30691
  "callbacks": {},
30682
30692
  "description": "Compila una consulta lógica (object/select/where/include/semantic/order_by) a SQL con permisos inyectados y devuelve las filas mapeadas a slugs. Único camino de lectura rica.",
30683
- "operationId": "HablalaApiWeb.Machine.QueryController.create",
30693
+ "operationId": "post /v1/query",
30684
30694
  "parameters": [],
30685
30695
  "requestBody": {
30686
30696
  "content": {
@@ -30744,7 +30754,7 @@
30744
30754
  "/v1/relationships": {
30745
30755
  "get": {
30746
30756
  "callbacks": {},
30747
- "operationId": "HablalaApiWeb.Machine.RelationshipController.index",
30757
+ "operationId": "get /v1/relationships",
30748
30758
  "parameters": [],
30749
30759
  "responses": {
30750
30760
  "200": {
@@ -30765,7 +30775,7 @@
30765
30775
  },
30766
30776
  "post": {
30767
30777
  "callbacks": {},
30768
- "operationId": "HablalaApiWeb.Machine.RelationshipController.create",
30778
+ "operationId": "post /v1/relationships",
30769
30779
  "parameters": [],
30770
30780
  "requestBody": {
30771
30781
  "content": {
@@ -30809,7 +30819,7 @@
30809
30819
  "/v1/relationships/{id}": {
30810
30820
  "get": {
30811
30821
  "callbacks": {},
30812
- "operationId": "HablalaApiWeb.Machine.RelationshipController.show",
30822
+ "operationId": "get /v1/relationships/{id}",
30813
30823
  "parameters": [
30814
30824
  {
30815
30825
  "description": "",
@@ -30855,7 +30865,7 @@
30855
30865
  "post": {
30856
30866
  "callbacks": {},
30857
30867
  "description": "Recibe la aserción del IdP (ya validada en el borde), resuelve o crea la identidad global del usuario, asegura su membresía en la organización y devuelve un token de API. El IdP solo CONFIRMA pertenencia; no reemplaza la identidad (el `user_id` global se preserva).",
30858
- "operationId": "HablalaApiWeb.Accounts.SsoController.callback",
30868
+ "operationId": "post /v1/sso/callback",
30859
30869
  "parameters": [],
30860
30870
  "requestBody": {
30861
30871
  "content": {
@@ -30901,7 +30911,7 @@
30901
30911
  "post": {
30902
30912
  "callbacks": {},
30903
30913
  "description": "Dado un email corporativo, resuelve la conexión SSO de su organización por el dominio y devuelve la URL del IdP a la que redirigir (flujo SP-initiated). Responde 404 si el dominio no tiene una conexión SSO habilitada (el frontend cae al login por contraseña).",
30904
- "operationId": "HablalaApiWeb.Accounts.SsoController.init",
30914
+ "operationId": "post /v1/sso/init",
30905
30915
  "parameters": [],
30906
30916
  "requestBody": {
30907
30917
  "content": {
@@ -30947,7 +30957,7 @@
30947
30957
  "post": {
30948
30958
  "callbacks": {},
30949
30959
  "description": "Inicia sesión con Google. Crea la cuenta si no existe o vincula Google a la cuenta con el mismo email (Google verifica el email, así que la cuenta queda confirmada).\n\nSoporta dos clientes según el campo que envíes:\n\n- **Nativo (app móvil):** envía `idToken` (el `id_token` OIDC del SDK `google_sign_in`). El backend lo **verifica** (firma JWKS de Google, `aud`, `iss`, `exp`) sin canjear nada. Es el flujo estándar de \"sign-in only\".\n- **Web (BFF con redirección server-side):** envía `code` + `redirectUri` (el mismo valor usado para pedir el `code`); se valida contra una allow-list server-side.",
30950
- "operationId": "HablalaApiWeb.Accounts.UserOAuthController.google",
30960
+ "operationId": "post /v1/users/auth/google",
30951
30961
  "parameters": [],
30952
30962
  "requestBody": {
30953
30963
  "content": {
@@ -30993,7 +31003,7 @@
30993
31003
  "post": {
30994
31004
  "callbacks": {},
30995
31005
  "description": "Completa la vinculación de Google a una cuenta existente que tiene contraseña (paso de re-autenticación del flujo *link-on-login*, ADR-024). Se llama tras recibir un `409 requires_reauth` de `POST /users/auth/google`: el cliente reenvía el mismo `idToken` (o `code`+`redirectUri`) **más** la `password` de la cuenta. Si la contraseña es correcta, se vincula la credencial Google y se devuelve usuario + token.",
30996
- "operationId": "HablalaApiWeb.Accounts.UserOAuthController.confirm_link",
31006
+ "operationId": "post /v1/users/auth/google/confirm-link",
30997
31007
  "parameters": [],
30998
31008
  "requestBody": {
30999
31009
  "content": {
@@ -31039,7 +31049,7 @@
31039
31049
  "post": {
31040
31050
  "callbacks": {},
31041
31051
  "description": "Envía un código OTP por SMS al número dado. Un solo camino para alta y login: si el número ya identifica a una persona, reusa su identidad; si no, la crea. Responde 204 siempre (anti-enumeración): no revela si el número ya existía.",
31042
- "operationId": "HablalaApiWeb.Accounts.UserPhoneController.start",
31052
+ "operationId": "post /v1/users/auth/phone/start",
31043
31053
  "parameters": [],
31044
31054
  "requestBody": {
31045
31055
  "content": {
@@ -31088,7 +31098,7 @@
31088
31098
  "post": {
31089
31099
  "callbacks": {},
31090
31100
  "description": "Verifica el código OTP recibido por SMS y, si es correcto, inicia sesión (devuelve un token de API). El teléfono queda verificado como credencial raíz.",
31091
- "operationId": "HablalaApiWeb.Accounts.UserPhoneController.verify",
31101
+ "operationId": "post /v1/users/auth/phone/verify",
31092
31102
  "parameters": [],
31093
31103
  "requestBody": {
31094
31104
  "content": {
@@ -31144,7 +31154,7 @@
31144
31154
  "post": {
31145
31155
  "callbacks": {},
31146
31156
  "description": "Verifica el código (OTP) enviado al registrarse, confirma la cuenta e inicia sesión (devuelve un token de API).",
31147
- "operationId": "HablalaApiWeb.Accounts.UserSessionController.confirm_email",
31157
+ "operationId": "post /v1/users/confirm-email",
31148
31158
  "parameters": [],
31149
31159
  "requestBody": {
31150
31160
  "content": {
@@ -31200,7 +31210,7 @@
31200
31210
  "post": {
31201
31211
  "callbacks": {},
31202
31212
  "description": "Reenvía el código (OTP) para confirmar la cuenta. Responde 204 siempre, exista o no el email o esté ya confirmado (evita enumeración).",
31203
- "operationId": "HablalaApiWeb.Accounts.UserSessionController.resend_confirmation",
31213
+ "operationId": "post /v1/users/confirm-email/resend",
31204
31214
  "parameters": [],
31205
31215
  "requestBody": {
31206
31216
  "content": {
@@ -31229,7 +31239,7 @@
31229
31239
  "post": {
31230
31240
  "callbacks": {},
31231
31241
  "description": "Agrega un teléfono como método de login a la cuenta autenticada y envía un OTP por SMS. Falla 422 si el número ya pertenece a otra persona.",
31232
- "operationId": "HablalaApiWeb.Accounts.UserLinkController.start_phone",
31242
+ "operationId": "post /v1/users/link/phone/start",
31233
31243
  "parameters": [],
31234
31244
  "requestBody": {
31235
31245
  "content": {
@@ -31277,7 +31287,7 @@
31277
31287
  "post": {
31278
31288
  "callbacks": {},
31279
31289
  "description": "Verifica el OTP y marca el teléfono como método verificado de la cuenta. No inicia una sesión nueva (ya estás autenticado): responde 204.",
31280
- "operationId": "HablalaApiWeb.Accounts.UserLinkController.verify_phone",
31290
+ "operationId": "post /v1/users/link/phone/verify",
31281
31291
  "parameters": [],
31282
31292
  "requestBody": {
31283
31293
  "content": {
@@ -31325,7 +31335,7 @@
31325
31335
  "post": {
31326
31336
  "callbacks": {},
31327
31337
  "description": "Intercambia email + contraseña por un token de API. Si la cuenta aún no está confirmada, responde 403 (hay que confirmar el email primero).",
31328
- "operationId": "HablalaApiWeb.Accounts.UserSessionController.create",
31338
+ "operationId": "post /v1/users/login",
31329
31339
  "parameters": [],
31330
31340
  "requestBody": {
31331
31341
  "content": {
@@ -31381,7 +31391,7 @@
31381
31391
  "delete": {
31382
31392
  "callbacks": {},
31383
31393
  "description": "Revoca el token de API usado en esta request.",
31384
- "operationId": "HablalaApiWeb.Accounts.UserSessionController.delete",
31394
+ "operationId": "delete /v1/users/logout",
31385
31395
  "parameters": [],
31386
31396
  "responses": {
31387
31397
  "204": {
@@ -31397,7 +31407,7 @@
31397
31407
  "/v1/users/me": {
31398
31408
  "get": {
31399
31409
  "callbacks": {},
31400
- "operationId": "HablalaApiWeb.Accounts.UserSessionController.me",
31410
+ "operationId": "get /v1/users/me",
31401
31411
  "parameters": [],
31402
31412
  "responses": {
31403
31413
  "200": {
@@ -31431,7 +31441,7 @@
31431
31441
  "patch": {
31432
31442
  "callbacks": {},
31433
31443
  "description": "Perfil de identidad global: nombre, avatar, zona horaria e idioma.",
31434
- "operationId": "HablalaApiWeb.Accounts.UserSettingsController.update_profile",
31444
+ "operationId": "patch /v1/users/profile",
31435
31445
  "parameters": [],
31436
31446
  "requestBody": {
31437
31447
  "content": {
@@ -31476,7 +31486,7 @@
31476
31486
  "post": {
31477
31487
  "callbacks": {},
31478
31488
  "description": "Crea un usuario con email y contraseña y le envía un código (OTP) para confirmar el email. NO inicia sesión: el usuario debe confirmar con `POST /users/confirm-email` antes de entrar. Responde 201 sin token.",
31479
- "operationId": "HablalaApiWeb.Accounts.UserRegistrationController.create",
31489
+ "operationId": "post /v1/users/register",
31480
31490
  "parameters": [],
31481
31491
  "requestBody": {
31482
31492
  "content": {
@@ -31515,7 +31525,7 @@
31515
31525
  "post": {
31516
31526
  "callbacks": {},
31517
31527
  "description": "Envía por email un enlace para restablecer la contraseña. Responde 204 siempre, exista o no el email (evita enumeración de usuarios).",
31518
- "operationId": "HablalaApiWeb.Accounts.UserPasswordController.request_reset",
31528
+ "operationId": "post /v1/users/reset-password",
31519
31529
  "parameters": [],
31520
31530
  "requestBody": {
31521
31531
  "content": {
@@ -31544,7 +31554,7 @@
31544
31554
  "post": {
31545
31555
  "callbacks": {},
31546
31556
  "description": "Canjea el token de reset (recibido por email) y fija una nueva contraseña.",
31547
- "operationId": "HablalaApiWeb.Accounts.UserPasswordController.reset",
31557
+ "operationId": "post /v1/users/reset-password/confirm",
31548
31558
  "parameters": [],
31549
31559
  "requestBody": {
31550
31560
  "content": {
@@ -31592,7 +31602,7 @@
31592
31602
  "/v1/users/settings": {
31593
31603
  "patch": {
31594
31604
  "callbacks": {},
31595
- "operationId": "HablalaApiWeb.Accounts.UserSettingsController.update",
31605
+ "operationId": "patch /v1/users/settings",
31596
31606
  "parameters": [],
31597
31607
  "requestBody": {
31598
31608
  "content": {
@@ -31637,7 +31647,7 @@
31637
31647
  "post": {
31638
31648
  "callbacks": {},
31639
31649
  "description": "Token firmado de vida corta para autenticar la conexión websocket (`/socket`). El bearer de la API no debe viajar en el query string del upgrade (los proxies loguean la URL); este token de minutos sí puede. Cada reconexión acuña uno nuevo.",
31640
- "operationId": "HablalaApiWeb.Accounts.UserSessionController.socket_token",
31650
+ "operationId": "post /v1/users/socket-token",
31641
31651
  "parameters": [],
31642
31652
  "responses": {
31643
31653
  "200": {
@@ -31671,7 +31681,7 @@
31671
31681
  "patch": {
31672
31682
  "callbacks": {},
31673
31683
  "description": "Cambia el handle con el que te descubren. Valida formato/charset (ASCII, minúsculas), nombres reservados y unicidad. Devuelve 422 con error en `username` si está tomado o es inválido.",
31674
- "operationId": "HablalaApiWeb.Accounts.UserSettingsController.update_username",
31684
+ "operationId": "patch /v1/users/username",
31675
31685
  "parameters": [],
31676
31686
  "requestBody": {
31677
31687
  "content": {
@@ -31716,7 +31726,7 @@
31716
31726
  "get": {
31717
31727
  "callbacks": {},
31718
31728
  "description": "Los webhook endpoints de la organización (solo metadatos; el signing secret se obtiene con `GET .../:id/secret`).",
31719
- "operationId": "HablalaApiWeb.Machine.WebhookController.index",
31729
+ "operationId": "get /v1/webhooks",
31720
31730
  "parameters": [],
31721
31731
  "responses": {
31722
31732
  "200": {
@@ -31738,7 +31748,7 @@
31738
31748
  "post": {
31739
31749
  "callbacks": {},
31740
31750
  "description": "Suscribe una URL a eventos del event store. La plataforma genera el **signing secret** (`whsec_…`) y lo incluye en esta respuesta (`secret`); con él el receptor verifica la firma de cada entrega (spec Standard Webhooks). También puede recuperarse después con `GET .../:id/secret`.",
31741
- "operationId": "HablalaApiWeb.Machine.WebhookController.create",
31751
+ "operationId": "post /v1/webhooks",
31742
31752
  "parameters": [],
31743
31753
  "requestBody": {
31744
31754
  "content": {
@@ -31793,7 +31803,7 @@
31793
31803
  "delete": {
31794
31804
  "callbacks": {},
31795
31805
  "description": "Elimina el endpoint y su historial de deliveries. Deja de recibir entregas.",
31796
- "operationId": "HablalaApiWeb.Machine.WebhookController.delete",
31806
+ "operationId": "delete /v1/webhooks/{id}",
31797
31807
  "parameters": [
31798
31808
  {
31799
31809
  "description": "",
@@ -31829,7 +31839,7 @@
31829
31839
  },
31830
31840
  "get": {
31831
31841
  "callbacks": {},
31832
- "operationId": "HablalaApiWeb.Machine.WebhookController.show",
31842
+ "operationId": "get /v1/webhooks/{id}",
31833
31843
  "parameters": [
31834
31844
  {
31835
31845
  "description": "",
@@ -31873,7 +31883,7 @@
31873
31883
  "patch": {
31874
31884
  "callbacks": {},
31875
31885
  "description": "Cambia `url`/`enabledEvents`/`status`. Reactivar (`status: \"enabled\"`) un endpoint auto-deshabilitado limpia el motivo del disable. El slug y el secret no se tocan aquí.",
31876
- "operationId": "HablalaApiWeb.Machine.WebhookController.update (2)",
31886
+ "operationId": "patch /v1/webhooks/{id}",
31877
31887
  "parameters": [
31878
31888
  {
31879
31889
  "description": "",
@@ -31928,7 +31938,7 @@
31928
31938
  "put": {
31929
31939
  "callbacks": {},
31930
31940
  "description": "Cambia `url`/`enabledEvents`/`status`. Reactivar (`status: \"enabled\"`) un endpoint auto-deshabilitado limpia el motivo del disable. El slug y el secret no se tocan aquí.",
31931
- "operationId": "HablalaApiWeb.Machine.WebhookController.update",
31941
+ "operationId": "put /v1/webhooks/{id}",
31932
31942
  "parameters": [
31933
31943
  {
31934
31944
  "description": "",
@@ -31985,7 +31995,7 @@
31985
31995
  "get": {
31986
31996
  "callbacks": {},
31987
31997
  "description": "La bitácora de entregas (canónico GitHub): qué eventos se entregaron, cuántos intentos costaron y con qué respondió el receptor. Más recientes primero (máx. 50).",
31988
- "operationId": "HablalaApiWeb.Machine.WebhookController.deliveries",
31998
+ "operationId": "get /v1/webhooks/{id}/deliveries",
31989
31999
  "parameters": [
31990
32000
  {
31991
32001
  "description": "",
@@ -32021,7 +32031,7 @@
32021
32031
  "post": {
32022
32032
  "callbacks": {},
32023
32033
  "description": "Genera un `whsec_…` nuevo para el MISMO endpoint (el historial no cambia). El secret viejo deja de firmar de inmediato: actualiza la copia del receptor. La respuesta incluye el nuevo secret.",
32024
- "operationId": "HablalaApiWeb.Machine.WebhookController.rotate",
32034
+ "operationId": "post /v1/webhooks/{id}/rotate",
32025
32035
  "parameters": [
32026
32036
  {
32027
32037
  "description": "",
@@ -32057,7 +32067,7 @@
32057
32067
  "get": {
32058
32068
  "callbacks": {},
32059
32069
  "description": "El `whsec_…` del endpoint, para configurarlo en el receptor (modelo Svix `GET .../secret` / Stripe dashboard \"Reveal\"). Es una llave de firma compartida, no una credencial de autenticación entrante: por eso es recuperable, a diferencia de `sk_`/`mat_`.",
32060
- "operationId": "HablalaApiWeb.Machine.WebhookController.secret",
32070
+ "operationId": "get /v1/webhooks/{id}/secret",
32061
32071
  "parameters": [
32062
32072
  {
32063
32073
  "description": "",
@@ -32093,7 +32103,7 @@
32093
32103
  "get": {
32094
32104
  "callbacks": {},
32095
32105
  "description": "Devuelve la organización a la que pertenece el token de máquina y sus permisos efectivos. La organización sale del token (no de la URL): así una herramienta externa la infiere sin que el desarrollador la configure.",
32096
- "operationId": "HablalaApiWeb.Machine.WhoamiController.show",
32106
+ "operationId": "get /v1/whoami",
32097
32107
  "parameters": [],
32098
32108
  "responses": {
32099
32109
  "200": {