Skip to content

🚢 Solnow Booking Engine API ​

API pública para integrar el motor de reservas de Solnow en sitios web y aplicaciones.


Flujo Básico ​

El flujo típico para crear una reserva desde una web externa consta de 6 pasos:

Buscar → Detalle → Disponibilidad → Calcular Precio → Sesión → Pago
PasoEndpointDescripción
1POST /website/searchBuscar experiencias con filtros
2GET /website/experiences/detailObtener detalle completo
3GET /website/experiences/{id}/availabilityConsultar disponibilidad mensual
4POST /website/calculate-priceCalcular precio con extras

Paso 1: Buscar Experiencias (POST /website/search) ​

Encuentra embarcaciones disponibles según ubicación, fechas y capacidad.

bash
curl -X POST "https://app.nautisync.com/website/search?organization_id=123" \
  -H "Content-Type: application/json" \
  -d '{
    "organization_id": 123,
    "common_filters": {
      "adults": 4,
      "children": 2,
      "city": "Valencia",
      "start_date": "2025-04-01T00:00:00Z",
      "end_date": "2025-04-30T00:00:00Z"
    },
    "experience_filters": {
      "exclusivity_type": "private"
    },
    "boat_filters": {
      "types": ["vela", "motor"]
    },
    "pagination": {
      "page": 1,
      "page_size": 20
    }
  }'
json
{
  "experiences": [
    {
      "experience_id": 456,
      "title": "Paseo en Velero por Valencia",
      "description": "Disfruta de un paseo de 2 horas...",
      "boat_name": "Mar Azul",
      "boat_model": "Beneteau Oceanis 40",
      "boat_type": "Velero",
      "exclusivity_type": "private",
      "booking_type": "rental",
      "capacity": {
        "max_adults": 8,
        "max_children": 4,
        "max_passengers": 12
      },
      "location": {
        "city": "Valencia",
        "country": "España"
      },
      "pricing_hint": {
        "from_price": 150,
        "currency": "EUR",
        "hourly_from": 75,
        "price_type": "hourly"
      },
      "slots": [
        {
          "start_time": "2025-04-15T10:00:00Z",
          "end_time": "2025-04-15T12:00:00Z",
          "duration": {"value": 2, "unit": "hours"},
          "estimated_price": 150,
          "price_per_unit": 75,
          "booking_policy_id": 12
        }
      ],
      "picture": "https://cdn.solnow.io/exp/456-thumb.jpg",
      "images": ["https://cdn.solnow.io/exp/456.jpg"],
      "link_to_website": "https://chartervalencia.solnow.io/experience/paseo-velero-valencia"
    }
  ],
  "total": 87,
  "page": 1,
  "page_size": 20,
  "total_pages": 5
}

Guarda el experience_id (ej: 456) para los siguientes pasos.


Paso 2: Obtener Detalle de la Experiencia (GET /website/experiences/detail) ​

Obtén información completa de una experiencia específica.

bash
curl "https://app.nautisync.com/website/experiences/detail?id=456&organization_id=123"
bash
curl "https://app.nautisync.com/website/experiences/detail?slug=paseo-velero-valencia&organization_id=123"
json
{
  "id": 456,
  "url_slug": "paseo-velero-valencia",
  "title": "Paseo en Velero por Valencia",
  "description": "Disfruta de un paseo de 2 horas por la costa de Valencia...",
  "boat_name": "Mar Azul",
  "boat_model": "Beneteau Oceanis 40",
  "boat_type": "Velero",
  "exclusivity_type": "shared",
  "booking_type": "rental",
  "is_multi_boat_pool": false,
  "pool_boat_count": 1,
  "total_pool_capacity": 8,
  "max_units_bookable": 1,
  "capacity": {
    "max_adults": 8,
    "max_children": 4,
    "max_passengers": 12
  },
  "location": {
    "city": "Valencia",
    "country": "España",
    "harbor": "Puerto de Valencia",
    "latitude": 39.4667,
    "longitude": -0.3667,
    "google_maps_link": "https://maps.google.com/..."
  },
  "equipment": ["GPS", "VHF", "Chalecos salvavidas", "Nevera"],
  "amenities": ["Solarium", "Escalera de baño", "Toldo"],
  "picture": "https://cdn.solnow.io/exp/456.jpg",
  "video_url": "https://cdn.solnow.io/exp/456-video.mp4",
  "images": [
    "https://cdn.solnow.io/exp/456-1.jpg",
    "https://cdn.solnow.io/exp/456-2.jpg",
    "https://cdn.solnow.io/exp/456-3.jpg"
  ],
  "pricing_hint": {
    "from_price": 150,
    "currency": "EUR",
    "hourly_from": 75,
    "daily_from": 0,
    "price_type": "hourly"
  },
  "fuel_included": true,
  "requires_license": false,
  "min_age": 0,
  "allow_children": true,
  "with_captain": "optional",
  "booking_policies": [
    {
      "id": 12,
      "name": "Temporada Alta",
      "pricing_hint": {
        "from_price": 150,
        "currency": "EUR"
      }
    }
  ],
  "extras": [
    {
      "id": 101,
      "name": "Catering Premium",
      "description": "Selección de tapas y bebidas",
      "price": 45.00,
      "price_per_day": false,
      "price_per_pax": true,
      "mandatory": false,
      "optionality": "Optional",
      "payment_type": "Online",
      "price_tiers": []
    },
    {
      "id": 102,
      "name": "Patrón Profesional",
      "description": "Patrón experimentado incluido",
      "price": 80.00,
      "price_per_day": true,
      "price_per_pax": false,
      "mandatory": false,
      "optionality": "Optional",
      "payment_type": "Online",
      "price_tiers": []
    }
  ],
  "deposit": 300.00,
  "widget_config": {
    "badge": {
      "image_url": "https://cdn.solnow.io/badges/popular.png",
      "position": "top_right",
      "size": "medium"
    }
  },
  "has_real_time_updates": true,
  "is_shared": true,
  "custom_html": null,
  "boats": [
    {
      "name": "Mar Azul",
      "type": "Velero",
      "ship_model": "Beneteau Oceanis 40",
      "manufacturer": "Beneteau",
      "length": 12.5,
      "width": 4.2,
      "year": "2018",
      "capacity": 8,
      "cabins": 2,
      "beds": 4,
      "bathrooms": 1,
      "max_speed": 12.5,
      "engine": "Yanmar 40cv",
      "consumption": 5.5,
      "night_capacity": 4,
      "location": {
        "city": "Valencia",
        "country": "España"
      }
    }
  ],
  "cancellation_policy": {
    "id": 5,
    "name": "Flexible",
    "description": "Cancelación gratuita hasta 48h antes",
    "default_penalty_percent": 0,
    "rules": [
      {
        "days_in_advance": 7,
        "refund_percent": 100
      },
      {
        "days_in_advance": 2,
        "refund_percent": 50
      }
    ]
  }
}

Paso 3: Consultar Disponibilidad (GET /website/experiences/{id}/availability) ​

Obtén los días disponibles del mes para la experiencia seleccionada.

bash
curl "https://app.nautisync.com/website/experiences/456/availability?year=2025&month=4&organization_id=123"
json
{
  "experience_id": 456,
  "year": 2025,
  "month": 4,
  "available_days": [
    {
      "date": "2025-04-15T00:00:00Z",
      "has_slots": true,
      "slot_count": 2,
      "check_in_available": true,
      "check_out_available": true,
      "units_available": 3,
      "total_units": 5,
      "is_shared": false
    },
    {
      "date": "2025-04-16T00:00:00Z",
      "has_slots": false,
      "slot_count": 0,
      "is_shared": false
    }
  ],
  "slots_by_policy": [
    {
      "booking_policy_id": 12,
      "policy_name": "Temporada Alta",
      "policy_type": "daily",
      "is_overnight": false,
      "min_duration": 2,
      "max_duration": 8,
      "pricing_hint": {
        "from_price": 150,
        "currency": "EUR"
      },
      "slots": [
        {
          "start_time": "2025-04-15T10:00:00Z",
          "end_time": "2025-04-15T12:00:00Z",
          "duration": {"value": 2, "unit": "hours"},
          "date": "2025-04-15",
          "available_boats": 3,
          "total_boats": 5,
          "available_capacities": [6, 8, 10]
        },
        {
          "start_time": "2025-04-15T18:00:00Z",
          "end_time": "2025-04-15T20:00:00Z",
          "duration": {"value": 2, "unit": "hours"},
          "date": "2025-04-15",
          "available_boats": 2,
          "total_boats": 5,
          "instance_id": 789,
          "available_spots": 4,
          "occupied_spots": 2,
          "total_capacity": 6,
          "is_full": false
        }
      ]
    }
  ],
  "unavailable_periods": [
    {
      "start_time": "2025-04-20T00:00:00Z",
      "end_time": "2025-04-25T00:00:00Z"
    }
  ]
}

Para experiencias compartidas (shared): Guarda el instance_id del slot elegido (aparece en slots_by_policy[].slots[].instance_id).

Para experiencias privadas (private): No necesitas instance_id, las fechas son flexibles.

TIP

El campo instance_id es obligatorio solo para experiencias compartidas. Para privadas, el sistema asigna automáticamente los barcos disponibles.


Paso 4: Calcular Precio (POST /website/calculate-price) ​

Obtén el desglose completo del precio incluyendo extras e impuestos.

bash
curl -X POST "https://app.nautisync.com/website/calculate-price?organization_id=123" \
  -H "Content-Type: application/json" \
  -d '{
    "experience_id": 456,
    "booking_policy_id": 12,
    "adults": 4,
    "children": 2,
    "start_date": "2025-04-15T10:00:00Z",
    "end_date": "2025-04-15T12:00:00Z",
    "start_time": "10:00",
    "end_time": "12:00",
    "units_needed": 1,
    "extra_ids": [101]
  }'
json
{
  "available": true,
  "price_breakdown": {
    "base_price": 150.00,
    "price_per_unit": 75.00,
    "extras": [
      {
        "id": 101,
        "name": "Catering Premium",
        "description": "Selección de tapas y bebidas",
        "unit_price": 45.00,
        "quantity": 6,
        "subtotal": 270.00,
        "unit": "person",
        "payment_type": "Online"
      }
    ],
    "extras_total": 270.00,
    "subtotal": 420.00,
    "tax_rate": 21.00,
    "tax_amount": 88.20,
    "grand_total": 508.20,
    "prices_include_iva": false,
    "pay_at_pickup_extras": [],
    "deposit": 152.46,
    "advance_payment_percentage": 30.00,
    "advance_amount": 152.46,
    "remaining_amount": 355.74,
    "currency": "EUR",
    "duration": 2.00,
    "duration_unit": "hours",
    "check_in_time": "10:00",
    "check_out_time": "12:00",
    "is_overnight": false
  }
}

Guarda el booking_policy_id que devuelve el cálculo (se necesita para crear la sesión).

Referencia de Endpoints ​

Autenticación ​

Todas las peticiones requieren identificar la organización mediante el query param:

?organization_id=123

Ejemplo:

GET /website/search?organization_id=123

GET /website/config ​

Obtiene la configuración pública del booking engine.

Query params:

CampoRequeridoDescripción
organization_idNoID de la organización

Response 200:

json
{
  "checkout_form_id": 42,
  "allow_children": true,
  "prices_include_iva": true,
  "whatsapp_phone": "+34612345678",
  "show_mooring": true
}

GET /website/experiences/detail ​

Obtiene el detalle completo de una experiencia.

Query params:

CampoRequeridoDescripción
idSí*ID de la experiencia
slugSí*URL slug de la experiencia
organization_idNoID de la organización

* Debes enviar id o slug

Response 200:

json
{
  "id": 456,
  "url_slug": "paseo-velero-valencia",
  "title": "Paseo en Velero por Valencia",
  "description": "Disfruta de un paseo de 2 horas por la costa de Valencia...",
  "boat_name": "Mar Azul",
  "boat_model": "Beneteau Oceanis 40",
  "boat_type": "Velero",
  "exclusivity_type": "shared",
  "booking_type": "rental",
  "is_multi_boat_pool": false,
  "pool_boat_count": 1,
  "total_pool_capacity": 8,
  "max_units_bookable": 1,
  "capacity": {
    "max_adults": 8,
    "max_children": 4,
    "max_passengers": 12
  },
  "location": {
    "city": "Valencia",
    "country": "España",
    "harbor": "Puerto de Valencia",
    "latitude": 39.4667,
    "longitude": -0.3667,
    "google_maps_link": "https://maps.google.com/..."
  },
  "equipment": ["GPS", "VHF", "Chalecos salvavidas", "Nevera"],
  "amenities": ["Solarium", "Escalera de baño", "Toldo"],
  "picture": "https://cdn.solnow.io/exp/456.jpg",
  "video_url": "https://cdn.solnow.io/exp/456-video.mp4",
  "images": [
    "https://cdn.solnow.io/exp/456-1.jpg",
    "https://cdn.solnow.io/exp/456-2.jpg",
    "https://cdn.solnow.io/exp/456-3.jpg"
  ],
  "pricing_hint": {
    "from_price": 150,
    "currency": "EUR",
    "hourly_from": 75,
    "daily_from": 0,
    "price_type": "hourly"
  },
  "fuel_included": true,
  "requires_license": false,
  "min_age": 0,
  "allow_children": true,
  "with_captain": "optional",
  "booking_policies": [
    {
      "id": 12,
      "name": "Temporada Alta",
      "pricing_hint": {
        "from_price": 150,
        "currency": "EUR"
      }
    }
  ],
  "extras": [
    {
      "id": 101,
      "name": "Catering Premium",
      "description": "Selección de tapas y bebidas",
      "price": 45.00,
      "price_per_day": false,
      "price_per_pax": true,
      "mandatory": false,
      "optionality": "Optional",
      "payment_type": "Online",
      "price_tiers": []
    }
  ],
  "deposit": 300.00,
  "widget_config": {
    "badge": {
      "image_url": "https://cdn.solnow.io/badges/popular.png",
      "position": "top_right",
      "size": "medium"
    }
  },
  "has_real_time_updates": true,
  "is_shared": true,
  "custom_html": null,
  "boats": [
    {
      "name": "Mar Azul",
      "type": "Velero",
      "ship_model": "Beneteau Oceanis 40",
      "manufacturer": "Beneteau",
      "length": 12.5,
      "width": 4.2,
      "year": "2018",
      "capacity": 8,
      "cabins": 2,
      "beds": 4,
      "bathrooms": 1,
      "max_speed": 12.5,
      "engine": "Yanmar 40cv",
      "consumption": 5.5,
      "night_capacity": 4,
      "location": {
        "city": "Valencia",
        "country": "España"
      }
    }
  ],
  "cancellation_policy": {
    "id": 5,
    "name": "Flexible",
    "description": "Cancelación gratuita hasta 48h antes",
    "default_penalty_percent": 0,
    "rules": [
      {
        "days_in_advance": 7,
        "refund_percent": 100
      },
      {
        "days_in_advance": 2,
        "refund_percent": 50
      }
    ]
  }
}

POST /website/search ​

Busca experiencias con filtros avanzados.

INFO

Usa filtros anidados: common_filters (fechas, ciudad, adultos), experience_filters (tipo de experiencia, presupuesto), y boat_filters (tipo de barco, categorías).

Body (UnifiedFilterRequest):

json
{
  "organization_id": 123,
  "boat_filters": {
    "types": ["vela", "motor", "catamaran"],
    "categories": ["boat", "kayak", "paddle_board", "jet_ski"],
    "tag_ids": [1, 2, 3]
  },
  "experience_filters": {
    "experience_ids": [456, 457],
    "exclusivity_type": "private",
    "booking_type": "rental",
    "requires_license": false,
    "with_captain": "optional",
    "budget": 500,
    "min_budget": 100
  },
  "common_filters": {
    "city": "Valencia",
    "start_date": "2025-04-01T00:00:00Z",
    "end_date": "2025-04-30T00:00:00Z",
    "start_time": "10:00",
    "end_time": "18:00",
    "duration_days": 1,
    "duration_hours": 4,
    "search_mode": "exact",
    "adults": 4,
    "children": 2,
    "tags": [1, 2, 3]
  },
  "pagination": {
    "page": 1,
    "page_size": 20
  }
}

Parámetros disponibles:

CampoRequeridoDescripción
organization_idSíID de la organización
common_filters.adultsSíNúmero de adultos
common_filters.cityNoCiudad
common_filters.start_dateNoFecha inicio
common_filters.end_dateNoFecha fin
common_filters.childrenNoNúmero de niños
experience_filters.exclusivity_typeNoprivate o shared
experience_filters.booking_typeNorental o packaged
experience_filters.budgetNoPresupuesto máximo en EUR
boat_filters.typesNoTipos de embarcación
boat_filters.categoriesNoCategorías: boat, kayak, etc.
pagination.pageNoNúmero de página
pagination.page_sizeNoItems por página

Response 200:

json
{
  "experiences": [
    {
      "experience_id": 456,
      "title": "Paseo en Velero por Valencia",
      "description": "Disfruta de un paseo...",
      "boat_name": "Mar Azul",
      "boat_model": "Beneteau Oceanis 40",
      "boat_type": "Velero",
      "exclusivity_type": "private",
      "booking_type": "rental",
      "capacity": {
        "max_adults": 8,
        "max_children": 4,
        "max_passengers": 12
      },
      "location": {
        "city": "Valencia",
        "country": "España"
      },
      "pricing_hint": {
        "from_price": 150,
        "currency": "EUR",
        "hourly_from": 75,
        "price_type": "hourly"
      },
      "slots": [...],
      "picture": "https://...",
      "images": ["https://..."],
      "link_to_website": "https://..."
    }
  ],
  "total": 87,
  "page": 1,
  "page_size": 20,
  "total_pages": 5
}

GET /website/filter-options ​

Obtiene las opciones de filtro disponibles para una organización.

Query params:

CampoRequeridoDescripción
organization_idNoID de la organización

Response 200:

json
{
  "locations": ["Valencia", "Alicante", "Denia"],
  "boat_types": ["vela", "motor", "catamaran"],
  "max_price": 1500.00,
  "min_price": 50.00,
  "max_capacity": 20
}

GET /website/experiences/{id}/availability ​

Consulta la disponibilidad mensual de una experiencia.

Path params:

CampoRequeridoDescripción
idSíID de la experiencia

Query params:

CampoRequeridoDescripción
yearSíAño
monthSíMes (1-12)
organization_idNoID de la organización
policy_idNoFiltrar por política de precios específica
include_pricingNoIncluir precios en la respuesta (true o false)

TIP

Usa policy_id para filtrar por una política de precios específica, o include_pricing=true para incluir información detallada de precios.

Response 200:

json
{
  "experience_id": 456,
  "year": 2025,
  "month": 4,
  "available_days": [
    {
      "date": "2025-04-15T00:00:00Z",
      "has_slots": true,
      "slot_count": 2,
      "check_in_available": true,
      "check_out_available": true,
      "units_available": 3,
      "total_units": 5,
      "is_shared": false
    },
    {
      "date": "2025-04-16T00:00:00Z",
      "has_slots": false,
      "slot_count": 0,
      "is_shared": false
    }
  ],
  "slots_by_policy": [
    {
      "booking_policy_id": 12,
      "policy_name": "Temporada Alta",
      "policy_type": "daily",
      "is_overnight": false,
      "min_duration": 2,
      "max_duration": 8,
      "pricing_hint": {
        "from_price": 150,
        "currency": "EUR"
      },
      "slots": [
        {
          "start_time": "2025-04-15T10:00:00Z",
          "end_time": "2025-04-15T12:00:00Z",
          "duration": {"value": 2, "unit": "hours"},
          "date": "2025-04-15",
          "available_boats": 3,
          "total_boats": 5,
          "available_capacities": [6, 8, 10]
        },
        {
          "start_time": "2025-04-15T18:00:00Z",
          "end_time": "2025-04-15T20:00:00Z",
          "duration": {"value": 2, "unit": "hours"},
          "date": "2025-04-15",
          "available_boats": 2,
          "total_boats": 5,
          "instance_id": 789,
          "available_spots": 4,
          "occupied_spots": 2,
          "total_capacity": 6,
          "is_full": false
        }
      ]
    }
  ],
  "unavailable_periods": [
    {
      "start_time": "2025-04-20T00:00:00Z",
      "end_time": "2025-04-25T00:00:00Z"
    }
  ]
}

POST /website/calculate-price ​

Calcula el precio completo incluyendo extras e impuestos.

TIP

Si necesitas calcular el precio para un horario específico del día, usa los campos opcionales start_time y end_time .

Body:

json
{
  "experience_id": 456,
  "booking_policy_id": 12,
  "adults": 4,
  "children": 2,
  "start_date": "2025-04-15T10:00:00Z",
  "end_date": "2025-04-15T12:00:00Z",
  "start_time": "10:00",
  "end_time": "12:00",
  "extra_ids": [101, 102],
  "boat_ids": [5],
  "units_needed": 1
}

Parámetros:

CampoRequeridoDescripción
experience_idSíID de la experiencia
booking_policy_idSíID de la política de reserva
adultsSíNúmero de adultos
start_dateSíFecha/hora de inicio
end_dateSíFecha/hora de fin
childrenNoNúmero de niños
start_timeNoHora específica de inicio
end_timeNoHora específica de fin
units_neededNoNúmero de unidades para multi-boat
boat_idsNoIDs específicos de barcos
extra_idsNoIDs de extras a incluir

Response 200:

json
{
  "available": true,
  "price_breakdown": {
    "base_price": 150.00,
    "price_per_unit": 75.00,
    "extras": [
      {
        "id": 101,
        "name": "Catering Premium",
        "description": "Selección de tapas y bebidas",
        "unit_price": 45.00,
        "quantity": 6,
        "subtotal": 270.00,
        "unit": "person",
        "payment_type": "Online"
      }
    ],
    "extras_total": 270.00,
    "subtotal": 420.00,
    "tax_rate": 21.00,
    "tax_amount": 88.20,
    "grand_total": 508.20,
    "prices_include_iva": false,
    "pay_at_pickup_extras": [],
    "deposit": 152.46,
    "advance_payment_percentage": 30.00,
    "advance_amount": 152.46,
    "remaining_amount": 355.74,
    "currency": "EUR",
    "duration": 2.00,
    "duration_unit": "hours",
    "check_in_time": "10:00",
    "check_out_time": "12:00",
    "is_overnight": false
  }
}

Códigos de Error ​

CódigoSignificadoCuándo ocurre
400Bad RequestParámetros inválidos o faltantes
401UnauthorizedFalta autenticación de organización
404Not FoundExperiencia, sesión o recurso no existe
410GoneSesión expirada o ya completada
500Server ErrorError interno del servidor

Webhooks ​

El sistema envía webhooks para eventos importantes:

  • payment_intent.created - Cuando se crea un intento de pago
  • payment_intent.succeeded - Pago confirmado exitosamente
  • payment_intent.payment_failed - Pago fallido
  • payment_intent.canceled - Pago cancelado

Configura tu URL de webhook en el panel de administración de Solnow.

¿Necesitas ayuda? Contacta con soporte@solnow.io