ParkWhiz Monthly Parking API
List and retrieve recurring monthly parking bookings, the subscription-style counterpart to transient (hourly / daily / event) bookings.
List and retrieve recurring monthly parking bookings, the subscription-style counterpart to transient (hourly / daily / event) bookings.
openapi: 3.0.3
info:
title: ParkWhiz / Arrive API v4
description: >-
The ParkWhiz v4 REST API powers parking discovery, reservation, and payment
for the ParkWhiz and BestParking consumer products and for approved
integration partners. It exposes bookable parking availability and pricing
(quotes), parking locations, bookings and parking passes, venues and events,
monthly parking, accounts, vehicles, payment methods, and tickets.
Access is partner-gated: the API is publicly documented at
developer.parkwhiz.com (mirrored at developer.arrive.com), but OAuth client
credentials (client_id, client_secret, redirect_uri) are issued to approved
partners on request via dev@parkwhiz.com, not through self-serve signup.
Scopes are assigned per partner - public (default), partner, mobile,
internal, and data. A sandbox environment is available for development.
This OpenAPI document was authored by API Evangelist from the public v4
developer documentation. Paths and methods reflect the documented API; the
schema shapes are representative models, not a byte-for-byte copy of the
provider spec.
version: '4.0'
contact:
name: ParkWhiz Developer Support
url: https://developer.parkwhiz.com/
email: dev@parkwhiz.com
x-logo:
url: https://kinlane-images.s3.amazonaws.com/shared/apis-json/apis-json-logo.jpg
servers:
- url: https://api.parkwhiz.com/v4
description: Production
- url: https://api-sandbox.parkwhiz.com/v4
description: Sandbox
- url: https://api.arrive.com/v4
description: Production (Arrive-branded host)
security:
- oauth2: []
tags:
- name: OAuth
description: Token issuance for partner and user authorization.
- name: Quotes & Locations
description: Search bookable availability and pricing, and parking location details.
- name: Bookings
description: Create and manage parking reservations and parking passes.
- name: Monthly Parking
description: Recurring monthly parking bookings.
- name: Venues & Events
description: Venue and event lookup for event parking.
- name: Accounts & Vehicles
description: User accounts, vehicles, and payment methods.
- name: Tickets
description: Drive-up parking transactions, violations, and payment.
paths:
/oauth/token:
post:
operationId: createToken
tags: [OAuth]
summary: Generate an OAuth access token
description: >-
Exchange partner credentials or user credentials for an access token.
Supported grant types include client_credentials, password,
authorization_code, refresh_token, and public token for mobile apps.
security: []
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
grant_type:
type: string
enum: [client_credentials, password, authorization_code, refresh_token]
client_id:
type: string
client_secret:
type: string
scope:
type: string
example: public partner
required: [grant_type, client_id]
responses:
'200':
description: An access token.
content:
application/json:
schema:
type: object
properties:
access_token: { type: string }
token_type: { type: string, example: bearer }
expires_in: { type: integer, example: 3600 }
scope: { type: string, example: public partner }
'401':
$ref: '#/components/responses/Unauthorized'
/quotes:
get:
operationId: searchQuotes
tags: [Quotes & Locations]
summary: Search parking quotes
description: >-
Search bookable parking availability and pricing for a location, event,
or time window. Returns quotes with prices and the associated parking
location.
parameters:
- name: q
in: query
description: >-
Composite search string, e.g. coordinates plus a start/end time
window (bounding box, radius, event id, and time filters are
supported).
schema: { type: string }
- name: fields
in: query
description: Comma-separated sparse fieldset controlling the embedded objects returned.
schema: { type: string }
responses:
'200':
description: A list of quotes.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Quote' }
'401':
$ref: '#/components/responses/Unauthorized'
/locations:
get:
operationId: searchLocations
tags: [Quotes & Locations]
summary: Search parking locations
description: Find parking facilities within a geographic area.
parameters:
- name: q
in: query
schema: { type: string }
responses:
'200':
description: A list of parking locations.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Location' }
/locations/{location_id}:
get:
operationId: getLocation
tags: [Quotes & Locations]
summary: Retrieve a parking location
parameters:
- $ref: '#/components/parameters/LocationId'
responses:
'200':
description: A parking location.
content:
application/json:
schema: { $ref: '#/components/schemas/Location' }
'404':
$ref: '#/components/responses/NotFound'
/locations/{location_id}/reviews:
get:
operationId: listLocationReviews
tags: [Quotes & Locations]
summary: List reviews for a location
parameters:
- $ref: '#/components/parameters/LocationId'
responses:
'200':
description: A list of reviews.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Review' }
post:
operationId: createLocationReview
tags: [Quotes & Locations]
summary: Create a review for a location
parameters:
- $ref: '#/components/parameters/LocationId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Review' }
responses:
'201':
description: The created review.
content:
application/json:
schema: { $ref: '#/components/schemas/Review' }
'401':
$ref: '#/components/responses/Unauthorized'
/bookings:
get:
operationId: listBookings
tags: [Bookings]
summary: List the authenticated user's bookings
responses:
'200':
description: A list of bookings.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Booking' }
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createBooking
tags: [Bookings]
summary: Create a booking
description: Reserve parking from a selected quote. Requires a user-authorized token.
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/BookingRequest' }
responses:
'201':
description: The created booking.
content:
application/json:
schema: { $ref: '#/components/schemas/Booking' }
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/UnprocessableEntity'
/bookings/previews:
post:
operationId: previewBooking
tags: [Bookings]
summary: Preview a booking price
description: Price a prospective booking before committing to it.
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/BookingRequest' }
responses:
'200':
description: A booking price preview.
content:
application/json:
schema: { $ref: '#/components/schemas/Booking' }
/bookings/{booking_id}:
get:
operationId: getBooking
tags: [Bookings]
summary: Retrieve a booking
parameters:
- $ref: '#/components/parameters/BookingId'
responses:
'200':
description: A booking.
content:
application/json:
schema: { $ref: '#/components/schemas/Booking' }
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: cancelBooking
tags: [Bookings]
summary: Cancel a booking
parameters:
- $ref: '#/components/parameters/BookingId'
responses:
'204':
description: The booking was cancelled.
'401':
$ref: '#/components/responses/Unauthorized'
/bookings/{booking_id}/parking_pass:
get:
operationId: getBookingParkingPass
tags: [Bookings]
summary: Retrieve the parking pass for a booking
description: >-
Returns a pre-formatted ParkWhiz parking pass. Requires a user
authorization token for the account holding the booking.
parameters:
- $ref: '#/components/parameters/BookingId'
responses:
'200':
description: An array of parking pass models (length 1).
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/ParkingPass' }
/bookings/{booking_id}/vehicle:
get:
operationId: getBookingVehicle
tags: [Bookings]
summary: Retrieve the vehicle attached to a booking
parameters:
- $ref: '#/components/parameters/BookingId'
responses:
'200':
description: The vehicle attached to the booking.
content:
application/json:
schema: { $ref: '#/components/schemas/Vehicle' }
post:
operationId: setBookingVehicle
tags: [Bookings]
summary: Attach a vehicle to a booking
description: >-
Attach a known and existing vehicle to a booking by vehicle_id, used to
validate a vehicle at many parking locations. Requires a user
authorization token for the target account.
parameters:
- $ref: '#/components/parameters/BookingId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
vehicle_id: { type: integer }
required: [vehicle_id]
responses:
'200':
description: The attached vehicle.
content:
application/json:
schema: { $ref: '#/components/schemas/Vehicle' }
/bookings/{booking_id}/extend/previews:
post:
operationId: previewBookingExtension
tags: [Bookings]
summary: Preview extending a booking
parameters:
- $ref: '#/components/parameters/BookingId'
responses:
'200':
description: An extension price preview.
content:
application/json:
schema: { $ref: '#/components/schemas/Booking' }
/bookings/{booking_id}/extend:
post:
operationId: extendBooking
tags: [Bookings]
summary: Extend a booking's duration
parameters:
- $ref: '#/components/parameters/BookingId'
responses:
'200':
description: The extended booking.
content:
application/json:
schema: { $ref: '#/components/schemas/Booking' }
/monthly_bookings:
get:
operationId: listMonthlyBookings
tags: [Monthly Parking]
summary: List monthly bookings
responses:
'200':
description: A list of monthly bookings.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Booking' }
/monthly_bookings/{booking_id}:
get:
operationId: getMonthlyBooking
tags: [Monthly Parking]
summary: Retrieve a monthly booking
parameters:
- $ref: '#/components/parameters/BookingId'
responses:
'200':
description: A monthly booking.
content:
application/json:
schema: { $ref: '#/components/schemas/Booking' }
/venues:
get:
operationId: searchVenues
tags: [Venues & Events]
summary: Search venues
responses:
'200':
description: A list of venues.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Venue' }
/venues/{venue_id}:
get:
operationId: getVenue
tags: [Venues & Events]
summary: Retrieve a venue
parameters:
- name: venue_id
in: path
required: true
schema: { type: integer }
responses:
'200':
description: A venue.
content:
application/json:
schema: { $ref: '#/components/schemas/Venue' }
/venues/{venue_id}/events:
get:
operationId: listVenueEvents
tags: [Venues & Events]
summary: List events at a venue
parameters:
- name: venue_id
in: path
required: true
schema: { type: integer }
responses:
'200':
description: A list of events.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Event' }
/events:
get:
operationId: searchEvents
tags: [Venues & Events]
summary: Search events
responses:
'200':
description: A list of events.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Event' }
/events/{event_id}:
get:
operationId: getEvent
tags: [Venues & Events]
summary: Retrieve an event
parameters:
- name: event_id
in: path
required: true
schema: { type: integer }
responses:
'200':
description: An event.
content:
application/json:
schema: { $ref: '#/components/schemas/Event' }
/accounts:
post:
operationId: createAccount
tags: [Accounts & Vehicles]
summary: Create an account
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Account' }
responses:
'201':
description: The created account.
content:
application/json:
schema: { $ref: '#/components/schemas/Account' }
/accounts/me:
get:
operationId: getCurrentAccount
tags: [Accounts & Vehicles]
summary: Retrieve the current user's account
responses:
'200':
description: The current account.
content:
application/json:
schema: { $ref: '#/components/schemas/Account' }
'401':
$ref: '#/components/responses/Unauthorized'
patch:
operationId: updateCurrentAccount
tags: [Accounts & Vehicles]
summary: Update the current user's account
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Account' }
responses:
'200':
description: The updated account.
content:
application/json:
schema: { $ref: '#/components/schemas/Account' }
/accounts/me/vehicles:
get:
operationId: listVehicles
tags: [Accounts & Vehicles]
summary: List saved vehicles
responses:
'200':
description: A list of vehicles.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/Vehicle' }
post:
operationId: addVehicle
tags: [Accounts & Vehicles]
summary: Add a vehicle
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Vehicle' }
responses:
'201':
description: The created vehicle.
content:
application/json:
schema: { $ref: '#/components/schemas/Vehicle' }
/accounts/me/vehicles/{vehicle_id}:
get:
operationId: getVehicle
tags: [Accounts & Vehicles]
summary: Retrieve a vehicle
parameters:
- $ref: '#/components/parameters/VehicleId'
responses:
'200':
description: A vehicle.
content:
application/json:
schema: { $ref: '#/components/schemas/Vehicle' }
patch:
operationId: updateVehicle
tags: [Accounts & Vehicles]
summary: Update a vehicle
parameters:
- $ref: '#/components/parameters/VehicleId'
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Vehicle' }
responses:
'200':
description: The updated vehicle.
content:
application/json:
schema: { $ref: '#/components/schemas/Vehicle' }
delete:
operationId: deleteVehicle
tags: [Accounts & Vehicles]
summary: Delete a vehicle
parameters:
- $ref: '#/components/parameters/VehicleId'
responses:
'204':
description: The vehicle was deleted.
/accounts/me/payment_methods:
get:
operationId: listPaymentMethods
tags: [Accounts & Vehicles]
summary: List payment methods
responses:
'200':
description: A list of payment methods.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/PaymentMethod' }
post:
operationId: addPaymentMethod
tags: [Accounts & Vehicles]
summary: Add a payment method
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/PaymentMethod' }
responses:
'201':
description: The created payment method.
content:
application/json:
schema: { $ref: '#/components/schemas/PaymentMethod' }
/tickets:
post:
operationId: createTicket
tags: [Tickets]
summary: Create a ticket
description: Create a drive-up parking transaction or violation record.
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Ticket' }
responses:
'201':
description: The created ticket.
content:
application/json:
schema: { $ref: '#/components/schemas/Ticket' }
/tickets/previews:
post:
operationId: previewTicket
tags: [Tickets]
summary: Preview a ticket payment
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/Ticket' }
responses:
'200':
description: A ticket price preview.
content:
application/json:
schema: { $ref: '#/components/schemas/Ticket' }
/tickets/{ticket_id}/pay:
post:
operationId: payTicket
tags: [Tickets]
summary: Pay a ticket
parameters:
- name: ticket_id
in: path
required: true
schema: { type: integer }
responses:
'200':
description: The paid ticket.
content:
application/json:
schema: { $ref: '#/components/schemas/Ticket' }
components:
securitySchemes:
oauth2:
type: oauth2
description: >-
OAuth 2.0. Partner credentials (client_id, client_secret, redirect_uri)
are issued by ParkWhiz to approved partners. Scopes: public (default),
partner, mobile, internal, data.
flows:
clientCredentials:
tokenUrl: https://api.parkwhiz.com/v4/oauth/token
scopes:
public: Default read access to public resources.
partner: Partner-level access to bookable inventory and bookings.
data: Access to resources restricted by data licensing.
authorizationCode:
authorizationUrl: https://api.parkwhiz.com/v4/oauth/authorize
tokenUrl: https://api.parkwhiz.com/v4/oauth/token
scopes:
public: Default read access to public resources.
mobile: Mobile app user access.
parameters:
LocationId:
name: location_id
in: path
required: true
schema: { type: integer }
BookingId:
name: booking_id
in: path
required: true
schema: { type: integer }
VehicleId:
name: vehicle_id
in: path
required: true
schema: { type: integer }
responses:
Unauthorized:
description: Missing or invalid OAuth token.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
NotFound:
description: The requested resource was not found.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
UnprocessableEntity:
description: The request could not be processed.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
schemas:
Error:
type: object
properties:
message: { type: string }
code: { type: string }
Quote:
type: object
properties:
id: { type: integer }
location_id: { type: integer }
start_time: { type: string, format: date-time }
end_time: { type: string, format: date-time }
price:
$ref: '#/components/schemas/Price'
purchase_options:
type: array
items:
type: object
properties:
id: { type: integer }
base_price: { $ref: '#/components/schemas/Price' }
price: { $ref: '#/components/schemas/Price' }
Price:
type: object
properties:
currency: { type: string, example: USD }
amount: { type: number, format: float }
formatted: { type: string, example: $12.00 }
Location:
type: object
properties:
id: { type: integer }
name: { type: string }
address1: { type: string }
city: { type: string }
state: { type: string }
postal_code: { type: string }
coordinates:
type: array
items: { type: number }
example: [41.8781, -87.6298]
bookable: { type: boolean }
description: { type: string }
Review:
type: object
properties:
id: { type: integer }
rating: { type: integer, minimum: 1, maximum: 5 }
body: { type: string }
created_at: { type: string, format: date-time }
BookingRequest:
type: object
properties:
quote_id: { type: integer }
payment_method_id: { type: integer }
vehicle_id: { type: integer }
required: [quote_id]
Booking:
type: object
properties:
id: { type: integer }
location_id: { type: integer }
start_time: { type: string, format: date-time }
end_time: { type: string, format: date-time }
status: { type: string, example: valid }
price: { $ref: '#/components/schemas/Price' }
parking_pass_id: { type: integer }
vehicle: { $ref: '#/components/schemas/Vehicle' }
ParkingPass:
type: object
properties:
id: { type: integer }
type: { type: string, example: barcode }
validation_steps:
type: array
items: { type: string }
scan_code_url: { type: string, format: uri }
Vehicle:
type: object
properties:
id: { type: integer }
make: { type: string }
model: { type: string }
color: { type: string }
license_plate: { type: string }
license_plate_state: { type: string }
PaymentMethod:
type: object
properties:
id: { type: integer }
type: { type: string, example: card }
brand: { type: string, example: visa }
last4: { type: string, example: '4242' }
exp_month: { type: integer }
exp_year: { type: integer }
Venue:
type: object
properties:
id: { type: integer }
name: { type: string }
coordinates:
type: array
items: { type: number }
address: { type: string }
Event:
type: object
properties:
id: { type: integer }
name: { type: string }
venue_id: { type: integer }
start_time: { type: string, format: date-time }
end_time: { type: string, format: date-time }
Account:
type: object
properties:
id: { type: integer }
email: { type: string, format: email }
first_name: { type: string }
last_name: { type: string }
phone: { type: string }
Ticket:
type: object
properties:
id: { type: integer }
location_id: { type: integer }
status: { type: string, example: open }
price: { $ref: '#/components/schemas/Price' }
vehicle: { $ref: '#/components/schemas/Vehicle' }