Developers
A JSON API at /api/v1 and widgets you can drop into any website. The full description is at /api/v1/openapi.json (OpenAPI 3.1).
Widgets
Paste one tag where the widget should appear. Replace marina-slug with the marina's name from its page address (for example, /marinas/kemah-boardwalk-marina).
Book a slip
Available slips with prices and a Request button. Requests count as bookings from your widget.
<script src="https://dockpact.com/widget.js" data-marina="marina-slug" data-widget="booking" async></script>Marina card
Photo, name, slips, rating and availability, linking to the marina page.
<script src="https://dockpact.com/widget.js" data-marina="marina-slug" data-widget="card" async></script>Fuel prices
Today's fuel prices at the marina.
<script src="https://dockpact.com/widget.js" data-marina="marina-slug" data-widget="fuel" async></script>Reviews badge
Average rating and review count, with verified stays.
<script src="https://dockpact.com/widget.js" data-marina="marina-slug" data-widget="reviews" async></script>Using the API
- Public reads need no key. They are rate limited per IP address (about 120 a minute; search 60).
- For a boater's own data, get tokens from
POST /api/v1/auth/tokenand sendAuthorization: Bearer <accessToken>. Access tokens last 15 minutes; refresh them withPOST /api/v1/auth/refresh. - Errors are JSON:
{ "code": "...", "message": "...", "field": "..." }. 400 means the input is wrong (fieldsays where), 422 means a business rule refused it, 429 means slow down. - Dates are
YYYY-MM-DDin the marina's time zone; money is in cents.
Endpoints
Marinas
GET /api/v1/metrosAreas we coverGET /api/v1/metros/{slug}/marinasMarina cards in an area: price or estimate, availability badge, ratingGET /api/v1/searchSearch marinas by place, map area and boat size; ranked by fit, then distanceGET /api/v1/marinas/{slug}A marina page: details, photos, amenities, fuel prices, review summary, spaces and availability summaryGET /api/v1/marinas/{slug}/slipsDocks and spaces for a slip mapGET /api/v1/slips/{id}/availabilityFree day ranges for one space (at most two years)
Booking
POST /api/v1/quotesPrice a stay and check it can be requestedPOST /api/v1/booking-requestsSign-inRequest a space; it is held while the marina decidesPOST /api/v1/booking-requests/{id}/cancelSign-inWithdraw a waiting requestGET /api/v1/my/booking-requestsSign-inThe caller's requests
Boats
GET /api/v1/my/vesselsSign-inThe caller's boatsPOST /api/v1/my/vesselsSign-inAdd a boatPATCH /api/v1/my/vessels/{id}Sign-inChange a boatDELETE /api/v1/my/vessels/{id}Sign-inRemove a boatGET /api/v1/my/launchesSign-inThe caller's launch and retrieve requests, and the boats they can ask forPOST /api/v1/my/launchesSign-inAsk the marina to launch or bring back a boatDELETE /api/v1/my/launches/{id}Sign-inWithdraw a launch request
Contact
POST /api/v1/leadsAsk about a slip at a marinaPOST /api/v1/removal-requestsAsk for a listing to be removed
Claims
POST /api/v1/claimsStart a marina claimGET /api/v1/claims/{token}The claimant's view of their claim (signed status link)POST /api/v1/claims/{token}/evidenceUpload one proof document (multipart: docType, file); stored encryptedPOST /api/v1/claims/{token}/verify-phoneText a code to the listing's phone ({action: "send"}) or confirm it ({code})
Chat
GET /api/v1/chat/conversationsSign-inThe caller's conversationsPOST /api/v1/chat/conversationsSign-inStart a conversation with support or a marinaGET /api/v1/chat/conversations/{id}Sign-inMessages, oldest firstPOST /api/v1/chat/conversations/{id}/messagesSign-inSend a messageGET /api/v1/chat/streamSign-inLive messages as Server-Sent Events (?conversation=<id>)POST /api/v1/chat/conversations/{id}/readSign-inClear the caller's unread count (?marina=slug for the marina side)
Sign-in
POST /api/v1/auth/tokenGet an access token (15 minutes) and refresh token (60 days)POST /api/v1/auth/refreshSwap a refresh token for a new pairPOST /api/v1/auth/revokeSign a device outPOST /api/v1/auth/loginPassword sign-in for the website (sets a session cookie)POST /api/v1/auth/passwordSign-inChange passwordGET /api/v1/auth/meSign-inThe signed-in userPOST /api/v1/auth/logoutSign the browser out (deletes the session)POST /api/v1/auth/magic-linkEmail a one-time sign-in link ({email}); same answer whether or not the account existsPOST /api/v1/auth/magic-link/verifyUse an emailed sign-in link ({token})POST /api/v1/auth/password-resetEmail a password reset link ({email}); same answer either wayPOST /api/v1/auth/password-reset/confirmSet a new password from a reset link ({token, password}) and sign in
Saved marinas
GET /api/v1/my/saved-marinasSign-inThe caller's saved marinas as cards, newest firstPUT /api/v1/my/saved-marinas/{marinaId}Sign-inSave a marinaDELETE /api/v1/my/saved-marinas/{marinaId}Sign-inRemove a saved marina
Tenant portal
GET /api/v1/my/leases/{id}Sign-inOne of the caller's leases with its documentsGET /api/v1/my/billingSign-inMarinas rented from, leases, invoices, cards and paymentsPOST /api/v1/my/invoices/{id}/paySign-inA Stripe Checkout page for an invoice balance (card, Apple Pay, Google Pay)POST /api/v1/my/tenancies/{id}/cardSign-inA Stripe Checkout page that saves a new card for autopayGET /api/v1/my/insuranceSign-inInsurance documents on filePOST /api/v1/my/insuranceSign-inSend proof of insurance to a marina (multipart: file, tenantId, expiresOn, carrier, number, liabilityCents, vesselId)GET /api/v1/my/alertsSign-inNotices and storm or safety alerts from the caller's marinasGET /api/v1/my/lease-documents/{id}Sign-inA lease PDF, for its tenant onlyPOST /api/v1/my/lease-documents/{id}/signSign-inSign a lease document by typing the full name and ticking consentPOST /api/v1/my/leases/{id}/checkoutSign-inA Stripe Checkout page for a signed lease's first paymentPOST /api/v1/pay/{token}A Stripe Checkout page for an invoice balance, from the signed link in the invoice emailPOST /api/v1/estimates/{token}Approve (typed name) or decline a work estimate from the signed link in the emailPOST /api/v1/card/{token}A Stripe page to save a new autopay card, from the signed link in the card-declined email
Mobile app
POST /api/v1/my/push-tokensSign-inRegister this phone for notifications (Expo push token)DELETE /api/v1/my/push-tokensSign-inStop notifications to this phone
Service
GET /api/v1/healthLiveness: database and RedisGET /api/v1/openapi.jsonThis API descriptionPOST /api/v1/webhooks/stripeStripe platform and Connect webhook events (Stripe-Signature checked; each event stored once)
Marina admin
POST /api/v1/invites/{token}/acceptSign-inJoin a marina's team from an invite linkGET /api/v1/manage/{marina}Sign-inThe marina's profilePATCH /api/v1/manage/{marina}Sign-inSave profile fieldsPATCH /api/v1/manage/{marina}/settingsSign-inSave settingsGET /api/v1/manage/{marina}/dashboardSign-inDashboard numbersGET /api/v1/manage/{marina}/onboardingSign-inGo-live checklistGET /api/v1/manage/{marina}/docksSign-inDocksPOST /api/v1/manage/{marina}/docksSign-inAdd a dockPATCH /api/v1/manage/{marina}/docks/{id}Sign-inChange a dockDELETE /api/v1/manage/{marina}/docks/{id}Sign-inRemove an empty dockGET /api/v1/manage/{marina}/slipsSign-inSpacesPOST /api/v1/manage/{marina}/slipsSign-inAdd a spacePATCH /api/v1/manage/{marina}/slips/{id}Sign-inChange a space (active: false deactivates)DELETE /api/v1/manage/{marina}/slips/{id}Sign-inRemove a space with no historyGET /api/v1/manage/{marina}/slips/{id}/addonsSign-inOptions on a spacePUT /api/v1/manage/{marina}/slips/{id}/addonsSign-inReplace the options on a spacePATCH /api/v1/manage/{marina}/slips/statusSign-inSet the status of many spacesGET /api/v1/manage/{marina}/rate-cardsSign-inPricesPOST /api/v1/manage/{marina}/rate-cardsSign-inAdd a pricePUT /api/v1/manage/{marina}/rate-cards/{id}Sign-inReplace a priceDELETE /api/v1/manage/{marina}/rate-cards/{id}Sign-inRemove a pricePUT /api/v1/manage/{marina}/prices/bulkSign-inOne price for spaces by dock, length, type or selectionGET /api/v1/manage/{marina}/addon-typesSign-inAdd-on price listPOST /api/v1/manage/{marina}/addon-typesSign-inAdd an optionPATCH /api/v1/manage/{marina}/addon-types/{id}Sign-inChange an optionDELETE /api/v1/manage/{marina}/addon-types/{id}Sign-inRetire an optionPUT /api/v1/manage/{marina}/availabilitySign-inOpen or close dates for booking (live marinas)GET /api/v1/manage/{marina}/calendarSign-inSlips by daysGET /api/v1/manage/{marina}/next-openingsSign-inSpaces by the date they next free upGET /api/v1/manage/{marina}/booking-requestsSign-inRequests inboxGET /api/v1/manage/{marina}/booking-requests/{id}Sign-inOne requestPOST /api/v1/manage/{marina}/booking-requests/{id}/acceptSign-inAccept: tenant, draft lease, lease to signPOST /api/v1/manage/{marina}/booking-requests/{id}/declineSign-inDecline with a reasonGET /api/v1/manage/{marina}/leasesSign-inLeasesPOST /api/v1/manage/{marina}/leases/{id}/sendSign-inSend the lease to signPOST /api/v1/manage/{marina}/leases/{id}/cancelSign-inCancel an unpaid leaseGET /api/v1/manage/{marina}/leases/{id}/documentsSign-inA lease's documentsGET /api/v1/manage/{marina}/leases/renewalsSign-inLeases that would renew into a season, with the new rentPOST /api/v1/manage/{marina}/leases/renewalsSign-inCreate renewals for a season at a rate change and send them all to signGET /api/v1/manage/{marina}/leadsSign-inSlip enquiries for this marinaPATCH /api/v1/manage/{marina}/leads/{id}Sign-inMark a lead new, contacted or closedPOST /api/v1/manage/{marina}/leads/{id}/convertSign-inMake a lead a customerGET /api/v1/manage/{marina}/lease-documents/{id}Sign-inA lease PDFGET /api/v1/manage/{marina}/lease-templateSign-inThe lease textPUT /api/v1/manage/{marina}/lease-templateSign-inSave a new lease text versionGET /api/v1/manage/{marina}/teamSign-inTeam and pending invitationsPATCH /api/v1/manage/{marina}/team/{id}Sign-inChange a member's roleDELETE /api/v1/manage/{marina}/team/{id}Sign-inRemove a memberPOST /api/v1/manage/{marina}/invitesSign-inInvite someoneDELETE /api/v1/manage/{marina}/invites/{id}Sign-inWithdraw an invitationGET /api/v1/manage/{marina}/tenantsSign-inCustomers (format=csv for a spreadsheet with every exportable field and the marina's own fields)POST /api/v1/manage/{marina}/tenantsSign-inAdd a customerGET /api/v1/manage/{marina}/tenants/{id}Sign-inA customer's pagePATCH /api/v1/manage/{marina}/tenants/{id}Sign-inChange a customerGET /api/v1/manage/{marina}/tenants/{id}/statementSign-inStatement with running balanceGET /api/v1/manage/{marina}/tenants/{id}/notesSign-inThe customer's notes and contact log, newest firstPOST /api/v1/manage/{marina}/tenants/{id}/notesSign-inAdd a note to a customerPOST /api/v1/manage/{marina}/tenants/{id}/contactsSign-inRecord a call, text, chat or visit with a customerDELETE /api/v1/manage/{marina}/notes/{id}Sign-inDelete a note you wroteGET /api/v1/manage/{marina}/custom-fieldsSign-inThe marina's own fields for customers, boats, spaces and leasesPOST /api/v1/manage/{marina}/custom-fieldsSign-inAdd a fieldPATCH /api/v1/manage/{marina}/custom-fields/{id}Sign-inChange or switch off a fieldGET /api/v1/manage/{marina}/tenants/{id}/fieldsSign-inA customer's own-field valuesPUT /api/v1/manage/{marina}/tenants/{id}/fieldsSign-inSave a customer's own-field valuesGET /api/v1/manage/{marina}/vessels/{id}/fieldsSign-inA boat's own-field valuesPUT /api/v1/manage/{marina}/vessels/{id}/fieldsSign-inSave a boat's own-field valuesGET /api/v1/manage/{marina}/slips/{id}/fieldsSign-inA space's own-field valuesPUT /api/v1/manage/{marina}/slips/{id}/fieldsSign-inSave a space's own-field valuesGET /api/v1/manage/{marina}/leases/{id}/fieldsSign-inA lease's own-field valuesPUT /api/v1/manage/{marina}/leases/{id}/fieldsSign-inSave a lease's own-field valuesPOST /api/v1/manage/{marina}/occupanciesSign-inMove a customer inPATCH /api/v1/manage/{marina}/occupancies/{id}Sign-inCheck in, end, extend or move a stayGET /api/v1/manage/{marina}/occupancies/{id}/checkoutSign-inWhat is left when a customer leaves: active gate codes and passes, and the depositPOST /api/v1/manage/{marina}/occupancies/{id}/depositSign-inSettle the deposit after the stay ends: apply part to the balance, give part back, keep the restGET /api/v1/manage/{marina}/occupancies/{id}/absencesSign-inDays the customer is awayPOST /api/v1/manage/{marina}/occupancies/{id}/absencesSign-inAdd days away; with a return date the slip can be sold for short staysPATCH /api/v1/manage/{marina}/absences/{id}Sign-inChange the days awayDELETE /api/v1/manage/{marina}/absences/{id}Sign-inRemove days away (not once short stays were sold in them)GET /api/v1/manage/{marina}/recurring-chargesSign-inA customer's recurring chargesPOST /api/v1/manage/{marina}/recurring-chargesSign-inAdd a recurring charge (months already run are billed at once)PATCH /api/v1/manage/{marina}/recurring-charges/{id}Sign-inChange or stop a recurring chargeGET /api/v1/manage/{marina}/work-ordersSign-inWork ordersPOST /api/v1/manage/{marina}/work-ordersSign-inStart a work order for a customerGET /api/v1/manage/{marina}/work-orders/{id}Sign-inA work order with its linesPATCH /api/v1/manage/{marina}/work-orders/{id}Sign-inChange a work order or its statusPOST /api/v1/manage/{marina}/work-orders/{id}/linesSign-inAdd a part or labour lineDELETE /api/v1/manage/{marina}/work-orders/{id}/lines/{lineId}Sign-inRemove a line before approvalPOST /api/v1/manage/{marina}/work-orders/{id}/sendSign-inEmail the estimate to approve by typing a nameGET /api/v1/manage/{marina}/launchesSign-inThe launch queue for a dayPOST /api/v1/manage/{marina}/launchesSign-inQueue a launch or retrieve for a customerPATCH /api/v1/manage/{marina}/launches/{id}Sign-inMove a launch request along, re-time or re-order itPOST /api/v1/manage/{marina}/yard-bookingsSign-inBook the lift or cranePATCH /api/v1/manage/{marina}/yard-bookings/{id}Sign-inMove, re-assign or close a yard bookingGET /api/v1/manage/{marina}/tenants/{id}/accessSign-inThe customer's gate codes, fobs and passesPOST /api/v1/manage/{marina}/tenants/{id}/accessSign-inGive the customer a gate code, fob or passPOST /api/v1/manage/{marina}/tenants/{id}/access/revokeSign-inRevoke some or all of the customer's credentialsGET /api/v1/manage/{marina}/todaySign-inArrivals and departuresGET /api/v1/manage/{marina}/chargesSign-inCharges not yet invoicedPOST /api/v1/manage/{marina}/chargesSign-inAdd a chargeDELETE /api/v1/manage/{marina}/charges/{id}Sign-inVoid an uninvoiced chargeGET /api/v1/manage/{marina}/invoicesSign-inInvoicesPOST /api/v1/manage/{marina}/invoicesSign-inInvoice a customer nowGET /api/v1/manage/{marina}/invoices/{id}Sign-inOne invoicePOST /api/v1/manage/{marina}/invoices/{id}/voidSign-inVoid an unpaid invoicePOST /api/v1/manage/{marina}/paymentsSign-inRecord a paymentGET /api/v1/manage/{marina}/receivablesSign-inReceivables agingGET /api/v1/manage/{marina}/expensesSign-inExpenses (json or csv)POST /api/v1/manage/{marina}/expensesSign-inAdd an expensePATCH /api/v1/manage/{marina}/expenses/{id}Sign-inChange an expenseDELETE /api/v1/manage/{marina}/expenses/{id}Sign-inRemove an expensePOST /api/v1/manage/{marina}/expenses/{id}/attachmentSign-inAttach a receipt (multipart file)GET /api/v1/manage/{marina}/expenses/{id}/attachmentSign-inThe receiptGET /api/v1/manage/{marina}/waitlistSign-inThe waitlist, offers first, then queue orderPOST /api/v1/manage/{marina}/waitlistSign-inAdd someone to the waitlistPATCH /api/v1/manage/{marina}/waitlist/{id}Sign-inChange a waitlist entry or its placePOST /api/v1/manage/{marina}/waitlist/{id}/offerSign-inOffer an open space (email, 48 hours to answer)POST /api/v1/manage/{marina}/waitlist/{id}/answerSign-inRecord an answer, remove, or requeueGET /api/v1/manage/{marina}/waitlist/matchesSign-inWho on the waitlist fits a spaceGET /api/v1/manage/{marina}/metersSign-inMeters with their latest readingPOST /api/v1/manage/{marina}/metersSign-inAdd a meter to a spacePATCH /api/v1/manage/{marina}/meters/{id}Sign-inChange a meter's price, multiplier or switch it offGET /api/v1/manage/{marina}/meters/{id}/readingsSign-inA meter's readings, newest firstPOST /api/v1/manage/{marina}/meters/{id}/readingsSign-inRecord a reading (flagged when below the last)DELETE /api/v1/manage/{marina}/meter-readings/{id}Sign-inRemove an unbilled readingPOST /api/v1/manage/{marina}/invoices/{id}/creditSign-inCredit part of an invoicePOST /api/v1/manage/{marina}/payments/{id}/refundSign-inRefund all or part of a payment (card payments through Stripe)GET /api/v1/manage/{marina}/tax-ratesSign-inThe marina's tax ratesPOST /api/v1/manage/{marina}/tax-ratesSign-inAdd a tax ratePATCH /api/v1/manage/{marina}/tax-rates/{id}Sign-inChange or switch off a tax rateGET /api/v1/manage/{marina}/broadcastsSign-inMessages sent to tenantsPOST /api/v1/manage/{marina}/broadcastsSign-inSend a notice or an urgent storm or safety alert to tenants (email, text and phone notification)GET /api/v1/manage/{marina}/expense-categoriesSign-inExpense categoriesPOST /api/v1/manage/{marina}/expense-categoriesSign-inAdd a categoryGET /api/v1/manage/{marina}/reports/{name}Sign-inA report: overview, pnl, rent-roll, receivables, inventory, revenue, tax, or pack.pdfGET /api/v1/manage/{marina}/importsSign-inRecent importsPOST /api/v1/manage/{marina}/importsSign-inUpload a slip or customer file (multipart)GET /api/v1/manage/{marina}/imports/{id}Sign-inImport previewPATCH /api/v1/manage/{marina}/imports/{id}Sign-inMap columns and validatePOST /api/v1/manage/{marina}/imports/{id}/commitSign-inCommit a validated importGET /api/v1/manage/{marina}/map-sourcesSign-inUploaded maps and traced suggestionsPOST /api/v1/manage/{marina}/map-sourcesSign-inUpload a map to trace (multipart) or capture one from a web page ({url})GET /api/v1/manage/{marina}/map-sources/{id}/fileSign-inAn uploaded map filePUT /api/v1/manage/{marina}/layoutSign-inSave the slip mapGET /api/v1/manage/{marina}/membershipSign-inMembership, Stripe connection and ledgerPOST /api/v1/manage/{marina}/membership/checkoutSign-inPay for the membershipPOST /api/v1/manage/{marina}/stripe/connectSign-inConnect Stripe to take tenants' payments
Operations
GET /api/v1/ops/metrosMetros in order, with marina countsPOST /api/v1/ops/metrosAdd a metroPUT /api/v1/ops/metros/orderSet the metro orderPATCH /api/v1/ops/metros/{id}Change a metroDELETE /api/v1/ops/metros/{id}Remove a metro with no marinasGET /api/v1/ops/marinasEvery marina, filteredPOST /api/v1/ops/marinasCreate a seeded marina from researchPOST /api/v1/ops/seed/runLoad the bundled seed data again (metros, waters, expense categories, plan, researched marinas); marinas their owners edited are keptGET /api/v1/ops/marinas/{id}A marina with research fields, team, membership, claims and tasksPATCH /api/v1/ops/marinas/{id}Change any field ops may setPOST /api/v1/ops/marinas/{id}/suspendSuspend or restore a listingPOST /api/v1/ops/marinas/{id}/auditRead the marina's website again and suggest checklist facts for reviewGET /api/v1/ops/marinas/{id}/factsWebsite facts waiting for review, the approved ones, and the last website readsPOST /api/v1/ops/facts/{id}Approve (optionally corrected) or reject a website factGET /api/v1/ops/researchResearch tasks and progress per metroPOST /api/v1/ops/researchAdd research tasks to a marinaPATCH /api/v1/ops/research/{id}Update a research taskGET /api/v1/ops/invitesClaim invites with opened and claimedPOST /api/v1/ops/invitesCreate a claim invite link (shown once) and email itDELETE /api/v1/ops/invites/{id}Revoke an unused claim inviteGET /api/v1/ops/claimsThe claim queueGET /api/v1/ops/claims/{id}A claim with its documents and checksPOST /api/v1/ops/claims/{id}/approveApprove a claimPOST /api/v1/ops/claims/{id}/rejectReject a claim with a reasonPOST /api/v1/ops/claims/{id}/more-docsAsk the claimant for another documentPOST /api/v1/ops/claims/{id}/rereadRead and score the claim's documents againGET /api/v1/ops/claims/{id}/evidence/{evidenceId}A proof document (logged)GET /api/v1/ops/removalsListing removal requestsGET /api/v1/ops/removals/{id}One removal requestPATCH /api/v1/ops/removals/{id}Review, remove, keep or close a removal requestGET /api/v1/ops/auditSearch the audit logGET /api/v1/ops/notificationsThe ops bellPOST /api/v1/ops/notifications/readMark bell items readGET /api/v1/ops/leadsSlip enquiriesPATCH /api/v1/ops/leads/{id}Set a platform lead's statusGET /api/v1/ops/membershipsPlans, memberships by status and monthly revenuePATCH /api/v1/ops/plans/{id}Change a planGET /api/v1/ops/ledgerMarinas with an open balanceGET /api/v1/ops/ledger/{marina}One marina's ledger and settlementsPOST /api/v1/ops/ledger/{marina}/adjustmentsAdd a manual adjustmentPOST /api/v1/ops/ledger/{marina}/settleSettle a marina nowGET /api/v1/ops/settlementsSettlements waiting on a personPOST /api/v1/ops/settlements/{id}/approveApprove a payout over the automatic limitPOST /api/v1/ops/settlements/{id}/paidRecord a settlement paid by handGET /api/v1/ops/importsEvery marina's imports and map tracesPOST /api/v1/ops/imports/{id}/rerunCommit a failed import againPOST /api/v1/ops/map-sources/{id}/retraceTrace an uploaded map againGET /api/v1/ops/conversationsThe support inboxPOST /api/v1/ops/conversations/{id}/statusClose or reopen a conversation