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:
- Classic: Receive offers, select a candidate, and have the client sign.
- Instant: Book an eligible sailor directly without waiting.
- Retrieve contact details once payment is complete.
Environments & Authentication
Endpoints
| Environment | URL | Description |
|---|---|---|
| Production | https://api.captnboat.com/opengraphql | Real data. Active billing. |
| Integration | https://api-int.captnboat.com/opengraphql | Sandbox 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:
- Creation: You create the Boat, the Ad (Mission), then the Job (Position).
- Waiting: Sailors receive a notification and apply.
- Consultation: You retrieve the list of offers via the API.
- Client Action: You redirect your client to the signature URL (
urlSignature) to sign and pay. - 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:CHARTERpPosition: 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: BoatTypeEnum—MOTORBOAT|SAILBOAT|MULTIHULL
Result (nodes)
instantBooking:trueif 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 vialistFlagsquery)boatPictures: [String!]boatType: BoatTypeEnum!— Values:MOTORBOAT,SAILBOAT,MULTIHULLbuilderName: String!hullLength: Float!(m)beam: Float!(m)hullType: HullTypeEnum!— Possible values:MONOHULL,CATAMARAN,TRIMARANmodelName: String!registrationNumber: StringenginePower: Int(HP) — Required for motorboats.hasAutopilot: Boolean— Optional (defaulttrue).
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:CHARTERboatId: 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: Intdescription: 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 (SKIPPERorOWNER).
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: UUIDORreferenceId: 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:trueif the sailor is in the organization’s favorites.isCaptnBoatApproved:trueif 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 viamatchingSailororjobOffers).
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: UUIDORreferenceId: 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: UUIDORreferenceId: Stringreason: 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 theiridandname.
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: AFloatvalue representing the recommended price.