Documentation API publique Capt'n Boat
L'API publique Capt'n Boat permet de transmettre la création d'un besoin à l'équipe commerciale Capt'n Boat.
Pour cela il vous faut :
- Créer un bateau
- Créer une annonce
- Créer un Job
- Renseigner les informations de facturation de votre client
L'équipe commerciale prendra ensuite contact avec votre client pour finaliser la réservation de votre Marin (Skipper / Hôtesse... ) et lui fera parvenir, lien de paiement, facture et contrat par mail.
Objectifs de l’API
L’API publique de Capt'n Boat a pour objectif d’ouvrir certaines fonctionnalités de la plateforme à des utilisateurs externes pour leur permettre la publication d’annonces Capt'n Boat directement depuis leur infrastructure numérique. Cette API permet notamment de :
- Enregistrer les navires de l’utilisateur externe.
- Créer une annonce pour ce navire. (Une annonce correspond à une mission donnée pour ce navire, et peut comprendre plusieurs postes à pourvoir)
- Créer une fiche de poste pour une mission.
- Annuler une demande.
- Récupérer les information de contact du marin trouvé.
L’API n’est pas pensée pour assurer la gestion des bateaux et annonces publiées. Cette fonctionnalité est rendue possible par l’interface utilisateur Capt'n Boat, par laquelle l’ensemble des bateaux, missions et postes à pourvoir peuvent être consultés/administrés.
Implémentation technique
L’API externe de Capt'n Boat est une API GraphQL. Son accès est limité aux utilisateurs disposant d’un token de connexion, fourni sur demande par Capt'n Boat.
Dans la présente documentation, l’ensemble des requêtes disponibles sont détaillées et illustrées par un exemple simple. Pour de plus amples détails sur la mise en place technique de cette API, n’hésitez pas à contacter l’équipe Capt'n Boat à l’adresse suivante : api-ext@captnboat.com
Chaque connexion à l’API externe doit être faite avec le token d’authentification, passé dans le header x-api-key
.
DĂ©tail des requĂŞtes disponibles
Enregistrement d’un navire
Pour enregistrer un navire, l’ensemble des informations suivantes concernant un navire sont passées à l’API :
- le nom du bateau
- le nom du constructeur du bateau
- le nom du modèle
- sa taille
- son type de propulsion (voile ou moteur)
- son type de coque (monocoque ou multicoque)
- l’ID de son pavillon (plus de détails pour récupérer la liste des pavillons plus bas)
- sa puissance moteur s’il s’agit d’un navire moteur
- son numéro d’enregistrement
- une liste de photos (liste d’url)
- si le bateau pocède un autopilote ou non
Suite à l’enregistrement d’un navire, l’API envoie en réponse l’ID du navire nouvellement créé.
Dans le cas où les mêmes informations sont passées plusieurs fois pour enregistrer un navire, celui-ci ne sera pas recréé, l’API va simplement renvoyer l’ID du navire déjà enregistré avec des infos similaires.
⚠️ Les navires en base de données sont rattachés à un pavillon, dont la liste comprend plus de 200 entrées. Une requête API est disponible pour lister les pavillons.
Lister les pavillons
Pour lister les pavillons, l’API GraphQL propose la query:
{listFlags {nodes {idname}}}Exemple de requĂŞte :
curl 'https://api-int.captnboat.com/opengraphql' \-X POST \-H 'Content-Type: application/json' \-H 'x-api-key: 4dd092283af8df27dd2943333149b7f7' \-d '{"query":"{listFlags{nodes{id name}}}"}'Enregistrer un navire
Pour enregistrer un navire, l’API GraphQL propose la mutation :
mutation CreateBoat {createBoat(input: {name: "testBoat3"flagId: "ef08f160-9858-464b-9e59-a93f94ad5260"boatPictures: ["http://mypictures.com/myboat.jpg"]boatType: MOTORBOATbuilderName: "jo boats"enginePower: 10hullLength: 1.5hullType: MONOHULLmodelName: "jo boat 1"registrationNumber: "registration"asAutopilot: true}) {boat {id}}}Dans le cas où les mêmes informations sont passées plusieurs fois, le bateau ne sera pas recréé, et la mutation renverra juste son ID.
Payload
name: String!
flagId: UUID!
boatPictures: [String]
boatType: BoatTypeEnum!
Les valeurs admises sont :MOTORBOAT
,SAILBOAT
,MULTIHULL
builderName: String!
enginePower: Int!
hullLength: Float!
hullType: HullTypeEnum!
Les valeurs admises sont :MONOHULL
,CATAMARAN
,TRIMARAN
modelName: String!
registrationNumber: String
asAutopilot: Boolean
RĂ©sultat
{"data": {"createBoat": {"boat": {"id": "b408c93b-74a7-4d67-9fdd-a61f764e2284"}}}}
Créer une mission
Pour créer une mission, les infos sur le trajet et les ports de départ et d’arrivée sont nécessaires, ainsi que l’ID d’un bateau. Cette mutation est donc généralement exécutée directement suite à la création d’un navire, à moins que l’identifiant des navires enregistrés ne soit stocké au fur et à mesure par l’utilisateur. Pour créer une mission, nous disposons de la mutation suivante :
mutation CompleteAd { createCompleteAd( input: { adType: CHARTER boatId: "b408c93b-74a7-4d67-9fdd-a61f764e2284" startDate: "2022-06-01" endDate: "2022-06-15" spokenLanguage: ["245e9757-a9ab-4fd8-af33-f99498d5d3ef"] endHarborLattitude: 47.27991613225704 endHarborLongitude: -2.1976906604134157 startHarborLattitude: 47.27991613225704 startHarborLongitude: -2.1976906604134157 passengerNumber: 10 commercialActivity: false description: "Une description" } ) { ad { id } }}
Payload
startDate: Datetime!
boatId: UUID!
endDate: Datetime!
startHarborLattitude: Float!
startHarborLongitude: Float!
endHarborLattitude: Float!
endHarborLongitude: Float!
adType: AdTypeEnum!
Les valeurs admises sont :CHARTER
ouCOACHING
passengerNumber: Int
description: String
commercialActivity: Boolean
Si client particulier non, si professionnel oui.spokenLanguage: [UUID]!
Les valeurs possibles pour les
spokenLanguages
sont listées dans la requête suivante :{languages {nodes {idname}}}Résultat
{"data": {"createCompleteAd": {"ad": {"id": "2c2bf016-5604-4e71-bf81-3a1e7399ee9d"}}}}
Créer une fiche de poste
Pour avoir une estimation de rémunération d'un marin :
query price { estimatedPrice( adType: DELIVERY endDate: "2024-08-15" endHarborLattitude: 47.27991613225704 endHarborLongitude: -2.1976906604134157 startHarborLattitude: 47.27991613225704 startHarborLongitude: -2.1976906604134157 hullLength: 1.5 positionType: SKIPPER startDate: "2024-08-08" )}
- Payload
endDate: String!
startDate: String!
endHarborLattitude
: Float!
endHarborLongitude
: Float!
startHarborLattitude
: Float!
startHarborLongitude
: Float!
adType
: AdTypeEnum!Les valeurs admises sont:
CHARTER,
SUPPORTet
COACHING`
hullLength
: Float!
positionType
: PositionEnum!Les valeurs admises sont:
SKIPPER,
HOTESSE,
MATELOT,
SECOND,
CHEF,
MECANICIENet
CHEF_DE_QUART`
RĂ©sultat
{"data": {"estimatePrice": 2360}}
Pour créer une fiche de poste, les informations de base sur le profil recherché, ainsi que des informations de facturation sont demandées. L’ID de la mission est aussi demandée, cette mutation est donc généralement exécutée directement suite à la création d’une mission, à moins que les identifiants des missions créées ne soient enregistrés en base de données. Pour créer une fiche de poste, nous disposons de la mutation suivante :
mutation CompleteJob { createCompleteJob( input: { billingDateOfBirth: "2000-01-01" billingEmail: "`billing@myco,com`" billingFirstname: "jo" billingLanguage: "fr" billingLastname: "durand" billingPhoneNumber: "1234567890" billingRegistrationNumber: "ag-y78hn5" billingSiret: "1234567890" positionType: SKIPPER price: 1500 adId: "20ca3ae7-a1c0-4bba-984f-0a9c952f7207" billingAdressFirstLine: "52 rue Truffaut" billingAdressZipCode: "75017" billingAdressCityName: "Paris" billingAdressCountry: "FR" lessor: "" referenceId: "12" reserved: "FAVOURITES" } ) { job { id } }}
Payload
billingDateOfBirth: String!
billingEmail: String!
billingFirstname: String!
billingLanguage: String
billingLastname: String!
billingPhoneNumber: String!
billingRegistrationNumber: String!
billingSiret: String
positionType: PositionEnum!
Les valeurs admises sont:SKIPPER
,HOTESSE
,MATELOT
,SECOND
,CHEF
,MECANICIEN
etCHEF_DE_QUART
price: Float!
adId: UUID!
billingAdressFirstLine: String!
billingAdressZipCode: String!
billingAdressCityName: String!
billingAdressCountry: String!
lessor : String
referenceId: String
Vous pouvez relier une demande de poste Capt'n Boat a votre dossier en renseignant ce champ de référence afin de relier un dossier à une demande de poste Capt'n Boatreserved : ReservedEnum
Les valeurs admises sont:ALL
,APPROVED
,FAVOURITES
,RESERVED
,RĂ©sultat
{"data": {"createCompleteJob": {"job": {"id": "636301f5-6c31-4d20-88c6-4eb8ddd81382"}}}}
Annuler une demande
Pour annuler une demande de poste créé vous avez besoin de l'ID de la fiche de poste ou la référence si vous en avez renseigné une à la création. La mutation est la suivante :
mutation CancelJob { cancelJob( input: { reason: "DELAYED" jobId: "636301f5-6c31-4d20-88c6-4eb8ddd81382" referenceId: "12" } ) { job { id } }}
Payload
reason
: String- "FOUND" :Jai trouvé un marin par un autre biais
- "DELAYED" :Mon besoin est reporté
- "NOT_FOUND" :Je ne trouve pas de profils correspondant
- "ERROR" :Mon annonce comporte des erreurs
- "DUPLICATE" :Doublon
- "CONTACT" :Etre contacté par un commercial
- "OTHER" :Autre raison
jobId: String
referenceId: String
RĂ©sultat
{"data": {"cancelJob": {"job": {"id": "636301f5-6c31-4d20-88c6-4eb8ddd81382"}}}}Offres des marins
Vous pouvez retrouver toutes les offres qui ont été faites par les marins :
query offres { jobOffers( jobId: "636301f5-6c31-4d20-88c6-4eb8ddd81382" referenceId: "12" ) { captnBoatProfil firstName isCaptnBoatApprooved isFavoris picture price travelFee urlSignature }}
Payload
picture: String
firstName: String
urlSignature: String
price: Float
travelFee: Float
isFavoris: Boolean
isCaptnBoatApprooved: Boolean
captnBoatProfil: String
RĂ©sultat
{"data": {"sailorContact": {"captnBoatProfil": "","firstName": "","isCaptnBoatApprooved": "","isFavoris": "","picture": "","price": "","travelFee": "","urlSignature": "",}}}
Contact du marin
Une fois la prestation payée par le client vous pouvez récupérer les informations de contact du marin avec la requête suivante :
query contact { sailorContact( jobId: "636301f5-6c31-4d20-88c6-4eb8ddd81382" referenceId: "12" ) { firstName birthCountry birthPlace birthday cityAdress civility countryAdress email lastName natinality phoneNumber }}
Payload
firstName: String
lastName: String
email: String
phoneNumber: String
civility: CivilityEnum
birthday: Datetime
birthPlace: String
birthCountry: String
natinality: String
countryAdress: String
cityAdress: String
price: Float
travelFee: Float
degree: String
invoice: String
contract: String
RĂ©sultat
{"data": {"sailorContact": {"firstName": "","birthCountry": "","birthPlace": "","birthday": "","cityAdress": "","civility": "","countryAdress": "","email": "","lastName": "","natinality": "","phoneNumber": ""}}}
Note marin
Une fois la prestation réaliser et que le client a laissé un commentaire pour la mission :
query notation { jobNotation( jobId: "636301f5-6c31-4d20-88c6-4eb8ddd81382" referenceId: "12" ) { notation comment }}
Payload
comment: String
notation: String
RĂ©sultat
{"data": {"sailorContact": {"notation": "","comment": "",}}}Pour toutes demandes supplémentaires, contactez-nous à l'adresse suivante
api-ext@captnboat.com
.