Xplor-H2O API, version 1
The website and the phone apps use this same API. Machine-readable description: /api/v1/openapi.json (OpenAPI 3.1).
- Sign in at
/api/auth/sign-in/email. Phone apps send the returned token asAuthorization: Bearer …. X-Acting-As: <page id>acts for a page you hold a position on.Idempotency-Keyon writes makes retries safe.- Errors look like
{"error":{"code","message","field"}}.
Me
GET
/api/v1/meSigned inThe signed-in person: roles, the pages and places they can act as.
GET
/api/v1/me/rolesSigned inRoles a person can hold, with their status for each.
POST
/api/v1/me/rolesSigned in, email confirmedApply for a role (Captain, Trainer, Club Manager, ...). Roles that need approval wait for Host Admin.
GET
/api/v1/me/followsSigned inPlaces and pages you follow (a bookmark list; there is no activity feed).
POST
/api/v1/me/followsSigned inFollow a place or page.
DELETE
/api/v1/me/follows/{entityId}Signed inStop following a place or page.
GET
/api/v1/me/savedSigned inYour saved places and listings (the phone apps keep these for offline use).
POST
/api/v1/me/savedSigned inSave a place or listing.
DELETE
/api/v1/me/saved/{targetKind}/{targetId}Signed inRemove a saved place or listing.
GET
/api/v1/me/reviewsSigned inReviews you've written and where each one stands.
GET
/api/v1/me/listingsSigned inYour marketplace listings.
POST
/api/v1/me/switch/returnSigned inEnd a switch and return to the Super Admin's own account. Only while a Super Admin is signed in as this account. Signing out does the same.
Pages
POST
/api/v1/pagesSigned in, email confirmedCreate a provider page, club or organization. Needs the matching active role; starts as a draft.
GET
/api/v1/pages/{ref}PublicA page by its web name. Drafts and private pages only for their staff.
PATCH
/api/v1/pages/{ref}Signed inEdit a page's details. Needs page.edit on the page.
POST
/api/v1/pages/{ref}/submitSigned in, email confirmedSend a draft page to Host Admin for review. Needs page.publish.
GET
/api/v1/pages/{ref}/staffSigned inPeople who hold positions on a page or location. Needs page.view or location.view.
POST
/api/v1/pages/{ref}/staffSigned in, email confirmedInvite someone by email to a position on a page or location. Needs page.staff or location.staff. Each person uses their own account.
DELETE
/api/v1/pages/{ref}/staff/{memberId}Signed inRemove a position. The last manager can't be removed.
POST
/api/v1/invitations/{token}/acceptSigned in, email confirmedAccept a staff invitation sent to your email.
Locations
GET
/api/v1/location-typesPublicKinds of place.
GET
/api/v1/locationsPublicSearch published places by text, type, distance (near + radiusKm) or map area (bbox = west,south,east,north).
GET
/api/v1/locations/{ref}PublicA place, with its approved Access-by-Water information.
POST
/api/v1/locationsSigned in, email confirmedAdd a place. Member-added places wait for Host review before they are public.
PATCH
/api/v1/locations/{ref}Signed inEdit a place's business details (hours, prices, amenities, contact). Location managers (location.edit) or Host Admin: Locations. Access-by-Water is separate and Host-approved.
POST
/api/v1/locations/{ref}/claimsSigned in, email confirmedClaim a place you run. Host Admin checks the evidence; approval makes you its manager.
GET
/api/v1/locations/{ref}/accessSigned inApproach-information versions for a place: the published one, proposals and history. The place's managers and Host Admin: Locations.
POST
/api/v1/locations/{ref}/accessSigned in, email confirmedPropose new approach information (managers), or publish it directly (Host Admin: Locations, publish=true). Nothing a manager sends is public until Host Admin approves it. Every published version carries the not-for-navigation notice.
Media
POST
/api/v1/mediaSigned in, email confirmedStart an upload: returns where to PUT the file. Then call /media/{id}/complete. Images (JPEG, PNG, WebP, HEIC) up to 15 MB; PDF evidence up to 15 MB. Uploads to object storage when configured.
POST
/api/v1/media/{id}/completeSigned in, email confirmedFinish an upload: the file is checked, measured and thumbnailed.
Admin
GET
/api/v1/admin/role-applicationsSigned inRole applications waiting for a decision. Host Admin with two-factor sign-in on. Sub-role: Providers.
POST
/api/v1/admin/role-applications/{id}/decideSigned inApprove or reject a role application. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/pagesSigned inPages by status (default: waiting for review). Host Admin with two-factor sign-in on. Sub-role: Providers.
POST
/api/v1/admin/pages/{id}/decideSigned inApprove (publish) or send back a page; or suspend an active one. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/claimsSigned inLocation claims. Host Admin with two-factor sign-in on. Sub-role: Locations.
POST
/api/v1/admin/claims/{id}/decideSigned inApprove a claim (the claimant becomes Location Manager) or reject it. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/locationsSigned inPlaces by visibility (default: waiting for review). Host Admin with two-factor sign-in on. Sub-role: Locations.
POST
/api/v1/admin/locations/{id}/decideSigned inPublish or hide a place. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/mediaSigned inUploaded media waiting for moderation. Host Admin with two-factor sign-in on. Sub-role: Content Moderator.
POST
/api/v1/admin/media/{id}/decideSigned inApprove or reject uploaded media. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/usersSigned inFind accounts by name or email. Host Admin with two-factor sign-in on. Sub-role: Users or Support.
POST
/api/v1/admin/users/{id}/rolesSigned inGrant or remove a role. Host Admin with two-factor sign-in on. Host Admin roles: Super Admin only. Other roles: Users or Providers.
POST
/api/v1/admin/users/{id}/statusSigned inSuspend or reinstate an account (signs them out everywhere). Host Admin with two-factor sign-in on. Sub-role: Users.
GET
/api/v1/admin/auditSigned inThe audit log, newest first. Host Admin with two-factor sign-in on. Sub-role: Super, Users, Risk or Support.
GET
/api/v1/admin/contributionsSigned inReviews by state (default: waiting). Host Admin with two-factor sign-in on. Sub-role: Content Moderator.
POST
/api/v1/admin/contributions/{id}/decideSigned inPublish, reject, or take down a review. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/reportsSigned inReported content. Host Admin with two-factor sign-in on. Sub-role: Content Moderator (reviews, photos) or Marketplace (listings).
POST
/api/v1/admin/reports/{id}/decideSigned inTake the reported content down (closes every open report on it) or dismiss the report. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/listingsSigned inMarketplace listings by state (default: waiting for review). Host Admin with two-factor sign-in on. Sub-role: Marketplace.
POST
/api/v1/admin/listings/{id}/decideSigned inApprove, reject or take down a listing. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/accessSigned inApproach-information proposals (default: waiting). Host Admin with two-factor sign-in on. Sub-role: Locations.
POST
/api/v1/admin/access/{id}/decideSigned inApprove (publish, with the date it was checked) or reject an approach-information proposal. Host Admin with two-factor sign-in on.
GET
/api/v1/admin/settingsSigned inPlatform settings, with placeholders for decisions the owner hasn't made yet. Host Admin with two-factor sign-in on. Any Host Admin may read; Super Admin edits.
PATCH
/api/v1/admin/settings/{key}Signed inChange a setting (the same JSON type as before). Clears its placeholder flag. Host Admin with two-factor sign-in on. Super Admin only.
POST
/api/v1/admin/users/{id}/switchSigned inSign in as another user (switch user). Super Admin with two-factor on, re-checked with a current authenticator code. Not into Host Admins, Super Admins or suspended accounts. Lasts 60 minutes; while it lasts this session acts as the account and Host Admin tools are off. Audited.
GET
/api/v1/admin/switchesSigned inSwitch-user history, newest first. Host Admin with two-factor sign-in on. Sub-role: Super or Risk.
Reviews
GET
/api/v1/reviewsPublicPublished reviews of one place or page (plus your own, whatever its state), with the rating summary.
POST
/api/v1/reviewsSigned in, email confirmedReview a place or a provider/club page. One live review per person per target; it waits for Host moderation before it is public. People who hold a position on the target can't review it. Daily limit: setting reviews.daily_limit.
PATCH
/api/v1/reviews/{id}Signed in, email confirmedEdit your review. It goes back to moderation.
DELETE
/api/v1/reviews/{id}Signed inWithdraw your own review. Nobody else can delete a review; report it instead.
POST
/api/v1/reviews/{id}/responseSigned in, email confirmedReply publicly to a review of a place or page you run (null removes the reply). Needs location.respond on the place, or page.edit on the page.
POST
/api/v1/reportsSigned in, email confirmedReport a review, listing or photo to the moderators.
Marketplace
GET
/api/v1/listing-categoriesPublicMarketplace categories.
GET
/api/v1/listingsPublicBrowse live listings by text, category, distance (near + radiusKm) or map area (bbox). Newest first.
GET
/api/v1/listings/{ref}PublicOne listing. Pending, sold and withdrawn listings only for the seller and Host Admin. The seller's contact details (contact) are included for signed-in members only.
POST
/api/v1/listingsSigned in, email confirmedList a personal item for sale (free). It waits for Host review; add photos with /media (contextKind listing). Give contactPhone and/or contactEmail (at least one): buyers contact you directly. The price is the seller's asking price, for display only. Settings: marketplace.listing_days, marketplace.max_open_listings.
PATCH
/api/v1/listings/{ref}Signed in, email confirmedEdit your listing. Changing the title, description or category sends it back to review. Contact details can be changed but not both removed.
POST
/api/v1/listings/{ref}/statusSigned in, email confirmedMark your listing sold, withdraw it, or relist it (renews the expiry).
Search
GET
/api/v1/searchPublicSearch everything at once: places, provider pages (captains, charters, scuba, rentals, ...), clubs and marketplace items, grouped by kind.
GET
/api/v1/geocodePublicAddress search (MapTiler Geocoding, called server-side). Returns 503 not_configured when no key is set. Cached for a day; 20 searches a minute per person or IP.