First-party app
FareHarbor FareHarbor

FareHarbor

Read FareHarbor companies, items and availability, and validate, create, cancel and check in bookings over the External API.

stable Calendar & SchedulingCommerce & Payments

About

FareHarbor ships in the w6w first-party pack. It declares 24 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.fareharbor
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Calendar & Scheduling · Commerce & Payments

Overview

FareHarbor is booking and reservation software for tour and activity operators. This app lets a workflow work with the External API that FareHarbor issues to approved integration partners: list the companies your keys may book, read their items (bookable products), pull availability for a date or a date range, and read bookings by availability, by creation date or by UUID.

It can also write: validate a booking before creating it, create one (with transportation, rebooking and custom fields), update a booking’s note, check customers in, cancel a booking and re-send confirmation emails.

Authentication is FareHarbor’s two keys, an App key and a User key; the User key is tied to one currency, so use one connection per currency. FareHarbor limits requests per IP address (30 a second and 3,000 per 5 minutes) and times availability ranges out at 60 seconds, so pull availability in short ranges. Only the production API is supported, not the demo sandbox.

Build with FareHarbor

Three routes to the same 24 actions. The Workflow tab is generated from FareHarbor's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

List Agents

agent-list

List the agents of an affiliate company. Affiliate keys only.

Get Availability

availability-get

Fetch one availability (a bookable time slot) with its capacity, customer type rates and custom fields.

List Availabilities by Date

availability-list-by-date

List the minimal availabilities of one item on one date (company-local). Possibly-bookable only: 'call to book' slots are excluded. Custom-field detail is excluded.

List Availabilities by Date Range

availability-list-by-date-range

List the minimal availabilities of one item between two dates, inclusive (company-local). FareHarbor times out at 60 seconds (HTTP 504) on wide ranges; pull in 7-day segments.

List Availability Lodgings

availability-lodging-list

List the lodgings an availability can provide transportation to.

Cancel Booking

booking-cancel

Cancel a booking. Allowed within 5 minutes of creating it regardless of policy; after that the company's cancellation policy and your permission decide. Within 48 hours of the start there is no refund. Any affiliate-collected payments must be refunded first.

Check In Booking

booking-checkin

Check in a booking, or one customer on it. With no Customer ID every customer is checked in. Check-in status defaults to FareHarbor's automatic choice.

Create Booking

booking-create

Book an availability. Fails if the slot is closed, over capacity or the customer type rates do not belong to it. Validate first. Pass Rebooking to replace an existing booking; the old one is marked rebooked.

Get Booking

booking-get

Fetch one booking by UUID: customers, contact, availability, pricing and status. Set With payments to include the payment records.

List Bookings for Availability

booking-list-by-availability

List the bookings made against one availability.

List Bookings by Create Date

booking-list-by-create-date

List the minimal records (pk, uuid, status) of every booking created on one date. The cheap way to poll for new bookings; fetch each with Get Booking.

Update Booking Note

booking-note-update

Set a booking's note (replaces the existing note).

Resend Confirmation Email

booking-resend-confirmation

Queue confirmation-email resends for every non-cancelled booking whose contact email and start date match. Emails go only to the address already on each booking, and the response never says whether anything matched. Limits: 5 requests/minute per key pair and 1 per 5 minutes per email.

Validate Booking

booking-validate

Dry-run a booking without creating it: returns whether it is bookable, the price, and the reason it is not. FareHarbor requires validating before an instantly-confirmed booking. A refusal comes back as `is_bookable: false` with a `code` and `error`, not as an HTTP error.

List Check-in Statuses

checkin-status-list

List the check-in statuses a company has defined.

Get Company

company-get

Fetch one company by shortname.

List Companies

company-list

List every company (supplier) these keys may book through the API, with its shortname, name and currency. Call it routinely: a shortname that disappears should be dropped from later requests.

List Crew Members

crew-member-list

List the crew members assigned to an availability.

List Desks

desk-list

List the desks of an affiliate company. Affiliate keys only.

Get Item

item-get

Fetch one item (bookable product): pricing prototypes, custom fields, images and FAQs.

List Items

item-list

List the items (bookable products) of a company. Without Detailed the response is the compact form; set Require future availabilities to drop products with nothing left to book.

List Lodgings

lodging-list

List the lodgings (hotels, pickup locations) a company offers transportation to.

List Roles

role-list

List the crew roles defined for a company.

List Company Users

user-list

List the users of a company (name, username) — the usernames that crew members are assigned by.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying FareHarbor's real ids.

{
  "manifestVersion": "2",
  "name": "fareharbor-example",
  "steps": [
    {
      "id": "agent-list",
      "uses": {
        "app": "io.w6w.fareharbor",
        "action": "agent-list",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "shortname": "<shortname>"
      }
    }
  ]
}

Here are some of the things you can do

  • List Agents

    read
    agent-list
  • Get Availability

    read
    availability-get
  • List Availabilities by Date

    search
    availability-list-by-date
  • List Availabilities by Date Range

    search
    availability-list-by-date-range
  • List Availability Lodgings

    read
    availability-lodging-list

+19 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for FareHarbor, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to FareHarbor. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "agent-list",
  payload: {
    shortname: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action agent-list --payload '{"shortname":"<value>"}'

Give an AI agent FareHarbor — without giving it FareHarbor's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.fareharbor#agent-list",
    "input": {
      "shortname": "<shortname>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's FareHarbor connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

FareHarbor's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. FareHarbor itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

FareHarbor declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

FareHarbor platform status

status.fareharbor.com. Booking, Calendar and Booking Webhook — the surfaces the External API drives — decide the verdict; every other component is reported but cannot make the app down. The page has no component named API, so this mapping is an inference.

dependency

External API reachable

Unauthenticated GET https://fareharbor.com/api/external/v1/companies/. A 400 key-missing carrying FareHarbor's JSON error envelope passes — it proves the API and its auth layer are answering. Credential validity is the derived `auth:*` check's job.

quota

API rate-limit headroom