NAV Navbar
shell

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:

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:

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