Use a marketplace app when your platform lists and sells rental inventory on behalf of Lockii operators. Operators connect your marketplace, choose which products to publish, and you push paid bookings into Lockii after you collect payment from the renter.
If you are building an accounting sync, automation tool, or other integration that is not a sales channel, see Building a Lockii App instead.
Marketplace apps are reviewed before launch. Email [email protected] to finish your app review. You can start developing today without needing to contact us.
Include:
Once approved, Lockii registers your app and issues:
client_id and client_secretTreat the client_secret like a password. Store it in a secrets manager. Never put it in client-side code or version control. Rotation is available on request.
Connect operator → Discover listings → Check availability → Get price for dates → Take payment → Create booking
| Concept | Meaning |
|---|---|
| Connection | One Lockii operator who granted your marketplace access. Each connection has its own tokens. |
| Listing | A product the operator published to your marketplace, plus location and a display "from" price. |
| Booking | A rental order in Lockii attributed to your marketplace. |
Important behaviours:
pricing_summary.from_amount is for "from $X/day" display only. Once a renter picks dates, call POST /channel/pricing for the catalogue total. Do not reimplement pricing tiers on your side.confirmed. If not (for example another booking landed in between), it is created as pending_approval and the operator decides. Handle both outcomes.channel:read and channel:write can call /api/v1/channel/* routes. They cannot call the operator Standard API (bookings, stock, customers, webhooks, or MCP). If you need that data, build a Lockii App with the right operator scopes instead.| Purpose | URL |
|---|---|
| API | https://dash.lockii.app/api/v1 |
| OAuth | https://dash.lockii.app/api/oauth |
Request only what you need:
| Scope | Grants |
|---|---|
channel:read |
Read published listings, check availability (including calendars), calculate hire prices, read bookings you created |
channel:write |
Create and cancel bookings |
Marketplace apps should request only channel scopes. Operator scopes (booking:read, booking:write, inventory:write, reporting:read) are for non-marketplace Lockii apps.
Lockii uses the OAuth 2.0 authorization code grant with refresh tokens. Each successful grant creates a connection for one operator. PKCE (S256) is supported and recommended.
While the operator is logged in on your platform, redirect them to:
https://dash.lockii.app/api/oauth/authorize
?client_id={your client_id}
&redirect_uri={one of your registered redirect URIs}
&response_type=code
&scope=channel:read channel:write
&state={opaque anti-CSRF value}
&external_account_id={your seller account ID}
&external_account_name={display name, optional}external_account_id is required for marketplace apps. It is your identifier for the seller account starting the connection. Lockii stores it on the connection and echoes it in the API and webhooks.
Operators can also start from Settings → Integrations in Lockii if you provided a connect URL.
The operator signs in to Lockii, picks a company, and approves the scopes.
redirect_uri with ?code=...&state=... (code expires in 10 minutes, single-use)?error=access_denied&state=...Always verify state before continuing.
POST /api/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code={code}
&client_id={client_id}
&client_secret={client_secret}
&redirect_uri={same redirect_uri as authorize}Response includes access_token, refresh_token, expires_in, scope, and connection_id. Store the token pair against your seller account, keyed by connection_id.
Authorization codes are single-use. If your token exchange fails, send the operator through the authorize flow again instead of retrying the same code.
POST /api/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token={current refresh token}
&client_id={client_id}
&client_secret={client_secret}Refresh a few minutes before expiry, or on a 401 with error.code: "token_expired".
403 with connection_pausedconnection.disconnected. Stop showing their listings immediatelyconnection_id and publications, with fresh tokensPOST /api/oauth/revoke (RFC 7009)Send the connection access token on every request:
Authorization: Bearer <access_token>The token identifies the connection. You do not pass a company id.
| Method | Endpoint | Object |
|---|---|---|
GET |
/channel/connection |
Connection |
GET |
/channel/listings |
Listing |
GET |
/channel/listings/{id} |
Listing |
POST |
/channel/availability |
Availability |
POST |
/channel/availability/calendar |
Availability calendar |
POST |
/channel/pricing |
Price |
POST |
/channel/bookings |
Booking |
GET |
/channel/bookings/{id} |
Booking |
POST |
/channel/bookings/{id}/cancel |
Booking |