# Get started as a developer

> What you can build on Travel Orbit, where each API lives, how it decides who you are, and your first request.

Source: https://docs.bifrostorbit.com/travel/developers/get-started/

Travel Orbit holds an organisation's trips, departures, prices and bookings. Your team runs them in the app; your website reads them and takes bookings through the APIs below. Payments go from the traveller's browser straight to the organisation's own Stripe account, never through your server or ours.

## What you can build

| You want to | Use |
| --- | --- |
| Show trips, departures, guides and destinations with live prices and places | The [booking API](https://docs.bifrostorbit.com/travel/developers/booking-api/) (REST) or [GraphQL](https://docs.bifrostorbit.com/travel/developers/graphql/) |
| Price a booking as the traveller chooses | `POST /quote` in the booking API, or the `quote` query in GraphQL |
| Take bookings on your own website | `POST /bookings` in the booking API, with Stripe's Payment Element |
| Give travellers an account on your website | The portal endpoints in the booking API |
| Preview draft trips on a staging site | An [API key](https://docs.bifrostorbit.com/travel/developers/api-keys/) that reads drafts, from your server |
| Let an AI assistant work with trips and bookings | The [MCP server](https://docs.bifrostorbit.com/travel/developers/mcp/) |
| Try requests with your own data | The [API playground](https://docs.bifrostorbit.com/travel/developers/api-playground/) |

If the website is built in CMS Orbit, editors can put trips on pages without code: see [Show your trips on your website](https://docs.bifrostorbit.com/travel/everyone/cms-orbit/). The organisation's hosted booking pages at `https://app.bifrostorbit.com/travel/book/{booking name}` need no code either.

## Addresses

| What | Address |
| --- | --- |
| Booking API | `https://app.bifrostorbit.com/travel/api/public/{booking name}` |
| GraphQL | `https://app.bifrostorbit.com/travel/api/cdn/graphql` |
| MCP server | `https://app.bifrostorbit.com/travel/mcp` |

The booking name is set under **Booking settings**, such as `northwilds`. It is the same name as in the hosted booking pages' address.

## Who you are

- **Reading** trips, departures, guides and destinations needs no key. It returns only what the booking pages show anyway.
- **Quotes and bookings** need no key either. From a browser, only the websites listed under **Allowed websites** in [Booking settings](https://docs.bifrostorbit.com/travel/everyone/booking-settings/) may call them; a call from your server, without an `Origin` header, always may.
- **API keys** are optional. A key that starts with `trv_pk_` counts your requests; one that starts with `trv_sk_` also reads draft trips and works only from a server. Admins create them under **API keys**.
- **The MCP server** signs in with OAuth as a person on the team, with that person's role.

## Your first request

List Northwilds' trips in Norway, in Norwegian:

```bash
curl 'https://app.bifrostorbit.com/travel/api/public/northwilds/trips?country=NO&locale=nb'
```

```json
{
  "data": [
    {
      "id": "6650f1c2a9e4b3d2c1f0e9b1",
      "slug": "lofoten-ridge-walk",
      "name": "Eggevandring i Lofoten",
      "currency": "EUR",
      "priceFrom": 124000,
      "nextDeparture": "2027-06-14",
      "departures": [{ "id": "6650f1c2a9e4b3d2c1f0ea07", "startDate": "2027-06-14", "status": "open", "seatsLeft": 6 }],
      "locale": "nb",
      "fallback": []
    }
  ]
}
```

The answer is shortened. Amounts are whole minor units: `124000` with `EUR` is €1,240.00.

The same in GraphQL, from a browser:

```js
const response = await fetch("https://app.bifrostorbit.com/travel/api/cdn/graphql?organisation=northwilds", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ query: '{ trips(country: "NO", locale: "nb") { slug name priceFrom currency nextDeparture } }' }),
});
const { data } = await response.json();
```

## From here

1. Open **API playground** under **Developers** in the sidebar and run **Trips** with your own data.
2. Read the [booking API](https://docs.bifrostorbit.com/travel/developers/booking-api/) for every field, the booking flow and the traveller account.
3. Add your website to **Allowed websites** before you call quotes or bookings from the browser.
4. When something answers with an error, look it up in [Troubleshooting](https://docs.bifrostorbit.com/travel/developers/troubleshooting/).

Travel Orbit records what happens to trips, departures, bookings and payments as [events](https://docs.bifrostorbit.com/travel/developers/webhooks-and-events/) in Orbit Exchange. It doesn't send webhooks to your own systems, and there is no Travel Orbit SDK: the APIs are plain HTTP and JSON.
