Sandbox
The sandbox is a separate deployment of the V2 API for building and testing an integration. It serves the same endpoints and response shapes as production, but bookings never reach the Hurtigruten reservation system: nothing you create in the sandbox is a real reservation, holds no cabin, and is never invoiced.
Use the sandbox to develop and test the full booking flow, from search to confirmation, before you switch to production.
Base URL
| Environment | Base URL |
|---|---|
| Sandbox | https://partner-sandbox.hurtigruten.com/api/v2 |
Every sandbox response carries a Sandbox: true header, so you can check which environment answered.
Access
The sandbox has its own agencies. Request sandbox access through the B2B Support Portal and you receive a sandbox user_key.
- A sandbox
user_keyonly works in the sandbox, and a productionuser_keyonly works in production. Using one in the wrong environment is rejected the same way as an unknown key. - Bookings made in the sandbox can only be read back from the sandbox.
The sandbox uses your production credentials. Use the same clientId and clientSecret, token URL and audience as for production (see Authentication); a production bearer token works against both. Only the base URL and user_key change.
curl --location 'https://partner-sandbox.hurtigruten.com/api/v2/voyages?user_key=YOUR_SANDBOX_USER_KEY' \
--header 'Authorization: Bearer YOUR_BEARER_TOKEN'
Rate limits apply per sandbox agency, as described in Operational notes, and are counted separately from production.
Inventory
Read-only endpoints (/voyages, /packages, /promotions, /flightInclusiveOptions and reference data) return the same inventory as production. Search results are built from that inventory, so the sailings, cabin grades and prices you see in search agree with what /voyages and /packages return.
Availability in the sandbox is static. Search reports the cabin availability from the latest inventory, and creating or confirming a sandbox booking does not reduce it.
Booking behaviour
The booking flow works end to end for voyage-only and package bookings: search, create a booking, read the held booking, confirm, and get the confirmed booking.
Bookings are simulated, so some values follow fixed rules instead of the rules a real booking would use:
| Value | Sandbox behaviour |
|---|---|
| Price | Per guest, from the inventory rate for the requested cabin grade. A party size without its own rate is priced from the nearest cabin mix. |
| Commission | 10% of the total price. |
| Tax | Norwegian VAT at 12%, included in the total price. |
| Deposit | 20% of the total price, due 7 days after the booking is created. When the final payment is due on or before that date, the deposit is 0 and its due date is the final payment date. |
| Final payment | Due 90 days before departure, or on the day the booking is created if departure is closer than that. |
| Booking id | Starts at 900000000, so a sandbox booking id can't be mistaken for a real one. |
Creating a booking for a cabin grade that is not sold on the sailing, or for more guests than the grade holds, is rejected. Confirming a booking requires customer details for every guest. Confirming the same booking again returns the original confirmation.
Cabin numbers
You can list and apply cabin numbers as in production, but the cabins are made up:
- Each ship offers six cabins per cabin grade, with the same numbers every time. They don't match the ship's real cabins or deck plans.
- A cabin you apply to one of your sandbox bookings isn't offered on your other bookings for the same sailing. Applying it to another of those bookings returns
409, as in production. The cabin becomes available again 24 hours after the booking holding it was created. - Cabins held by other agencies' sandbox bookings don't affect yours.
- Grades that stand for "a cabin of this standard" can't be selected by number, and both calls return
400, as in production.
Not yet available
Add-ons, excursions and supplemental tours are not simulated yet:
- The endpoints that list applicable add-ons, excursions and supplemental tours return empty lists.
- Applying or removing one returns
400, because none is applicable.
The booking flow completes without them.
Moving to production
Switch the base URL and user_key to your production values. The request and response contracts are the same, so no other changes are needed.