Introduction
Welcome to the Runara API! You can use our API to access Runara endpoints.
Authentication
jQuery Auth Example:
$.ajax({
url: "https://api.runara.com/classes",
type: 'GET',
headers: {"Authorization": 'Bearer eyJ0eXAiOiJKV.eyJpc3MiOiJodHRwczovL2FwaS5ydDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyIsInVzZXIiOnsiaWQiOjEwMDMxOX19.ma52y-xNn2AYuKCv2zznWMSQ'}
});
Runara uses API keys to allow access to the API. You can register a new Runara API key by logging into Runara and navigating to Account Settings -> API.
Runara expects for the API key to be included in all API requests to the server as the value for the header Authorization
.
Authorization: Bearer your.jwt.token
Errors
The Runara API attempts to keep all exception responses formatted in a similar fashion to help you present the data more consistently to your users.
Validation Errors
Sample Response:
{
"data": {
"email": "Invalid email address provided."
}
}
Validation errors (when applicable) will return a key-pair response corresponding to the name/value pairs you supplied in your request.
The Runara API uses the following error codes:
Code | Meaning |
---|---|
400 | Bad Request -- Your request was formatted incorrectly |
401 | Unauthorized -- Your API key is wrong |
402 | Payment Required -- Returned when payment is declined. |
403 | Forbidden -- The kitten requested is hidden for administrators only |
404 | Not Found -- The specified item could not be found |
Non-Validation Errors
Sample Response:
{
"data": {
"error": "Form error encountered. Please try again."
}
}
The Runara API uses the following error codes for non-validation exceptions:
Code | Meaning |
---|---|
405 | Method Not Allowed -- You tried to access an endpoint with an invalid method |
406 | Not Acceptable -- You requested a format that isn't json |
409 | Conflict -- The item you're attempting to create already exists |
429 | Too Many Requests -- You're requesting too many endpoints! Slow down! |
500 | Internal Server Error -- We had a problem with our server. Try again later. |
503 | Service Unavailable -- We're temporarially offline for maintanance. Please try again later. |
Admin
What are Admin Routes?
The admin
routes are helper endpoints created to assist staff with day-to-day workflow tasks, such as check-ins and payments. While these tasks can be achieved using other existing endpoints, admin
routes are always set in the context of a staff member so any information returned is pertinent to the logged-in user (Staff Member).
Admin View
Example Response:
{
"meta": {
"accounts": [
{
"id": 100110,
"name": "Body by Keelay",
"role": "Administrator"
},
{
"id": 100111,
"name": "5x5 Inc",
"role": "Staff"
}
],
"data": [
{
"id": 477,
"session_id": null,
"name": "StrongLifts Introduction",
"type": "Class",
"item_id": 100118,
"date": "August 28th at 8:00am",
"timestamp": 1535457600,
"duration": "30 minutes",
"timespan": "8:00am - 8:30am",
"clients": [
{
"id": 100137,
"booking_id": 477,
"name": "Fatima Kuphal",
"payment_status": 0,
"payment_status_description": "Unpaid - Pay at Checkin",
"payment_amount": "30.00",
"checked_in": false,
"photo": {
"default": null,
"thumb": null
}
}
],
"account": {
"id": 100110,
"name": "Body by Keelay"
},
"staffed_by": {
"id": 100135,
"name": "Trudie Kirlin",
"photo": {
"default": "https:\/\/randomuser.me\/api\/portraits\/men\/1.jpg",
"thumb": "https:\/\/randomuser.me\/api\/portraits\/men\/1.jpg"
}
},
"location": {
"id": 100118,
"name": "Pineville",
"room": null
},
"capacity": 20,
"total_clients": 1,
"total_checkins": 0
},
{
"id": 848,
"session_id": null,
"name": "Cut and Shampoo",
"type": "Appointment",
"item_id": 100111,
"date": "August 28th at 10:30am",
"timestamp": 1535466600,
"duration": "105 minutes",
"timespan": "10:30am - 12:15pm",
"clients": [
{
"id": 100112,
"booking_id": 848,
"name": "Jamie Kihn",
"payment_status": 1,
"payment_status_description": "Paid - Cash",
"payment_amount": "64.00",
"checked_in": false,
"photo": {
"default": null,
"thumb": null
}
}
],
"account": {
"id": 100110,
"name": "Body by Keelay"
},
"staffed_by": {
"id": 100135,
"name": "Trudie Kirlin",
"photo": {
"default": "https:\/\/randomuser.me\/api\/portraits\/men\/1.jpg",
"thumb": "https:\/\/randomuser.me\/api\/portraits\/men\/1.jpg"
}
},
"location": {
"id": 100116,
"name": "123 Main",
"room": null
},
"capacity": null,
"total_clients": 1,
"total_checkins": 0
}
]
}
}
If logged-in as a staff member, returns upcoming bookings staff accounts.
This endpoint should only be used by staff members. Non staff members will not receive any results from this endpoint.
HTTP Request
GET https://api.runara.com/admin
HTTP Request for Specific Staff (admin-only)
GET https://api.runara.com/admin/{staff_id}
Route Parameters
Parameter | Required | Description | Example |
---|---|---|---|
ID | false | ID of staff to view. | 11234433 |
Appointments
Appointments are single-client bookings.
All Appointments
Example Response:
{
"data": [
{
"id": 100112,
"name": "Coloring Session",
"description": "Veniam culpa et omnis quam rerum maiores sapiente iusto.",
"base_price": "$27.00",
"online_booking": true,
"active": true
},
{
"id": 100111,
"name": "Cut and Shampoo",
"description": "Iure voluptatem corporis excepturi sint similique officiis ab. Doloremque in eum dolores aut sunt ut doloribus. Similique necessitatibus sint mollitia. Non quia recusandae vel nihil doloribus.",
"base_price": "$64.00",
"online_booking": true,
"active": true
}
]
}
View all appointments belonging to an account.
HTTP Request
GET https://api.runara.com/appointments
Single Appointment
Example Response:
{
"data": {
"id": 100112,
"name": "Coloring Session",
"description": "Veniam culpa et omnis quam rerum maiores sapiente iusto.",
"base_price": "$27.00",
"online_booking": true,
"staff": [
{
"id": 52,
"name": "Trudie Kirlin",
"price": "$37.00"
},
{
"id": 53,
"name": "Desmond Mann",
"price": "$23.00"
}
]
}
}
View details of a specific appointment.
Includes a base_price
that applies to any staff member that does not otherwise have a specified price for this appointment.
Staff members that charge a different amount are listed under the staff
object.
HTTP Request
GET https://api.runara.com/appointments/{id}
Bookings
Get All bookings
Example Response:
[
{"data":{"id":"asdf"}}
]
This endpoint retrieves all bookings for the current user.
HTTP Request
GET https://api.runara.com/bookings
Get a Specific Booking
Example Response:
{
"id": 2,
"name": "Max",
"breed": "unknown",
"fluffiness": 5,
"cuteness": 10
}
This endpoint retrieves a single booking.
HTTP Request
GET https://api.runara.com/bookings/<ID>
URL Parameters
Parameter | Description |
---|---|
ID | The ID of the booking to retrieve |
Classes
Classes are multi-client bookings. Classes are constrained by capacity
, which is determined by the timeseries entries attributed to each class. Each timeseries can have different locations, rooms and capacities.
All Classes
Example Response:
{
"data": [
{
"id": 100119,
"name": "30-Minute Yoga",
"description": "Molestiae sit ut sunt vel vero. Ut est dolores magni eligendi et laborum. Quidem inventore aut quidem aspernatur voluptas exercitationem occaecati. Deleniti voluptatem qui omnis eligendi reprehenderit eum quis. Autem atque ipsa autem.",
"price": "$25.00",
"requires_membership": false,
"active": true
},
{
"id": 100115,
"name": "Advanced Pilates",
"description": "Enim consequatur sunt adipisci. Quae architecto quasi accusamus ipsum neque deleniti. Earum sit impedit ipsum iusto aut sit. Qui voluptas et est excepturi inventore. Voluptatum nemo ut soluta.",
"price": "$5.00",
"requires_membership": false,
"active": true
},
{
"id": 100116,
"name": "Introduction to Basic Yoga Techniques",
"description": "Minus omnis error corporis aut error quisquam consequuntur.",
"price": "$25.00",
"requires_membership": false,
"active": true
}
]
}
View all classes belonging to an account.
HTTP Request
GET https://api.runara.com/classes
Single Class
Example Response (?with_sessions enabled):
{
"data": {
"id": 100119,
"name": "30-Minute Yoga",
"description": "Molestiae sit ut sunt vel vero. Ut est dolores magni eligendi et laborum. Quidem inventore aut quidem aspernatur voluptas exercitationem occaecati. Deleniti voluptatem qui omnis eligendi reprehenderit eum quis. Autem atque ipsa autem.",
"capacity": 20,
"duration": "30mins",
"price": null,
"pricing": {
"single": null,
"packages": [],
"unlimited": null
},
"sessions": {
"meta": {
"name": "30-Minute Yoga",
"description": "Molestiae sit ut sunt vel vero. Ut est dolores magni eligendi et laborum. Quidem inventore aut quidem aspernatur voluptas exercitationem occaecati. Deleniti voluptatem qui omnis eligendi reprehenderit eum quis. Autem atque ipsa autem.",
"price": "$25.00",
"duration": 30,
"days": [
"2018-08-28",
"2018-08-29"
],
"staff": [
{
"id": 100116,
"name": "Trudie Kirlin",
"photo": "https:\/\/randomuser.me\/api\/portraits\/men\/1.jpg"
}
],
"locations": [
{
"id": 100116,
"name": "123 Main"
}
],
"selected_date": null,
"selected_week": null,
"time_extremes": {
"earliest": "11:00am",
"latest": "8:00pm"
},
"booking_interval": 30,
"dates": null
},
"dates": [
{
"id": "100148-1535468400",
"timestamp": 1535468400,
"ends": 1535470200,
"formatted": {
"short": "2018-08-28",
"long": "August 28th 2018",
"time": "11:00am",
"span": "11:00am - 11:30am"
},
"meta": {
"ts_id": 100148,
"staff_id": 100116,
"staff": "Trudie Kirlin",
"staff_abbr": "Trudie K.",
"staff_photo": "https:\/\/randomuser.me\/api\/portraits\/men\/1.jpg",
"location_id": 100116,
"location": "123 Main",
"timezone": "America\/New_York",
"time": "11:00am",
"end_time": null,
"time_between": null,
"price": "$25.00",
"capacity": 10,
"registered": 0,
"is_full": false,
"is_booked": false,
"duration": 30,
"name": "11:00am",
"item_type": "class",
"item_id": 100119,
"spots_left": 10
}
},
{
"id": "100170-1535543100",
"timestamp": 1535543100,
"ends": 1535544900,
"formatted": {
"short": "2018-08-29",
"long": "August 29th 2018",
"time": "7:45am",
"span": "7:45am - 8:15am"
},
"meta": {
"ts_id": 100170,
"staff_id": 100116,
"staff": "Trudie Kirlin",
"staff_abbr": "Trudie K.",
"staff_photo": "https:\/\/randomuser.me\/api\/portraits\/men\/1.jpg",
"location_id": 100116,
"location": "123 Main",
"timezone": "America\/New_York",
"time": "7:45am",
"end_time": null,
"time_between": null,
"price": "$25.00",
"capacity": 5,
"registered": 0,
"is_full": false,
"is_booked": false,
"duration": 30,
"name": "7:45am",
"item_type": "class",
"item_id": 100119,
"spots_left": 5
}
}
]
},
"requires_membership": false,
"active": true
}
}
View details of a specific class.
URL parameter with_sessions
can be passed to retrieve upcoming bookable sessions for the class.
HTTP Request
GET https://api.runara.com/classes/{id}
URL Parameters
Parameter | Required | Description | Example |
---|---|---|---|
with_sessions | false | Boolean. Returns upcoming sessions for which class is bookable. | true |
Clients
View Clients
Example Response:
{
"data": [
{
"id": "595b26a99a89204afc2fb2c4",
"first_name": "Nestor",
"last_name": "DuBuque",
"email": "leffler.georgette@yahoo.com",
"phone": null,
"photo": {
"original": 'http://url.to.photo/photo.jpg',
"thumb": 'http://url.to.photo/photo.jpg',
}
},
{
"id": "595b03a89a89204afe458627",
"first_name": "Kenyon",
"last_name": "Hartmann",
"email": "jblick@wisozk.com",
"phone": null,
"photo": {
"original": 'http://url.to.photo/photo.jpg',
"thumb": 'http://url.to.photo/photo.jpg',
}
}
]
}
Views a list of clients associated with the requesters current account.
HTTP Request
GET https://api.runara.com/clients
View Client Details
Example Response:
{
"data": {
"id": "57be63229a89201a8f515fa4",
"first_name": "Michael",
"last_name": "McGuirt",
"email": "michaelmcg@gmail.com",
"phone": "333-444-5555",
"photo": {
"default": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/users\/profiles\/photo_1496448339_default.jpg",
"thumb": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/users\/profiles\/photo_1496448339_thumb.jpg"
},
"packages": [
{
"id": "5940b73a9a892006485be2ef",
"name": "Grand Package"
}
],
"passes": [
{
"id": "597173179a8920268225f3d3",
"name": "Monthly Membership"
}
],
"recent_purchases": [
{
"id": "598935a99a89202b3d28fe56",
"type": "Booking",
"date": "Aug 7th 2017",
"status": "Complete",
"total": "$48.00",
"receipt": "http:\/\/app.runara.app\/payments\/view\/598935a99a89202b3d28fe56"
},
{
"id": "598900199a892025a41725c4",
"type": "Booking",
"date": "Aug 7th 2017",
"status": "Complete",
"total": "$48.00",
"receipt": "http:\/\/app.runara.app\/payments\/view\/598900199a892025a41725c4"
}
]
}
}
Displays client details for the current account.
HTTP Request
GET https://api.runara.com/clients/{client}
URL Parameters
Parameter | Required | Description | Example |
---|---|---|---|
client | true | ID of client. | 23434234234 |
Get recent activity
Example Response:
{
"data": {
"recent": {
"upcoming": [
{
"booking_id": "5234233343423",
"type": "class",
"type_id": "57f71b6a9a892007ef2acc69",
"name": "30-Minute Yoga",
"date": "1483956000",
"date_short": "1\/09\/17",
"date_long": "January 9th 2017",
"time": "10:00am",
"location": {
"id": "57f71b1b9a892007ef2acc2f",
"name": "Shields Ltd",
"room": {
"id": null,
"name": null
}
},
"staffed_by": {
"_id": "581d41449a89200452530aca",
"name": "Bianka Cassin"
}
},
{
"booking_id": "586c7d7e9a89200fe53be793",
"type": "class",
"type_id": "57f71b759a892007ef2acc78",
"name": "5 Minute Abs",
"date": "1484541000",
"date_short": "1\/16\/17",
"date_long": "January 16th 2017",
"time": "4:30am",
"location": {
"id": "57f71b4f9a892008497f6169",
"name": "Schuppe, Bergstrom and Carter",
"room": {
"id": "57f71b509a892008497f616b",
"name": "MediumSpringGreen"
}
},
"staffed_by": {
"_id": null,
"name": null
}
}
],
"past": [
{
"booking_id": "586c822d9a89201a3975a7a9",
"type": "class",
"type_id": "57f71b799a892007d959ee1d",
"name": "Grow an Ass Wuori Would Love",
"date": "1483763400",
"date_short": "1\/07\/17",
"date_long": "January 7th 2017",
"time": "4:30am",
"location": {
"id": "57f71b329a892007ef2acc41",
"name": "Ledner, Murphy and Pfeffer",
"room": {
"id": "57f71b339a892007ef2acc42",
"name": "Tan"
}
},
"staffed_by": {
"_id": null,
"name": null
}
},
{
"booking_id": "586d99399a892004494e6421",
"type": "class",
"type_id": "57f71b6a9a892007ef2acc69",
"name": "30-Minute Yoga",
"date": "1483603200",
"date_short": "1\/05\/17",
"date_long": "January 5th 2017",
"time": "8:00am",
"location": {
"id": "57f71b249a892008497f6145",
"name": "Botsford PLC",
"room": {
"id": null,
"name": null
}
},
"staffed_by": {
"_id": "581d41489a8920045120499c",
"name": "Joannie Becker"
}
}
],
"purchases": [
],
"locations": [
{
"id": "57f71b259a892007ef2acc38",
"name": "Mertz-Moore",
"room": {
"id": "57f71b269a892007ef2acc39",
"name": "Red"
}
},
{
"id": "57f71b1b9a892007ef2acc2f",
"name": "Shields Ltd",
"room": {
"id": null,
"name": null
}
},
{
"id": "57f71b4f9a892008497f6169",
"name": "Schuppe, Bergstrom and Carter",
"room": {
"id": "57f71b509a892008497f616b",
"name": "MediumSpringGreen"
}
}
]
}
}
}
Returns recent bookings, purchases and locations from the client's records.
HTTP Request
POST https://api.runara.com/me
Favorites
Favorites allow clients easy-access to commonly-used businesses. When a client purhcases from a new business, that business (and location) will be automatically added to their favorites.
View User Favorites
Example Response:
{
"data": [
{
"id": 59,
"users_id": 100110,
"accounts_id": 100110,
"locations_id": 100116,
"name": "Body by Keelay - 123 Main",
"street": "15235 John J Delaney Dr",
"street_2": null,
"city": "Charlotte",
"state": "NC",
"postal": "28277",
"categories": [
{
"id": 100110,
"name": "Barre"
},
{
"id": 100113,
"name": "Dance"
},
{
"id": 100115,
"name": "Gym"
}
],
"photo": {
"default": null,
"original": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/locations\/photos\/photo_1519872697_orig.png"
},
"geo": {
"lat": 35.0539776,
"lng": -80.8486842
}
},
{
"id": 67,
"users_id": 100110,
"accounts_id": 100111,
"locations_id": 100113,
"name": "5x5 Inc - Center City",
"street": "1400 Central Ave",
"street_2": null,
"city": "Charlotte",
"state": "NC",
"postal": "28205",
"categories": [
{
"id": 100110,
"name": "Barre"
},
{
"id": 100113,
"name": "Dance"
}
],
"photo": {
"default": null,
"original": null
},
"geo": {
"lat": 35.2195292,
"lng": -80.8145677
}
}
]
}
Returns the clients's favorites list.
HTTP Request
GET https://api.runara.com/accounts/favorites
BODY Parameters
Parameter | Required | Description | Example |
---|---|---|---|
client | false | ID of client if not current client. | 234334 |
Manage User Favorites
Example Response:
{
"data": [
{
"id": 59,
"users_id": 100110,
"accounts_id": 100110,
"locations_id": 100116,
"name": "Body by Keelay - 123 Main",
"street": "15235 John J Delaney Dr",
"street_2": null,
"city": "Charlotte",
"state": "NC",
"postal": "28277",
"categories": [
{
"id": 100110,
"name": "Barre"
},
{
"id": 100113,
"name": "Dance"
},
{
"id": 100115,
"name": "Gym"
}
],
"photo": {
"default": null,
"original": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/locations\/photos\/photo_1519872697_orig.png"
},
"geo": {
"lat": 35.0539776,
"lng": -80.8486842
}
},
{
"id": 67,
"users_id": 100110,
"accounts_id": 100111,
"locations_id": 100113,
"name": "5x5 Inc - Center City",
"street": "1400 Central Ave",
"street_2": null,
"city": "Charlotte",
"state": "NC",
"postal": "28205",
"categories": [
{
"id": 100110,
"name": "Barre"
},
{
"id": 100113,
"name": "Dance"
}
],
"photo": {
"default": null,
"original": null
},
"geo": {
"lat": 35.2195292,
"lng": -80.8145677
}
}
]
}
Adds or removes (favorites or un-favorites) a location for a client. If client already has the location
marked as favorite, then this action will un-favorite the locaton.
HTTP Request
POST https://api.runara.com/accounts/favorite
BODY Parameters
Parameter | Required | Description | Example |
---|---|---|---|
location | true | ID of location to favorite. | 2343432 |
Locations
Find Nearby Locations
Example Response:
{
"data": {
"meta": {
"categories": [
{
"id": "salon",
"name": "Salon"
},
{
"id": "spa",
"name": "Spa"
}
],
"pagination": {
"total": 3,
"total_pages": 1,
"per_page": 25,
"current_page": 1,
"next_page": null,
"prev_page": null
}
},
"user_location": {
"address": "107 Mainside Ave, Charlotte, NC 28203, USA",
"city": "Charlotte",
"state": "NC",
"postal": "28203",
"x": -80.8658719,
"y": 35.2047737
},
"results": [
{
"id": "5940b6259a892006485be2bd",
"name": "Curves - Suburbia",
"categories": [
{
"id": "pilates",
"name": "Pilates"
},
{
"id": "salon",
"name": "Salon"
},
{
"id": "spa",
"name": "Spa"
}
],
"street": "712 Ideal Way",
"street_2": null,
"city": "Charlotte",
"state": "NC",
"postal": "28203",
"distance": "< 1 mile away",
"logo": null,
"geo": {
"lat": 35.199486,
"lng": -80.85681
}
},
{
"..." : "..."
}
]
}
}
Finds nearby locations and returns paginated results within 25 miles of the user's (request originator) location. Location is determined by a series of geolocation tests.
Other qualifiers may be provided, such as category
and search
.
HTTP Request
GET https://api.runara.com/locations/nearby
URL Parameters
Parameter | Type | Required | Description | Example |
---|---|---|---|---|
limit | integer | false | Number of results to return per-page. | 10 |
page | integer | false | Page number of pagination set. | 1 |
lng | double | false | Longitude value of user. | -80.8659062 |
lat | double | false | Latitude value of user. | 35.2047847 |
search | string | false | Search term to use. | Yoga |
category | string | false | Category to limit results to. | 'Spa' |
View Location Details
Example Response:
{
"data": {
"id": "5940b6289a892006485be2c1",
"name": "Curves - University",
"categories": [
{
"id": "salon",
"name": "Salon"
},
],
"street": "2200 Park Rd",
"street_2": null,
"city": "Charlotte",
"state": "NC",
"postal": "28203",
"distance": "< 1 mile away",
"hours": [
{
"Monday - Tuesday": [
"Closed"
]
},
{
"Wednesday - Thursday": [
"8:00am - 5:00pm"
]
},
{
"Friday - Saturday": [
"Closed"
]
},
{
"Sunday": [
"8:00am - 1:00pm",
"2:00pm - 6:00pm"
]
}
],
"phone": "+1-875-433-8032",
"logo": "https:\/\/unsplash.it\/200\/300\/?random",
"photo": {
"default": "https:\/\/unsplash.it\/500\/500?random"
},
"rooms": [
{
"id": "5940b6289a892006485be2c3",
"name": "Studio B"
}
],
"geo": {
"lat": 35.2004625,
"lng": -80.852509
},
"appointments": [
{
"name": "Coloring Session",
"description": "Est aspernatur vel praesentium distinctio. Facere molestiae neque ratione modi quia ipsa. Tenetur deserunt adipisci alias laboriosam. Cum nobis repellat molestiae qui deserunt numquam sed.",
"book_online": true,
"staff": [
{
"id": "5940b6ac9a8920086234b594",
"name": "Franz Kunze"
},
{
"id": "5940b6a59a8920086234b589",
"name": "Cecil Kuhn"
},
{
"id": "5940b6aa9a892006423822ed",
"name": "Zoie Osinski"
}
],
"id": "5940b6db9a892006485be2e1"
},
],
"classes": [
{
"timeseries": [
{
"_id": {
"$oid": "5940b6f99a8920064238237b"
},
"start_date": "11\/18\/2016",
"end_date": "08\/12\/2018",
"repeat": "3",
"days": null,
"location": {
"_id": {
"$oid": "5940b6259a892006485be2bd"
},
"name": "Suburbia",
"timezone": {
"dstOffset": 3600,
"rawOffset": -18000,
"timeZoneId": "America\/New_York",
"timeZoneName": "Eastern Daylight Time"
},
"room": {
"_id": {
"$oid": "5940b6269a892006485be2bf"
},
"name": "Yoga Room"
}
},
"expires": false,
"capacity": 15,
"start_time": "9:30am",
"name": "9:30am",
"staffed_by": {
"_id": {
"$oid": "5940b6a59a8920086234b589"
},
"name": "Cecil Kuhn",
"photo": "https:\/\/randomuser.me\/api\/portraits\/men\/0.jpg"
},
"description": {
"full": "Every 3rd Friday of the month at 09:30am until Aug 12th, 2018.",
"time": "09:30am",
"days": "Every 3rd Friday of the month",
"until": "Aug 12th, 2018",
"repeats": "Monthly"
}
}
],
"name": "30-Minute Yoga",
"description": "Dolores enim aut non quia et veritatis.",
"category": {
"_id": {
"$oid": "5940b6f59a8920086234b5e5"
},
"name": "Cycling"
},
"id": "5940b6f89a89200642382376",
"price": "$24.00"
}
],
"packages": [
{
"name": "Ivory Package",
"description": "Nihil omnis nihil enim officia quo corporis ipsam. Doloremque hic eveniet vel quod hic. Quaerat impedit incidunt tempora et voluptas.",
"price": "$16.00",
"id": "5940b73b9a8920086234b651"
}
],
"products": [
{
"name": "T Shirt",
"description": null,
"id": "5940b7309a8920086234b634"
}
],
"staff": [
{
"first_name": "Cecil",
"last_name": "Kuhn",
"photo": {
"thumb": "https:\/\/randomuser.me\/api\/portraits\/men\/0.jpg",
"large": "https:\/\/randomuser.me\/api\/portraits\/men\/0.jpg",
"original": "https:\/\/randomuser.me\/api\/portraits\/men\/0.jpg"
},
"category": {
"_id": {
"$oid": "5940b6a59a8920086234b58a"
},
"name": "Boat Builder and Shipwright"
},
"classes": 4,
"appointments": 4,
"id": "5940b6a59a8920086234b589"
}
]
}
}
Retrieves a location's details, as well as services and products offered at the location.
HTTP Request
GET https://api.runara.com/locations/{ID}
URL Parameters
Parameter | Type | Required | Description | Example |
---|---|---|---|---|
ID | string | true | ID of location to view. | 568b55febffebc91068d4579 |
Packages
Packages are combinations of your products that are available at a discount when purchased as a whole.
All Packages
Example Response:
{
"data": [
{
"id": 100113,
"name": "MistyRose Package",
"description": "Ipsam saepe debitis velit. Non dolores deserunt quod corrupti pariatur est aut.",
"price": "$67.00"
},
{
"id": 100118,
"name": "Beginner Package",
"description": "This is a sample description.",
"price": "$33.00"
}
]
}
View all packages belonging to an account.
HTTP Request
GET https://api.runara.com/packages
Single Package
Example Response:
{
"data": {
"id": 100113,
"name": "MistyRose Package",
"description": "Ipsam saepe debitis velit. Non dolores deserunt quod corrupti pariatur est aut.",
"price": "$67.00",
"expires": "5 weeks after purchase.",
"classes": {
"all_classes": false,
"classes": [
{
"id": 100130,
"name": "30-Minute Yoga"
}
],
"limit": 15
},
"appointments": {
"all_appointments": false,
"appointments": [
{
"id": 100140,
"name": "Coloring Session"
}
],
"limit": 15
},
"products": null,
"extras": []
}
}
View details of a specific packages along with its inclusions.
HTTP Request
GET https://api.runara.com/packages/{id}
Passes
Passes (also referred to as Memberships) are recurring payments or subscription to an account.
All Passes
Example Response:
{
"data": [
{
"id": 100113,
"name": "Monthly Package",
"description": "This monthly package includes...",
"price": "$20.00"
},
{
"id": 100116,
"name": "Monthly Membership Plus",
"description": "This is a monthly membership package that includes...",
"price": "$55.00"
}
]
}
View all passes belonging to an account.
HTTP Request
GET https://api.runara.com/passes
Single Pass
Example Response:
{
"data": {
"id": 100113,
"name": "Monthly Package",
"description": "This is a monthly pass for...",
"price": "$20.00",
"billing_interval": "month",
"trial_period": null,
"billing_descriptor": "Monthly Package at Abs",
"all_classes": true,
"classes": [],
"all_appointments": false,
"appointments": [
{
"id": 100110,
"name": "Mens Haircut"
},
{
"id": 100111,
"name": "Cut and Shampoo"
}
]
}
}
View details of a specific pass.
HTTP Request
GET https://api.runara.com/passes/{id}
Profiles
Get User Profile
Example Response:
{
"data": {
"id": "sd5763ce9a89201a8f515fa4",
"email": "user.name@email.com",
"first_name": "Mike",
"last_name": "Jones",
"photo": {
"default": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/users\/profiles\/photo_1484882588_default.jpg",
"thumb": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/users\/profiles\/photo_1484882588_thumb.jpg"
},
"street": null,
"street_2": null,
"city": null,
"state": null,
"postal": null
}
}
Returns the profile of the user requesting the endpoint.
HTTP Request
GET https://api.runara.com/profiles
Products
Products are items that can be purchased directly from your business.
Each product can contain multiple SKUs, which allow you to sell multiple versions of the same product (e.g. T-shirts in multiple sizes).
All Products
Example Response:
{
"data": [
{
"id": 100112,
"name": "Water Bottle",
"description": "Ab et tempore sed ea dolorem sunt. Placeat exercitationem quis non at vero qui assumenda. Quos neque rerum omnis deleniti assumenda. Debitis exercitationem maxime autem et dolorum laboriosam."
},
{
"id": 100113,
"name": "T-Shirt",
"description": "Earum debitis dolorem aut neque. Ipsa quia quos ut consectetur impedit earum."
}
]
}
View all products belonging to an account.
HTTP Request
GET https://api.runara.com/products
Single Product
Example Response:
{
"data": {
"id": 100113,
"name": "T-Shirt",
"description": "Earum debitis dolorem aut neque. Ipsa quia quos ut consectetur impedit earum.",
"attributes": null,
"skus": [
{
"id": 100126,
"products_id": 100113,
"sku": "23443343",
"inventory": null,
"inventory_count": 139,
"price": "34.00",
"currency": "USD",
"active": 1
},
{
"id": 100127,
"products_id": 100113,
"sku": "42332",
"inventory": null,
"inventory_count": 149,
"price": "30.00",
"currency": "USD",
"active": 1
},
{
"id": 100128,
"products_id": 100113,
"sku": "9798798",
"inventory": null,
"inventory_count": 11,
"price": "15.00",
"currency": "USD",
"active": 1
}
]
}
}
View details of a specific product along with its available SKUs.
HTTP Request
GET https://api.runara.com/products/{id}
Promos
All Promos
Example Response:
{
"data": [
{
"id": 100115,
"code": null,
"description": null
},
{
"id": 100113,
"code": "FALLSAVINGS",
"description": "Qui laborum consequatur occaecati qui. Aliquid qui reprehenderit voluptate consequuntur. Officiis odio fugiat laborum. Est consequatur vel non vel dignissimos facilis. Esse non aut velit beatae voluptatem."
},
{
"id": 100112,
"code": "HOTSUMMERSALE",
"description": "Ut qui non quae mollitia assumenda. Odio nulla magni laborum deserunt deleniti."
},
{
"id": 100114,
"code": "SPRINGUP22",
"description": "Nihil et eius fugit aliquid deleniti repellendus expedita. Iste qui recusandae aut."
}
]
}
Displays all promo codes belonging to the current account.
HTTP Request
GET https://api.runara.com/promos
Checkout
Checkout endpoints create and modify a shopping cart on the Runara platform. All account purchases are managed through the Checkout interface.
Create an Empty Cart
Empty Cart Response:
{
"data": {
"id": 1939,
"payments_id": 0,
"meta": {
"flags": {
"is_deposit_payment": null,
"limited_to_single": null,
"needs_secondary_payment": false,
"pay_at_checkout": null,
"purchase_type_defaulted": null,
"ready_to_complete": false,
"promo_enabled": false,
"gratuity_enabled": true
},
"payment_options": [
{
"value": "card_100526",
"name": "Visa ending in 4242",
"class": "card-visa",
"disabled": true
},
{
"value": "cash",
"name": "Cash",
"class": "card-cash",
"disabled": true
}
],
"credit_options": []
},
"status": "pending",
"client": {
"id": 100110,
"first_name": "Tucker",
"last_name": "Tuckerson",
"email": "tucker@gmail.com",
"photo": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/users\/profiles\/photos\/photo_1520391437_thumb.jpg"
},
"items": [],
"promos": null,
"gratuity": null,
"payment_option": null,
"closeout": false,
"sub_total": "$0.00",
"tax_taxable": "0.00",
"tax_rate": "0.00",
"tax_total": "$0.00",
"total": "$0.00"
}
}
Create an empty cart to initialize it if you do not yet know which items the client would like to purchase.
Parameter | Required | Description | Example |
---|---|---|---|
client | true | User ID of client | 11223344 |
HTTP Request
POST https://api.runara.com/cart
Create a Cart with Items Added
Cart response with a Class/Session combo added
{
"data": {
"id": 1940,
"payments_id": 0,
"meta": {
"flags": {
"is_deposit_payment": null,
"limited_to_single": null,
"needs_secondary_payment": false,
"pay_at_checkout": null,
"purchase_type_defaulted": true,
"ready_to_complete": false,
"promo_enabled": true,
"gratuity_enabled": true
},
"payment_options": [
{
"value": "card_100526",
"name": "Visa ending in 4242",
"class": "card-visa",
"disabled": false
},
{
"value": "cash",
"name": "Cash",
"class": "card-cash",
"disabled": false
},
{
"value": "checkin",
"name": "Pay at Check-In",
"class": "card-cash",
"disabled": false
}
],
"credit_options": [],
"limited_to_single": false
},
"status": "pending",
"client": {
"id": 100110,
"first_name": "Tucker",
"last_name": "Tuckerson",
"email": "tucker@gmail.com",
"photo": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/users\/profiles\/photos\/photo_1520391437_thumb.jpg"
},
"items": [
{
"item_name": "Advanced Pilates",
"item_type_id": 1,
"item_type": "Booking",
"sub_type": "class",
"item_id": 100115,
"sku": null,
"qty": 1,
"price": "$5.00",
"sub_total": "$5.00",
"total": "$5.00",
"staffed_by": {
"id": 100115,
"name": "Desmond Mann",
"photo": "https:\/\/randomuser.me\/api\/portraits\/women\/0.jpg"
},
"location": {
"id": 100118,
"name": "Pineville"
},
"session_date": 1532706000,
"session_date_formatted": "Friday, Jul 27th at 11:40am",
"purchase_type": "Single Session",
"purchase_type_id": "single",
"purchase_price": "5.00",
"purchase_options": [
{
"value": "single",
"name": "Single Session",
"label": "Single Session - $5.00",
"price": "5.00",
"description": null,
"expires": null,
"selected": true
},
{
"value": "pkg_100121-100115",
"name": "Package - 5 Sessions",
"label": "Package - 5 Sessions for $50.00",
"price": "50.00",
"description": "5 Sessions",
"expires": "Expires in 90 days",
"selected": false
},
{
"value": "pkg_100122-100115",
"name": "Package - 10 Sessions",
"label": "Package - 10 Sessions for $80.00",
"price": "80.00",
"description": "10 Sessions",
"expires": "Does not expire.",
"selected": false
},
{
"value": "pkg_100123-100115",
"name": "Package - 25 Sessions",
"label": "Package - 25 Sessions for $125.00",
"price": "125.00",
"description": "25 Sessions",
"expires": "Does not expire.",
"selected": false
}
],
"limited_to_single": false
}
],
"promos": null,
"gratuity": null,
"payment_option": null,
"closeout": false,
"sub_total": "$5.00",
"tax_taxable": "0.00",
"tax_rate": "0.00",
"tax_total": "$0.00",
"total": "$5.00"
}
}
You can also create a cart with items already added.
HTTP Request
POST https://api.runara.com/cart
BODY Parameters
Parameter | Required | Description | Example |
---|---|---|---|
client | true | User ID of client | 11223344 |
Example: Add a class session:
Parameter | Required | Description | Example |
---|---|---|---|
item | true | Item to add to cart. | class-11223344 |
session | true | Session ID to book. | 100133-1532706000 |
Add an Item
Cart response with a product added
{
"data": {
"id": 1941,
"payments_id": 0,
"meta": {
"flags": {
"is_deposit_payment": null,
"limited_to_single": null,
"needs_secondary_payment": false,
"pay_at_checkout": null,
"purchase_type_defaulted": null,
"ready_to_complete": false,
"promo_enabled": true,
"gratuity_enabled": true
},
"payment_options": [
{
"value": "card_100526",
"name": "Visa ending in 4242",
"class": "card-visa",
"disabled": false
},
{
"value": "cash",
"name": "Cash",
"class": "card-cash",
"disabled": false
}
],
"credit_options": []
},
"status": "pending",
"client": {
"id": 100110,
"first_name": "Tucker",
"last_name": "Tuckerson",
"email": "tucker@gmail.com",
"photo": "https:\/\/s3-us-west-2.amazonaws.com\/runara\/users\/profiles\/photos\/photo_1520391437_thumb.jpg"
},
"items": [
{
"item_name": "T Shirt - #519608",
"item_type_id": 2,
"item_type": "Product",
"sub_type": "product",
"item_id": 100111,
"sku": "519608",
"qty": 1,
"price": "$25.00",
"sub_total": "$25.00",
"total": "$25.00",
"staffed_by": {
"id": 0,
"name": null,
"photo": null
},
"location": {
"id": 0,
"name": null
},
"session_date": null,
"session_date_formatted": "Wednesday, Dec 31st at 7:00pm",
"purchase_type": null,
"purchase_type_id": null,
"purchase_price": null,
"purchase_options": [],
"limited_to_single": false
}
],
"promos": null,
"gratuity": null,
"payment_option": null,
"closeout": false,
"sub_total": "$25.00",
"tax_taxable": "0.00",
"tax_rate": "0.00",
"tax_total": "$0.00",
"total": "$25.00"
}
}
Adds and item to an existing cart.
You can add an item to a cart provided it meets the following conditions:
- Items can not be added to an initial booking of a class or appointment.
- Only one pass or package is allowed for each purchase.
HTTP Request
POST https://api.runara.com/cart/items/add
BODY Parameters
Parameter | Required | Description | Example |
---|---|---|---|
client | true | User ID of client | 11223344 |
cart | true | ID of cart to add item to | 11223344 |
The above parameters are required for each of the examples below
Example: Add a product:
Parameter | Required | Description | Example |
---|---|---|---|
item | true | Item to add to cart. | product-11223344-323423 |
qty | false | Quantity of product/SKU to add. Default: 1 . |
1 |
Example: Add a booking:
Parameter | Required | Description | Example |
---|---|---|---|
item | true | Item to add to cart. | class-11223344 or appt-11223344 |
session | true | Session ID to book. | 100133-1532706000 |
Example: Add a package:
Parameter | Required | Description | Example |
---|---|---|---|
item | true | Package to add to cart. | package-11223344 |
Example: Add a pass:
Parameter | Required | Description | Example |
---|---|---|---|
item | true | Pass to add to cart. | pass-11223344 |
Remove an Item
Removes an item from an existing cart.
HTTP Request
POST https://api.runara.com/cart/items/remove
BODY Parameters
Parameter | Required | Description | Example |
---|---|---|---|
client | true | User ID of client | 11223344 |
cart | true | ID of cart to add item to | 11223344 |
item | true | ID of item to remove | 11223344 |
Update Item Quantity
Updates the quantity of a single item added to cart.
HTTP Request
POST https://api.runara.com/cart/items/remove
BODY Parameters
Parameter | Required | Description | Example |
---|---|---|---|
client | true | User ID of client | 11223344 |
cart | true | ID of cart to add item to | 11223344 |
item | true | ID of item to remove | 11223344 |
qty | true | Quantity of item to purchase. | 4 |
Note: The following validation occurs when adjusting quantity:
- If
qty
is0
, the item will be removed - If
qty
is greater than inventory on-hand, a 422 validation error will be returned.
Bookings
Get All bookings
Example Response:
[
{"data":{"id":"asdf"}}
]
This endpoint retrieves all bookings for the current user.
HTTP Request
GET https://api.runara.com/bookings
Get a Specific Booking
Example Response:
{
"id": 2,
"name": "Max",
"breed": "unknown",
"fluffiness": 5,
"cuteness": 10
}
This endpoint retrieves a single booking.
HTTP Request
GET https://api.runara.com/bookings/<ID>
URL Parameters
Parameter | Description |
---|---|
ID | The ID of the booking to retrieve |
Check-In a Client
Successful check-in returns an empty 204 response.
This endpoint adds a client to the requestor's current account.
HTTP Request
POST https://api.runara.com/bookings/checkinpass
BODY Parameters
Parameter | Required | Description | Example |
---|---|---|---|
client | true if no code |
ID of client to check-in. | 1233243 |
code | true if no client |
Badge/Fob code for client. | AA234444 |
location | true | Current location ID where check-in occurs. | 2233344 |