Capt'n Boat Public API Documentation

Capt’n Boat Public API Documentation

The Capt’n Boat public API allows partners to integrate professional crew recruitment directly into their tools. It covers the entire lifecycle: from boat creation to contract signing and payment.

Key Features:

  • Check sailor availability before creating a mission.
  • Create a full mission (Boat, Ad, Job).
  • Manage recruitment via two methods:
    1. Classic: Receive offers, select a candidate, and have the client sign.
    2. Instant: Book an eligible sailor directly without waiting.
  • Retrieve contact details once payment is complete.

Environments & Authentication

Endpoints

EnvironmentURLDescription
Productionhttps://api.captnboat.com/opengraphqlReal data. Active billing.
Integrationhttps://api-int.captnboat.com/opengraphqlSandbox for testing your developments.

Authentication

The API is a GraphQL API. Access is secured via an API key.

  • Required Header: x-api-key: <YOUR_TOKEN>
curl '[https://api-int.captnboat.com/opengraphql](https://api-int.captnboat.com/opengraphql)' \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: <YOUR_TOKEN>' \
  -d '{"query":"{ __typename }"}'
⚠️

Security: Your API key allows the generation of financial contracts. It must never be exposed on the client side (browser). Always make calls from your server (Backend).


Integration Workflow

Choose the flow that suits your needs:

The classic marketplace workflow:

  1. Creation: You create the Boat, the Ad (Mission), then the Job (Position).
  2. Waiting: Sailors receive a notification and apply.
  3. Consultation: You retrieve the list of offers via the API.
  4. Client Action: You redirect your client to the signature URL (urlSignature) to sign and pay.
  5. Contact: Once paid, the sailor’s contact details become accessible.

Guide: Create a Mission Step-by-Step

1. (Optional) Check Availability

Before creating a mission, check if sailors are available in the area. This also allows you to identify sailors eligible for instant booking.

Technical Note: GPS coordinates and dimensions are expected as String.

query CheckAvailability {
  matchingSailor(
    pAdType: CHARTER
    pPosition: SKIPPER
    pStartDate: "2026-06-15"
    pEndDate: "2026-06-30"
    pStartHarborLatitude: "47.2799"
    pStartHarborLongitude: "-2.1976"
    pEndHarborLatitude: "47.2799"
    pEndHarborLongitude: "-2.1976"
    pHullLength: "15"
    pBeam: "4"
    pBoatType: MOTORBOAT
  ) {
    nodes {
      id
      averageNotations
      instantBooking
      price
      birthday
      civility
      cv
      documents
      firstName
      nationality
      sailorAvatar
    }
  }
}

Payload (Search Arguments)

  • pAdType: AdTypeEnum! — Value: CHARTER
  • pPosition: PositionEnum! — Values: SKIPPER, HOTESSE, MATELOT, SECOND, CHEF, MECANICIEN, CHEF_DE_QUART, HOTESSE_COOK, STEW_COOK.
  • pStartDate: String! (Format YYYY-MM-DD)
  • pEndDate: String! (Format YYYY-MM-DD)
  • pStartHarborLatitude / Longitude: String!
  • pEndHarborLatitude / Longitude: String!
  • pHullLength: String (m)
  • pBoatType: BoatTypeEnumMOTORBOAT | SAILBOAT | MULTIHULL

Result (nodes)

  • instantBooking: true if the sailor can be booked immediately.
  • price: The sailor’s indicative daily rate.
  • documents: List of validated certificates.
  • id: Unique identifier for the sailor’s profile on the platform.
  • averageNotations: Average rating given by owners.
  • birthday: The sailor’s date of birth.
  • civility: The sailor’s title (e.g., Mr., Mrs.).
  • cv: Link to or content of the Curriculum Vitae (detailed experience).
  • firstName: The sailor’s first name.
  • nationality: The sailor’s nationality.
  • sailorAvatar: Link to the sailor’s profile picture.

2. Create (or retrieve) a Boat

Create (or retrieve) a boat. If an identical boat already exists, the mutation does not recreate the entry and returns only its id.

mutation CreateBoat {
  createBoat(
    input: {
      name: "Boat Name"
      flagId: "ef08f160-9858-464b-9e59-a93f94ad5260"
      boatPictures: ["[http://mypictures.com/myboat.jpg](http://mypictures.com/myboat.jpg)"]
      boatType: MOTORBOAT
      builderName: "Beneteau"
      hullLength: 15
      beam: 4
      hullType: MONOHULL
      modelName: "Oceanis 45"
      registrationNumber: "AY-123-BC"
      enginePower: 150
      hasAutopilot: true
    }
  ) {
    boat { id }
  }
}

Payload (CreateBoatInput)

  • name: String!
  • flagId: UUID! — Flag ID (retrievable via listFlags query)
  • boatPictures: [String!]
  • boatType: BoatTypeEnum! — Values: MOTORBOAT, SAILBOAT, MULTIHULL
  • builderName: String!
  • hullLength: Float! (m)
  • beam: Float! (m)
  • hullType: HullTypeEnum! — Possible values: MONOHULL, CATAMARAN, TRIMARAN
  • modelName: String!
  • registrationNumber: String
  • enginePower: Int (HP) — Required for motorboats.
  • hasAutopilot: BooleanOptional (default true).

Result

  • boat { id } : The unique identifier of the boat (new or existing).

3. Create an Ad (Mission)

Defines the context: dates, route, passengers.

mutation CreateAd {
  createCompleteAd(
    input: {
      adType: CHARTER
      boatId: "BOAT_ID_STEP_2"
      startDate: "2025-06-01"
      endDate: "2025-06-15"
      startHarborLatitude: "47.2799"
      startHarborLongitude: "-2.1976"
      endHarborLatitude: "47.2799"
      endHarborLongitude: "-2.1976"
      passengerNumber: 6
      description: "Summer delivery"
    }
  ) {
    ad { id }
  }
}

Payload (CreateCompleteAdInput)

  • adType: AdTypeEnum! — Value: CHARTER
  • boatId: UUID! — The ID retrieved in step 2.
  • startDate: String (Format YYYY-MM-DD)
  • endDate: String (Format YYYY-MM-DD)
  • startHarborLatitude / Longitude: String!
  • endHarborLatitude / Longitude: String!
  • passengerNumber: Int
  • description: String

Result

  • ad { id } : The unique identifier of the ad.

4. Create a Job Post

Here you define the position (Skipper, Hostess) and the billing information for the final client.

You can add your own referenceId (e.g., your internal order ID) here to retrieve this job later without storing the Capt’n Boat ID.

mutation CreateJob {
  createCompleteJob(
    input: {
      adId: "AD_ID_STEP_3"
      positionType: SKIPPER
      price: 150.0
      referenceId: "INTERNAL-ORDER-999" # Your unique ID
      billingFirstname: "John"
      billingLastname: "Doe"
      billingEmail: "john.doe@email.com"
      billingAdressCityName: "London"
      billingAdressCountry: "United Kingdom"
      billingAdressFirstLine: "10 Downing Street"
      billingAdressZipCode: "SW1A 2AA"
      billingDateOfBirth: "1980-01-01"
      billingLanguage: "EN"
      billingPhoneNumber: "+44712345678"
      reserved: ALL
      travelFee: SKIPPER
    }
  ) {
    job {
      id
      referenceId
    }
  }
}

Payload (CreateCompleteJobInput)

  • Mandatory Fields:

    • adId: UUID!
    • positionType: PositionEnum! — E.g.: SKIPPER. See complete list in Step 1.
    • price: Float! — Daily rate. See price estimation in Appendix.
    • billingFirstname: String!
    • billingLastname: String!
    • billingEmail: String!
  • Optional Fields:

    • referenceId (String) — Important: Your unique identifier (e.g., Order ID). Allows performing actions (Cancel, GetOffers) without using the Capt’n Boat ID.
    • billingAddressCityName, billingAddressCountry, billingAddressFirstLine, billingAddressZipCode (String): Billing address.
    • billingDateOfBirth (Date): Date of birth for billing.
    • billingPhoneNumber (String): Phone number for billing.
    • billingRegistrationNumber / billingSiret (String): Registration numbers (for professionals).
    • reserved (ReservedEnum) — Defines ad visibility:
      • ALL: Open to all.
      • APPROVED: Accessible to all sailors approved by Capt’n Boat.
      • FAVOURITES: Accessible to favorite sailors of the ad owner’s organization.
      • RESERVED: Instant Booking.
    • travelFee (TravelFeeEnum) — Defines who pays for travel (SKIPPER or OWNER).

Result

  • job { id, referenceId } : The unique identifier and reference of the created job.

Offer Management & Booking

List Offers (Standard Flow)

Allows you to see who has applied. You can use either jobId or your referenceId.

query GetOffers {
  jobOffers(
    # Use one or the other:
    jobId: "JOB_ID_CAPTN_BOAT"
    referenceId: "INTERNAL-ORDER-999"
  ) {
    picture
    urlSignature
    travelFee
    price
    isFavorite
    isCaptnBoatApproved
    firstName
    captnBoatProfile
  }
}

Payload

  • jobId: UUID OR referenceId: String — The job identifier.

Result

  • firstName: The sailor’s first name.
  • price: The price requested by the sailor for this offer.
  • urlSignature: The URL to redirect your client to for contract signing and payment.
  • picture: Link to the sailor’s profile picture.
  • travelFee: Information regarding travel expense coverage.
  • isFavorite: true if the sailor is in the organization’s favorites.
  • isCaptnBoatApproved: true if the sailor’s profile has been validated and approved by Capt’n Boat.
  • captnBoatProfile: Link to or identifier for the sailor’s public profile on the Capt’n Boat platform.

Instant Booking (Direct Flow)

Use this mutation only if you have identified a sailor with instantBooking: true. This creates an offer and validates it directly.

mutation InstantBook {
  createOffer(
    input: {
      jobId: "JOB_ID"
      sailorId: "SAILOR_ID"
    }
  ){
    createOfferResult {
      signatureUrl
    }
  }
}

Payload (CreateOfferInput)

  • jobId: UUID! — ID of the job created previously.
  • sailorId: UUID! — ID of the sailor (retrieved via matchingSailor or jobOffers).

Result

  • createOfferResult: Object containing finalization details.
  • signatureUrl: The URL to redirect your client to for contract signing and payment.

After Booking

Retrieve Sailor Contact

Contact details are only accessible once the job is paid and signed.

query GetContact {
  sailorContact(
    # Use one or the other:
    jobId: "JOB_ID"
    referenceId: "INTERNAL-ORDER-999"
  ) {
    firstName
    lastName
    email
    phoneNumber
    sailorAvatar
    price
    travelFee
    documents
    degree
    cv
    contract
    birthday
    civility
    averageNotations
    invoices
  }
}

Payload

  • jobId: UUID OR referenceId: String.

Result

  • firstName: The sailor’s first name.
  • lastName: The sailor’s last name.
  • email: The sailor’s email address.
  • phoneNumber: The sailor’s phone number.
  • sailorAvatar: Link to the sailor’s profile picture.
  • price: The final validated rate for the mission.
  • travelFee: Information regarding travel expense coverage.
  • documents: List of the sailor’s administrative documents.
  • degree: Details on diplomas and certifications.
  • cv: Link to or content of the sailor’s Curriculum Vitae.
  • contract: Link to or data of the signed contract.
  • birthday: The sailor’s date of birth.
  • civility: The sailor’s title (e.g., Mr., Mrs.).
  • averageNotations: Average rating given by previous owners.
  • invoices: List of generated invoices associated with this job.

Cancel a Job

Allows cancelling a Job if the mission is no longer taking place. Accessible via referenceId.

mutation CancelJob {
  cancelJob(
    input: {
      reason: DELAYED
      # Use one or the other:
      jobId: "JOB_ID"
      referenceId: "INTERNAL-ORDER-999"
    }
  ) {
    job { id }
  }
}

Payload

  • jobId: UUID OR referenceId: String
  • reason: CancelReasonEnum! — The reason for cancellation. Possible values:
    • FOUND: I found a sailor via another channel.
    • DELAYED: My need is postponed.
    • NOT_FOUND: I cannot find matching profiles.
    • ERROR: My ad contains errors.
    • DUPLICATE: Duplicate.
    • OTHER: Other reason.
    • CONTACT: To be contacted by a sales representative.

Result

  • job { id } : Confirmation of the cancelled job ID.

Appendices

List Flags

Useful for obtaining IDs required for boat creation.

query Flags {
  listFlags {
    nodes {
      id
      name
    }
  }
}

Result

  • Returns the list of flags (nodes) with their id and name.

Estimate a Price

Get a market price range before creating the job.

query PriceEstimate {
  estimatedPrice(
    adType: CHARTER
    startDate: "2025-08-08"
    endDate: "2025-08-15"
    startHarborLatitude: 47.2799
    startHarborLongitude: -2.1976
    endHarborLatitude: 47.2799
    endHarborLongitude: -2.1976
    hullLength: 15
    positionType: SKIPPER
  )
}

Payload

Arguments are similar to sailor search (matchingSailor):

  • adType, startDate, endDate, positionType, GPS coordinates, etc.

Result

  • estimatedPrice: A Float value representing the recommended price.