{"info":{"_postman_id":"9a0d0312-5e2b-477d-81c0-b2b55bfc6862","name":"Mithras IA Hotel Config Scrapper","description":"<html><head></head><body><h2 id=\"variables-de-la-colección\">Variables de la colección</h2>\n<p>Estas variables viven a nivel de colección (Postman). Editalas en tu Environment o en la colección según necesites.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variable</th>\n<th>¿Qué es?</th>\n<th>Ejemplo</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>baseUrl</code></td>\n<td>Base URL del servicio en tu entorno (dev).</td>\n<td><code>https://ia-hotel-config-fetcher.mithras.cloud</code></td>\n</tr>\n<tr>\n<td><code>processId</code></td>\n<td>ID del proceso (extract). Se obtiene al llamar POST /api/process/generate.</td>\n<td><code>uuid</code></td>\n</tr>\n<tr>\n<td><code>syncProcessId</code></td>\n<td>ID del proceso (sync). Se crea al llamar POST /api/establishment/synchronize.</td>\n<td><code>uuid</code></td>\n</tr>\n<tr>\n<td><code>provider</code></td>\n<td>Nombre del provider/adaptador interno (ej: booking). Se usa en /internal/providers/booking/*.</td>\n<td><code>booking</code></td>\n</tr>\n<tr>\n<td><code>providerUrl</code></td>\n<td>URL del hotel en la OTA/proveedor (ej: Booking.com).</td>\n<td><code>https://www.booking.com/hotel/ar/...</code></td>\n</tr>\n<tr>\n<td><code>sessionJwt</code></td>\n<td>Session JWT de Pxsol (token de sesión del PMS) usado para llamar endpoints Pxsol durante sync.</td>\n<td><code>eyJhbGci...</code></td>\n</tr>\n<tr>\n<td><code>establishmentId</code></td>\n<td>ID del establecimiento/producto en PXSol (ProductID).</td>\n<td><code>24449</code></td>\n</tr>\n<tr>\n<td><code>idempotencyKey</code></td>\n<td>Clave opcional para deduplicar sincronizaciones (Idempotency-Key).</td>\n<td><code>sync-YYYYMMDD-001</code></td>\n</tr>\n<tr>\n<td><code>PXSOL_API_BASE_URL</code></td>\n<td>Base URL de la API PXSol (por defecto api-1-eb).</td>\n<td><code>https://api-1-eb.pxsol.io</code></td>\n</tr>\n<tr>\n<td><code>PXSOL_API_TOKEN</code></td>\n<td>Token PXSol alternativo (fallback) si no hay sessionJwt en el proceso (según notas).</td>\n<td>``</td>\n</tr>\n<tr>\n<td><code>filesBaseUrl</code></td>\n<td>Base URL para uploads de archivos/fotos en PXSol (api-2-eb).</td>\n<td><code>https://api-2-eb.pxsol.io</code></td>\n</tr>\n<tr>\n<td><code>policiesBaseUrl</code></td>\n<td>Base URL para policies en PXSol (api-2-eb).</td>\n<td><code>https://api-2-eb.pxsol.io</code></td>\n</tr>\n<tr>\n<td><code>ratePlansBaseUrl</code></td>\n<td>Base URL para rate plans en PXSol (api-2-eb).</td>\n<td><code>https://api-2-eb.pxsol.io</code></td>\n</tr>\n<tr>\n<td><code>skuBaseUrl</code></td>\n<td>Base URL para SKUs/rooms en PXSol (api-2-eb).</td>\n<td><code>https://api-2-eb.pxsol.io</code></td>\n</tr>\n<tr>\n<td><code>servicesBaseUrl</code></td>\n<td>Base URL para services/hotel facilities en PXSol (api-2-eb).</td>\n<td><code>https://api-2-eb.pxsol.io</code></td>\n</tr>\n<tr>\n<td><code>distanceBaseUrl</code></td>\n<td>Base URL para distance/update en PXSol (api-1-eb).</td>\n<td><code>https://api-1-eb.pxsol.io</code></td>\n</tr>\n<tr>\n<td><code>ownPos</code></td>\n<td>OwnPos obtenido de product/info (se usa para limpieza de cache).</td>\n<td><code>string</code></td>\n</tr>\n<tr>\n<td><code>companyId</code></td>\n<td>CompanyID obtenido de product/info (se usa para uploads/policies/sku owner).</td>\n<td><code>number</code></td>\n</tr>\n<tr>\n<td><code>idString</code></td>\n<td>IDString obtenido de product/info (se usa como 'pos' en varias llamadas).</td>\n<td><code>string</code></td>\n</tr>\n<tr>\n<td><code>googlePlaceInput</code></td>\n<td>Texto de dirección completa para create/search (Google Place ID).</td>\n<td><code>normalized.address.full</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"notas-rápidas\">Notas rápidas</h3>\n<ul>\n<li><p>En el flujo recomendado, <strong>no</strong> pases <code>normalized</code> en el body de <code>/api/establishment/synchronize</code>; primero guardalo con <code>PUT /api/process/:id/normalized</code> y luego sincronizá solo con <code>sourceProcessId</code>.</p>\n</li>\n<li><p>Para llamadas PXSol, normalmente alcanza con <code>sessionJwt</code>. Si tu implementación permite fallback, completá <code>PXSOL_API_TOKEN</code>.</p>\n</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"31335963","collectionId":"9a0d0312-5e2b-477d-81c0-b2b55bfc6862","publishedId":"2sBXVcnYjR","public":true,"customColor":{"top-bar":"000","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-01-05T19:58:09.000Z"},"item":[{"name":"Extracción end-to-end (paso a paso)","item":[{"name":"Paso 1: Crear proceso (Generate: extract + normalize)","id":"8f983534-8521-4dcd-b8f8-52c90a379146","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"url\": \"https://www.booking.com/hotel/ar/diplomatic-mendoza.html\",\n  \"session_jwt\": \"eyJhbGci...\",\n  \"establishment_id\": 24449\n}"},"url":"http://localhost:3000/api/process/generate","description":"<p>Crea un proceso type=extract, persiste process y dispara extracción + normalización. Devuelve processId.</p>\n<p>Seteá <code>providerUrl</code>, <code>sessionJwt</code> y <code>establishmentId</code>. Guardá el <code>processId</code> del response en la variable <code>processId</code> para los pasos siguientes.</p>\n","urlObject":{"path":["api","process","generate"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"8f983534-8521-4dcd-b8f8-52c90a379146"},{"name":"Paso 2: Ver estado del proceso (poll)","id":"6ab92b16-6bf7-4313-9006-e314a7aab51e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/process/00000000-0000-0000-0000-000000000000","description":"<p>Obtiene status y resumen de datasets del proceso.</p>\n<p>Usá este endpoint para ir viendo <code>status</code> y si ya hay datasets generados. Repetilo hasta ver que existe un dataset <code>normalized</code>.</p>\n","urlObject":{"path":["api","process","00000000-0000-0000-0000-000000000000"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"6ab92b16-6bf7-4313-9006-e314a7aab51e"},{"name":"Paso 3: Obtener normalized (revisión)","id":"990dd4bf-cba7-4b13-b36f-e9af2d7fe1a3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/process/00000000-0000-0000-0000-000000000000/normalized","description":"<p>Obtiene el dataset normalizado más reciente del proceso.</p>\n<p>Devuelve <code>{ datasetId, data }</code>. Este <code>data</code> es el objeto normalizado que podés revisar antes de sincronizar.</p>\n","urlObject":{"path":["api","process","00000000-0000-0000-0000-000000000000","normalized"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"990dd4bf-cba7-4b13-b36f-e9af2d7fe1a3"},{"name":"Paso 4: Editar y guardar normalized (recomendado)","id":"f5e52dcd-e0ed-4799-9eb1-2820fbea2132","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"data\": {\n    \"name\": \"DiplomaticHotel Editado\",\n    \"photos\": [\n      {\n        \"url\": \"https://example.com/photo.jpg\"\n      }\n    ],\n    \"rooms\": [],\n    \"facilities\": [],\n    \"surroundings\": []\n  }\n}"},"url":"http://localhost:3000/api/process/00000000-0000-0000-0000-000000000000/normalized","description":"<p>Actualiza (o crea) el dataset normalized más reciente del proceso. Recomendado para evitar payloads grandes en Kestra.</p>\n<p>Pegá en <code>data</code> el normalized editado desde el frontend. Esto guarda en DB y evita problemas de tamaño al pasar JSON por Kestra.</p>\n","urlObject":{"path":["api","process","00000000-0000-0000-0000-000000000000","normalized"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"f5e52dcd-e0ed-4799-9eb1-2820fbea2132"},{"name":"Paso 5: Sincronizar con PXSol (lee normalized desde DB)","id":"9e068b14-a038-4630-b25f-39f9c4b9585a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"sourceProcessId\": \"00000000-0000-0000-0000-000000000000\",\n  \"idempotencyKey\": \"sync-20260105-001\"\n}"},"url":"http://localhost:3000/api/establishment/synchronize","description":"<p>Crea un proceso type=sync, guarda sync_payload y encola job process-sync. Lee el normalized más reciente desde DB (recomendado).</p>\n<p>Ejecuta el flujo de sync: crea proceso type=sync y encola el worker. Recomendado: <strong>no</strong> enviar <code>normalized</code> en el body.</p>\n","urlObject":{"path":["api","establishment","synchronize"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"9e068b14-a038-4630-b25f-39f9c4b9585a"},{"name":"Paso 6: Ver logs del proceso (admin)","id":"5f228853-6003-44f2-a1bd-e6eea5f7304c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/admin/processes/00000000-0000-0000-0000-000000000000/logs","description":"<p>Admin: logs del proceso.</p>\n<p>Útil para debugging: muestra logs por paso. Asegurate de usar el <code>syncProcessId</code> si querés logs del sync, o <code>processId</code> para extract.</p>\n","urlObject":{"path":["api","admin","processes","00000000-0000-0000-0000-000000000000","logs"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"5f228853-6003-44f2-a1bd-e6eea5f7304c"},{"name":"Paso 7: Ver datasets del proceso (admin)","id":"5d789f25-e509-4675-9610-7f2a15f901b1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/admin/processes/00000000-0000-0000-0000-000000000000/datasets","description":"<p>Admin: datasets del proceso.</p>\n<p>Lista datasets (provider_raw, normalized, sync_payload, sync_result, etc.). Usá <code>syncProcessId</code> para ver resultados del worker.</p>\n","urlObject":{"path":["api","admin","processes","00000000-0000-0000-0000-000000000000","datasets"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"5d789f25-e509-4675-9610-7f2a15f901b1"},{"name":"Paso 8: Stream de progreso (SSE)","id":"5dfc6cc9-089c-4526-b35a-356eeac4418f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/admin/processes/00000000-0000-0000-0000-000000000000/stream","description":"<p>SSE con progreso en vivo. Nota: Postman puede mostrarlo como stream; si no, usar curl -N.</p>\n<p>Si Postman no renderiza bien SSE, usá curl: <code>curl -N http://localhost:3000/api/admin/processes/00000000-0000-0000-0000-000000000000/stream</code>.</p>\n","urlObject":{"path":["api","admin","processes","00000000-0000-0000-0000-000000000000","stream"],"host":["http://localhost:3000"],"query":[],"variable":[]}},"response":[],"_postman_id":"5dfc6cc9-089c-4526-b35a-356eeac4418f"}],"id":"25fd5b25-1977-4a00-b458-d45f06725539","_postman_id":"25fd5b25-1977-4a00-b458-d45f06725539","description":""}],"event":[{"listen":"prerequest","script":{"id":"71c35cb6-c528-4d15-b0b7-077f506e3728","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"261103e9-064f-4311-b41e-f5b78c674409","type":"text/javascript","packages":{},"exec":[""]}}],"variable":[{"key":"baseUrl","value":"http://localhost:3000"},{"key":"processId","value":"00000000-0000-0000-0000-000000000000"},{"key":"syncProcessId","value":"00000000-0000-0000-0000-000000000000"},{"key":"provider","value":"booking"},{"key":"providerUrl","value":"https://www.booking.com/hotel/ar/diplomatic-mendoza.html"},{"key":"sessionJwt","value":"eyJhbGci..."},{"key":"establishmentId","value":"24449"},{"key":"idempotencyKey","value":"sync-20260105-001"},{"key":"PXSOL_API_BASE_URL","value":"https://api-1-eb.pxsol.io"},{"key":"PXSOL_API_TOKEN","value":""},{"key":"filesBaseUrl","value":"https://api-2-eb.pxsol.io"},{"key":"policiesBaseUrl","value":"https://api-2-eb.pxsol.io"},{"key":"ratePlansBaseUrl","value":"https://api-2-eb.pxsol.io"},{"key":"skuBaseUrl","value":"https://api-2-eb.pxsol.io"},{"key":"servicesBaseUrl","value":"https://api-2-eb.pxsol.io"},{"key":"distanceBaseUrl","value":"https://api-1-eb.pxsol.io"},{"key":"ownPos","value":""},{"key":"companyId","value":""},{"key":"idString","value":""},{"key":"googlePlaceInput","value":"Friedrichstraße 103, 10117 Berlin, Mitte, Alemania"}]}