Introduction
Base URLs
https://api.getgalore.com/v1
https://api.getgalore-dev.com/v1
https://api.getgalore-staging.com/v1
This is preliminary documentation for the Care.com Connect & Explore APIs, both RESTful endeavors (with momentary lapses for the sake of expediency). Properly formed requests should receive valid JSON, sometimes with helpful error
messages and/or relevant status
codes.
Authorized Requests
curl "https://api.getgalore.com/v1/..."
-H "Api-Key: {YOUR API KEY}'"
-H "Api-Version: 1.25"
-H "Timezone: Pacific Time (US & Canada)"
-H "User-Agent: ..."
-H "Content-Type: application/json"
-H "Provider-ID: 1"
Api-Key
You’ll need to pass an API key in the header of each request in order to use the Galore API.
Api-Version
An intermediate versioning identifier that allows the server to decide how it should respond to properly signed requests.
Timezone
A string representing the user’s timezone.
Provider-ID
This is an optional param that the the client can pass which will scope responses to just this provider.
Errors
These errors will apply to any endpoint that requires user authentication.
HTTP Code | Error code | Description |
---|---|---|
403 |
“no_auth_token” | The client did not pass an authentication_token |
403 |
“invalid_auth_token” | The client passed an authentication_token , but it could not be matched to a user. The user is likely logged out. |
403 |
“user_not_confirmed” | This endpoint requires the user to be confirmed, but the current user has not been confirmed. |
403 |
“forbidden” | The client tried to access or manipulate a record that it did not own |
Sessions
User requests are authorized through an
"Authentication-Token"
field, which is passed in the header of each request.
curl "https://api.getgalore.com/v1/..."
-H "Authentication-Token: {USER AUTHENTICATION TOKEN}"
Actions like reservations, profile updates, etc. all require that the user authenticate with Care.com C/E. This involves either registering or logging in, after which the user will receive an authentication_token
. This token should then be passed in the header of every request in order to identify and authenticate the user.
The authentication_token
is erased when a user logs out and/or reset when a user logs in.
The API will was include a signup
attribute in its session response so that you can tell whether the session was a login or a signup.
Check authentication type
GET /sessions/check
Sample request
{
"email": "New+user@getgalore.com "
}
Sample response
{
"authentication_type": 1,
"email": "new+user@getgalore.com",
"reset_password_token": "aslj298d29dj9a8whatever",
"gift_card": {
}
}
The client can check on which authentication flow to present the user by passing an email
argument to the check
endpoint. The server will then respond with one of several possible authentication_type
values:
1
— Registration- The client should use the
POST /sessions
endpoint
- The client should use the
2
— Login- The client should use the
POST /sessions
endpoint
- The client should use the
3
— Confirm account- The client should use the
POST /sessions/account_setup
endpoint
- The client should use the
4
— Gift card redemption- The client should use the
POST /sessions/account_setup
endpoint
- The client should use the
Arguments
email Required
string
The user’s email address. Note that the server will return the email input by the user with whitespaces stripped and in downcase format.
Check type errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“invalid_email” | You didn’t include an email parameter |
Registration
POST /sessions
{
"signup": true,
"user": {
"email": "test@getgalore.com",
"password": "password",
"first_name": "Test",
"last_name": "Johnson",
"gender": 1,
"facebook_id": "{WHATEVER}",
"facebook_access_token": "{WHATEVER}",
"kids": [
{
"first_name": "Joe",
"gender": 1,
"birthdate": 1342054903
}
],
"address": {
"line1": "123 Mapletree Rd",
"line2": null,
"city": "Woodlawn Estates",
"state": "New Jersey",
"postal": "08753",
"neighborhood": null
}
},
"sharer_id": 23,
"sharer_device_identifier": "{DEVICE IDENTIFIER}",
"recipient_device_identifier": "{DEVICE IDENTIFIER}",
"promo": "DOWNLOADMOBILE",
"channel": "Facebook"
}
Example response
{
"user": {
"id": 1,
"full_name": "Max Stiles",
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com",
"phone": "9732079450",
"created": 1456528752,
"confirmed": 1465857620,
"authentication_token": "{TOKEN}",
"facebook_id": null,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_1_thumb.png?1466533222",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_1_small.png?1466533222",
"kids": [],
"caregivers": [],
"reviews": [],
"waitlists": [],
"reservations": [],
"notifications": [],
"address": {
"line1": "123 Mapletree Rd",
"city": "Woodlawn Estates",
"state": "New Jersey",
"postal": "08753"
}
},
"signup": true,
"referral": {
"id": 11,
"sharer_id": 23,
"sharer": {
"id": 23,
"first_name": "Test",
"last_name": "User"
},
"recipient_id": 1,
"recipient": {
"id": 1,
"first_name": "Max",
"last_name": "Stiles"
},
"code": null,
"sharer_device_identifier": "{DEVICE IDENTIFIER}",
"recipient_device_identifier": "{DEVICE IDENTIFIER}",
"channel": "Facebook",
"currency": "USD",
"recipient_credit_integer": 2000,
"sharer_credit_integer": 2000
},
"user_credit": {
"id": 261,
"currency": "USD",
"used": false,
"name": "Galore download credit",
"percent": null,
"percent_uses": 0,
"percent_uses_redeemed": 0,
"amount": "20.0",
"amount_integer": 2000,
"amount_used": "0.0",
"amount_used_integer": 0,
"created": 1500842660,
"updated": 1500842660,
"code": "DOWNLOADMOBILE",
"user": {
"id": 1
},
"eligible_types": null,
"expiration_date": 0,
"provider": null
}
}
Note that registration via Facebook works the same as registration via email, i.e. the client device connects to Facebook directly and then passes registration credentials to the Galore API as per the below. If this results in a new account, you’ll see "signup": true
in the response; otherwise you’ll see "signup": false
.
If the user signs up because of a referral, the server will pass a referral object in the response—the client can then use this to alert the user that they got credit: “…thanks to sharer.first_name
’s referral”. For a normal sign up, the referral
will be null
.
Arguments
signup Required
boolean
A boolean indicating that the user is intending to register. If you don’t include this key, the server will think you’re trying to log in.
user.email Required
string
Required to create an account. Should be wrapped inside a “user” object.
user.first_name Required
string
e.g. “Joe”. Should be wrapped inside a “user” object.
Optional
user.password
string
Must be at least 8 characters. Should be wrapped inside a “user” object.
user.last_name
string
A string, e.g. “Jackson”
user.kids
array
An optional array of kid objects. More on this below.
user.address
hash
A hash containing the following location components: line1, line2, city, state, zip/postal, neighborhood
.
sharer_id
string
ID for the user who’s share prompted the new user to install/register
sharer_device_identifier
string
An identifier unique to the device who shared an activity, organization, etc. with the current user. This is used to ensure that referrals are unique (i.e. that they can’t be used more than once per sharer/recipient).
recipient_device_identifier
string
An identifier unique to the device that received a share. This is used to ensure that referrals are unique (i.e. that they can’t be used more than once per sharer/recipient).
channel
string
A human readable string indicating what channel/resource brought the user to Galore (e.g. “Email”, “Facebook”, etc.)
Registration errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You didn’t pass your info inside a user block. |
400 |
“invalid_email” | You didn’t include an email parameter |
400 |
“invalid_facebook_auth” | You tried to connect via Facebook but didn’t include a facebook_access_token |
422 |
“validation_failed” | You didn’t include a first_name parameter |
422 |
“invalid_password” | You either didn’t include a password parameter, or the password is not valid. |
422 |
“invalid_facebook_auth” | You tried to connect via Facebook using an invalid facebook_access_token |
422 |
“user_already_exists” | We found an account for that email address, but your password wasn’t valid (so we couldn’t automatically log you in) |
Login
POST /sessions
{
"user": {
"email": "test@getgalore.com",
"password": "password"
},
"promo": "DOWNLOADMOBILE"
}
Example response
{
"user": {
"id": 1,
"authentication_token": "{TOKEN}",
"email": "max.hainesstiles@gmail.com",
"phone": "9732079450",
"full_name": "Max Stiles",
"first_name": "Max",
"last_name": "Stiles",
"created": 1456528752,
"confirmed": 1465857620,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_1_thumb.png?1466533222",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_1_small.png?1466533222",
"avatar_medium": "https://s3.amazonaws.com/galore-dev/avatar_1_medium.png?1466533222",
"facebook_id": null,
"facebook_access_token": null,
"waitlists": [],
"reservations": [],
"kids": [],
"caregivers": [],
"active_providers": [
{
"id": 1,
"name": "Galore",
"support_phone": "5555555555",
"support_email": "support@getgalore.com",
"subdomain": "galore"
},
{
"id": 10,
"name": "Big franchisor",
"support_phone": "5555555555",
"support_email": "support@getgalore.com",
"subdomain": "bigfranchisor"
}
]
},
"referral": {
"id": 11,
"sharer_id": 369,
"recipient_id": 296,
"code": null,
"sharer_device_identifier": "{DEVICE IDENTIFIER}",
"recipient_device_identifier": "{DEVICE IDENTIFIER}",
"channel": null,
"currency": "USD",
"recipient_credit_integer": 2000,
"sharer_credit_integer": 2000
}
}
Note that this is the same endpoint as registration, which allows the server to log someone in if they try to register using an existing email & password combination.
Arguments
user.email Required
string
Required, of course.
user.password Required
string
The user’s password (must be 7 or more characters to support old users).
Login errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You didn’t pass your info inside a user block. |
400 |
“invalid_facebook_auth” | You tried to connect via Facebook but didn’t include a facebook_access_token |
422 |
“invalid_email” | We couldn’t find an account for this email address or an email parameter was not included |
422 |
“invalid_password” | You either didn’t include a password parameter, or the password is not valid. |
422 |
“invalid_facebook_auth” | You tried to connect via Facebook using an invalid facebook_access_token |
422 |
“invalid_password” | We found an account associated with this email address, but your password wasn’t valid |
The client should pass the same parameters whether signing up or logging in through Facebook – the server decides whether to create a new account or log into an existing one.
POST /sessions
{
"user": {
"email": "max@getgalore.com",
"first_name": "John",
"last_name": "James",
"gender": 1,
"facebook_id": "{FACEBOOK_ID}",
"facebook_access_token": "{ACCESS_TOKEN}"
}
}
Required Arguments
user.email Required
string
Required, of course.
user.facebook_id Required
string
The user’s facebook_id
user.facebook_access_token Required
string
The user’s access_token
from the Facebook Login SDK.
When authenticating with Facebook, the client device should ask for the following permissions
:
public_profile
, user_friends
, and email
Which will gives us access to the following fields:
id, first_name, last_name, email, gender
Install
POST /sessions/install
Example request
{
"distinct_id": "{MIXPANEL DISTINCT_ID}",
"version": "1.0.0",
"platform": "Android",
"build": 1,
"name": "Galore",
"operating_system": "9.3.2"
}
Indicates that somebody has done a fresh install of the Galore. Fires an internal webhook notifying the Galore team that an install event has taken place.
Arguments
distinct_id
string
A mixpanel distinct_id for the user
version
string
The app version installed (e.g. “1.0.0”)
build
integer
The internal build number associated with this particular version, e.g. (1)
name
string
The human readable app name/title (e.g. “Galore”, “Galore for Providers”, etc.)
platform
string
The user’s device type (e.g. “iPhone”, “Nexus 5”, etc.)
operating_system
string
e.g. “9.3.2”, “4.0.1”, etc.
Forgot password
POST /sessions/reset_password
Example request
{ "email": "test@getgetalore.com" }
Example response
{ "success": true }
Takes an email as its only parameters and, if the server finds a corresponding user, sends them a “reset password” email.
The API will respond with a 404
if it can’t find an account associated for the requested email address.
email required
string
The user’s email
Change password
POST /sessions/change_password
Example request
{
"reset_password_token": "123abc",
"password": "password",
"password_confirmation": "password"
}
If successful, the API will log the user in (i.e. reset their password and authentication token) and then respond with the same json as in the login and registration flows.
reset_password_token required
string
A reset_password_token
string which the client should have received as a URL/deep link parameter.
password required
string
Must be at least 8 characters.
password_confirmation required
string
Must be at least 8 characters and match the password
.
Change password errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You didn’t pass the proper parameters. |
403 |
“invalid_password_token” | The client did not pass a valid reset_password_token . This might be because the previous token expired or because the user requested multiple tokens but did not click the link from the most recent email. What a putz. |
422 |
“passwords_dont_match” | The required password fields didn’t match. |
422 |
“password_length_error” | Your password needs to be 8 ore more characters. |
Account setup
POST /sessions/account_setup
Example request
{
"reset_password_token": "123abc",
"user":{
"first_name": "John",
"last_name": "James",
"email": "test@getgalore.com",
"password": "password",
"password_confirmation": "password"
}
}
This endpoint is used to finish setting up (i.e. allow users to claim) partially completed accounts. A partially completed account might occur if a user was the recipient of a gift card or if a provider created an account for them. If successful, the API will log the user in (i.e. reset their password and authentication token) and then respond with the same json as in the login and registration flows.
reset_password_token required
string
A reset_password_token
string which the client should have received as a URL/deep link parameter.
user[email] required
string
Must be a valid email address.
user[first_name] required
string
The user’s first name. In some instances, this field may be pre-populated because the client already knows the user’s first name.
user[last_name] required
string
The user’s last name.
user[password] required
string
Must be at least 8 characters.
user[password_confirmation] required
string
Must be at least 8 characters and match the password
.
Account setup errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You didn’t pass the proper parameters, e.g. by not wrapping the user values in a user object or by not including a reset_password_token . |
403 |
“invalid_account_setup_token_error” | The client did not pass a valid reset_password_token or it was invalid. This might be because the previous token expired or because the user requested multiple tokens but did not click the link from the most recent email. What a putz. |
422 |
“passwords_dont_match” | The required password fields didn’t match. |
422 |
“password_length_error” | Your password needs to be 8 ore more characters. |
Review queue
GET /users/review_queue
Example response
{
"reservation": {
"id": 594,
"attended": null,
"activities": null,
"series": {
"id": 336,
"title": "Another creation test",
"provider": {
"id": 1,
"name": "Demo Galore"
},
"photos": [
{
"id": 43,
"uuid": "2d931510-d99f-494a-8c67-87feb05e1594",
"position": 0,
"created": 1480227256,
"caption": "This is a lion. Hear me roar!",
"small_url": "https://s3.amazonaws.com/galore-dev/image_184_small.jpg?1480310565",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_184_medium.jpg?1480310565",
"large_url": "https://s3.amazonaws.com/galore-dev/image_184_large.jpg?1480310565",
"image_file_name": "lions.png",
"series": {
"id": 336,
"title": "Another creation test",
"provider": {
"id": 12,
"name": "Demo Galore"
}
}
}
]
}
}
}
Checks whether we should prompt the user to review a recent reservation. The client should hit this endpoint whenever a user signs in and/or whenever the device becomes active (e.g. after the user returns to the app following an event).
This endpoint will respond with a 204 No Content
when the user has no reviews in their queue and thus no action is required. If the server does respond with a reservation, that reservation will be marked as reviewed regardless of how the client responds. This means that, if a user wants to skip the review, all the client needs to do is dismiss the prompt (i.e. no further communication with the API is required — that reservation will not show up again as needing to be reviewed).
Please note that you’ll need to make your request with an Api-Version
of 1.11
or above.
The API will respond with a title, date, and array of photos for the reservation (either through a series
key or an activities
key, depending on the reservation). These should be used to present the user with some relevant information as to what they’re actually reviewing (i.e. “How was {EVENT_TITLE} on {EVENT_DATE}” with an event photo below).
Please see the section on creating reviews for more information on the Review
object itself.
Logout
DELETE /sessions/logout
Clears the user’s authentication_token
and returns 204 No Content
if successful.
Users
User object
string
The user’s email address
full_name
string
The user’s constructed full name.
first_name
string
The user’s first name
last_name
string
The user’s last name
phone
string
The user’s phone number
authentication_token
string
A unique token for each user that must be passed in the header of each request that requires user authentication and/or authorization. This is reset on both log in and log out.
facebook_id
string
A facebook id… from Facebook.
created
integer
An integer Unix timestamp indicating when the user was created.
confirmed
integer
An integer Unix timestamp indicating when the user was confirmed.
text_permission
boolean
Whether the user has authorized Galore to send them text messages. Not returned with every request.
push_permission
boolean
Whether the user has authorized Galore to send them push notifications on all devices. Not returned with every request.
email_permission
boolean
Whether the user has authorized Galore to send them emails. Not returned with every request.
connections_email_permission
boolean
Whether the user wants to receive emails from other parents via the Galore ecosystem. Not returned with every request.
visibility
string
How the user wants to share their activity on Galore (e.g. event attendance and bookmarks). Possible values:
"visible_none"
— only me"visible_all"
— public"visible_connections"
— with connections
avatar_thumb, avatar_small, avatar_medium
string
URL strings representing for the user’s avatar.
active_providers
array
An array of provider object(s) with which this customer is actively doing business. Each object will include an id
and name
.
uuid
string
An obfuscated unique ID for this user object.
kids
array
An array of kid objects
caregivers
array
An array of caregiver objects
notifications
array
An array of notification objects
reviews
array
An array of review objects
waitlists
array
An array of waitlist objects
Connected users
{
"connected_users": [
{
"id": 123,
"attending": false,
"description": "bookmark",
"user": {
"id": 118,
"first_name": "John",
"last_name": "James",
"city": "San Francisco",
"created": 1508705611,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_2_thumb.?1508708996",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_2_small.?1508708996"
},
"social_connection": {
"id": 37,
"description": "you both reserved a spot at Coffee course",
"requested_at": 1508685962,
"accepted_at": null,
"rejected_at": null,
"direct": true,
"direction": "inbound",
"user": {
"id": 1,
"first_name": "Max",
"last_name": "Test",
"city": "San Francisco",
"created": 1508685962,
"avatar_thumb": null,
"avatar_small": null
}
}
}
]
}
These are users who have some sort of connection to an object on Galore, e.g. an activity
, series
, organization
, user
etc. In other words, each connected_user
represents on object_connection
between a user and an object on the platform. Embedded within each connected_user
object will sometimes be a social_connection
object which represents a connection between two users who’ve taken similar actions on Galore. For example, two users who’ve reserved the same activity will share a social_connection
between the two of them. For a non-authenticated user, the connected_users
response for that activity would include both of the aforementioned reservation-holders, but neither of object would have a social_connection
object. For the above reservation holders, though, the API would return a social_connection
when viewing each other’s connected_users
.
description
string
A human readable string — generated on the server — for this connection. Possible values which can influence this string:
- school
- social_group
- reservation
- purchase
- zip
- bookmark
- review
- unknown
attending
boolean
Whether this user to whom this connection belongs.
user_id
integer
The user who’s connected to the object in question.
first_name
string
The user’s first name.
last_name
string
The user’s last name.
avatar_thumb
string
An image URL for the user’s profile avatar, if available.
social_connection
SocialConnect object.
A json
representation of the social connection between the current user and the connected user. This attribute will not be present if there is no currently signed in user or null
if there is no social connection between the current user and the connected user. If there is a social connection with a non-null requested_at
value but with a null or missing accepted_at
value, that means there’s currently a pending “connection” request between users. Each connection may also have a direct
boolean attribute indicating whether the two users had a programmatic connection created between them because they are friends on facebook, referred each other, or sent on another a gift card
Add phone
POST users/confirm_mobile
Example request
{
"phone": "555-555-5555",
"zip": "94102"
}
Successful response
{ "success": true }
Sample error response
{ "error": "Sorry, but we're unable to send texts in development mode" }
Although a phone number is not required in order to create an account, it is required in order to perform certain user-specific requests (like making reservations). This endpoint will respond with either success
indicating that the user should be receiving a text, or an error
message indicating that something went wrong.
Please note that +1
is the only country code we currently support.
Required arguments
phone required
string
The user’s phone number as a string. Hyphens, parentheses and other non-digits are okay – they will be stripped on the server so that the phone string is purely numeric.
zip required
string
The user’s primary zip code as a string. This is used in order to geographically target marketing communications.
Phone Errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You either didn’t use a phone key, or the value you did pass was not valid. |
403 |
“forbidden” | We couldn’t find a valid user based on the passed authentication_token . |
503 |
“service_unavailable” | You didn’t pass the magic phone number, or Twilio was unavailable. |
Confirm phone
POST users/confirm
Example request
{ "confirmation_token": "123456" }
Successful response
{
"phone": "5555555555",
"confirmed": 1468300490
}
Sample error
{
"error": "Invalid confirmation token"
}
Used to confirm that the user’s phone number is valid and can receive texts.
SMS messaging is not currently enabled on either staging or development. If you want to test a successful response from the server regardless of whether you received a token (e.g. testing mobile phone confirmation despite not receiving a token via text message), use the magic token 555555
.
Required
confirmation_token required
string
A 6-digit string.
Confirmation errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden” | You didn’t pass a valid authentication_token in the request header, so we couldn’t find the appropriate user |
404 |
“not_found” | You didn’t pass a confirmation_token |
422 |
“validation_failed” | This wasn’t the correct confirmation token. Notify the user that they mistyped something. |
Register for push notifications
POST /push_registrations
Example request
{
"push_registration": {
"device_type": 1,
"token": "{DEVICE TOKEN}"
}
}
Successful response
{"success": true}
This endpoint is responsible for handling push tokens sent from mobile clients to the server. On each request, the server will grab the user associated with the authentication_token
passed in the header (or respond with 403
if it can’t find a user) and then save the token to that user. Note that a user can only have one token per device_type
and that subsequent requests to this endpoint for the same device_type
will update an existing token rather than create new one(s). The mobile client is not responsible for deleting stale tokens.
Required
device_type required
string
An integer representing the device:
- iPhone:
1
- iPad:
2
- Android:
3
token required
string
The relevant device_token
required in order to send server-generated push notifications to the device.
Settings
GET /settings
Example response
{
"user": {
"id": 1,
"full_name": "Max Stiles",
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com",
"phone": "9732079450",
"created": 1456528752,
"confirmed": 1465857620,
"authentication_token": "{TOKEN}",
"text_permission": false,
"email_permission": true,
"push_permission": true,
"reminder_text_permission": true,
"reminder_email_permission": true,
"confirmation_email_permission": true,
"marketing_email_permission": true,
"automated_email_permission": true,
"connections_email_permission": true,
"visibility": "visible_all",
"facebook_id": null,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_1_thumb.png?1466533222",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_1_small.png?1466533222",
"avatar_medium": "https://s3.amazonaws.com/galore-dev/avatar_1_medium.png?1466533222",
"kids": [
{
"id": 19,
"first_name": "Arabica",
"last_name": null,
"user_ids": [1],
"gender": null,
"birthdate": 1325419200,
"allergies": "",
"notes": ""
}
],
"caregivers": [
{
"id": 1,
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com",
"phone": null,
"gender": null,
"birthdate": null,
"user": {
"id": 1
},
"created": 1456528752,
"user_as_caregiver_id": 1
}
],
"address": {
"id": 10,
"line1": "123 Mapletree Rd",
"line2": null,
"city": "Woodlawn Estates",
"state": "New Jersey",
"postal": "08753",
"phone": null,
"longitude": -74.1967810816327,
"latitude": 39.9772519795918,
"timezone": "Eastern Time (US & Canada)",
"neighborhood": null
},
"reviews": []
}
}
For fetching a user’s settings (e.g. email, phone, caregiver or kid info, etc.).
Update user
PATCH /users/{ID}
Sample request
{
"user": {
"id": 1,
"first_name": "New first name",
"facebook_id": 123,
"facebook_access_token": "123abc",
"address": {
"line1": "123 Main St",
"line2": null,
"city": "San Francisco",
"state": "CA",
"postal": "08753",
"phone": null,
"neighborhood": null
}
},
"permission": {
"reminder_email": true,
"reminder_text": true,
"email": true,
"text": false,
"push": true,
"marketing_email": true,
"automated_email": true,
"connections_email": true,
"visibility": "visible_none"
}
}
Example response
{
"user": {
"id": 1,
"full_name": "Max Stiles",
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com",
"phone": "9732079450",
"created": 1456528752,
"confirmed": 1465857620,
"authentication_token": "{TOKEN}",
"text_permission": false,
"email_permission": true,
"push_permission": true,
"reminder_text_permission": true,
"reminder_email_permission": true,
"confirmation_email_permission": true,
"marketing_email_permission": true,
"automated_email_permission": true,
"connections_email_permission": true,
"visibility": "visible_all",
"facebook_id": null,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_1_thumb.png?1466533222",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_1_small.png?1466533222",
"avatar_medium": "https://s3.amazonaws.com/galore-dev/avatar_1_medium.png?1466533222",
"kids": [],
"caregivers": [],
"reviews": [],
"address": {
"line1": "123 Main St",
"line2": null,
"city": "San Francisco",
"state": "CA",
"postal": "08753",
"phone": null,
"neighborhood": null
}
}
}
Note that either user[address][zip]
or user[address][postal]
can be passed, depending on the customer’s country/locale. Please also note that in order to update a user’s communication permissions, the API requires that clients pass those permissions inside a separate permission
object. Those permissions will then be passed back as part of the original user
object.
Please note that the visibility
permission actually takes a string value — not a boolean.
Unlink from facebook
DELETE /users/unlink_fb
The server will remove the facebook_id
and facebook_access_token
attributes for the user identified by authentication_token
passed by the client. The server will also delete any “facebook” connections that the user has active.
Avatar
POST /users/{ID}/avatar
Example response
{
"user": {
"id": 1,
"avatar_medium": "https://s3.amazonaws.com/galore-staging/avatar_1_medium.jpg?1479947709",
"avatar_small": "https://s3.amazonaws.com/galore-staging/avatar_1_small.jpg?1479947709",
"avatar_thumb": "https://s3.amazonaws.com/galore-staging/avatar_1_thumb.jpg?1479947709",
"confirmed": 1476483857,
"created": 1413498221,
"updated": 1413498221
}
}
Required
user[avatar] required
file
The image/pdf that’s being uploaded as the user’s avatar.
Note that this is a multipart request, meaning the client should use "Content-Type", "multipart/form-data"
.
You can set the filename via Content-Disposition
, e.g. "Content-Disposition: form-data; name="user[avatar]"; filename="User_Test_avatar.jpg"\r\nContent-Type: image/jpg\r\n">
Avatar from facebook
POST /users/{ID}/avatar_from_fb
Initiates a request to pull the user’s avatar from Facebook. No parameters are required for this method, since the user is being identified through their Authentication-Token
and the logic to request and then save the avatar will take place on the server. Will generate a 403 Forbidden
response if the user did not authenticate from Facebook (and thus we don’t have their facebook_id
of facebook_access_token
).
Remove an avatar
DELETE /users/{ID}/destroy_avatar
Example response
{
"success": true
}
Removes the user’s saved avatar. The client should make sure to delete/reset all user thumbnails with the old avatar.
View profile
GET /users/{ID}
Requests information about a particular user for the purpose of showing their profile. If the current user and the user being viewed are connected, the response will also include a social_connection
object.
Example response
{
"user": {
"id": 1,
"avatar_medium": "https://s3.amazonaws.com/galore-staging/avatar_1_medium.jpg?1479947709",
"avatar_small": "https://s3.amazonaws.com/galore-staging/avatar_1_small.jpg?1479947709",
"avatar_thumb": "https://s3.amazonaws.com/galore-staging/avatar_1_thumb.jpg?1479947709",
"created": 1413498221,
"first_name": "Joe",
"last_name": "Schmo",
"uuid": "b168080a-34da-4af2-8de1-f1b3bff76974",
"city": "San Francisco",
"reviews": [],
"social_connection": {
"id": 37,
"description": "you're both friends on facebook and you both reserved a spot at Magical Date Nights",
"requested_at": 1508686992,
"accepted_at": 1508689992,
"rejected_at": null,
"direct": true,
"user": {
"id": 1,
"first_name": "Max",
"last_name": "Test",
"city": "San Francisco",
"created": 1508685962,
"avatar_thumb": null,
"avatar_small": null
}
}
}
}
Events
All events
GET /events
{
"total": 10,
"page": 1,
"last_page": false,
"activities": [
{
"id": 4957,
"title": "repeat timezone test",
"start_time": 1468256400,
"end_time": 1468260000,
"price_integer": 5000,
"currency": "USD",
"updated": 1468256400,
"drop_in": null,
"indoor": true,
"outdoor": false,
"about": "t",
"available_spots": 1,
"start_months_old": 0,
"end_months_old": 0,
"camp": false,
"date_night": false,
"purchasable": true,
"drop_off": true,
"for_kids": null,
"only_purchasable_as_trial": false,
"membership_eligible": true,
"package_eligible": false,
"activity_location": {
"hidden": false,
"directions": null,
"location": { }
},
"allows_waitlist": true,
"discounts": [],
"connected_users": [],
"reservation": {
"id": 1234,
"spots": 1
},
"caregiver_string": "Optional: adults can stay or take a breather",
"provider": null,
"series": null,
"instructors": [],
"organizations": [],
"photos": [],
"allowed_entry": true
}
],
"series": [
{
"id": 290,
"title": "New series",
"available_spots": 10,
"price_integer": 2000,
"currency": "USD",
"updated": 1468256400,
"indoor": true,
"outdoor": false,
"camp": false,
"location_series": {
"hidden": false,
"directions": "These are directions for the location of this series",
"location": { }
},
"allows_waitlist": true,
"about": "This is a new series",
"discounts": [
{
"id": 1234,
"name": "sibling discount",
"percent": "15.0",
"amount_integer": 0,
"currency": "USD"
}
],
"connected_users": [],
"reservation": {
"id": 2345,
"spots": 1
},
"sessions": [
{
"id": 4973,
"series": {
"id": 290
},
"title": "New series",
"start_time": 1468411200,
"end_time": 1468414800,
"drop_in": true,
"available_spots": 15,
"about": "This is a new series",
"price_integer": 1500,
"currency": "USD",
"allows_waitlist": true,
"session_index": 1,
"caregiver_string": "Required: an adult must stay",
"drop_off": false,
"activity_location": null,
"provider": {
"id": 20,
"name": "Little Artistas",
"image_thumb": null,
"image_small": null,
"image_medium": null
},
"discounts": [
{
"id": 1234,
"name": "sibling discount",
"percent": "15.0",
"amount_integer": 0,
"currency": "USD"
}
]
},
{
"id": 4974,
"series": {
"id": 290
},
"title": "New series",
"start_time": 1468497600,
"end_time": 1468501200,
"drop_in": true,
"available_spots": 20,
"about": "This is a new series",
"price_integer": 1000,
"currency": "USD",
"allows_waitlist": true,
"session_index": 2,
"caregiver_string": "Required: an adult must stay",
"drop_off": false,
"activity_location": null,
"provider": {
"id": 20,
"name": "Little Artistas",
"image_thumb": null,
"image_small": null,
"image_medium": null
},
"discounts": [
{
"id": 1234,
"name": "sibling discount",
"percent": "15.0",
"amount_integer": 0,
"currency": "USD"
}
]
}
],
"caregiver_string": "Required: an adult must stay",
"provider": {
"id": 20,
"name": "Little Artistas",
"image_thumb": null,
"image_small": null,
"image_medium": null
},
"instructors": [
{
"id": 55,
"provider": {
"id": 20
},
"first_name": "Max",
"last_name": "Stiles",
"photos": []
}
],
"organizations": [
{
"id": 45,
"provider": {
"id": 20
},
"name": "Little Artistas",
"photos": []
}
],
"photos": [
{
"id": 101,
"uuid": "2d931510-d99f-494a-8c67-87feb05e1594",
"created": 1468040186,
"position": 0,
"medium_url": "https://s3.amazonaws.com/galore-dev/image_101_medium.jpg?1468040194"
}
]
}
]
}
Fetches separate arrays of activity and series objects, respectively, as well as the attributes page
and total
. Note that filtering uses the /events
endpoint, except with one or more of the below optional arguments.
Response objects
activities
Array
An array of activity objects
series
Array
An array of series objects
total
integer
The total number of results the API was able to find based on the user’s search criteria.
page
integer
The current page from the paginated response object. Useful for building infinite scroll.
last_page
boolean
A boolean value indicating whether there are more records to return or if this was the last page in the paginated response. Useful for building infinite scroll.
Optional arguments
latitude
float
If you don’t pass a latitude, the API will not be able to scope by location – which is crazy. If the user has not given the app permission to determine coordinates, you can pass the latitude for San Francisco.
longitude
float
If you don’t pass a longitude, the API will not be able to scope by location – which is crazy. If the user has not given the app permission to determine coordinates, you can pass the longitude for San Francisco.
distance
float
The filter radius in kilometers. The API defaults to 32.1869km if no distance
parameter is passed in.
count
integer
An integer representing how many results you want returned per page. If you don’t pass a count
parameter in your request, the server will default to a default page size of 30
combined activity and series results.
page
integer
The desired page to return. Always 1
after a refresh, then incremented up by 1
as the user scrolls.
sort_by_distance
boolean
Including this parameter will tell the server to sort events by distance from the client (either the user’s location or a location the user has chosen). Note that latitude and longitude must also be passed in order for sort_by_distance to be enabled.
search
string
A search term
dates
Array
An array of dates in “yyyy-mm-dd” format (e.g. [“2017-01-01”,“2017-09-29”])
start_date
integer Unix timestamp
The beginning date range that a parent wants to filter for.
end_date
integer Unix timestamp
The end date range that a parent wants to filter for.
updated_start
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
updated_end
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
drop_in
boolean
Response will include only drop-in activities
series
boolean
Response will include non-camp series, i.e. if a camp is also a series, the series will appear in the camp tab but not the series tab.
camp
boolean
Response will include all camps (e.g. for both series and activities).
date_night
boolean
Response will include date nights
months
array
An array of integers representing the filter months
free
boolean
Whether the event is free (i.e. price == 0)
paid
boolean
Whether the event has a positive price (i.e. price > 0)
offers_discount
boolean
Whether the event offers a sibling discount
drop_off
boolean
Whether a parent or caregiver can drop their kid off.
indoor
boolean
Whether the event is indoor
outdoor
boolean
Whether the event is outdoors
grown_ups
boolean
These events are intended for grown-ups, but kids are welcome too.
grown_ups_only
boolean
This event is only for grown-ups (no kids allowed).
Activities
Activity object
id
integer
Unique integer ID for this activity
title
string
Human readable title for this activity
currency
string
The ISO 4217 currency string for price_integer
, e.g. ‘USD’
price_integer
integer - user specific
The price as an integer, e.g. 1000
equals $10.00
. This will be the final kids ticket price based on any top_line_deductions
.
ticket_price_integer
integer - user specific
The price as an integer, e.g. 1000
equals $10.00
. This will be the final adult ticket price based on any top_line_deductions
.
top_line_price_integer
integer - conditional
The top line price of the event, i.e. without any discounts or trials applied. This attribute will only be returned if there are top_line_deductions
that can affect the price of this event for the user. If this attribute is present and different from price_integer
, clients should display the top_line_price
with a strikethrough and then display the price_integer
as the final price.
top_line_ticket_price_integer
integer - conditional
The top line ticket price of the event.
top_line_deductions
array
Array of deduction objects with type
, name
, and deduction_amount_integer
that specify how the top_line_price_integer
was reduced to the price_integer
. The sum of the amount_integers
in the top_line_deductions
should equal the different between the top_line_price_integer
and the price_integer
. Currently, the type will either be trial
or discount
.
drop_in
boolean
Whether a parent can “drop in” to this single activity (i.e. not part of a multi-day series). Will be null
for non-session activities (i.e. activities that do not belong to a series), true
for activities that are drop-in-able, and false
for activities that are not drop-in-able.
indoor
boolean
Whether the event is indoor
outdoor
boolean
Whether the event is outdoors
about
string
Text describing the event, typically about a paragraph in length.
purchasable
boolean
Indicates whether the activity is ticketed by Galore or merely a passive “listing” on the platform. In other words, a purchasable = true
event is one where we are partnering with the provider to function as their booking solution.
available_spots
integer
Remaining “inventory” for the activity. Only shown to the user if there are less than 2 available spots for activity.
max_spots_per_reservation
integer
Total number of spots that a single parent can reserve for this activity. If null
, then there is no limit on the number of spots per reservation.
start_months_old
integer
Beginning age range (in months). If this value is 0
or null
, the event is suitable for ages up to the end_months_old
value.
end_months_old
integer
Ending age range (in months). If this value is 0
or null
, the event is suitable for the start_months_old
value and up.
Please note that if both start_months_old
and end_months_old
are 0, the event is suitable for all_ages
, which means exactly what you’d guess it means.
camp
boolean
A flag indicating whether this event should show up in the camp filter/tab. Note that camps can be either activity
or series
objects.
date_night
boolean
A flag indicating whether this event should show up in the date night filter/tab. Note that date nights can only be activity
objects.
day_pass
boolean
A flag indicating whether this event is a “day pass”. Note that day passes can only be activity
objects and will show up on the day passes filter/tab.
drop_off
boolean
allows_waitlist
boolean
Indicates whether a parent should be able to sign up for a waitlist if the activity is sold out.
allowed_entry
boolean
Indicates that the currently authenticated user has an active waitlist (i.e. there is still a waitlist for this event, but the provider has given the user 48 hours to bypass the waitlist in order to make their reservation). Note that this argument will not be present if the user is not authenticated or if the user does not have an active waitlist for this event.
discounts
array
An array of Discount objects.
bookmark
object
The user’s Bookmark for this activity. Because of server-side uniqueness constraints, there should only ever be one bookmark per user.
connected_users
array
An array of connected users objects.
assigned_form_fields
array
An array of assigned_form_field objects.
reservation
object
The user’s Reservation for this activity. On the main /events
feed this will only have the id
and spots
attributes for performance. If the user does not have a reservation then this attribute will not be present.
waitlist
object
The user’s Waitlist for this activity. On the main /events
feed this will only have the id
and spots
attributes for performance. If the user is not on a waitlist then this attribute will not be present.
trial
object
A Trial object.
only_purchasable_as_trial
boolean
Activities with this attribute set to true
will be reservable only if the user is eligible for the associated trial. See the Booking endpoint for more information on how to use this during the reservation flow.
user_eligible_for_trial
boolean - conditional
This attribute will only be returned if the activity has a trial. If this is set to true
then the user will be charged the trial.price
. That is already taken into account in the price_integer
.
membership_eligible
boolean
Activities with this attribute set to true
are reservable using an applicable membership. See the Booking endpoint for more information on how to use this during the reservation flow.
package_eligible
boolean - conditional
This attribute will only be returned if the user is logged in and has purchased a “Class Pack” that includes this activity. If this is set to true
then the user will be able to use some of their package_credits
towards their reservation. See the Booking endpoint for more information.
caregiver_count
integer
The number of caregivers required to make a reservation for this event. If null
or 0
then no caregivers are required.
caregiver_string
string
A human readable string indicating how the app should display caregiver info for the activity.
attendance_string
string
A human readable string indicating how the app should display age/attendance info for the activity.
show_kid_picker
boolean
A boolean indicating whether the client should give users the ability to select kids for attendance.
show_ticket_picker
boolean
A boolean indicating whether the client should give users the ability to select number of tickets for purchase.
for_kids
boolean
A three-valued boolean that describes how kids should participate:
true
: This activity is only for kidsfalse
: Kids are not allowed at this activity.null
: The activity is for parents, but kids may attend as well.
link
string
An optional external url for this activity, if the provider wants to add/cite information external to Galore (e.g. “http://www.parksandrec.com/fun-event”). Note that HTTP
or HTTPS
should have already been added.
online_link
string
An optional external meeting or resource link for an online activiy (e.g. for Zoom, Slack, etc.). Note that HTTP
or HTTPS
should have already been added.
web_url
string
The URL for accessing this activity on Galore web. Used for creating deep links.
start_time
integer Unix timestamp
When the activity starts.
end_time
integer Unix timestamp
When the activity ends. Note that the app is designed to show activities on the feed up until they end, giving parents the ability to sign up through the app during the activity itself.
start_time_iso_string
string
The activity start time in ISO 8601.
end_time_iso_string
string
The activity end time in ISO 8601.
visible_start_date
integer Unix timestamp
The point in time before which the event should not be visible on the app. Note that the events
feed will never respond with an activity whose visible_start_date
is in the future, so this attribute can be safely ignored.
visible_end_date
integer Unix timestamp
The point in time after which the event should no longer be visible on the app. Note that the events
feed will never respond with an activity whose visible_end_date
is in the past, so if the client is not storing events on the device, this attribute can be safely ignored.
purchasable_start_time
integer Unix timestamp
A Unix timestamp indicating when users can start purchasing this activity. The API will not send events with purchasable_start_time
in the future as part of its feed response, but a user could still end up on the detail view if they were given a deep link. As such, the client should not allow users to bring up the purchase flow or submit reservation requests for events with purchasable_start_time
in the future.
purchasable_end_time
integer Unix timestamp
The point in time after which the event should no longer be purchasable. If the provider does not list an explicit purchasable end time, this value defaults to the activity’s end_time
.
unique_product_id
string
The unique ID that report to various ad/marketing platforms — including Facebook re: Dynamic Product Ads — when a user views an event, opens a reservation screen, and makes a purchase.
provider
Provider object
An event can have at most one provider. null
if the event is not purchasable (i.e. not ticketed through Galore).
instructors
array
An array of Instructor objects. Note that instructors will be returned in alphabetical order, based on the instructor’s first name.
organizations
array
An array of Organization objects. There will typically only be one per event, but it’s possible that multiple organizations could host joint events and want their names displayed together. Note that organizations will be returned in alphabetical order.
photos
array
An array of Photo objects.
extras
array
An array of Extra objects.
activity_location
Activity location
An event can have, at most, one activity location. A location is required for all events. Note that the location for many sessions will simply point to the location_series
object for the parent series.
Get an activity
GET /activities/{ID}
Sample request
GET /activities/80957
{
"activity": {
"id": 80957,
"title": "To publish on Sat (8/27)",
"price_integer": 5000,
"currency": "USD",
"about": "This is a description.",
"discounts": [],
"camp": false,
"extras": [],
"session_index": null,
"link": "https://www.fake-website.com/path",
"online_link": "https://www.fake-website.com/online-path",
"phone": null,
"spots": null,
"available_spots": null,
"start_months_old": 24,
"end_months_old": 96,
"drop_in": null,
"date_night": false,
"indoor": true,
"outdoor": false,
"purchasable": false,
"canceled": false,
"instructions": "",
"allows_waitlist": false,
"caregiver_string": "Optional: adults can stay or take a breather",
"show_kid_picker": true,
"show_ticket_picker": true,
"attendance_string": "For kids and grown-ups",
"start_time": 1473872400,
"end_time": 1473876000,
"start_time_iso_string": "2016-09-14T10:00:00-07:00",
"end_time_iso_string": "2016-09-14T11:00:00-07:00",
"purchasable_start_time": 1473676000,
"purchasable_end_time": 1473876000,
"updated": 1468256400,
"drop_off": true,
"connected_users": [
{
"id": 123,
"description": "bookmark",
"attending": false,
"user": {
"id": 118,
"first_name": "Test",
"last_name": "User",
"city": "San Francisco",
"created": 1508705611,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_118_thumb.jpg?1501949047",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_118_small.jpg?1501949047"
},
"social_connection": {
"id": 37,
"description": "you both reserved a spot at Coffee course",
"user": {
"id": 1,
"first_name": "Max",
"last_name": "Test",
"city": "San Francisco",
"created": 1508685962,
"avatar_thumb": null,
"avatar_small": null
}
}
}
],
"reviews": [],
"positive_reviews": 36,
"total_reviews": 40,
"discounts": [],
"start_unix": 1473872400,
"end_unix": 1473876000,
"caregiver": null,
"caregiver_count": null,
"series": null,
"photos": [],
"instructors": [],
"organizations": [],
"bookmark": null,
"tags": [],
"provider": { },
"activity_location": { },
"package_eligible": true,
"membership_eligible": true,
"web_url": "https://ccsdemogalore.getgalore-staging.com/a/80957",
"unique_product_id": "ACTIVITY_80957",
"allowed_entry": true,
"assigned_form_fields": []
}
}
Note that if a provider allows a customer entry into a sold out activity, the activity response will include an allowed_entry: true
attribute. If that allowed_entry
param is true
then the user can create a new reservation. Note that this argument will not be present if the user is not authenticated or if the user does not have an active waitlist for this event.
Arguments
id Required
integer
The integer ID of the activity to retrieve. The integer ID of the activity to retrieve.
Errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found” | The requested activity could not be found |
Series
Series object
{
"id": 219,
"title": "Favorite Artistas",
"available_spots": 1,
"price_integer": 5000,
"top_line_price_integer": 5000,
"ticket_price_integer": 0,
"top_line_ticket_price_integer": 0,
"currency": "USD",
"indoor": true,
"outdoor": false,
"camp": true,
"allows_waitlist": true,
"allowed_entry": true,
"start_months_old": 36,
"end_months_old": 60,
"unique_product_id": "SERIES_219",
"updated": 1468256400,
"location_series": {
"hidden": false,
"directions": "Special directions for Favorite Artistas",
"location": {
"id": 1617,
"line1": "667 Chenery St",
"line2": null,
"city": "San Francisco",
"state": "California",
"postal": "94131",
"phone": null,
"longitude": -122.4332017,
"latitude": 37.7343979,
"neighborhood": "",
"name": "Little Artistas",
"visible": true,
"yelp_business_id": null,
"photos": []
}
},
"caregiver_string": "Optional: adults can stay or take a breather",
"show_kid_picker": true,
"show_ticket_picker": true,
"attendance_string": "For kids and grown-ups",
"web_url": "https://ccsdemogalore.getgalore-staging.com/s/248-nemanja-test-series-2",
"pro_rata": true,
"purchasable_start_time": 1473676000,
"purchasable_end_time": 1473876000,
"provider": {
"id": 41,
"name": "Staging Artistas",
"image_thumb": "https://dn8v0guplrley.cloudfront.net/provider_avatar_41_thumb.png?1467240091",
"image_small": "https://dn8v0guplrley.cloudfront.net/provider_avatar_41_small.png?1467240091"
},
"organizations": [
{
"id": 201,
"name": "Staging Artistas",
"photos":[],
"provider": {
"id": 41
}
}
],
"bookmark": null,
"connected_users": [],
"sessions": [],
"photos": [],
"assigned_form_fields": []
}
id
integer
Unique integer ID for this series.
title
string
Human readable title for this series.
currency
string
The ISO 4217 currency string for price_integer
, e.g. 'USD’
price_integer
integer
The price as an integer, e.g. 1000
equals $10.00
. This will take into account pro-rata pricing as if the reservation was made now. For example, a $100 series that had half of its sessions in the past would return 5000
($50).
ticket_price_integer
integer
The adult ticket price as an integer, e.g. 1000
equals $10.00
.
top_line_price_integer
integer
The full series price as an integer, e.g. 2000
equals $20.00
. The client can use this price to indicate that pro-rata pricing or early-bird discounts have been applied.
top_line_ticket_price_integer
integer
The full series adult ticket price as an integer, e.g. 2000
equals $20.00
. The client can use this price to indicate that pro-rata pricing or early-bird discounts have been applied.
indoor
boolean
Whether the event is indoor
outdoor
boolean
Whether the event is outdoors
about
string
Text describing the event, typically about a paragraph in length.
purchasable
boolean
Indicates whether the activity is ticketed by Galore or merely a passive “listing” on the platform. In other words, a purchasable = true
event is one where we are partnering with the provider to function as their booking solution.
available_spots
integer
Remaining “inventory” for the activity. Only shown to the user if there are less than 2 available spots for activity.
max_spots_per_reservation
integer
Total number of spots that a single parent can reserve for this series. If null
, then there is no limit on the number of spots per reservation.
start_months_old
integer
Beginning age range (in months). If this value is 0
or null
, the event is suitable for ages up to the end_months_old
value.
end_months_old
integer
Ending age range (in months). If this value is 0
or null
, the event is suitable for the start_months_old
value and up.
Please note that if both start_months_old
and end_months_old
are 0, the event is suitable for all_ages
, which means exactly what you’d guess it means.
camp
boolean
A flag indicating whether this event should show up in the camp filter/tab. Note that camps can be either activity
or series
objects.
drop_off
boolean
Whether a parent or caregiver can drop their kid off.
allows_waitlist
boolean
Indicates whether a parent should be able to sign up for a waitlist if the series is sold out.
allowed_entry
boolean
Indicates that the currently authenticated user has an active waitlist (i.e. there is still a waitlist for this event, but the provider has given the user 48 hours to bypass the waitlist in order to make their reservation). Note that this argument will not be present if the user is not authenticated or if the user does not have an active waitlist for this event.
pro_rata
boolean
A boolean indicating whether parents can purchase the series after it’s already started. If true
, the client should display a “pro-rata” ticket price, i.e. the number of remaining sessions multiplied by the pro-rata price (which will be the total series price divided by the number of sessions). For example, a $100 series that started last Monday but which has 3 more sessions and pro_rata: true
should display a price of $75.
for_kids
boolean
A three-valued boolean that describes how kids should participate:
true
: This series is only for kidsfalse
: Kids are not allowed at this series.null
: The series is for parents, but kids may attend as well.
visible_start_date
integer Unix timestamp
The point in time before which the series should not be visible on the app. Note that the events
feed will never respond with a series whose visible_start_date
is in the future, so this attribute can be safely ignored.
visible_end_date
integer Unix timestamp
The point in time after which the series should no longer be visible on the app. Note that the events
feed will never respond with an series whose visible_end_date
is in the past, so if the client is not storing events on the device, this attribute can be safely ignored.
purchasable_start_time
integer Unix timestamp
A Unix timestamp indicating when users can start purchasing the series. The API will not send events with purchasable_start_time
in the future as part of its feed response, but a user could still end up on the detail view for such a series if they were given a deep link. As such, the client should not allow users to bring up the purchase flow for these types of series, notifying them that the event is not yet purchasable.
purchasable_end_time
integer Unix timestamp
A Unix timestamp indicating when users should no longer be able to purchase the series. After this point in time, the device should no longer display this series (unless via Reservations view or deep link), and the listing/detail view should not allow the user to bring up the purchase flow. If the provider does not list an explicit purchasable end time, this value defaults to the series end_time
.
discounts
array
An array of Discount objects.
bookmark
object
The user’s Bookmark for this series. Because of server-side uniqueness constraints, there should only ever be one bookmark per user.
connected_users
array
An array of connected users objects.
reservation
object
The user’s Reservation for this series. On the main /events
feed this will only have the id
and spots
attributes for performance. If the user does not have a reservation then this attribute will not be present.
assigned_form_fields
array
An array of assigned_form_field objects.
waitlist
object
The user’s Waitlist for this series. On the main /events
feed this will only have the id
and spots
attributes for performance. If the user is not on a waitlist then this attribute will not be present.
caregiver_count
integer
The number of caregivers required to make a reservation for this event. If null
or 0
then no caregivers are required.
caregiver_string
string
A human readable string indicating how the app should display caregiver info for the series.
attendance_string
string
A human readable string indicating how the app should display age/attendance info for the series.
show_kid_picker
boolean
A boolean indicating whether the client should give users the ability to select kids for attendance.
show_ticket_picker
boolean
A boolean indicating whether the client should give users the ability to select number of tickets for purchase.
link
string
An optional external url for this series, if the provider wants to add/cite information external to Galore (e.g. “https://www.parksandrec.com/fun-event”). Note that HTTP
or HTTPS
should have already been added.
online_link
string
An optional external url for an online meeting location for this series. Note that HTTP
or HTTPS
should have already been added.
web_url
string
The URL for accessing this series on Galore web. Used for creating deep links.
unique_product_id
string
The unique ID that we report to our various ad marketing services, including Facebook (Dynamic Product Ads), when a user views an event, opens a reservation screen, and makes a purchase.
provider
Provider object
An event can have at most one provider. null
if the event is not purchasable (i.e. not ticketed through Galore).
instructors
array
An array of Instructor objects. Note that instructors will be returned in alphabetical order, based on the instructor’s first name.
organizations
array
An array of Organization objects. There will typically only be one per event, but it’s possible that multiple organizations could host joint events and want their names displayed together. Note that organizations will be returned in alphabetical order.
photos
array
An array of Photo objects.
location_series
Object
The location series object for this series.
sessions
array
An array of Activity objects representing individual dates/sessions within the series. Sessions will be returned in chronological order by default.
Get a series
GET /series/{ID}
Sample request
GET /series/305
{
"series": {
"id": 248,
"title": "Nemanja Test Series 2",
"price_integer": 2500,
"currency": "USD",
"purchasable": true,
"start_months_old": 0,
"end_months_old": 0,
"all_ages": true,
"about": "Series with two drop in activities, I want to test the drop in tab series presentation.",
"indoor": false,
"outdoor": true,
"camp": false,
"extras": [],
"available_spots": 10,
"instructions": "",
"link": "https://www.another-fake-website.com/path",
"online_link": "https://www.another-fake-website.com/online-path",
"phone": null,
"canceled": false,
"caregiver_string": "Drop-off: kids only",
"allows_waitlist": true,
"caregiver": false,
"caregiver_count": null,
"drop_off": true,
"allowed_entry": true,
"sessions": [],
"provider": { },
"instructors": [],
"organizations": [],
"tags": [],
"photos": [],
"location_series": { },
"discounts": [
{
"id": 1234,
"name": "sibling discount",
"percent": "15.0",
"amount_integer": 0,
"currency": "USD"
}
],
"connected_users": [],
"reviews": [],
"positive_reviews": 44,
"total_reviews": 60,
"assigned_form_fields": []
}
}
Returns a series object inside a series
wrapper. Note that if a provider allows a customer entry into a sold out series, the series response will include an allowed_entry: true
attribute. If that allowed_entry
param is true
then the user can create a new reservation. Note that this argument will not be present if the user is not authenticated or if the user does not have an active waitlist for this event.
Arguments
id required
integer
The integer ID of the series to retrieve.
waitlist_token
string
Errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found” | The requested series could not be found |
Locations
A location
is the canonical venue that exists in the real world, as represented by the attributes listed below (e.g. street
, phone
, etc.). activity_location
and location_series
objects represent the location as it pertains to a particular event, optionally indicating special directions for that event or whether the provider would like for that location to be hidden.
Location object
Attributes
id
integer
The integer ID of the location
name
string
The name of the venue, e.g. “Rajko Mitić Stadium”
line1
string
The first line in a human readable address string.
line2
string
The second line in a human readable address string.
city
string
A city in the US (for now).
state
string
A state in the US (for now).
postal
string
Synonym for “zip code”
phone
string
A contact phone number for the location.
longitude
float
Degrees longitude
latitude
float
Degrees latitude
neighborhood
string
Human readable string indicating the location’s general area. This is show in place of an exact address if the location is listed as “hidden”. e.g. “Mission”, “SOMA”, “Some part of Belgrade”
utc_offset
integer
The number of integer seconds ahead or behind UTC. Useful for figuring out which timezone the client should use for displaying an event’s start and/or end times.
yelp_business_id
string
The ID used to pull information about this location/venue from the Yelp API.
directions
string
A general guide and/or tips on how a parent can find and/or get to a location. Note that activity_location
or location_series
directions, i.e. directions specific to a particular event, should take precedence over these general location
directions.
about
string
Optional background info on a particular venue, e.g. “This stadium was first used for dog racing back in the mid 19th centry – but is now a polo field!”
verified
boolean
Whether Galore has verified the location.
bookmark
object
The user’s Bookmark for this object. Because of server-side uniqueness constraints, there should only ever be one bookmark per user.
activities
array
10 upcoming Activity objects at this location.
series
array
10 upcoming Series objects at this location.
Get locations
GET /locations
{
"locations": [],
"meta": {
"total": 144,
"page": 1,
"last_page": false
}
}
This endpoint returns a list of locations with organization information for the purposes of showing all locations and organizations within a specific bounding box or location radius.
Arguments
ne_lat | ne_lng | sw_lat | sw_lng
float
Latitude coordinates for the location search bounding box.
Get a location
GET /locations/{ID}
Sample request
GET /locations/4438
{
"location": {
"id": 4438,
"line1": null,
"line2": null,
"city": "Lakewood",
"state": "Colorado",
"postal": "80226",
"phone": null,
"longitude": -105.0849687,
"latitude": 39.7101457,
"timezone": "Mountain Time (US & Canada)",
"neighborhood": null,
"name": null,
"directions": null,
"yelp_business_id": null,
"url": null,
"photos": [],
"activities": [],
"series": []
},
"meta": {
"total": 10,
"page": 1,
"last_page": false
}
}
Arguments
id Required
integer
The integer ID of the location to retrieve.
Errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found” | The requested location could not be found |
Location events
By including a page
parameter, the client can fetch a location’s activities and series. Note that the activities
and series
returned as part of the initial fetch of location details constitutes page 1 and will return 30 total objects.
GET /locations/{ID}?page=
{
"location": {
"activities": [],
"series": []
},
"meta": {
"total": 10,
"page": 1,
"last_page": false
}
}
Activity location
The bridge object connecting an activity with a specific location on Galore. Note that sessions (i.e. dates within a series) will typically point to the location listed for the series.
Attributes
id required
integer
The unique integer ID for this object.
hidden
boolean
Indicates whether this location should be hidden to users who don’t already have a reservation. If hidden, the app should only show a venue name
and/or neighborhood
and not show a pin on the map corresponding to the location’s actual coordinates or an actual address.
directions
string
Human readable string containing directions to this particular event.
location
Object
The location object
Location series
The bridge object connecting a series with a specific location on Galore.
Attributes
id required
integer
The unique integer ID for this object.
hidden
boolean
Indicates whether this location should be hidden to users who don’t already have a reservation. If hidden, the app should only show a venue name
and/or neighborhood
and not show a pin on the map corresponding to the location’s actual coordinates or an actual address.
directions
string
Human readable string containing directions to this particular event.
location
Object
The location object
Photos
Photo object
Attributes
id
integer
The integer ID of the object-specific photo (e.g. the activity_photo, series_photo, organization_photo, etc.)
uuid
text
An obfuscated unique ID for this photo object.
created
integer Unix timestamp
The date the photo was uploaded to Galore
caption
string
A caption describing the contents of the photo. Not always present.
image_file_name
string
The photo object’s virtual file name.
thumb_url
string
URL for thumbnail size, at least 260 in height/width
small_url
string
URL for small size, at least 750 in width
medium_url
string
URL for medium size, at least 1080 in width
large_url
string
URL for the large size, at least 1440 in width
position
integer
An integer indicating the photo’s sort order. Starts at 0
; no need to sort if null
.
photo
Photo
Returns the photo ID wrapped inside an photo object
series
Series
Returns the series ID wrapped inside an series object. Note that this will be a stubbed series object, with id
, name
and provider
keys (if applicable).
activity
Activity
Returns the activity ID wrapped inside an activity object. Note that this will be a stubbed activity object, with id
, name
and provider
keys (if applicable).
organization
Object
Returns the organization ID wrapped inside an organization object
instructor
Object
Returns the instructor ID wrapped inside an instructor object
User photos
GET /users/photos
Example response
{
"photos": [
{
"id": 43,
"uuid": "2d931510-d99f-494a-8c67-87feb05e1594",
"position": 0,
"created": 1480227256,
"caption": "This is a lion. Hear me roar!",
"thumb_url": "https://s3.amazonaws.com/galore-dev/image_184_thumb.jpg?1480310565",
"small_url": "https://s3.amazonaws.com/galore-dev/image_184_small.jpg?1480310565",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_184_medium.jpg?1480310565",
"large_url": "https://s3.amazonaws.com/galore-dev/image_184_large.jpg?1480310565",
"image_file_name": "lions.png",
"series": {
"id": 336,
"title": "Another creation test",
"provider": {
"id": 12,
"name": "Demo Galore"
}
},
"user": null,
"organization": null,
"location": null
}
],
"meta": {
"total": 10,
"page": 1,
"last_page": true
}
}
Booking
Reservation booking
GET /users/booking?activity_id={ACTIVITY ID}
GET /users/booking?series_id={SERIES ID}
Example response
{
"eligible": true,
"eligible_error_message": null,
"user": {
"id": 1,
"email": "max.hainesstiles@gmail.com",
"phone": "5555555554",
"cards": [],
"bank_accounts": [],
"caregivers": [],
"paid_reservation_count": 2,
"free_reservation_count": 1,
"purchase_count": 0,
"kids": [
{
"id": 19,
"first_name": "Arabica",
"gender": null,
"birthdate": 1325419200,
"eligible": true,
"eligible_error_message": null,
"users": [
{
"id": 1
}
]
}
],
"user_credits": [
{
"id": 89,
"amount_integer": 500,
"amount_used_integer": 500,
"percent": "0.0",
"percent_uses": 0,
"percent_uses_redeemed": 0,
"currency": "USD",
"used": true,
"created": 1472448143,
"updated": 1472608647,
"name": "Test",
"code": "Test",
"eligible_types": ["date_night", "camp"],
"user": {
"id": 1
},
"provider": {
"id": 1,
"name": "Demo Galore"
}
}
]
},
"activity_reservation": {
"id": 3225,
"canceled": false,
"reviewed": null,
"spots": 3,
"message": null,
"currency": "USD",
"charge_amount": "0.0",
"charge_amount_integer": 0,
"extras_amount": "0.0",
"extras_amount_integer": 0,
"discount_amount_integer": 0,
"credit_amount_integer": 0,
"package_credits_applied": 3,
"created": 1490911137,
"updated": 1490911137,
"user": {
"id": 296
},
"kids": [],
"reservation_extras": [],
"caregivers": []
},
"series_reservation": {
"id": 292,
"user": {
"id": 1
},
"canceled": false,
"charge_amount_integer": 2000,
"extras_amount_integer": 0,
"currency": "USD",
"reviewed": null,
"purchasable": true,
"created": 1470626366,
"updated": 1470626366,
"kids": [],
"reservation_extras": [],
"caregivers": [],
"spots": 2
},
"activity": {
"id": 82591,
"title": "Dance Class",
"top_line_price_integer": 5000,
"price_integer": 0,
"top_line_deductions": [
{
"type": "trial",
"name": "Free trial",
"deduction_amount_integer": 5000
}
],
"package_credits": [
{
"title": "Yoga 5 Pack",
"remaining_uses": 2
}
],
"only_purchasable_as_trial": false,
"user_eligible_for_trial": true,
"currency": "USD",
"discounts": [
{
"id": 816,
"name": "sibling discount",
"percent": "5.0",
"amount_integer": null,
"currency": "USD"
}
],
"trial": {
"id": 38,
"name": "Free trial",
"active": true,
"price_integer": 0,
"currency": "USD"
}
},
"series": {
"id": 390,
"title": "Dance Class",
"top_line_deductions": [],
"top_line_price_integer": 10000,
"price_integer": 10000,
"top_line_ticket_price_integer": 0,
"ticket_price_integer": 0,
"currency": "USD",
"discounts": [
{
"id": 816,
"name": "sibling discount",
"percent": "5.0",
"amount_integer": null,
"currency": "USD"
}
]
}
}
This endpoint is designed for refreshing the client before entering the purchase flow for an activity or series. The response will include updated kid, caregiver, payment method, and credit/promo information. It’s advisable to grab booking info for both the activity and series, if applicable – it’s possible that a user may have reservations for both.
The client must pass the user’s authentication_token
in the request header, otherwise the API will respond with a 403
.
Parameters
activity_id | series_id
integer
The ID for either the activity or series in question
Response attributes
user
integer
The user’s integer-based ID
string
Email as a string. What else?
phone
string
The user’s current phone number (must be confirmed)
eligible
boolean
This attribute is present on the top level as well as each kid
object. On the top level, eligible
denotes whether the user or any kids are able to reserve this event or purchase this item. On the kid object, eligible
denotes whether or not the specific kid can reserve the event.
eligible_error_message
string
This attribute is also present on the top level as well as each kid
object. If eligible
is false
, this will be a user-friendly, printable error string explaining why the user is not eligible to reserve/purchase this object. If eligible
is set to true
, this field will either be null
or will not be present.
user
User object
Returns a user object, including cards
, caregivers
, kids
, and user_credits
.
series_reservation
Series reservation
Returns a reservation object for this series, if present.
activity_reservation
Activity reservation
Returns a reservation object for this activity, if present.
activity
Abbreviated activity object
An abbreviated activity object will be returned with the up-to-date pricing info for the signed in user. This will include any trials or discounts that may be associated with the activity.
top_line_price_integer
: The initial price of the activity before any discounts or trials are applied.price_integer
: The per-ticket price that should be used during the reservation charge calculation. If desired, mobile clients can display thetop_line_deductions
to show the user how they’re saving money.top_line_deductions
: Array of deduction objects withtype
,name
, anddeduction_amount_integer
that specify how thetop_line_price_integer
was reduced to theprice_integer
. The sum of theamount_integers
in thetop_line_deductions
should equal the different between thetop_line_price_integer
and theprice_integer
. Currently, the type will either betrial
ordiscount
.package_credits
: Array ofpackage_credit
objects withtitle
andremaining_uses
. Eachremaining_use
can be applied to one spot in the reservation. If the user reserves more spots than theremaining_uses
, then theprice_integer
should apply for each additional spot.trial
: The trial object will only be present if there is indeed an active trial on the activity.only_purchasable_as_trial
: Boolean. Atrue
value means this event can only be reserved if theuser_eligible_for_trial
istrue
(i.e. if the user has not made a reservation with this provider before).user_eligible_for_trial
: A boolean describing whether or not the user is eligible for the trial. This attribute only needs to be checked ifonly_purchasable_as_trial
istrue
.
If a trial
object is present, the client should check the user_eligible_for_trial
and only_purchasable_as_trial
attributes. If only_purchasable_as_trial == true
and user_eligible_for_trial == false
then the reservation will fail since this event can only be reserved by new customers of this provider. In that case, the client should take action to redirect the user to other activities from the provider (or some other helpful action). That is the only trial-related situation that requires active action. In other cases, the top_line_deductions
and price_integer
will contain the information needed to calculate the charge.
series
Abbreviated series object
An abbreviated series object will be returned with the up-to-date pricing info for the signed in user. This will include any discounts that may be associated with the activity.
In the reservation workflow, mobile clients should use the price_integer
as the per-ticket price. If desired, mobile clients can display the top_line_deductions
to show the user how they’re saving money.
The top_line_deductions
will be an array of objects that specify how the top_line_price
was reduced to the price_integer
. The sum of the deduction_amount_integers
in the top_line_deductions
should equal the different between the top_line_price_integer
and the price_integer
. The only type
of deduction for series is discount
.
Purchase booking
GET /users/booking?membership_id={MEMBERSHIP ID}
GET /users/booking?product_id={PRODUCT ID}
GET /users/booking?event_package_id={EVENT PACKAGE ID}
Example response
{
"user": {
"id": 1,
"email": "max.hainesstiles@gmail.com",
"phone": "5555555554",
"cards": [],
"bank_accounts": [],
"caregivers": [],
"paid_reservation_count": 2,
"free_reservation_count": 1,
"purchase_count": 0,
"kids": [
{
"id": 19,
"first_name": "Arabica",
"gender": null,
"birthdate": 1325419200,
"users": [
{
"id": 1
}
]
}
],
"user_credits": [
{
"id": 89,
"amount_integer": 500,
"amount_used_integer": 500,
"percent": "0.0",
"percent_uses": 0,
"percent_uses_redeemed": 0,
"currency": "USD",
"used": true,
"created": 1472448143,
"updated": 1472608647,
"name": "Test",
"code": "Test",
"eligible_types": ["purchase"],
"user": {
"id": 1
},
"provider": {
"id": 1,
"name": "Demo Galore"
}
}
]
},
"product_purchase": {
"id": 181,
"purchase_count": 2,
"created": 1510177937,
"charge_amount_integer": 2000,
"extras_amount_integer": 0,
"discount_amount_integer": 0,
"credit_amount_integer": 0,
"completed_form_fields": [
{
"id": 288,
"assigned_form_field_id": 195,
"kid_id": null,
"attendee": 0,
"value": true,
"value_type": "boolean"
}
]
},
"product": {
"id": 20,
"title": "Questions T Shirt",
"updated": 1547679424,
"unique_product_id": "PRODUCT_20",
"price_integer": 1000,
"currency": "USD",
"assigned_form_fields": [
{
"id": 195,
"required": false,
"prompt": "Choose your single favorite skydiving manufacturer. ",
"field_type": "single_select",
"each_attendee": true,
"options": [
{
"text": "Sun Path Products",
"id": 10
},
{
"text": "Phoenix Fly",
"id": 11
},
{
"text": "Squirrel",
"id": 12
}
]
},
{
"id": 195,
"required": false,
"prompt": "Choose \"Yes\" or \"No\"",
"field_type": "boolean",
"each_attendee": true
}
]
}
}
This endpoint is designed for refreshing the client before entering the purchase flow for a membership, product, event package. The response will include updated kid, payment method, and credit/promo information.
The client must pass the user’s authentication_token
in the request header, otherwise the API will respond with a 403
.
Parameters
membership_id | product_id | event_package_id
integer
The ID for the membership, product or event_package in question
Response attributes
user
User object
Returns a user object, including cards
, caregivers
, kids
, and user_credits
.
membership_purchase
Purchase object
Returns an abbreviated purchase object for this membership, if present.
product_purchase
Purchase object
Returns an abbreviated purchase object for this product, if present.
event_package_purchase
Purchase object
Returns an abbreviated purchase object for this event package, if present.
membership
Membership object
An abbreviated membership object.
product
Product object
An abbreviated product object.
event_package
Event package object
An abbreviated event_package object.
Reservations
A reservation can represent two things:
- The purchase of one or more spots at an event whose ticketing is being wholly or partially managed by Galore.
- An RSVP for an event that is listed on the platform but whose ticketing is not managed by Galore.
Any activity
or series
that is listed as purchasable = true
is being managed by Galore – a parent will typically pay to reserve their spot, and thus a purchase flow is required for this type of event. Any activity
or series
that is listed as purchasable = false
is not being managed by Galore – a parent is actually creating a fake “RSVP” for this type of event and thus a purchase flow is not required.
Note that purchasable = false
events will typically have a null
value for both the price
and spots
attributes, thus most RSVP events are free. However, not all free events are RSVP – a purchasable = true
event that is free will be ticketed through Galore.
Note that creating paid reservations and creating RSVPs are done the same way (described in greater detail below), and that the client is not responsible for indicating what type of reservation he or she is creating or updating. The client is responsible, however, for determining how to display activities or series on the device, e.g. deciding whether to show a “Reserve” button or an “RSVP” button.
Reservation object
Attributes
id
integer
The integer ID of the resevation object
created
integer Unix timestamp
The date this reservation was created
updated
integer Unix timestamp
The last date this reservation was updated. Will be the same as created
if it’s never been updated.
reviewed
boolean
Whether the reservation has been reviewed by the user. Returns false
if the user decided to skip this review (e.g. because they did not attend the event or because they simply don’t believe in the value of user reviews), true
if the user has created a review, or null
if the user has not reviewed the event.
canceled
boolean
Indicates whether the reservation was canceled. A canceled reservation should be removed from the user’s calendar, but it may still be advisable to leave the reservation in the user’s reservations list in light gray and/or with a line through the text.
purchasable
boolean
Indicates whether the series or all of the underlying activities are purchasable (i.e. whether they are ticketed through Galore).
attended
boolean
Whether the parent/kid attended the event referenced by the reservation. This attribute will be null
for future reservations (and, unfortunately, null
for past reservations where a provider has not interacted with their attendance page), but may be true
or false
for past reservations (and can therefore be used by the client to display whether a parent/kid has attended past events with a provider/organization/instructor).
message
string
A custom message from the customer to the organizer detailing any special concerns or requests (e.g. “We’ll be late for the Monday class but on time for all the others!”).
currency
string
The ISO 4217 currency string for price_integer
, e.g. 'USD’
top_line_integer
integer
The subtotal for the spots in the reservation. This does not include any amount paid for extras, nor does it include discounts. Two spots for a $20 activity would be reported with a top_line_integer
of 4000
or $40.
extras_amount_integer
integer
The amount the user spent on extras for this reservation, e.g. 2000
on aftercare (equals $20.00
).
charge_amount_integer
integer
How much the user was originally charged for this reservation (i.e. the amount we charged their credit card – not the ticket price). Sent as integer, e.g. 1000
equals $10.00
.
remaining_charge_amount_integer
integer
The remainder that has still been charged to the users credit card. This will only be different from the charge_amount_integer
if a refund has taken place.
discount_amount_integer
integer
The amount or provider-specific credit and/or other discounts used on this reservation, e.g. 2000
might signify a $20.00
promo code.
refunded_amount_integer
integer
The amount that has been refunded to the users credit card.
credit_amount_integer
integer
The amount of Galore credit (not provider credit) used on this reservation, e.g. 2000
equals $20.00
.
credit_refunded_amount_integer
integer
The amount of Galore credit (not provider credit) that has been refunded.
package_credits_applied
integer - conditional
If present, the quantity of package_credits
that were applied to this reservation. If not present, that means that package_credits
were not used for this reservation.
spots
integer
The total number of combined unique kids and tickets on this reservation.
ticket_spots
integer
The number of tickets (e.g. for grown-ups) on this reservation.
paid_reservation_count
integer
The total number of paid reservations the user has made across platforms. This parameter will only be included in the POST /reservations
or PATCH /reservations/{ID}
calls.
free_reservation_count
integer
The total number of free reservations (e.g. RSVPs, free trials, etc.) the user has made across platforms. This parameter will only be included in the POST /reservations
or PATCH /reservations/{ID}
calls.
purchase_count
integer
The number products the user has purchased. This parameter will only be included in the POST /reservations
or PATCH /reservations/{ID}
calls.
provider_count
integer
The unique number of providers this user has purchased from. This parameter will only be included in the POST /reservations
or PATCH /reservations/{ID}
calls.
lifetime_spend
float
The amount this user has spent over their lifetime with Galore. This parameter will only be included in the POST /reservations
or PATCH /reservations/{ID}
calls.
user
User
Returns the user ID wrapped inside a user object
series
series
(Optional) - if populated, this represents the series for which the reservation was made.
activities
array of activity objects
Returns an array of JSON-represented activity objects. * For a series reservation, this represents all of the activities reserved as part of a series. * Alternatively, this could be a collection of multiple drop-in activities within a series that a parent reserved during a single purchase workflow. * Finally, this will be a single-element array if the reservation was made for a stand-alone activity
session_count
integer
The number of sessions in the series, if applicable.
kids
array of kid object
Returns an array of JSON-represented kid objects that were attached to this reservation. Note that this is
caregivers
array of caregiver objects
Returns an array of JSON-represented caregiver objects that were attached to this reservation.
reservation_extras
array of reservation extra objects
Returns an array of JSON-represented reservation extras objects that were attached to this reservation.
Create a reservation
POST /reservations
Sample Series Reservation request
{
"reservation": {
"kid_ids": [175],
"series_id": 81154,
"caregiver_ids":[50],
"reservation_extras":[
{
"extra_id": 718,
"purchase_count": 1,
"kid_id":175
}
],
"completed_form_fields":[
{
"kid_id": 175,
"assigned_form_field_id": 123,
"value": "This is an answer"
},
{
"kid_id": 175,
"assigned_form_field_id": 456,
"value": [22, 33]
}
]
},
"card_id": "{CARD_ID}",
"provider_id": 2,
"waitlist_token": "{WAITLIST_TOKEN}"
}
Sample Activity Reservation request
{
"reservation": {
"caregiver_ids":[50],
"activities":[
{
"activity_id": 33442,
"kid_ids": [175],
"until": "2019-11-01"
}
],
"reservation_extras":[
{
"extra_id": 718,
"purchase_count": 1,
"kid_id":175
}
],
"completed_form_fields":[
{
"kid_id": 175,
"assigned_form_field_id": 123,
"value": "This is an answer"
},
{
"kid_id": 175,
"assigned_form_field_id": 456,
"value": [22, 33]
}
]
},
"card_id": "{CARD_ID}"
}
Sample RSVP request
{
"reservation": {
"activities":[
{
"activity_id": 33442
}
]
}
}
This endpoint is used to create reservations for both purchasable = true
and purchasable = false
events.
Somewhat confusingly, we call the former a “Reservation” while we call the latter an “RSVP” – even though they’re both, technically, Reservation
objects.
Note that for both POST /reservations
and PATCH /reservations/{ID}
the client can pass a provider_id
back to the server. The provider_id
is the STORED_PROVIDER_ID
that was read/fetched from the last deep link used to open the app. If the client didn’t use a deep link to enter the app, then the client should not pass any provider_id
value back to the server. On successful submission of a reservation create/update request, the client should clear the STORED_PROVIDER_ID
; in other words, the ID can be stored on the device for an infinite period of time (so long as the user does not use any other branch links), but should be erased after the next successful reservation request.
Attributes
activities | series_id required
integer
Either an array of activity objects or a series_id
is required to make a reservation.
If an until
parameter is present in the activity object (in YYYY-MM-DD
format) then the server will try to make recurring reservations on that specific day-of-week and time until the date specified. The reservation response will then return {"meta": {"total_reservations": 4}}
with the total number of reservations created.
card_id
integer
An optional integer ID for the card the user wants to charge (if different from the user’s primary source). If no card_id
or bank_account_id
is provided, the API will use the user’s primary payment source. If the user does not have a primary card, the API will respond with the appropriate reservation error.
bank_account_id
integer
An optional integer ID for the bank account the user wants to charge (if different from the user’s primary source). If no bank_account_id
or card_id
is provided, the API will use the user’s primary payment source. If the user does not have a primary source, the API will respond with the appropriate reservation error.
kid_ids
array
An array of kid IDs (integers) representing which kids will be attending the camp or series. This attribute is only required at the top level for a series reservation. For an activity reservation, the kid_ids
should be included in each activity object. This attribute is required if creating a reservation for a purchasable = true
event but not required for an RSVP.
caregiver_ids
array
An array of caregivers IDs (integers) indicating which caregivers will be present or provider care during/at the reservation. Note that this attribute is required if the event is listed as caregiver = true
, but is not required for drop-off events.
reservation_extras
array
An array of reservation extras specific to this reservation.
provider_id
integer
An optional argument used to pass a stored provider_id
so the server can determine transaction commission. This provider_id
would have been passed to the client as part of a deep link from a provider’s connect subdomain. Note that the client should erase the stored provider_id
if the server responds successfully to this request, since each provider_id
is “one-time use”.
completed_form_fields
array
An array of completed_form_field objects.
waitlist_token
string
Pass a waitlist token with the request in order to allow a user to bypass spot validation for sold_out
events. If valid, the reservation request will succeed even for sold out events. See the activity and series endpoints for more information.
Reservations for grown-ups
POST /reservations
Sample Activity Reservation request
{
"reservation": {
"activities":[
{
"activity_id": 33442,
"ticket_spots": 1
}
],
"reservation_extras":[
{
"extra_id": 718,
"purchase_count": 1
}
]
},
"card_id": "{CARD_ID}"
}
Sample Series Reservation request
{
"reservation": {
"series_id": 81154,
"reservation_extras":[
{
"extra_id": 718,
"purchase_count": 1
}
],
"ticket_spots": 1
},
"card_id": "{CARD_ID}"
}
Note that the general structure is the same as with for_kids
reservations except instead of referencing kid_ids
, the client should pass a ticket_spots
field representing the unique number of adults that should be attached to the reservation.
Update a reservation
PATCH /reservations/{ID}
Sample series reservation update request
{
"reservation": {
"kid_ids": [25, 175],
"series_id": 81154,
"caregiver_ids":[50],
"reservation_extras":[
{
"extra_id": 718,
"purchase_count": 2,
"kid_id":25
},
{
"extra_id": 718,
"purchase_count": 1,
"kid_id":175
}
]
},
"bank_account_id": "{BANK_ACCOUNT_ID}"
}
Sample activities reservation update request
{
"reservation": {
"activities":[
{
"activity_id": 33442,
"kid_ids": [175, 25]
}
],
"caregiver_ids":[50],
"reservation_extras":[
{
"extra_id": 718,
"purchase_count": 2,
"kid_id":25
},
{
"extra_id": 718,
"purchase_count": 1,
"kid_id":175
}
]
}
}
Note that the client should pass all the attributes they expect to see for the end state of the reservation, i.e. not just the new kid IDs, caregiver IDs, etc.
Attributes
The same attributes and structure as the POST /reservations
endpoint for both kid and grown-up events. See above.
Reservation errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | The parameters were incorrect or not properly assembled |
403 |
“invalid_auth_token” | We couldn’t find a user for that authentication_token |
404 |
“not_found” | We couldn’t find the activity, series, or reservation requested |
422 |
“caregiver_required” | The user needs to select one or more caregivers for this reservation |
422 |
“sold_out” | The event is sold out |
422 |
“age_range” | “Sorry, but you won’t be able to reserve a spot for {kid_names} because they’re outside the age range for this event.” |
422 |
“not_trial_eligible” | “Sorry, this can only be reserved if you are a new customer to {provider}” |
422 |
“not_reservable” | “You cannot reserve {class} without a valid membership or class pack” |
422 |
“no_membership_for_kids” | “You cannot reserve {class} for {kid_names} without a valid membership or class pack” |
422 |
“not_enough_credits” | “You cannot reserve {class} because you only have {credit_count} to cover {spots}” |
422 |
“membership_not_usable” | “You cannot reserve {class} because you have already used the {allowed_uses} for the {membership_term)” |
422 |
“charge_failed” | There was an issue charging for the reservation |
422 |
“not_enough_spots” | The event has availability, but not enough to accomodate the user’s request. This error will include an additional available_spots key with the number of available spots left. |
422 |
“missing_required_questions” | Required questions either weren’t answered or weren’t passed by the client |
422 |
“validation_failed” | There was an error processing the reservation (one not covered by the other error codes) |
Cancel a reservation
DELETE /reservations/{ID}/cancel
Example response
{
"success": true
}
A user can cancel any non-purchasable reservation, which should remove the event from both the user’s list of active reservations as well as from their device/personal calendar. As of October 2017, only non-purchasable reservations can be canceled through the app.
Reservation cancelation errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden” | The user attempted to cancel a reservation that doesn’t belong to them |
422 |
“cancelation_failed” | The user can’t cancel this reservation through the API |
All reservations
GET /users/reservations
Example response
{
"reservations": [
{
"id": 316,
"canceled": false,
"attended": null,
"reviewed": false,
"purchasable": true,
"created": 1471878828,
"updated": 1471878828,
"user": {
"id": 1
},
"kids": [],
"reservation_extras": [],
"caregivers": [],
"activities": [
{
"id": 5129,
"title": "Duffel Repeat",
"price_integer": 2500,
"currency": "USD",
"start_time": 1472072400,
"end_time": 1472076000,
"provider": {
"id": 1,
"name": "Demo Galore"
},
"activity_location": {
"location": { }
}
}
],
"series": null
}
],
"meta": {
"total": 154,
"page": 3,
"last_page": false
}
}
Use this endpoint to refresh or reload a user’s reservations list. The server will return 30 future reservations by default, but past
and/or page
attributes can be used to load past reservations or to enable pagination. The server identifies the user to retrieve reservations for from the authentication_token
in the header of the request.
Optional Arguments
past
boolean
A flag for whether or not to return past reservations.
page
integer
1
by default. Use this argument to load subsequent pages.
Purchases
Purchase object
The purchase object represents a transaction in which a user buys (or uses credit for) an object available through Galore – an Event Package, Product, or Membership. A purchase is the “non-event equivalent” of a reservation, meaning it is a entity that represents a user transaction.
Attributes
id
integer
You get it by now.
purchase_count
integer
The quantity of product
, event_packages
, or memberships
that the user purchased in this transaction. This attribute will always be present.
created
integer
An integer Unix timestamp indicating when the purchase was made.
charge_amount_integer
integer
An integer representation of how much was paid. For example, 1000
equals $10.
kids
Kid
An array of Kid objects. This array will only be present for memberships
that are for_kids
.
product
Product
A Product object.
membership
Membership
A Membership object.
event_package
Event Package
An abbreviated Event Package object. The event_package
returned here will only have the activity_count
, not all of the activities. Use the /package_credits
endpoint to retrieve data on all of the activities.
Create a purchase
POST /purchases
Sample product purchase request
{
"purchase": {
"purchase_count": 1,
"product_id": 34,
"defer_payment": true
}
}
Sample event package purchase request
{
"purchase": {
"event_package_id": 33,
"purchase_count": 1
}
}
Sample kids membership purchase request
{
"purchase": {
"kid_ids": [123, 456],
"membership_id": 789
}
}
Successful response
{
"purchases": [
{
"id": 93,
"purchase_count": 1,
"created": 1491328838,
"charge_amount_integer": 16000,
"event_package": {
"id": 19,
"title": "Yoga 5-Pack",
"about": "Any 5 yoga classes - you pick!",
"updated": 1547679424,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"price_integer": 20000,
"currency": "USD",
"activity_count": 30,
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
}
}
}
]
}
Creates a new purchase object
purchase_count
integer
The count of products that the user is purchasing for Product
, EventPackages
, or not-for-kids Memberships
.
defer_payment
boolean
Only valid for Membership
purchases with pro_rata: true
. If defer_payment: true
, we will defer payment until the first of next month. The user won’t be charged anything at the time of purchase. If false
, the user will be charged the pro-rata price based on the number of days elapsed in the current month.
kid_ids
array
An array of kid ids
. This is only required for Memberships with for_kids: true
.
completed_form_fields
array
An array of completed form field objects. Only required if the membership, product, or event package has assigned form fields.
Get user purchases
GET /users/purchases
Successful response
{
"purchases": [
{
"id": 93,
"purchase_count": 1,
"created": 1491328838,
"charge_amount_integer": 16000,
"event_package": {
"id": 19,
"title": "Yoga 5-Pack",
"about": "Any 5 yoga classes - you pick!",
"updated": 1547679424,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"price_integer": 20000,
"currency": "USD",
"activity_count": 30,
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
}
}
}
]
}
Retrieves all purchases that the user has made
Get a single purchase
GET /purchases/93
Successful response
{
"purchase": {
"id": 93,
"purchase_count": 1,
"created": 1491328838,
"charge_amount_integer": 16000,
"event_package": {
"id": 19,
"title": "Yoga 5-Pack",
"about": "Any 5 yoga classes - you pick!",
"updated": 1547679424,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"price_integer": 20000,
"currency": "USD",
"activity_count": 30,
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
}
}
}
}
Kids
Kid object
Attributes
id
integer
The unique integer ID for this kid – because aren’t all kids unique?
first_name
string
e.g. “Li'l Timmy”.
last_name
string
This will typically be the last name of the parent. But, technically speaking, it might be something different. Go figure.
gender
integer
1 for boy, 2 for girl
allergies
string
Allergies listed for the kid, e.g. “Peanuts and shellfish”
notes
string
Any special notes or free text entry that a parent or caregiver wants to enter for their kid.
birthdate_string
string
A string in “yyyy-mm-dd” format, e.g. “2016-09-06”
schools
array
An array of school objects.
You can add or update schools by either passing a school_ids
array or by passing a schools
array that includes JSON objects with a name
parameter (examples below). Passing an empty school_ids
or schools
array will indicate that the child is “not in school”.
users
array
An array of user objects representing the kid object’s parent objects.
Create a kid
POST /kids
Example request
{
"kid": {
"first_name": "Butter",
"last_name": "Knife",
"gender": 1,
"allergies": "Butter",
"birthdate": "2014-09-09",
"schools": [
{
"name": "New school name"
}
]
}
}
Example response
{
"kid": {
"first_name": "Butter",
"last_name": "Knife",
"gender": 1,
"allergies": "Butter",
"notes": null,
"birthdate_string": "2014-09-09",
"schools": [
{
"id": 285,
"name": "New school name",
"about": null,
"start_grade": -1,
"end_grade": 6,
"locations": []
}
],
"users":[
{
"id": 1
}
]
}
}
Kid errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“invalid_auth_token” | We couldn’t find a user for that authentication_token |
422 |
“validation_failed” | There was an error saving the kid |
Parameters
first_name required
string
You’ll have to pass a first name – otherwise we won’t know who this kid is?!
last_name
string
Not required.
birthdate required
string
Required in order to figure out age eligibility for certain events (and to send out birthday cards).
schools | school_ids required
Array
You must pass an array of school
IDs (example below in the PATCH
section) or an array of JSON school objects with at least a name
(example to the right in the POST
section). You can pass an empty array, which will indicate to the API that the child is “not in school”.
Update a kid
PATCH /kids/{ID}
Example request
{
"kid": {
"first_name": "Jane",
"last_name": "Johnson",
"gender": 2,
"school_ids": [1]
}
}
This is how you… update a kid.
Remove a kid
DELETE /kids/{ID}
Sample response
{
"success": true
}
HTTP Code | Error Code | Description |
---|---|---|
403 |
“not_found” | The client tried to remove a kid that could not be found. |
403 |
“forbidden” | The client tried to remove a kid that did not belong to the user. |
403 |
“validation_failed” | There was an unknown error removing the kid. The error_message will have a description of the error. |
Caregivers
Caregiver object
Attributes
first_name and last_name
string
e.g. “John” and “Smith”.
email and phone
string
Duh.
relationship
string
A string describing the relationship of the caregiver to the user, e.g. “Nanny”, “Spouse”, etc.
user
User
Returns the user ID wrapped inside a user object
user_as_caregiver
User
If the caregiver is also a Galore user, this will be the ID of the user associated with that caregiver object (wrapped inside a user object). null
if the caregiver is not a Galore user.
created
integer
An integer Unix timestamp for when the caregiver was created.
birthdate
integer
An integer Unix timestamp representing the caregiver’s birthday.
gender
integer
1 indicates male, 2 indicates female
Create a caregiver
POST /caregivers
Example request
{
"caregiver": {
"first_name": "John",
"last_name": "John",
"email": "test@getgalore.com",
"phone": "5555555555"
}
}
Arguments
first_name required
string
e.g. “John”
last_name required
string
e.g. “Smith”
email required
string
e.g. “test@getgalore.com”
phone required
string
e.g. “5555555555”
Update a caregiver
PATCH /caregivers/{ID}
Example response
{
"caregiver": {
"id": 1,
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com",
"phone": null,
"gender": null,
"birthdate": null,
"user": {
"id": 1
},
"created": 1456528752,
"user_as_caregiver_id": 1
}
}
Arguments
first_name required
string
e.g. “John”
first_name required
string
e.g. “Smith”
email required
string
e.g. “test@getgalore.com”
phone required
string
e.g. “5555555555”
Remove a caregiver
DELETE /caregivers/{ID}
Sample response
{
"success": true
}
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden” | The client tried to remove a caregiver that did not belong to the user |
404 |
“not_found” | The client tried to remove a caregiver that could not be found |
422 |
“validation_failed” | There was an unknown error removing the caregiver. The error_message will have more info. |
Customers
Fetch all customers
GET /customers?
Example response
{
"page": 1,
"total": 1,
"last_page": true,
"customers": [
{
"id": 72,
"user_id": 87,
"notes": null,
"created": 1520109061,
"first_name": "Sample",
"last_name": "User 2",
"phone": "5555555556",
"email": "max+sample@getgalore.com",
"kids": [],
"caregivers": []
}
]
}
This endpoint is used when a client wants to see their full customers list and/or search for specific customers. Note the /customers
endpoint uses a parameters structure identical to that used on the web-based Connect dashboard.
Arguments
search
string
Free text search string used for filtering customers
page
integer
Integer used for incrementing pages in response
months
Array
Array of integers representing acceptable age range for events
per_page or count
integer
The number of search results the client would like returned for each page. Default is 30
.
account
string
The account status of the customer(s) group. Possible values include: "active"
,"unconfirmed"
, or "guest"
. Defaults to "all"
.
reviews
string
A string used to filter customers based on the type(s) of reviews they’ve givne. Possible values include "positive"
,"negative"
,"none"
. Defaults to "all"
Fetch single customer
GET /customers/{ID}
Example response
{
"customer": {
"id": 72,
"user_id": 87,
"notes": null,
"created": 1520109061,
"first_name": "Sample",
"last_name": "User 2",
"phone": "5555555556",
"email": "max+sample@getgalore.com",
"kids": [],
"caregivers": [],
"purchases": [],
"reservations": []
}
}
This endpoint is used when a client wants more information on a specific customer.
Update single customer
PATCH /customers/{ID}
Example request
{
"customer": {
"notes": "These are customer notes",
},
"user": {
"address": {
"line1": "123 Main St",
"city": "San Francisco",
"state": "CA",
"postal": "94110"
}
}
}
This endpoint is used when a client wants to update a specific customer’s notes.
Organizations
Get an organization
id required
integer
The integer ID of the organization to retrieve
sort_by_distance
boolean
Presence of this boolean will tell the server to sort an organization’s events by distance from the client (using the coordinates selected via the feed, which could be the user’s location or a location the user has chosen).
Organization object
GET /organizations/{ID}
{
"organization": {
"id": 71,
"provider": {
"id": 1,
"name": "Demo Galore"
},
"providers": [
{
"id": 1,
"name": "Demo Galore"
}
],
"name": "joe town",
"about": null,
"link": null,
"phone": null,
"email": null,
"in_business_since": null,
"activities": [],
"yelp_business_id": null,
"web_url": "https://getgalore-staging.com/o/1",
"created": 1471839431,
"updated": 1471839431,
"photos": [],
"socials": [],
"web_url": "https://getgalore-staging.com/o/1-it-s-yoga-kids",
"bookmark": {
"id": 2
},
"activities": [],
"series": []
},
"meta": {
"total": 10,
"page": 1,
"last_page": false
}
}
id
integer
The integer ID of the organization
name
string
The organization’s name
about
string
Text that describes the organization, usually about a paragraph.
link
string
The organization’s public facing external (i.e. not Galore) URL.
in_business_since
string
When the organization was founded, typically given as a human readable string in “Month, 'Year” format.
yelp_business_id
string
The ID used to pull information about this organization from the Yelp API.
web_url
string
The URL for accessing this organization on Galore web. Used for creating deep links.
slug
string
Parameterized version of an organization’s name, e.g. for “Little Artistas” the slug would be “little-artistas”. Useful for constructing a url/path for this resource.
providers
array
An array of provider objects that belong to this organization.
photos
array
An array of Photo objects.
socials
array
An array of Social objects.
bookmark
object
The user’s Bookmark for this object. Because of server-side uniqueness constraints, there should only ever be one bookmark per user.
activities
array
An array of future Activity objects, none of which are canceled or invisible.
series
array
An array of future Series objects, none of which are canceled or invisible.
Organization events
By including a page
parameter, the client can fetch an organization’s activities and series. Note that the activities
and series
returned as part of the initial fetch of organization details constitutes page 1 and will return 30 total objects.
GET /organizations/{ID}?page=
{
"organization": {
"activities": [],
"series": []
},
"meta": {
"total": 10,
"page": 1,
"last_page": false
}
}
Instructors
Get an instructor
id required
integer
The integer ID of the instructor to retrieve
sort_by_distance
boolean
Presence of this boolean will tell the server to sort an instructor’s events by distance from the client (using the coordinates selected via the feed, which could be the user’s location or a location the user has chosen).
Instructor object
GET /instructors/{ID}
{
"instructor": {
"id": 95,
"first_name": "Max",
"last_name": "Stiles",
"phone": null,
"email": "max@getgalore.com",
"approved": false,
"reviewed": false,
"about": "A little about this idiot",
"link": null,
"zip": null,
"in_business_since": null,
"web_url": "https://getgalore-staging.com/i/1-max-stiles",
"socials": [],
"locations": [],
"organizations": [],
"photos": [],
"bookmark": null,
"provider": {
"id": 1,
"name": "Demo Galore"
},
"activities": [],
"series": []
},
"meta": {
"total": 10,
"page": 1,
"last_page": false
}
}
id
integer
The integer ID of the instructor.
first_name | last_name
string
The instructor’s name.
phone
string
The best number to reach the instructor for questions/comments/concerns.
string
The instructor’s contact email address
about
string
Text that describes the instructor, i.e. a short bio.
link
string
The instructors’s public facing external (i.e. not Galore) URL. Not required.
in_business_since
string
When the instructor started teaching/coaching/operating, typically given as a human readable string in “Month, 'Year” format.
web_url
string
The URL for accessing this instructor on Galore web. Used for creating deep links.
provider
Provider object
An instructor can have at most one provider.
photos
array
An array of Photo objects.
locations
array
The locations where this instructors teaches.
bookmark
object
The user’s Bookmark for this object. Because of server-side uniqueness constraints, there should only ever be one bookmark per user.
socials
array
An array of Social objects.
organizations
array
The Organizations that this instructor is affiliated with.
activities
array
An array of future Activity objects, none of which are canceled or invisible.
series
array
An array of future Series objects, none of which are canceled or invisible.
Instructor events
By including a page
parameter, the client can fetch an instructor’s activities and series.
GET /instructors/{ID}?page=
{
"instructor": {
"activities": [],
"series": []
},
"meta": {
"total": 10,
"page": 1,
"last_page": false
}
}
Credits/Promos
Credit object
A credit
is a synonym for promotional code (“promo”). A user_credit
is the object created when a user redeems a credit, in other words, it represents money that the user can spend on Galore. A credit
, and thus user_credits
, can be specific to a provider or good to spend anywhere on the platform. A credit can either be given to a user by a provider or admin, or redeemed by way of a promo code.
Note that promos can only be redeemed once per use – if a user tries to receive the same promo more than once, they’ll get a 403
with an "error": "Promo already used"
JSON body.
Redeem a promo
POST /user_credits
Example request
{
"name": "FREE_GALORE",
"device_identifer": "{USER DEVICE ID}",
"provider_id": 1093
}
Arguments
name required
string
The name of the promo, e.g. “FREE_GALORE”.
device_identifier
string
A unique device identifier used to ensure that users can’t redeem the same promo more than once.
provider_id
integer or string
The integer or string ID of the provider you’re scoping promos from. If no provider_id
value is passed, we’ll query from the global pool of promos
Redemption errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | The parameters were incorrect or not properly assembled |
403 |
“invalid_auth_token” | We couldn’t find a user for that authentication_token |
404 |
“not_found” | We couldn’t find a promo to match the requested name |
422 |
“validation_failed” | The user has already redeemed this promo |
View all credits
GET /users/credits
Example response
{
"user_credits": [
{
"id": 68,
"created": 1466178338,
"updated": 1466183587,
"currency": "USD",
"percent": "0.0",
"percent_uses": 0,
"percent_uses_redeemed": 0,
"amount_integer": 1000,
"amount_used_integer": 500,
"user": {
"id": 1
},
"used": true,
"name": null,
"provider": null,
"eligible_types": ["date_night"]
}
]
}
id
integer
Unique integer ID for the credit
name
string
Human readable title string for the promo (e.g. “FREE_GALORE”). A null
means this object is a credit, not a promo.
percent
decimal string
If greater than 0, then that means this is a percent credit. For example, "10.0"
would mean a 10% discount
percent_uses
integer
The number of times this percent credit can be redeemed. For example, a value of 3
would mean this was a credit similar to “10% off of your next 3 reservations”
percent_uses_redeemed
integer
The number of times this percent credit has alredy been redeemed. One charge equals one redemption - the number of spots does not matter. If percent_uses_redeemed >= percent_uses
then this credit will not be applied.
amount_integer
integer
A string representing the monetary value (as an integer) of the credit/promo. E.g. 1000
equals $10.00
amount_used_integer
integer
A string representing the amount of value used (as an integer) for the credit/promo. E.g. 500
equals $5.00
currency
string
The ISO 4217 currency string for price_integer
, e.g. 'USD’
used
boolean
A somewhat unnecessary boolean indicating whether the credit/promo has been fully used.
expiration_date
integer
A unix timestamp after which the credit can no longer be used towards a reservation or purchase.
eligible_types
array
If present, this credit can only be applied to the types of events listed. Note - OR
logic applies, so a credit with date_night
and camp
set to true could be used for date night OR camp events. The following values may be included:
date_night
: This credit applies to date night events.camp
: This credit applies to camps.day_pass
: This credit applies to day passes.drop_in
: This credit applies to drop in activities (i.e. not full series).series
: This credit applies to full series (i.e. not drop-in activities).grown_ups
: This credit applies to “Grown ups” events.product
: This credit applies to products, e.g. memberships, class packs, and product.
Returns an array of user_credit
objects
Errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden” | The client did not pass an authentication_token |
403 |
“invalid_auth_token” | The client passed an invalid authentication_token |
Discounts
Discount object
A discount
is an object that will affect the price of an event or product. There are currently three types of discounts: additional_attendee
, early_bird
, and volume
.
additional_attendee
discounts should be applied to the price on all but the first kid. For example, given a $50 event that had a 10% sibling discount, the total cost for two kids would be $95 - the discount only applies for the second reservation.
early_bird
discounts have already been factored in to the event price_integer
. We still return early_bird
discounts in the event object so mobile clients can say “10% early bird discount applied”. Note - early bird discounts will only be returned if they are applicable now. Early bird discounts that ended in the past or start in the future will not be returned.
volume
discounts have also already been factored in to the event price_integer
. When a user makes any purchase for a provider we keep track of a 2 hour window for which volume discounts will apply. We will return volume discounts regardless of whether or not they currently apply. This way, mobile clients can say something along the lines of “10% volume discount if you purchase 2 or more events!”. Volume discounts have only been applied to the price_integer
if the active
attribute is true
.
Currently there is no discounts
endpoint. Discounts are returned as part of the response for an activity or series.
Example response
{
"activity": {
"id": 80957,
"title": "To publish on Sat (8/27)",
"price_integer": 5000,
"currency": "USD",
"discounts": [
{
"id": 1234,
"discount_type": "additional_attendee",
"name": "sibling discount",
"percent": "15.0",
"amount_integer": 0,
"currency": "USD",
"active": true
},
{
"id": 4567,
"discount_type": "early_bird",
"name": "early bird",
"percent": null,
"amount_integer": 1000,
"start_time": 54623412,
"end_time": 54628412,
"currency": "USD",
"active": true
},
{
"id": 7890,
"discount_type": "volume",
"name": "multi-purchase",
"percent": null,
"amount_integer": 500,
"currency": "USD",
"active": false
}
]
}
}
id
integer
Unique integer ID for the discount
discount_type
string
An identifier for the type of discount. Currently this is one of additional_attendee
, early_bird
, or volume
.
name
string
A human-readable string so that clients can easily print the name of the discount.
percent
decimal string
The value of the percentage discount in full percentage points. For example, "15.5"
is a 15.5% discount. A discount will either have a percent
or amount_integer
- not both.
amount_integer
integer
A string representing the monetary value (as an integer) of the discount. E.g. 1000
equals $10.00
. A discount will either have a percent
or amount_integer
- not both.
start_time
integer UNIX timestamp
The seconds since the UNIX epoch at the point where this discount started to be applicable.
end_time
integer UNIX timestamp
The seconds since the UNIX epoch for the point at which this discount will no longer be applicable.
active
boolean
Whether or not this discount should be applied to the next reservation or purchase.
currency
string
The ISO 4217 currency string for price_integer
, e.g. 'USD’
Deductions
Deduction object
A deduction
is an object that accompanies an event or product when there is an adjustment to the top_line_price_integer
or top_line_ticket_price_integer
of the event or product. Clients can use deduction
objects to tell customers how they are saving money. For example, “free trial for new customers” or “10% early bird discount applied”.
For example, a $100 activity might have a 10% early bird discount. The top_line_price_integer
would be 1000
and the price_integer
would be 900
. In this case the server will return a single Deduction
with the deduction_amount_integer
of 900
.
{
"type": "discount",
"name": "early_bird",
"deduction_amount_integer": 100
}
type
string
The type of object that led to the deduction - either discount
or trial
.
name
string
The name of the trial
or the discount_type
of the discount.
deduction_amount_integer
integer
The monetary value of this deduction that has already been applied to the top_line_price_integer
. E.g. 1000
equals $10.00
.
Trials
Trial object
A trial
is an object that represents a cheaper price for new customers of that provider. Trials currently only apply to activities.
Just because a trial
is returned with an Activity
does not mean that the trial.price
necessarily applies. Trial prices only apply when a customer books their first reservation with a given provider.
To determine the true price that will be charged, consult the Booking endpoint.
Currently there is no trials
endpoint. Trials are returned as part of an Activity.
Example response
{
"activity": {
"id": 80957,
"title": "To publish on Sat (8/27)",
"price_integer": 5000,
"currency": "USD",
"trial": {
"id": 1234,
"name": "Free trial!",
"active": true,
"price_integer": 0,
"currency": "USD"
}
}
}
id
integer
Unique integer ID for the trial
name
string
An identifier for the trial. The providers can set this title.
active
boolean
Describes whether or not the trial price should be applied. Providers can disable trial pricing for a given activity without deleting the trial.
price_integer
integer
A string representing the charge that should be applied if the user is eligible for the trial. E.g. 1000
equals $10.00
.
currency
string
The ISO 4217 currency string for price_integer
, e.g. 'USD’
Payment sources
Sources
GET /users/sources
Example response
{
"user": {
"id": 1,
"primary_source": {},
"cards": [],
"bank_accounts": []
}
}
No parameters required for this endpoint, as the API will pull the user from the Authentication-Token
in the request header. Note that this endpoint replaces the now deprecated GET users/cards
endpoint. Note that although the mobile client can get and display bank_account
objects, there’s currently no endpoint for creating bank_account
sources via mobile.
Card object
A credit card or payment method, such as Apple Pay. Cards/payment methods can only be created or destroyed – they can not be edited.
{
"id": 24,
"last4": "4242",
"exp_month": 12,
"exp_year": 2016,
"primary": false,
"brand": "Visa",
"apple_pay": false,
"created": 1463702066,
"updated": 1469319825,
"chargeable": true,
"user": {
"id": 1
}
}
Attributes
id
integer
Unique ID integer for this card/payment method
last4
string
The last 4 digits for this card.
brand
string
The card brand, as passed from Stripe (e.g. “Visa”, “American Express”, etc.)
primary
boolean
Indicates whether this is the user’s primary payment method. Note that the API will always use the user’s primary_card
to process charges.
apple_pay
boolean
Whether this payment method represents an Apple Pay source. Note that, even if this returns true
, the Card
object should still have brand
, last4
, etc. attributes.
chargeable
boolean
Whether this payment method can actually be charged via the Galore API. Non-chargeable cards should still be shown to the user to indicate that they should be removed.
created
integer UNIX timestamp
The seconds since the UNIX epoch that this card or payment method was created.
updated
integer UNIX timestamp
The seconds since the UNIX epoch that this card or payment method was last updated.
user
Object
Returns the user ID wrapped inside an user object
Bank account object
A bank account used for processing ACH transactions. Note that the server does not currently support adding bank accounts via mobile, but bank accounts should be visible and chargeable via mobile clients.
{
"id": 24,
"last4": "4242",
"primary": false,
"verified": true,
"bank_name": "Chase",
"created": 1463702066,
"updated": 1469319825,
"chargeable": true,
"user": {
"id": 1
}
}
Attributes
id
integer
Unique ID integer for this card/payment method
last4
string
The last 4 digits for this card.
bank_name
string
The name of the bank (e.g. “Chase”, “Bank of America”, etc.)
verified
boolean
Indicates whether this bank account is verified and ready for us. Attempts to charge verified: false
bank accounts will fail.
primary
boolean
Indicates whether this is the user’s primary payment method. Note that the API will always use the user’s primary_source
to process charges.
chargeable
boolean
Whether this payment method can actually be charged via the Galore API. Non-chargeable cards should still be shown to the user to indicate that they should be removed.
created
integer UNIX timestamp
The seconds since the UNIX epoch that this card or payment method was created.
updated
integer UNIX timestamp
The seconds since the UNIX epoch that this card or payment method was last updated.
user
Object
Returns the user ID wrapped inside an user object
Add card
POST /cards
Example request
{
"card": {
"apple_pay": true
},
"stripe_token": "{STRIPE CARD TOKEN}"
}
The only required argument is a stripe_token
generated by the Stripe SDK. The API will then use this token to “link” the user’s new payment method with either a new or existing customer profile on Stripe.
Arguments
stripe_token required
string
The Stripe token
allowing us to connect the card, newly created on the mobile client, with the user
object on the Galore API.
apple_pay
boolean
A boolean indicating whether this is an apple pay card or not.
Card errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | The request is missing a stripe_token parameter. |
403 |
“forbidden” | The client did not pass an authentication_token |
403 |
“invalid_auth_token” | The client passed an invalid authentication_token |
422 |
“validation_failed” | Something may have gone wrong with Stripe. In this case, we’ll pass the error to the device. |
Set primary source
PATCH /users/{USER ID}
Example requests
{
"primary_card_id": 294
}
{
"primary_bank_account_id": 45
}
Example response
{
"user": {
"id": 1,
"primary_source": {},
"cards": [],
"bank_accounts": []
}
}
Send either primary_card_id
or primary_bank_account_id
in order to specify a primary payment source. The response object will be a full listing of all user cards
and bank_accounts
so that the client can fully update its UI.
Arguments
primary_card_id
integer
The Galore integer ID for this card.
primary_bank_account_id
integer
The Galore integer ID for this bank account.
Errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden” | User is trying to update a card that doesn’t belong to them. |
403 |
“invalid_auth_token” | The client passed an invalid authentication_token |
422 |
“validation_failed” | There was an error saving the card object. |
503 |
“service_unavailable” | Something may have gone wrong with Stripe. In this case, we’ll pass the error to the device. |
Remove card
DELETE /cards/{ID}
Card errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden” | Either there was/is no user or the user tried to delete someone else’s card. |
404 |
“not_found” | We couldn’t find a card for the ID that was passed. |
503 |
“service_unavailable” | Something may have gone wrong with Stripe. In this case, we’ll pass the error to the device. |
Remove bank account
DELETE /bank_accounts/{ID}
Bank account errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden” | Either there was/is no user or the user tried to delete someone else’s bank account. |
404 |
“not_found” | We couldn’t find a bank account for the ID that was passed. |
503 |
“service_unavailable” | Something may have gone wrong with Stripe. In this case, we’ll pass the error to the device. |
Charges
Charge object
{
"id": 3459,
"paid": true,
"description": "Toddler Tandems – Questions Membership",
"currency": "USD",
"top_line_integer": 4000,
"remaining_payment_amount_integer": 4000,
"charge_amount_integer": 4000,
"refunded_amount_integer": 0,
"discount_amount_integer": 0,
"extras_amount_integer": 0,
"credit_amount_integer": 0,
"credit_refunded_amount_integer": 0,
"provider_credit_amount_integer": 0,
"created": 1512162043,
"updated": 1512162045,
"purchase": {
"id": 175,
"title": "Questions Membership"
}
}
A charge
represents a financial transaction through the Galore platform. Charges can belong to either reservations
or purchases
.
Attributes
id
integer
It’s a secret.
paid
boolean
Whether or not this charge has been processed. We sometimes create unpaid charges to track future invoices or for memberships that have a deferred payment.
description
string
The description that will appear on a customer’s bank account statement
currency
string
The ISO 4217 currency string for price_integer
, e.g. 'USD’
top_line_integer
integer
The subtotal for the spots in the reservation. This does not include any amount paid for extras, nor does it include discounts. Two spots for a $20 activity would be reported with a top_line_integer
of 4000
or $40.
extras_amount_integer
integer
The amount the user spent on extras for this reservation, e.g. 2000
on aftercare (equals $20.00
).
charge_amount_integer
integer
How much the user was originally charged for this reservation (i.e. the amount we charged their credit card – not the ticket price). Sent as integer, e.g. 1000
equals $10.00
.
remaining_charge_amount_integer
integer
The remainder that has still been charged to the users credit card. This will only be different from the charge_amount_integer
if a refund has taken place.
discount_amount_integer
integer
The amount or provider-specific credit and/or other discounts used on this reservation, e.g. 2000
might signify a $20.00
promo code.
refunded_amount_integer
integer
The amount that has been refunded to the users credit card.
credit_amount_integer
integer
The amount of Galore credit (not provider credit) used on this reservation, e.g. 2000
equals $20.00
.
credit_refunded_amount_integer
integer
The amount of Galore credit (not provider credit) that has been refunded.
provider_credit_amount_integer
integer
The amount of provider credit (not Galore credit) used on this reservation, e.g. 2000
equals $20.00
.
purchase
Purchase object
A (very) abbreviated purchase object. You should make a query to GET /purchases/1234
if you need more purchase information.
reservation
Reservation object
A (very) abbreviated reservation object. You should make a query to GET /reservations/1234
if you need more reservation information.
Get user charges
GET /users/charges
GET /users/charges?purchases=true
GET /users/charges?reservations=true
Successful response
{
"charges": [
{
"id": 3459,
"paid": true,
"description": "Toddler Tandems – Questions Membership",
"currency": "USD",
"top_line_integer": 4000,
"remaining_payment_amount_integer": 4000,
"charge_amount_integer": 4000,
"refunded_amount_integer": 0,
"discount_amount_integer": 0,
"extras_amount_integer": 0,
"credit_amount_integer": 0,
"credit_refunded_amount_integer": 0,
"provider_credit_amount_integer": 0,
"created": 1512162043,
"updated": 1512162045,
"purchase": {
"id": 175,
"title": "Questions Membership"
}
}
]
}
Response
charges
array
An array of charge objects.
Parameters
purchases
boolean
If you pass a purchases: true
parameter, only purchase
charges will be returned.
reservations
boolean
If you pass a reservations: true
parameter, only reservation
charges will be returned.
Extras
Extras are items that parents can add to a reservation, for example: “aftercare”, “lunch”, etc.
Extra object
Attributes
id
integer
The unique integer ID for this extra
title
string
The human readable title for this extra, e.g. “Aftercare”.
currency
string
The ISO 4217 currency string for price_integer
, e.g. 'USD’
price_integer
integer
The price as an integer, e.g. 1000
equals $10.00
extra_type
string
An string denoting the type of extra. These are stored as integers on the server but can be interpreted using the following enum
(note that “other” functions as a catch all for everything we haven’t defined yet):
Integer | Extra type |
---|---|
0 |
other |
1 |
precare |
2 |
aftercare |
series_only
boolean
If this extra is part of a series, whether the extra must be purchased as part of the whole series or whether it can be purchased for individual dates within the series (i.e. just on certain days). Disregard this attribute for single activity-specific extras.
max_count
integer
The maximum number of extras available for purchase, i.e. the inventory for the extra. For example, if a provider only has 5 lunches available on a certain day, their max_count
for the day should be 5.
activity
Activity
Returns the activity ID wrapped inside an activity object
series
Series
Returns the series ID wrapped inside a series object
Reservation extra object
{
"reservation_extra": {
"id": 107,
"purchase_count": 1,
"extra": {
"id": 123,
"max_count": 1,
"title": "Aftercare",
"notes": null,
"price_integer": 1000,
"currency": "USD",
"series_only": true,
"activity": null,
"series": { }
},
"reservation": {
"id": 12098
},
"kid": {
"id": 1
}
}
}
An extra that’s attached to both a kid and a reservation is called a ReservationExtra
.
Attributes
id
integer
The unique integer ID for this reservation extra.
purchase_count
integer
The number of extras purchased for this kid for this particular reservation.
extra
Extra
A stubbed representation of the extra object that’s being referenced.
kid
Kid
Returns the kid ID wrapped inside a kid object.
reservation
Reservation
Returns the reservation ID wrapped inside a reservation object.
Notifications
Notification object
Attributes
id
integer
You get it by now.
read
boolean
Indicates whether the notification has been read or not.
message
string
Message body for the notification.
sent_at
integer
Integer UNIX timestamp representing the moment the notification was sent (and thus the moment the notification was sent, since notifcations are sent on creation).
notification_type
integer
Integer indicating what kind of notification this is.
Notification Types
Type | Description |
---|---|
1 | New reservation |
2 | Upcoming reservation (i.e. reservation reminder) |
3 | Reservation cancelation |
4 | A new actvitiy was created (provider-specific) |
5 | Stripe account success (provider-specific) |
6 | Stripe account error (provider-specific) |
7 | Stripe transfer success (provider-specific) |
8 | Stripe transfer error (provider-specific) |
9 | Stripe transfer requested (provider-specific) |
10 | Stripe transfer canceled (provider-specific) |
11 | Provider approved (provider-specific) |
12 | A user received credit |
13 | Reservation refund |
14 | Charge refund |
15 | Reservation was updated |
16 | A promo was redeemed |
17 | Need info for instructor (provider-specific) |
18 | New parent on waitlist |
19 | New purchase |
20 | Update purchase |
21 | Multiple activity reservation |
22 | New Review |
23 | New Save |
24 | Waitlist removal |
25 | Cancel Purchase |
Get notifications
GET /users/notifications
{
"notifications": [
{
"id": 3751,
"read": false,
"message": "You just got $5 in Galore credit. Nice!",
"notification_type": 12,
"sent_at": 1468013877,
"activity": {
"id": 1
},
"series": {
"id": 2
},
"reservation": {
"id": 3
}
}
]
}
Responds with the notifications for the user attached to the authentication_token
in the request header. If a valid authentication_token
is missing or we can’t find a user connected to the token, the API will respond with a 403
.
Include param mark_read: true
in order to mark all unread notifications as read.
Mark all notifications read
POST /notifications/read
{
"success": true
}
Quickly marks all unread user notifications as read
Delete a notification
DELETE /notifications/{ID}
{
"success": true
}
Deletes a single notification. Server will respond with 404
if it can’t find a notification for the requested ID.
Clear notifications
DELETE /notifications/clear
{
"success": true
}
Deletes all the user’s notifications. Careful with this one!
Socials
Social object
Attributes
id
integer
You get it by now.
link
string
User-entered URL representing a link to a social media property, e.g. Facebook, Twitter, etc.
A simple object describing an external link (typically for social media) that an instructor, organization or location wants to make public.
Attributes
link
string
A URL for the social, e.g. https://www.facebook.com/getgalore
Waitlists
Waitlist object
Waitlist
{
"waitlist": {
"id": 5,
"kids": [
{
"id": 1,
"first_name": "..."
}
],
"spots": null,
"user": {
"id": 1
},
"series": {
"id": 130
},
"message": "Please let me in!",
"activity": null,
"created": 1463424607,
"notified": null
}
}
Attributes
id
integer
Integer ID for the waitlist object
spots
integer
The count of spots that the customer wants reserved for the event. Only present if the event is not for_kids
.
message
string
An optional message that a customer can add for the event organizer.
user
User
Returns the user ID wrapped inside a user object
series
Series
Returns the series ID wrapped inside an series object
activity
Activity
Returns the activity ID wrapped inside an activity object
kids
array of kid object
An array of kid objects attached to the waitlist. Will not be present if the event is not for kids.
created
integer
An integer Unix timestamp for when a user gets on a waitlist. Both the user and the provider (if applicable) will receive an email notifying them that a new waitlist object was just created.
notified
integer
An integer Unix timestamp for when the user was notified that a spot (or spots) have become available for the reference event. Will be null
if the user has not yet been notified about availability.
Get on waitlist
POST /waitlists
Example request
{
"waitlist": {
"series_id": 130,
"kid_ids": [123,1234],
"message": "Pretty please!"
}
}
Successful response
{
"waitlist": {
"id": 5,
"kids": [
{
"id": 123,
"first_name": "Idiot 1",
"last_name": "Kid"
},
{
"id": 1234,
"first_name": "Idiot 2",
"last_name": "Kid"
}
],
"spots": null,
"activity": null,
"series": {
"id": 130
},
"user": {
"id": 1
},
"message": "Pretty please!",
"created": 1463424607,
"notified": null
}
}
Arguments
activity_id or series_id required
integer
The integer ID of the Series
or Activity
the user wants to get on the waitlist for, wrapped inside a waitlist
object.
kid_ids
array
An array of integer IDs for the kids that will attend the event, wrapped inside a waitlist
object. Required if the event is for_kids
.
spots
integer
The count of spots that the customer wants reserved for the event, wrapped inside a waitlist
object. Required if the event is not for_kids
.
message
string
Exactly what you’d think. Not required.
Waitlist errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found” | There isn’t an activity or series associated with the activity_id /series_id that you passed. |
422 |
“validation_failed” | This event does not offer a waitlist or you forgot to include kid_ids or spots . |
422 |
“spots_available” | Spots are now available for this event. Note that the number of spots will also be passed in the error response, i.e. {"error": "Spots available", "spots": 2} |
Update a waitlist
PATCH /waitlists/{ID}
Example request
{
"waitlist": {
"activity_id": 13,
"spots": 2,
"message": "My friend is coming too"
}
}
Same arguments and error responses as the get on waitlist endpoint.
Remove from waitlist
DELETE /waitlists/ID
Successful response
{
"success": true
}
Waitlist errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found” | This waitlist either never existed or it was already destroyed. |
403 |
“forbidden” | The client tried to delete a waitlist that belonged to a different user |
Upcoming waitlists
GET /users/waitlists
{
"waitlists": [
{
"id": 51,
"kids": [
{
"id": 123
}
],
"spots": null,
"created": 1478223417,
"notified": null,
"activity": "...",
"series": null
}
]
}
id
integer
The integer ID of the waitlist.
spots
integer
The count of spots that the customer wants reserved for the event. Only present if the event is not for_kids
.
created
integer
An integer Unix timestamp indicating when the waitlist was created.
activity
Activity
An Activity object.
series
Series
A Series object.
kids
array of kid objects
An array of kid objects. Will not be present if the event is not for kids.
Store
Items
GET /store
{
"total": 10,
"page": 1,
"last_page": false,
"products": [],
"event_packages": [],
"memberships": []
}
Fetches separate arrays of product, event package and membership objects, respectively, as well as the attributes page
and total
. Note that filtering will use the same /store
endpoint, except with one or more of the below optional arguments.
Response Objects
products
Array
An array of product objects
memberships
Array
An array of membership objects
event_packages
Array
An array of event package objects
total
integer
The total number of results the API was able to find based on the user’s search criteria.
page
integer
The current page from the paginated response object. Useful for building infinite scroll.
last_page
boolean
A boolean value indicating whether there are more records to return or if this was the last page in the paginated response. Useful for building infinite scroll.
Optional Arguments
provider_id
integer
The integer ID of the provider you’re scoping events to.
category
string
A string used to filter the types of objects returned. Possible values include:
product
membership
event_package
per_page
integer
An integer representing how many results you want returned per page. If you don’t pass a per_page
parameter in your request, the server will default to a default page size of 30
combined product
, membership
and event_package
results.
page
integer
The desired page to return. Always 1
after a refresh, then incremented up by 1
as the user scrolls.
search
string
A search term.
Memberships
Membership object
{
"membership": {
"id": 14,
"title": "Dance Class Membership",
"about": "4 month long membership",
"disclaimer": "This is a disclaimer",
"unique_product_id": "MEMBERSHIP_14",
"auto_renew": false,
"cycles": 6,
"term": "months",
"for_kids": true,
"visible": true,
"active": true,
"inventory": null,
"purchased_inventory": 0,
"active_inventory": 0,
"price_integer": 1600,
"top_line_price_integer": 2000,
"membership_price_integer": 1500,
"currency": "USD",
"updated": 1547679424,
"bookmark": {},
"photos": [
{
"id": 731,
"uuid": "2d931510-d99f-494a-8c67-87feb05e1594",
"created": 1491922364,
"small_url": "https://s3.amazonaws.com/galore-dev/image_731_small.png?1491922373",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_731_medium.png?1491922373",
"large_url": "https://s3.amazonaws.com/galore-dev/image_731_large.png?1491922373",
"image_file_name": "stuff.png"
}
],
"organization": {
"id": 56,
"name": "Toddler Tandems",
"about": "About the organization",
"link": null,
"phone": null,
"email": null,
"in_business_since": "January, '15",
"yelp_business_id": "its-yoga-kids-san-francisco",
"providers": [],
"photos": []
},
"assigned_form_fields": [],
"schedules": [
{
"id": 12,
"title": "Toddler playtime"
},
{
"id":13,
"title": "Baby playtime"
}
]
}
}
id
integer
The integer ID of the membership.
title
string
The display title of the membership.
about
string
Some details about the membership.
disclaimer
string
An optional disclaimer field that accepts a free text entry. Not available on all accounts.
updated
integer
An integer Unix timestamp indicating when the membership was last updated.
for_kids
boolean
Whether or not this membership requires kid objects. If true, you must submit an array of kid_ids
when creating a purchase for this membership. If false, you must simply submit a purchase_count
when creating a purchase.
auto_renew
boolean
Whether the membership renews each period or whether it expires after the minimum number of billing cycles.
visible
boolean
Whether the membership is publicly discoverable. Note that memberships that are not visible
can still be purchased if accessed via deep link.
active
boolean
Whether the membership can be purchased.
cycles
integer
The membership can not be pauses or canceled until this number of billing cycles has passed.
term
string
The allowed values are 'weeks'
, 'months'
, and 'years'
. See cycles
above for more info.
price_integer
integer
An integer representation of the price a customer will pay. For example, 1000
equals $10.00.
top_line_price_integer
integer
An integer representation of the full price before discounts or deductions are taken into account. The client can display effective discount by showing the difference between top_line_price_integer
and price_integer
.
membership_price_integer
integer
An integer representation of the price a customer will pay in subsequent membership periods (i.e. without initial enrollment fees/taxes).
currency
string
The currency of the price_integer
.
inventory
integer
The total number of memberships available for purchase (including those that have already been purchased). If less than or equal to purchased_inventory
, then this membership is sold out. Note that if this value is null
, there’s no inventory limit.
purchased_inventory
integer
The number of memberships that have been purchased. Incremented or decremented each time a membership is purchased, canceled, or expired. Includes memberships that have been paused but not memberships that have been canceled or expired.
active_inventory
integer
The number of memberships that are currently active. Does not include memberships that were canceled, paused, or expired.
assigned_form_fields
array
An array of assigned_form_field objects.
photos
array
Photo objects.
schedules
array
An array of schedule objects.
organization
Organization
A Organization object.
Get all memberships
GET /memberships
{
"total": 10,
"page": 1,
"last_page": false,
"products": [],
"event_packages": [],
"memberships": []
}
Optional arguments
visible
boolean
Whether you want to scope this request to only memberships that can be purchased online (i.e. visible to customers).
active
boolean
Whether you want to scope this request to only memberships that are active.
updated_start
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
updated_end
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
Get a membership
GET /memberships/{MEMBERSHIP_ID}
Successful response
{
"membership": {
"price_integer": 1500,
"top_line_price_integer": 2000,
"membership_price_integer": 1500,
"discounted_price_integer": 1500,
"id": 14,
"title": "Dance Class Membership",
"about": "4 month long membership",
"disclaimer": null,
"unique_product_id": "MEMBERSHIP_14",
"auto_renew": true,
"cycles": 1,
"term": "months",
"for_kids": true,
"visible": true,
"active": true,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"minimum_period_interval": 3,
"minimum_period_units": "months",
"inventory": 5,
"purchased_inventory": 2,
"active_inventory": 1,
"currency": "USD",
"updated": 1547679424,
"photos": [
{
"id": 731,
"uuid": "2d931510-d99f-494a-8c67-87feb05e1594",
"caption": null,
"created": 1491922364,
"small_url": "https://s3.amazonaws.com/galore-dev/image_731_small.png?1491922373",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_731_medium.png?1491922373",
"large_url": "https://s3.amazonaws.com/galore-dev/image_731_large.png?1491922373",
"image_file_name": "stuff.png",
"user": {
"id": 296
},
"series": null,
"activity": null,
"organization": null,
"location": null
}
],
"organization": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
},
"assigned_form_fields": []
}
}
Returns a membership object.
Event Packages
Event Package object
{
"event_package": {
"id": 19,
"title": "Yoga 5 Pack",
"about": "Choose any 5 of our Yoga classes!",
"disclaimer": "This is a disclaimer",
"updated": 1547679424,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"price_integer": 19000,
"top_line_price_integer": 20000,
"currency": "USD",
"visible": false,
"purchasable_online": false,
"active": false,
"unique_product_id": "PACK_19",
"inventory": null,
"purchased_inventory": 0,
"active_inventory": 0,
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
},
"activities": [],
"assigned_form_fields": [],
"schedules": [
{
"id": 12,
"title": "Toddler playtime"
},
{
"id":13,
"title": "Baby playtime"
}
]
}
}
id
integer
The integer ID of the event package.
title
string
The display title of the event package.
about
string
Some details about the event package.
disclaimer
string
An optional disclaimer field that accepts a free text entry. Not available on all accounts.
updated
integer
An integer Unix timestamp indicating when the event package was last updated.
price_integer
integer
An integer representation of the price. For example, 1000
equals $10.00.
top_line_price_integer
integer
An integer representation of the full price before discounts or deductions are taken into account. The client can display effective discount by showing the difference between top_line_price_integer
and price_integer
.
currency
string
The currency of the price_integer
.
visible
boolean
Whether the event package is publicly discoverable. Note that event packages that are not visible
can still be purchased if accessed via deep link.
purchasable_online
boolean
An alias for visible
, which is defined above. An event package that is not purchasable_online
can be purchased on the dashboard and will still be active, but won’t be discoverable by customers.
active
boolean
Whether the event package can be purchased.
expiration_date
datetime
If present, then this package has an absolute expiration date. The user can only redeem package credits until this date.
expiration_period_interval
integer
If present, then this event package has a relative expiration date based on the date of purchase. Use this attribute combined with expiration_period_units
to calculate when the pack will expire. For example, expiration_period_interval = 6
and expiration_period_units = 'months'
means that the user will be able to redeem package_credits for 6 months after the date of purchase.
expiration_period_units
string
If present, then this package has a relative expiration date based on the date of purchase. The allowed values are 'weeks'
, 'months'
, and 'years'
. See expiration_period_interval
above for more info.
unique_product_id
string
The unique ID that we report to a couple of the worst companies in the world re: advertising (e.g. Dynamic Product Ads) when a user views a package, opens a reservation screen, and makes a purchase.
inventory
integer
The total number of event packages available for purchase (including those that have already been purchased). If less than or equal to purchased_inventory
, then this item is sold out. Note that if this value is null
, there’s no inventory limit.
purchased_inventory
integer
The number of event packages that have been purchased. Incremented or decremented each time an item is purchased, canceled, or expired.
active_inventory
integer
The number of event packages that are currently active.
assigned_form_fields
array
An array of assigned_form_field objects.
schedules
array
An array of schedule objects.
provider
Provider
A Provider object.
activity_count
integer
This attribute will be present when the event_package
is part of another response like /purchases
. This is simply an integer count of all available activities in the package.
activities
array
An array of Activity objects. Use the /package_credits
object to search through these activities.
Get all class packs
GET /event_packages
{
"total": 10,
"page": 1,
"last_page": false,
"products": [],
"event_packages": [],
"memberships": []
}
Optional Arguments
visible
boolean
Whether you want to scope this request to only class packs (aka event_packages
) that are visible (i.e. can be purchased online by customers).
active
boolean
Whether you want to scope this request to only class packs (aka event_packages
) that are active.
updated_start
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
updated_end
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
Get an event package
GET /event_packages/{EVENT_PACKAGE_ID}
Successful response
{
"event_package": {
"price_integer": 19000,
"top_line_price_integer": 20000,
"id": 19,
"title": "Yoga 5 Pack",
"about": "Choose any 5 of our Yoga classes!",
"disclaimer": null,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"unique_product_id": "PACK_19",
"drop_in": false,
"camp": false,
"day_pass": false,
"date_night": false,
"grown_ups": false,
"for_kids": null,
"active": true,
"provider_id": 1,
"inventory": null,
"purchased_inventory": 0,
"currency": "USD",
"purchasable_online": true,
"updated": 1547679424,
"organization": {},
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
},
"activities": [],
"assigned_form_fields": []
}
}
Returns an event package object.
Package Credits
Package Credit object
{
"package_credit": {
"id": 73,
"allowed_uses": 3,
"redeemed_uses": 3,
"activities": [],
"event_package": {
"id": 19,
"title": "Yoga 5-Pack",
"about": "Choose any of our 5 yoga classes!",
"updated": 1547679424,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"price_integer": 19000,
"top_line_price_integer": 20000,
"currency": "USD",
"activity_count": 20,
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
}
},
"purchase": {
"id": 93,
"purchase_count": 1,
"created": 1491328838,
"charge_amount_integer": 16000,
"product": null,
"event_package": {}
}
}
}
id
integer
The integer ID of the package_credit.
allowed_uses
integer
The total number of spots that can be reserved with this package credit.
redeemed_uses
integer
The number of spots that have already been redeemed.
activity_count
integer
This attribute will be present when the package_credit
is returned in an array. This is simply an integer count of all available activities that can be redeemed with this credit.
activities
array
An array of Activity objects. This will be returned when viewing a specific package_credit
through /package_credits/{ID}
. All of the information for an Activity Card will be included in this response.
event_package
Event Package
An Event Package object.
purchase
Purchase
The Purchase object that was made when this package_credit
was purchase.
All package credits
GET /users/package_credits
{
"package_credits": [
{
"id": 73,
"allowed_uses": 3,
"redeemed_uses": 3,
"activity_count": 30,
"event_package": {
"id": 19,
"title": "Yoga 5-Pack",
"about": "Choose any of our 5 yoga classes!",
"updated": 1547679424,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"price_integer": 20000,
"top_line_price_integer": 20000,
"currency": "USD",
"activity_count": 20,
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
}
},
"purchase": {
"id": 93,
"purchase_count": 1,
"created": 1491328838,
"charge_amount_integer": 16000,
"product": null,
"event_package": {}
}
}
]
}
Retrieves all of the package credits for a specific user. The client must pass the user’s authentication_token
in the request header, otherwise the API will respond with a 403
.
Note that for this response we will return only the activity_count
for each package credit. Use the get package credit endpoint to retrieve all activity objects.
Get package credit
GET /package_credits/{ID}
Example request
{
"id": 73,
"activity_search": "yoga",
"dates": ["2018-01-01","2018-09-29"]
}
Successful response
{
"package_credit": {
"id": 73,
"allowed_uses": 3,
"redeemed_uses": 3,
"activities": [],
"event_package": {
"id": 19,
"title": "Yoga 5-Pack",
"about": "Choose any of our 5 yoga classes!",
"updated": 1547679424,
"allowed_uses": 5,
"expiration_date": null,
"expiration_period_interval": 6,
"expiration_period_units": "months",
"price_integer": 20000,
"top_line_price_integer": 20000,
"currency": "USD",
"activity_count": 20,
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
}
},
"purchase": {
"id": 93,
"purchase_count": 1,
"created": 1491328838,
"charge_amount_integer": 16000,
"product": null,
"event_package": {}
}
}
}
Retrieves a single package credit for a user. The client must pass the user’s authentication_token
in the request header, otherwise the API will respond with a 403
.
Optional Arguments
activity_search
string
A search term for the activity information.
dates
array
An array of dates in “yyyy-mm-dd” format (e.g. [“2018-01-01”,“2018-09-29”])
Response Objects
activities
array
An array of full activity objects for an Activity Card. These activities will be filtered according to any optional arguments that were passed.
Products
Product object
{
"product": {
"id": 14,
"title": "T Shirt",
"about": "Paddys Pub Product",
"updated": 1547679424,
"price_integer": 1500,
"currency": "USD",
"visible": true,
"active": true,
"purchasable_online": false,
"sku": "12345678",
"photos": [
{
"id": 731,
"uuid": "2d931510-d99f-494a-8c67-87feb05e1594",
"caption": null,
"created": 1491922364,
"small_url": "https://s3.amazonaws.com/galore-dev/image_731_small.png?1491922373",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_731_medium.png?1491922373",
"large_url": "https://s3.amazonaws.com/galore-dev/image_731_large.png?1491922373",
"image_file_name": "stuff.png",
"user": {
"id": 296
},
"series": null,
"activity": null,
"organization": null,
"location": null
}
],
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
},
"assigned_form_fields": []
}
}
id
integer
The integer ID of the product.
title
string
The display title of the product.
about
string
Some details about the product.
updated
integer
An integer Unix timestamp indicating when the product was last updated.
price_integer
integer
An integer representation of the price. For example, 1000
equals $10.00.
currency
string
The currency of the price_integer
.
visible
boolean
Whether the product is publicly discoverable. Note that products that are not visible
can still be purchased if accessed via deep link.
active
boolean
Whether the product can be purchased.
purchasable_online
boolean
Whether the product can be purchased online. If false
or null
, this product can only be purchased in store.
sku
string
A unique identifier for this product. Limited to 255 alphanumeric characters.
credit_eligible
boolean
Whether the customer can use credit towards purchasing this product. Note that if this argument is true
or simply not present, then the user can use credit towards this purchase.
max_purchase_count
integer
The maximum number of purchases a user can make for this particular product.
assigned_form_fields
array
An array of assigned_form_field objects.
photos
array
Photo objects.
provider
Provider
A Provider object.
Get all products
GET /products
{
"total": 10,
"page": 1,
"last_page": false,
"products": [],
"event_packages": [],
"memberships": []
}
Optional Arguments
purchasable_online
boolean
Whether you want to scope this request to only products that can be purchased online.
active
boolean
Whether you want to scope this request to only products that are active.
updated_start
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
updated_end
integer
An integer Unix timestamp indicating the starting bound of range selection for when the object was last updated.
Get product object
GET /products/{PRODUCT_ID}
Successful response
{
"product": {
"id": 14,
"title": "T Shirt",
"about": "Paddys Pub Product",
"updated": 1547679424,
"price_integer": 1500,
"currency": "USD",
"photos": [
{
"id": 731,
"uuid": "2d931510-d99f-494a-8c67-87feb05e1594",
"caption": null,
"created": 1491922364,
"small_url": "https://s3.amazonaws.com/galore-dev/image_731_small.png?1491922373",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_731_medium.png?1491922373",
"large_url": "https://s3.amazonaws.com/galore-dev/image_731_large.png?1491922373",
"image_file_name": "stuff.png",
"user": {
"id": 296
},
"series": null,
"activity": null,
"organization": null,
"location": null
}
],
"provider": {
"id": 56,
"name": "Toddler Tandems",
"image_thumb": null,
"image_small": null
},
"assigned_form_fields": []
}
}
Returns a product object.
Bookmarks
Get bookmarks
GET /users/bookmarks
{
"bookmarks": [
{
"id": 95,
"created": 1480227256,
"activity": null,
"series": null,
"organization": null,
"instructor": null,
"location": null,
"event_package": null,
"membership": null,
"product": null
}
]
}
Optional Arguments
search
string
A search term entered by the user.
page
integer
Used for pagination. Defaults to 1
.
Response Attributes
id
integer
The integer ID of the bookmark.
created
integer
An integer Unix timestamp indicating when the user was created.
notified
integer
An integer Unix timestamp indicating when the user was allowed entry into the event (via email with Waitlist token).
activity
Activity
An Activity object.
series
Series
A Series object.
organization
Organization
A Organization object.
instructor
Instructor
A Instructor object.
location
Location
A Location object.
event_package
EventPackage
An EventPackage object.
membership
Membership
A Membership object.
product
Product
A Product object.
Create a bookmark
POST /bookmarks
Sample request
{
"bookmark": {
"bookmarkable_id": 53,
"bookmarkable_type": "Activity"
}
}
Successful response
{
"bookmark": {
"id": 23,
"created": 1480227256,
"activity": "..." ,
"series": null,
"organization": null,
"instructor": null,
"location": null
}
}
bookmarkable_id required
integer
The integer ID of the object the user is attempting to bookmark. Can be an instance of:
activity_id
series_id
organization_id
instructor_id
location_id
event_package_id
membership_id
product_id
bookmarkable_type required
string
The class name for the object the user is attempting to bookmark. Can be:
"Activity"
"Series"
"Organization"
"Instructor"
"Location"
"EventPackage"
"Membership"
"Product"
Delete a bookmark
DELETE /bookmarks/{ID}
{
"success": true
}
Depending on the client UI, a user should be able to remove a bookmark either from the “Saved View” or from the event, organization, instructor or location view itself.
Form fields
“Form fields” are custom questions that providers can add to collect specific information during a reservation.
Assigned form field object
assigned_form_fields
are attached to events or products and represent the questions that should be answered during the reservation process.
{
"assigned_form_fields": [
{
"id": 19,
"required": true,
"prompt": "Choose \"Yes\" or \"No\"",
"field_type": "boolean",
"each_attendee": true
},
{
"id": 26,
"required": true,
"prompt": "Type in a number between 1 and 10.",
"field_type": "number",
"each_attendee": false,
"min_value": "1.0",
"max_value": "10.0"
},
{
"id": 27,
"required": true,
"prompt": "Just write something down",
"field_type": "text",
"each_attendee": false
},
{
"id": 36,
"required": true,
"prompt": "Choose which animals you want or have.",
"field_type": "multi_select",
"each_attendee": true,
"options": [
{
"text": "Dog",
"id": 1
},
{
"text": "Cat",
"id": 2
}
]
},
{
"id": 37,
"required": true,
"prompt": "Choose your single favorite ice cream.",
"field_type": "single_select",
"each_attendee": true,
"options": [
{
"text": "Chocolate",
"id": 1
},
{
"text": "Vanilla",
"id": 2
}
]
}
]
}
Attributes
id
integer
You get it by now.
required
boolean
Whether or not the user needs to answer this question.
prompt
string
Provider specified question for the user. Note that confirmation
form fields can have very long prompts.
field_type
string
The type of response that should be collected for this form field. The available options are:
text
: Collect a free text response from the user.initial
: Collect the user’s initials (as a string).boolean
: Choose either a “Yes” (true
) or a “No” (false
) answer from the usernumber
: Allow the user to choose a number. Theassigned_form_field
object will also havemin_value
andmax_value
attributes fornumber
fields.confirmation
: The user should have a confirmation checkbox (or similar UI element) to confirm that they’ve read theprompt
.single_select
: Give the user the option to choose one single answer from a list of answers. Theassigned_form_field
object will also have anoptions
array for the available options.multiple_select
: Give the user the option to choose one or more options from a list of answers. Theassigned_form_field
object will also have anoptions
array for the available options.
min_value
decimal string
The minimum allowed value for a number
type.
max_value
decimal string
The maximum allowed value for a number
type.
options
array
The available options for single_select
or multi_select
types. This is an array of objects with the format of [{"text": "Option 1", "id": 123}]
. Submit the selections as an array of id
s.
Completed form field object
completed_form_fields
are attached to reservations or purchases and represent the customer’s answers to assigned_form_fields
.
{
"completed_form_fields": [
{
"id": 50,
"assigned_form_field_id": 19,
"kid_id": 601,
"value": true,
"value_type": "boolean"
},
{
"id": 51,
"assigned_form_field_id": 26,
"value": 2,
"value_type": "number"
},
{
"id": 52,
"assigned_form_field_id": 27,
"value": "Testing",
"value_type": "text"
}
]
}
Attributes
id
integer
You get it by now.
assigned_form_field_id
integer
The primary key of the associated assigned_form_field
.
kid_id
integer
The primary key of the kid
object for the question. Only applies to for_kids
event assigned_form_field
s with each_attendee: true
.
attendee
integer
An integer for a specific attendee. Starts counting at 0
up to 1 less than reservation.spots
. Only applies to grown ups event assigned_form_field
s with each_attendee: true
. We need this so that we can keep track of each_attendee
questions for grown ups events.
value_type
string
The type of response that should be collected for this form field. The available options are:
text
: Collect a free text response from the user.initial
: Collect the user’s initials (as a string).boolean
: Choose either a “Yes” (true
) or a “No” (false
) answer from the usernumber
: Allow the user to choose a number. Theassigned_form_field
object will also havemin_value
andmax_value
attributes fornumber
fields.confirmation
: The user should have a confirmation checkbox (or similar UI element) to confirm that they’ve read theprompt
.single_select
: Give the user the option to choose one single answer from a list of answers. Theassigned_form_field
object will also have anoptions
array for the available options.multiple_select
: Give the user the option to choose one or more options from a list of answers. Theassigned_form_field
object will also have anoptions
array for the available options.
value
string, integer, boolean, or array
The coerced value of the response. For text
, initial
and number
values, the response will be a string. For boolean
and confirmation
types, the value will be a boolean. For single_select
and multi_select
types, the value will be an array of integer IDs of the form options
.
Connections
Social connections
GET /users/connections
Example response
{
"user": {
"id": 123,
"facebook_id": null,
"facebook_access_token": null,
"kids": []
},
"connected_users": [],
"meta": {
"total": 14,
"page": 1,
"last_page": true
}
}
This endpoint will respond with the current user’s social connections. Note that these social connections are scoped such that only direct connections (i.e. connections between users that have been “accepted” or connections because both users are friends on facebook) will be sent. A user
object is sent as a convenience for the client to more easily determine if the user has already linked with facebook and/or has any kids. The endpoint is set up to provide paginated results — the user
object will only be returned if a page
is not specified or specified as page=1
. Connections that don’t have a requested_at
value were created in the background, e.g. because two users live in the same zip code or their kids go to the same school.
The client can filter which connections should be returned by using either of the below parameters:
type
string
Whether the client is looking for inbound
(i.e. requested of the current user), outbound
(i.e. requested by the current user), or suggestions
(other users with some sort of connection to the current user but who aren’t already directly connected).
status
string
Filter requested connections by whether they have been rejected
, accepted
or are still pending
(i.e. have been neither accepted or rejected).
Social connection object
id
integer
The integer ID for this social connection.
description
string
Human readable string describing the connection.
direction
string
Specifies whether this social connection was requested by the current user (i.e. “outbound”) or by the other user (i.e. “inbound”). Can only be of two possible values: inbound
or outbound
.
direct
boolean
A boolean value that returns true
if the connection was created because of a friend request, a facebook friendship, a gift card or referral, or false
if the connection was created programmatically (e.g. because both users reserved a spot at the same event).
requested_at
integer
An integer Unix timestamp indicating when the connection was requested.
rejected_at
integer
An integer Unix timestamp indicating when the connection was ignored (i.e. rejected).
accepted_at
integer
An integer Unix timestamp indicating when the connection was accepted.
Object connections
GET /connections?activity_id={ID}
Example response
{
"connected_users": [],
"meta": {
"total": 14,
"page": 1,
"last_page": true
}
}
This endpoint is responsible for serving on object’s connected users. The endpoint is set up to provide paginated results.
Request parameters
{object}
integer
The unique integer ID for the object. Possible keys include:
activity_id
series_id
user_id
organization_id
instructor_id
location_id
membership_id
event_package_id
product_id
Connect
POST /social_connections
Sample request
{
"social_connection": {
"connected_user_id": 53
}
}
connected_user_id required
integer
The integer ID for the user that the client is attempting to connect with.
Disconnect
DELETE /social_connections/{CONNECTED_USER_ID}
Sample response
{
"success": true
}
Required request argument(s)
connected_user_id required
integer
The integer ID for the user that the client is attempting to disconnect with, passed as part of the URL.
Accept
POST /social_connections/{CONNECTED_USER_ID}/accept
Sample response
{
"success": true
}
connected_user_id required
integer
The integer ID for the user that send the connection request.
Reject
POST /social_connections/{CONNECTED_USER_ID}/reject
Sample response
{
"success": true
}
connected_user_id required
integer
The integer ID for the user who sent the connection request that’s now being rejected.
Connection errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden_error” | A user can’t delete someone else’s connections. |
404 |
“not_found_error” | This relationship doesn’t exist (i.e. the server couldn’t find a valid connection). |
403 |
“validation_failed_error” | Something went wrong. The server will pass the error message directly to the client. |
Tags
Tag object
TBD
Schedules
Schedule object
Attributes
id
integer
The integer ID for this schedule object.
title
string
The name of the event(s) attached to this schedule.
frequency_string
string
A string value representing how often the schedule should repeat. Can be daily
, weekly
, or monthly
.
occurrences
integer
The number of time this schedule repeats the frequency string, i.e. if occurrences
is 2 and frequency_string
is Weekly
, then the schedule repeats for 2 weeks.
start_date
date
A date string representing the start date for the schedule.
last_date
date object
A date string representing the end date for the schedule.
time_slots
array
An array of objects that help determine when events repeat within the schedule.
time_slot[days]
array
An array representing which day of the week events will repeat. Sunday is “0”, Monday is “1”, etc.
time_slot[appointment_duration]
integer
Indicates how long each appointment will be. Only relevant for “appointment” schedules (i.e. schedules with multiple availabilities throughout the day; for example, “Math Tutoring” available in 60 minute increments from 9am to 5pm).
time_slot[schedule_exceptions]
array
An array of times — as defined with the "skip_time"
key — dictating when the above rules are ignored (and when an event/appointment will not take place)
Get a schedule
Use this endpoint for fetching a particular schedule
object.
GET /schedules/ID
Example request
{
"schedule": {
"id": 5,
"title": "Membership Schedule",
"frequency_string": "Weekly",
"start_date": "2020-07-20T12:00:00.000Z",
"last_date": "2021-12-29T21:00:00.000Z",
"time_slots": [
{
"days": [
"1",
"3",
"0"
],
"start_time": "2020-07-20T19:00:00.000Z",
"end_time": "2020-07-20T20:00:00.000Z",
"appointment_duration": null,
"schedule_exceptions": [
{
"skip_time": "2020-09-04T12:00:00.000Z"
}
]
}
]
}
}
Schools
School object
Attributes
id
integer
You get it by now.
name
string
The school’s name as a, you guessed it, string
.
about
string
A paragraph or more of descriptive text about the school.
start_grade
integer
An integer indicating the school’s start grade. Note that 0
is used to indicate “Kindergarten”, -1
for “Pre-K”, and -2
for “Transitional-K”.
end_grade
integer
An integer indicating the school’s end grade. Note that 0
is used to indicate “Kindergarten”, -1
for “Pre-K”, and -2
for “Transitional-K”.
locations
Array
An array of location objects indicating where the school is located. There will usually only be one location – but the API will pass it as an array in order to support situations where a school has multiple sites.
Get schools
When adding or editing kid objects, users will be asked to add/select a school for their kid. In order to add/edit a kid object, a user will be required to either select a school or explicitly state that their child is not in school. When searching schools, the client should supply the user’s coordinates so that the API can deliver the most geographically relevant results. The client must supply either a search
parameter or latitude
and longitude
parameters, otherwise the API will return 204
.
GET /schools
Example request
{
"search": "Alvarado",
"latitude": 37.7749300,
"longitude": -122.4194200
}
Request parameters
search
string
A user-generated search string.
latitude
float
The latitude associated with the query.
longitude
float
The longitude associated with the query.
Create a school
POST /schools
Example request
{
"school": {
"name": "The best school ever"
}
}
The client can create a school by hitting this endpoint with a valid school
object. A school object is valid
if it includes a name
parameter. The client can also create one or more schools by passing a schools
parameter with one or more valid school
objects when creating/updating a kid
– described in the kid section.
Parameters
name required
string
The name of the school.
Reviews
Review object
{
"review": {
"id": 1,
"rating": 1,
"body": "It was a really great event. Nothing more.",
"created": 1480227256,
"title": "This was the event title",
"subtitle": "Demo Galore",
"reservation": {
"id": 278
},
"user": {
"id": 4,
"first_name": "Joe",
"last_name": "Schmo",
"created": 1456528752,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_1_thumb.jpg?1501949047",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_1_small.jpg?1501949047",
"avatar_medium": "https://s3.amazonaws.com/galore-dev/avatar_1_medium.jpg?1501949047"
},
"provider": {
"id": 1,
"name": "Demo Galore@@#%!@#&'",
"organization": {
"id": 27,
"name": "Demo Galore@@#%!@#&'",
"cover_photo": {
"id": 215,
"uuid": "aed5aacc-47f4-42f7-b6b6-cf9976830bc5",
"created": 1485906709,
"thumb_url": "https://s3.amazonaws.com/galore-dev/image_215_thumb.jpg?1502066720",
"small_url": "https://s3.amazonaws.com/galore-dev/image_215_small.jpg?1502066720",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_215_medium.jpg?1502066720",
"large_url": "https://s3.amazonaws.com/galore-dev/image_215_large.jpg?1502066720"
}
}
},
"cover_photo": {
"id": 215,
"uuid": "aed5aacc-47f4-42f7-b6b6-cf9976830bc5",
"created": 1485906709,
"thumb_url": "https://s3.amazonaws.com/galore-dev/image_215_thumb.jpg?1502066720",
"small_url": "https://s3.amazonaws.com/galore-dev/image_215_small.jpg?1502066720",
"medium_url": "https://s3.amazonaws.com/galore-dev/image_215_medium.jpg?1502066720",
"large_url": "https://s3.amazonaws.com/galore-dev/image_215_large.jpg?1502066720"
}
}
}
We ask users to review events as soon as they’re over (i.e after the end_time
of a single activity or the end_time
of the last event within a series). Please see the review queue section for more details.
Note that the reviews returned on activity and series requests are actually reviews for the provider and not just for that particular event.
rating
integer
A 0
is a thumbs down, a 1
is a thumbs up.
body
text
Optional comments from the user about the event (placeholder: “Any comments (optional)?”).
created
integer
An integer Unix timestamp indicating when the review was created.
title
string
A human readable title string representing either the object that was reviewed or the user who gave the review. The server is responsible for deciding which to present.
subtitle
string
A human readable subtitle/caption string providing more context for either the reviewed object or the user who gave the review.
user
User
A stubbed user object with name and avatar so that the client can display the user’s basic info.
reservation
Reservation
A stubbed reservation object, including the reservation id
. The client should use the review title
in order to show the title of the event that was reviewed.
organization
Organization
A stubbed organization object, including id
and full_name
.
instructor
Instructor
A stubbed instructor object, including id
and full_name
.
location
Location
A stubbed location object, including id
and name
.
cover_photo
Photo
A Photo object so that the client can display a thumbnail for the reviewed object. Note that this will only be present for reviews that are being displayed on a user profile.
Fetch reviews
GET /reviews/?<object_id>={ID}
Example response
{
"reviews": [],
"meta": {
"total": 45,
"page": 1,
"last_page": false
}
}
This endpoint is used to fetch reviews for a specific object. Note that an object ID is required in order for the server to know what you want to display. This endpoint responds with 30 reviews at a time in reverse chronological order and does accept a page
parameter for pagination.
object ID required
integer
The unique ID integer the server should use in querying reviews. Possible values:
- activity_id
- series_id
- organization_id
- instructor_id
- location_id
- user_id
page
integer
Used for pagination. Defaults to 1.
Create review
POST /reviews
Example request
{
"review": {
"reviewable_id": 278,
"reviewable_type": "Reservation",
"rating": 1,
"body": "It was a really great event. Nothing more."
}
}
reviewable_id required
integer
The unique ID integer for the object that’s being reviewed.
reviewable_type required
string
The class name (capitalized) for the object that’s being reviewed, e.g. “Reservation”, “Organization”, “Instructor”, or “Location”.
rating required
integer
A 0
is a thumbs down, a 1
is a thumbs up.
body
text
Optional comments from the user about the event (placeholder: “Any comments (optional)?”).
Referrals
View Referral Credits
Use this endpoint to retrieve the current sharer_credit
and recipient_credit
that is awarded for a successful share and signup.
GET /referrals
Example response
{
"sharer_credit_integer": 1000,
"recipient_credit_integer": 1000,
"currency": "USD",
"sharer_text": "Share stuff!"
}
sharer_credit_integer
integer
The credit that the sharer will receive for a successful recipient sign-up. Integer format, so 1000
equals $10.00
recipient_credit_integer
integer
The credit that the recipient will receive after signing up. Integer format, so 1000
equals $10.00
currency
string
The ISO 4217 currency string for sharer_credit_integer
and recipient_credit_integer
Referrral object
A referral object will be passed in the /sessions
response if the user has just created a new account thanks to a share link from another user.
{
"id": 11,
"sharer_id": 23,
"sharer": {
"id": 23,
"first_name": "Test",
"last_name": "User"
},
"recipient_id": 1,
"recipient": {
"id": 1,
"first_name": "Max",
"last_name": "Stiles"
},
"code": null,
"sharer_device_identifier": "{DEVICE IDENTIFIER}",
"recipient_device_identifier": "{DEVICE IDENTIFIER}",
"channel": "Facebook",
"currency": "USD",
"recipient_credit_integer": 2000,
"sharer_credit_integer": 2000
}
Gift cards
Gift card object
Attributes
id
integer
The unique integer ID for this gift card.
uuid
string
Unique string identifier for this gift card.
gccode
string
Unique gift card redemption code. Only present when the gift card sender chooses to either send the gift card themselves or when they don’t select a recipient.
created
integer
An integer Unix timestamp indicating when the gift card was created.
sent
integer
An integer Unix timestamp indicating when the gift card was actually sent to its recipient.
amount_integer
integer
A string representing the monetary value (as an integer) of the gift card. E.g. 1000
equals $10.00
amount_used_integer
integer
A string representing the amount of value used (as an integer) for the gift card. E.g. 500
equals $5.00
currency
string
The ISO 4217 currency string, e.g. 'USD’
sender
Object
The user who sent the gift card, abbreviated down to id
, first_name
, last_name
, and email
.
provider
Object
If this gift card is specific to a provider, e.g. “can only be used with Demo Galore”, this value will be non-null.
Give a gift card
POST /gift_cards
Example request
{
"recipient": "test@getgalore.com",
"recipient_first_name": "Some-guy",
"amount_cents": 2000,
"subject": "Sample email subject line",
"message": "Sample personalized message"
}
Example response
{
"gift_card": {
"uuid": "180930ed-4ff6-4344-8645-5741d93b3238",
"created": 1498325274,
"sent": null,
"currency": "USD",
"amount_integer": 200,
"amount_used_integer": 0,
"sender": {
"id": 1,
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com"
},
"provider": {
"id": 1,
"name": "Demo Galore@@#%!@#&'"
}
}
}
When someone gives a gift card, the world rejoices.
Fields
recipient required
string
The email of the person you’re trying to send this gift card to.
amount_cents required
integer
The smallest currency units
recipient_first_name required
string
The first name of the person you’re sending a gift card to.
should_notify_user required
boolean
Whether the sender wants Galore to automatically send the recipient a gift card or whether the user wants to do it themselves.
subject
string
An optional subject line for the email sent from sender to recipient notifying the recipient about their gift card.
message
string
An optional message for the note sent from sender to recipient.
provider_id
integer
The unique integer ID for the provider that the user has selected for this gift card.
Get a gift card
When someone gets a gift card, they receive an email with a deep link that includes a gift_card_uuid
parameter. Using this param
, a client can query the API for more info about this gift card, e.g. who sent it and how much it’s worth. Note that this endpoint is set up to take a uuid
param and not an id
. Trying to GET
a gift_card with an id
will result in a 404
.
GET /gift_cards/180930ed-4ff6-4344-8645-5741d93b3238
Example response
{
"gift_card": {
"uuid": "180930ed-4ff6-4344-8645-5741d93b3238",
"created": 1498325274,
"sent": 1498325574,
"currency": "USD",
"amount_integer": 200,
"amount_used_integer": 0,
"sender": {
"id": 1,
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com"
},
"provider": {
"id": 1,
"name": "Demo Galore@@#%!@#&'"
}
}
}
Subscribers
A user can sign up to receive emails from Galore, e.g. “receive updates when we launch in your area!”, by creating a Subscriber
object with their email address.
Join mailing list
POST /subscribers
Example request
{
"email": "test@getgalore.com",
"zip": "94110"
}
Successful response
{
"success": true
}
email required
string
A validated email string.
zip
string
The user’s zip code, as a string. Required if the user is signing up for the “We’re not launched in your area yet” email list.
Deep links
Install
Payloads
activity_id
, series_id
, organization_id
, instructor_id
, and promo_id
Services API
This section describes the endpoints namespaced behing the API services
path. These are geared towards the various clients and microservices that interact with the Galore API.
Please note that all 4xx
errors will include a human readable error_message
which can be reflected back to the user without editing.
Services errors
Code | Error code string | Description |
---|---|---|
401 |
“unauthorized” | You didn’t pass an api-key in your request header. |
403 |
“forbidden” | You passed an api-key in your request header, but there was no active API client associated with the api-key . |
404 |
“not_found” | We couldn’t find the resource you were attempting to access (e.g., you passed a UUID that wasn’t associated with anything). |
422 |
“unprocessable_entity” | Your URL parameters or request payload was not formatted properly. If passing json , ensure the payload has the proper node names (e.g., sales_contract ). |
Create sales contract
POST /services/v1/sales_contracts
Example request
{
"sales_contract": {
"salesforce_opportunity_id": "006f000000P0eNJAAZ",
"contract_status": "published",
"contract_status_updated_at": 1612201832,
"platform_fee": 8000,
"platform_fee_discount": 2000,
"discount_offer": "5% off as Care.com benefit",
"discount_available": true,
"currency_code": "USD",
"business": {
"name": "Stepping Stone",
"address": {
"line1": "5th Street",
"line2": null,
"city": "New York",
"state": "New York",
"postal_code": "10035"
}
},
"business_owner": {
"first_name": "Bob",
"last_name": "Tester",
"email": "bob@test.com",
"phone": "5555555555"
},
"reviews": [
{
"first_name": "John",
"last_name": "Smith",
"email": "jsmith@gmail.com",
"phone": "555-555-5555",
"location_name": "Stepping Stone South Park Meadows"
}
],
"sales_reps": [
{
"salesforce_id": "006f0eNJAAZ",
"email": "sales1@getgalore.com",
"first_name": "Sales1",
"last_name": "Test"
}
],
"locations": [
{
"name": "Stepping Stone South Park Meadows",
"salesforce_id": "123abc-saleforce-id",
"run_ads": true,
"ads_status": "active",
"address": {
"line1": "5th Street",
"line2": null,
"city": "New York",
"state": "New York",
"postal_code": "10035"
},
"offerings": [
{
"vertical": "child_care",
"service": "centers",
"capacity": 123,
"min_months": 0,
"max_months": 72
}
],
"license": {
"business_name": "Stepping Stone South Park Meadows",
"address": {
"line1": "5th Street",
"line2": null,
"city": "New York",
"state": "New York",
"postal_code": "10035"
},
"license_number": "2091711",
"status": "unverified",
"approved": false
},
"monthly_advertising_budget": 30000,
"budget_currency": "USD",
"advertising_areas": [ "78748", "77801", "93849" ],
"phone": "555-555-5555",
"email": "ssmeadows@test.com",
"discounts": [ //only the first discount will be accepted
{
"amount": 5, // integer: amount off as Care.com benefit. As a dollar amount or percentage it is a whole number in Galore.
"type": "money", // string - defines the type - either "money" or "percentage" off the value
"available": true, // boolean - true to turn off discount across the network / lifemartand false to turn on across the network
"audience": "all members", // string - enum: The intended audience of this discount. Lowercase "all members", or "premium and enterprise members only"
"exclusions": "modified exclusions" // string: The terms and conditions of this offer on this specfic discount
}
]
}
]
}
}
Successful response
{
"sales_contract": {
"uuid": "afbded54-65ac-4e28-b7e4-3e62ce1af7f5",
"salesforce_opportunity_id": "b38ea377-bc83-4051-a2b8-29286e4a866b",
"business_id": "aef3962b-37a7-4fac-8548-82ec60468e2f",
"locations": []
}
}
Endpoint for creating new sales contracts. All payloads to this endpoint should be wrapped inside a sales_contract
node. Note that this endpoint can be used to create a new sales contract for a new business or to create a new sales contract for an existing business by passing the option business_id
parameter mentioned below.
business_id optional
uuid
A uuid for a business that already exists within Galore/Care.com. This optional attribute can be passed if the new contract is meant to be associated with an existing business.
contract_status
string
A string indicating the enrollment status for this contract. Possible values include: published
, pending_enrollment
, pending_activation
, active
, void
, canceled
.
salesforce_opportunity_id
string
An ID string allowing the API to identify the sales contract.
platform_fee
integer
The integer value — in cents — that the business should be charged per billing term.
currency_code
string
A string representing the currency code for the contract (e.g. “USD”, “CAD”).
business
object
An object representing
reviews
array
An array of review objects (also called references) representing user/customer revies for a given business location. A review must have a first_name
, last_name
, email
and phone
number, and should also include a location_name
value that references one of the business’s locations.
locations
array
An array of license (also called providers) objects representing the one or more locations where services are offered by the business. Each location will have both a salesforce_id
and a uuid
to ensure both the API and the consumer can identify objects common to both.
Update sales contract
PATCH /services/v1/sales_contracts/{uuid}
Example request
{
"sales_contract": {
"contract_status": "canceled"
}
}
Successful response
{
"sales_contract": {
"uuid": "afbded54-65ac-4e28-b7e4-3e62ce1af7f5",
"salesforce_opportunity_id": "b38ea377-bc83-4051-a2b8-29286e4a866b",
"business_id": "aef3962b-37a7-4fac-8548-82ec60468e2f",
"locations": []
}
}
Endpoint for updating existing sales contracts. Typically this will be an update of the contract’s “enrollment status” and the payload will be much smaller (i.e. only the columns/values that need to be updated).
Fetch a business
Endpoint for fetching full business info
GET /services/v1/businesses/{business_id}
Example response
{
"business": {
"business_id": "aef3962b-37a7-4fac-8548-82ec60468e2f",
"sales_contract_uuid": "afbded54-65ac-4e28-b7e4-3e62ce1af7f5",
"locations": [],
"reviews": []
}
}
business_id
uuid
A uuid for the business that’s being fetched.
sales_contract_uuid
uuid
A uuid for the active contract associated with this business. Note that although a business can be associated with multiple contracts, this will be the uuid for the sole active contract associated with this business.
Create review
Endpoint for creating new reviews. Please note that you must include a business_id
in order to create a review, otherwise the system has no idea which business the review belongs to, and we’ll return a 422
.
POST /services/v1/reviews
Example request
{
"review": {
"business_id": "b38ea377-bc83-4051-a2b8-29286e4a866b",
"first_name": "John",
"last_name": "Smith",
"email": "jsmith@gmail.com",
"phone": "555-555-5555",
"location_name": "Stepping Stone South Park Meadows"
}
}
Successful response
{
"review": {
"uuid": "aef3962b-37a7-4fac-8548-82ec60468e2f",
"first_name": "John",
"last_name": "Smith",
"email": "jsmith@gmail.com",
"phone": "555-555-5555",
"location_name": "Stepping Stone South Park Meadows"
}
}
business_id required
uuid
A text-based uuid that allows us to determine which business the reference/review should be attached to.
first_name required
string
The first name of the customer who gave the review.
last_name
string
The last name of the customer who gave the review.
email required
string
The email of the customer who gave the review.
phone required
string
The phone number of the customer who gave the review.
location_name
string
The name of the location that the customer reviewed. This must match a location/provider
object name exactly.
Update review
Endpoint for updating existing reviews. No update will take place if the system detects that this review has already been verified (in which case the system will respond with a 422
error). Note that clients can update specific fields rather than passing the entire review object"
PATCH /services/v1/reviews/{review_uuid}
Example request
{
"review": {
"email": "jsmith@gmail.com"
}
}
Successful response
{
"review": {
"uuid": "aef3962b-37a7-4fac-8548-82ec60468e2f",
"first_name": "John",
"last_name": "Smith",
"email": "jsmith@gmail.con",
"phone": "555-555-5555",
"location_name": null
}
}
Update a license
PATCH /services/v1/licenses/{uuid}
Example request
{
"license": {
"status": "licensed"
}
}
Successful response
{
"license": {
"uuid": "afbded54-65ac-4e28-b7e4-3e62ce1af7f5",
"status": "licensed",
"approved": true,
"business_name": "Test business",
"state": "CA",
"postal_code": "94110"
}
}
Endpoint for updating existing licenses during the safety and review process.
status required
string
A string enum indicating the status of the license review process. Possible values include: under_review
, approved
, rejected
, or unknown
.
Update an offering
PATCH /services/v1/offerings/{uuid}
Example request
{
"offering": {
"active": true
}
}
Successful response
{
"offering": {
"uuid": "afbded54-65ac-4e28-b7e4-3e62ce1af7f5",
"active": true,
"capacity": 50,
"open_time": null,
"close_time": null,
"vertical": "child_care",
"service": "centers",
"start_week": null,
"end_week": null,
"min_months": 6,
"max_months": 24
}
}
Endpoint for canceling or activating specific offerings. Note that this endpoint only takes one argument: active
. Attempts to update other attributes will fail silently.
active
boolean
A boolean indicating whether this offering is active or inactive.
Update a provider
PATCH /services/v1/providers/{uuid}
Example request
{
"provider": {
"ads_status": "active"
}
}
Successful response
{
"provider": {
"name": "Stepping Stone South Park Meadows",
"uuid": "afbded54-65ac-4e28-b7e4-3e62ce1af7f5",
"salesforce_id": "123abc-saleforce-id",
"address": {},
"offerings": [],
"license": {},
"monthly_advertising_budget": 30000,
"budget_currency": "USD",
"advertising_areas": [ "78748", "77801", "93849" ],
"phone": "555-555-5555"
}
}
Endpoint for pausing, activating, or permanently pausing (i.e. canceling) a provider (aka a “location”).
ads_status
string
Used to set an explicit status for a provider; possible values are unknown
, active
, paused
, or inactive
.
Provider API
This section describes the endpoints namespaced behing the API providers
path. Many of these endpoints feature similar logic and formatting to the consumer-facing side of the application.
Please note that after successfully authenticating the provider user, the client should pass a Provider-ID
value in all request headers. This allows the server to determine which provider the user is looking to access. If the server can’t find a valid provider for that ID, it will respond with 403 Forbidden
.
Provider errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“provider_forbidden” | You either didn’t pass a provider-id in the headers or there is no provider associated with the ID that you did pass. |
Provider object
A provider is an account on Galore that lists events, manages reservations, and accepts payments. A provider is a parent object that contains at least one or more instructor objects as well organization objects (although a provider must have at least one instructor, organizations are not required).
id
integer
The integer ID of the provider account.
name
string
The provider’s name
chargeable
boolean
This boolean controls whether or not we will actually process payment on the Galore platform. If false
then the provider will collect payment from the customer in person or through another means. This is only the case with a small number of providers who have different payment contracts with us.
slug
string
Parameterized version of an providers’s name, e.g. for “Little Artistas” the slug would be “little-artistas”. Useful for constructing a url/path for this resource.
subdomain
string
Parameterized version of an provider’s name with no spaces, e.g. for “Little Artistas” the subdomain would be littleartistas
. Useful for constructing a url/path for this resource.
thumb_url
string
URL for thumbnail
small_url
string
URL for small size
medium_url
string
URL for medium size
Provider user attributes
owner
boolean
Owner permissions grant the current user global visibility
admin
boolean
Grants the current user access to all of the dashboard/app except certain marketing and finance functions.
finance
boolean
Finance permissions
schedule
boolean
Schedule permissions
marketing
boolean
Marketing permissions
Provider login
POST /providers/v1/sessions
Example request
{
"email": "test@getgalore.com",
"password": "password"
}
Successful response
{
"user": {
"id": 1,
"full_name": "Max Stiles",
"first_name": "Max",
"last_name": "Stiles",
"email": "max.hainesstiles@gmail.com",
"phone": "9732079450",
"created": 1456528752,
"confirmed": 1465857620,
"authentication_token": "{TOKEN}",
"facebook_id": null,
"avatar_thumb": "https://s3.amazonaws.com/galore-dev/avatar_1_thumb.png?1466533222",
"avatar_small": "https://s3.amazonaws.com/galore-dev/avatar_1_small.png?1466533222",
"avatar_medium": "https://s3.amazonaws.com/galore-dev/avatar_1_medium.png?1466533222",
"owner": true,
"admin": true,
"marketing": true,
"finance": true,
"schedule": true,
"providers": [
{
"id": 30,
"name": "Demo Galore",
"subdomain": "demogalore",
"image_thumb": null,
"image_small": null,
"locations": [
{
"id": 494,
"line1": "Fort Mason Center, 2 Marina Blvd. Bldg. D",
"line2": null,
"city": "San Francisco",
"state": "California",
"postal": "94109",
"phone": null,
"longitude": -122.4318391,
"latitude": 37.806817,
"timezone": "Pacific Time (US & Canada)",
"neighborhood": "",
"name": "Blue Bear School of Music",
"directions": null,
"yelp_business_id": null
}
],
"tags": [
{
"id": 25,
"title": "Whiskey"
},
{
"id": 26,
"title": "Beer 2016-2017"
}
],
"cohorts": [
{
"id": 3,
"name": "3 yr olds",
"color": null
},
],
"memberships": [
{
"id": 25,
"title": "Sample membership name"
},
{
"id": 26,
"title": "Another sample membership name"
}
]
},
{
"id": 54,
"name": "Demo Galore 2",
"subdomain": "demogalore2",
"image_thumb": null,
"image_small": null,
"locations": [],
"tags": []
}
]
}
}
email required
string
A validated email string.
password required
string
User password (for existing account).
Provider login errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You didn’t pass your info inside a user block. |
400 |
“invalid_email” | You didn’t include an email parameter |
400 |
“invalid_facebook_auth” | You tried to connect via Facebook but didn’t include a facebook_access_token |
403 |
“no_provider” | A parent trying to log into the provider app |
422 |
“invalid_password” | You either didn’t include a password parameter, or the password is not valid. |
422 |
“invalid_facebook_auth” | You tried to connect via Facebook using an invalid facebook_access_token |
422 |
“user_already_exists” | We found an account for that email address, but your password wasn’t valid (so we couldn’t automatically log you in) |
Provider events
GET /providers/v1/events
{
"total": 10,
"page": 1,
"last_page": false,
"activities": [
{
"id": 4957,
"title": "repeat timezone test",
"start_time": 1468256400,
"end_time": 1468260000,
"price_integer": 5000,
"currency": "USD",
"drop_in": null,
"indoor": true,
"outdoor": false,
"about": "The about section",
"spots": 3,
"available_spots": 1,
"reserved_spots": 2,
"start_months_old": 0,
"end_months_old": 0,
"camp": false,
"date_night": false,
"purchasable": true,
"drop_off": true,
"for_kids": null,
"only_purchasable_as_trial": false,
"has_memberships": true,
"has_event_packages": true,
"activity_location": {
"hidden": false,
"directions": null,
"location": "..."
},
"allows_waitlist": true,
"waitlists":[
{
"id": 2,
"spots": null,
"kids":[
{
"id": 5
}
]
}
],
"discounts": [],
"package_eligible": true,
"membership_eligible": true,
"provider": null,
"series": null,
"instructors": [],
"organizations": [],
"photos": []
}
]
}
Fetches an array of provider activities as well as the attributes page
and total
. Note that filtering uses the /events
endpoint, except with one or more of the below optional arguments.
Response Objects
activities
Array
An array of activity objects
total
integer
The total number of results the API was able to find based on the user’s search criteria.
page
integer
The current page from the paginated response object. Useful for building infinite scroll.
last_page
boolean
A boolean value indicating whether there are more records to return or if this was the last page in the paginated response. Useful for building infinite scroll.
Optional Arguments
past
boolean
Whether the API should return reverse chronologically sorted events in the past. The default is to return only upcoming events in chronological order.
latitude
float
If you don’t pass a latitude, the API will not be able to scope by location – which is crazy. If the user has not given the app permission to determine coordinates, you can pass the latitude for San Francisco.
longitude
float
If you don’t pass a longitude, the API will not be able to scope by location – which is crazy. If the user has not given the app permission to determine coordinates, you can pass the longitude for San Francisco.
distance
float
The filter radius in kilometers. The API defaults to 32.1869km if no distance
parameter is passed in.
count
integer
An integer representing how many results you want returned per page. If you don’t pass a count
parameter in your request, the server will default to a default page size of 30
combined activity and series results.
page
integer
The desired page to return. Always 1
after a refresh, then incremented up by 1
as the user scrolls.
search
string
A search term.
dates
Array
An array of dates in “yyyy-mm-dd” format (e.g. [“2017-01-01”,“2017-09-29”]).
start_date
integer Unix timestamp
The beginning date range that a parent wants to filter for.
end_date
integer Unix timestamp
The end date range that a parent wants to filter for.
day
array
An array of one or more day strings in capital case (e.g. day[]=Tuesday&day[]=Wednesday
) in order to return events that take place on that/those days. Note that a series object will be returned if the first date in that series falls on a day you’re trying to filter for.
drop_in
boolean
Response will include only drop-in activities.
series
boolean
Response will include non-camp series, i.e. if a camp is also a series, the series will appear in the camp tab but not the series tab.
camp
boolean
Response will include all camps (e.g. for both series and activities).
date_night
boolean
Response will include date nights.
months
array
An array of integers representing the filter months.
free
boolean
Whether the event is free (i.e. price == 0).
offers_discount
boolean
Whether the event offers a sibling discount.
drop_off
boolean
Whether a parent or caregiver can drop their kid off.
indoor
boolean
Whether the event is indoor.
outdoor
boolean
Whether the event is outdoors.
grown_ups
boolean
These events are intended for grown-ups, but kids are welcome too.
grown_ups_only
boolean
This event is only for grown-ups (no kids allowed).
Attendance (providers)
Although a list of attendees can be requested via the event itself (e.g. GET /providers/v1/activites/{ID}
or GET /providers/v1/series/{ID}
), marking kids and/or customers as having attended or not is done via a separate endpoint: POST /attendances
. This endpoint is responsible for handling the Attendance
object, which is tied to an underlying reservation_activity
(for grown-up events) or kid_reservation
(for kids events), or a purchase
object (e.g. a memberships).
Mark attended/not attended
POST /providers/v1/attendances
Sample requests
{
"attendance": {
"reservation_activity_id": 1233
},
"attended": true,
"signature": {
"image": "..."
}
}
{
"attendance": {
"kid_reservation_id": 1233
},
"attended": false
}
{
"attendance": {
"purchase_id": 1233,
"attendance_date": "yyyy-mm-dd"
},
"attended": true
}
{
"attendance": {
"kid_purchase_id": 1,
"attendance_date": "yyyy-mm-dd"
},
"attended": true
}
Sample response
{
"attended": true
}
attended required
boolean
A boolean indicating whether the attendee was present. Note that this could be a kid — in the instance of a kid_reservation
— or a customer — in the instance of a reservation_activity
for a grown ups event.
attendance[kid_reservation_id]
integer
The integer ID of the kid_reservation in question.
attendance[reservation_activity_id]
integer
The integer ID of the reservation_activity in question — note that this will only apply to events for grown-ups.
attendance[purchase_id]
integer
The integer ID of the object purchased by the user — for example, for a membership purchase.
attendance[kid_purchase_id]
integer
The integer ID of the kid_purchase
in question (a kid_purchase
is our way of tracking a specific kid within a purchase, e.g. if a parent purchases a membership
for two kids, then that single purchase
object would have two kid_purchases
, one for each kid.
attendance[attendance_date]
string
A string representing the date associated with this attendance
object—it could be today, sometime in the past, or in the future—formatted as “yyyy-mm-dd”. If the client does not include an attendance_date
value when creating and/or updating attendance
objects, the API will assume the client is attempting to manipulate the attendance
for the current day.
attendance[attended_at]
integer
A unix timestamp representing the date and time when the customer was marked as attended. If the client does not send this value when attempting to mark someone as attended, the attended_at
value will default to the current time.
attendance[kid_purchase_id]
integer
The integer ID of the kid_purchase in question.
attendance[kid_purchase_ids]
array
An array of integer IDs for the kid_purchase in question. Use this to mark multiple kid membership attendances at once.
Attendance errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found_error” | The server could not find a reservation_activity, kid_reservation, or purchase for the ID passed |
422 |
“validation_error” | There was a server-side error while trying to process this attendance object |
Customers (providers)
Fetch all customers (providers)
GET /providers/v1/customers
Example request
GET /providers/v1/customers?search=Sample&ptransaction=Membership
Example response
{
"page": 1,
"total": 1,
"last_page": true,
"customers": [
{
"id": 72,
"user_id": 87,
"notes": null,
"created": 1520109061,
"first_name": "Sample",
"last_name": "User 2",
"phone": "5555555556",
"email": "max+sample@getgalore.com",
"kids": [],
"caregivers": [],
"address": {
"id": 123,
"line1": "5th Street",
"line2": null,
"city": "New York",
"state": "New York",
"postal": "10035",
"phone": null,
"longitude": -73.9882362,
"latitude": 40.7433922
}
}
]
}
This endpoint is used when a provider wants to see a full customers list and/or search for specific customers. Note the /customers
endpoint uses a parameters structure identical to that used on the web-based Connect dashboard (e.g. https://ccsdemogalore.getgalore-staging.com/dashboard/reports?type=customers).
Fetch single customer (providers)
GET /providers/v1/customers/{ID}
Example request
Example response
{
"customer": {
"id": 72,
"user_id": 87,
"notes": null,
"created": 1520109061,
"first_name": "Sample",
"last_name": "User 2",
"phone": "5555555556",
"email": "max+sample@getgalore.com",
"kids": [],
"caregivers": [],
"purchases": [],
"reservations": [],
"address": {
"id": 123,
"line1": "5th Street",
"line2": null,
"city": "New York",
"state": "New York",
"postal": "10035",
"phone": null,
"longitude": -73.9882362,
"latitude": 40.7433922
}
}
}
This endpoint is used when a provider wants more information on a specific customer.
Create customer (providers)
POST /providers/v1/customers
Example response
{
"customer": {
"email": "email@getgalore.com",
"phone": "555-555-5555",
"first_name": "First",
"last_name": "Name"
}
}
This endpoint is used when a provider wants to add a new customer to their account. This will either create a new user
or add an existing user
as a customer
of this provider
(although this would be contingent on the provider verifying the user’s email address and phone number). A first_name
and either email
or phone
values are required in order to create/fetch a valid user
.
Provider customers endpoint errors
HTTP Code | Error code | Description |
---|---|---|
422 |
“validation_error” | “Something went wrong” [while trying to create the user (e.g. missing an email address)] |
Update customer (providers)
PATCH /providers/v1/customers/{ID}
Example request
{
"customer": {
"notes": "These are customer notes",
"address": {
"line1": "5th Street",
"line2": null,
"city": "New York",
"state": "New York",
"postal": "10035",
"phone": null,
"longitude": -74.1967810816327,
"latitude": 39.9772519795918,
"timezone": "Eastern Time (US & Canada)",
"neighborhood": null
}
}
}
This endpoint is used when a provider needs to update customer info via the provider app (i.e. during sign in/out mode).
Example response
{
"customer": {
"id": 72,
"user_id": 87,
"notes": null,
"created": 1520109061,
"first_name": "Sample",
"last_name": "User 2",
"phone": "5555555556",
"email": "max+sample@getgalore.com",
"kids": [],
"caregivers": [],
"purchases": [],
"reservations": [],
"address": {
"id": 123,
"line1": "5th Street",
"line2": null,
"city": "New York",
"state": "New York",
"postal": "10035",
"phone": null,
"longitude": -73.9882362,
"latitude": 40.7433922
}
}
}
This endpoint is used when a provider wants to update a customer; for example, by changing the notes
attribute.
Provider customers endpoint errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“no_user” | Couldn’t find the user account |
Caregivers (providers)
Create caregiver (providers)
POST /providers/v1/caregivers
Example request
{
"user_id": 1,
"caregiver": {
"first_name": "John",
"last_name": "John",
"email": "test@getgalore.com",
"phone": "5555555555"
}
}
This endpoint is used when a customer or caregiver needs to add caregiver info via the provider app (i.e. during sign in/out mode).
Arguments
user_id required
integer
The integer ID for the user object on which to attach this caregiver.
first_name required
string
e.g. “John”
last_name required
string
e.g. “Smith”
string
Either an email or phone number is required.
phone
string
Either an email or phone number is required.
Provider caregivers endpoint errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You didn’t pass your info inside a caregiver block |
404 |
“no_user” | Couldn’t find the user account on which to create/add this caregiver |
422 |
“validation_failed” | There was an unknown error while trying to create this caregiver. The error_message may have more info. |
Events (providers)
Fetch activity
Fetching a for_kids
activity will return reservation_activity
objects with kid_reservations
and caregivers
arrays but no top-level attended
or signed_out
boolean. The attended
and signed_out
boolean will be passed inside each kid_reservation
object.
Activities for grown-ups, however, will not include kid_reservations
or caregivers
arrays but will include spots
as well as top-level attended
and signed_out
booleans.
GET providers/v1/activities/{ID}
{
"activity": {
"price_integer": 1000,
"id": 1438,
"title": "Weekly wednesday waitlist",
"about": "This is a waitlist",
"camp": false,
"extras": [],
"link": null,
"online_link": null,
"spots": 0,
"available_spots": 0,
"reserved_spots": 0,
"max_spots_per_reservation": null,
"start_months_old": 0,
"end_months_old": 0,
"drop_in": null,
"date_night": false,
"day_pass": false,
"indoor": true,
"outdoor": true,
"purchasable": true,
"canceled": false,
"instructions": "",
"allows_waitlist": true,
"caregiver_string": "Required: an adult must stay",
"unique_product_id": "ACTIVITY_1438",
"currency": "USD",
"appointment": false,
"top_line_price_integer": 1000,
"ticket_price_integer": 0,
"top_line_ticket_price_integer": 0,
"for_kids": true,
"start_time": 1543431600,
"end_time": 1543442400,
"session_index": null,
"start_time_iso_string": "2018-11-28T11:00:00-08:00",
"end_time_iso_string": "2018-11-28T14:00:00-08:00",
"purchasable_end_time": 1543442400,
"drop_off": false,
"show_kid_picker": true,
"show_ticket_picker": null,
"last_photo_share_at": 1535383485,
"photos": [],
"reservation_activities": [
{
"id": 939,
"spots": null,
"user": {},
"kid_reservations": [
{
"id": 1503,
"attended": true,
"signed_out": false,
"kid": {
"id": 43,
"first_name": "Decaf",
"last_name": "Coffee",
"gender": 2,
"allergies": "coffee",
"notes": "hates tigers",
"birthdate": 1397649600,
"birthdate_string": "2014-04-16",
"schools": [],
"cohorts": [],
"users": []
}
}
],
"reservation_extras": [],
"caregivers": [],
"completed_form_fields": [
{
"value_type": "confirmation",
"id": 400,
"assigned_form_field_id": 1077,
"kid_id": 3,
"attendee": null,
"value": true
}
],
"attended": true,
"signed_out": false
}
],
"assigned_form_fields": [
{
"field_type": "confirmation",
"id": 1077,
"required": true,
"prompt": "Do you like coffee?",
"each_attendee": true
}
],
"waitlists": [],
"customer_photos": []
}
}
Fetch series
GET providers/v1/series/{ID}
{
"series": {
"photos": [],
"customer_photos": [],
"reservation_activities": []
}
}
Memberships (providers)
Fetch all memberships
GET providers/v1/memberships
{
"page": 1,
"total": 1,
"last_page": true,
"memberships": [
{
"id": 9,
"title": "Single month membership",
"for_kids": false,
"updated": 1547679424,
"currency": "USD",
"expiration_period_interval": 1,
"visible": true,
"active": true,
"price_integer": 10826,
"members": 2,
"photos": []
}
]
}
Returns an array of this provider’s membership objects. as well as the attributes page
and total
. Note that there are optional arguments below that can be used for filtering.
Response Objects
memberships
Array
An array of membership objects
total
integer
The total number of results the API was able to find based on the user’s search criteria.
page
integer
The current page from the paginated response object. Useful for building infinite scroll.
last_page
boolean
A boolean value indicating whether there are more records to return or if this was the last page in the paginated response. Useful for building infinite scroll.
Optional Arguments
count
integer
An integer representing how many results you want returned per page. If you don’t pass a count
parameter in your request, the server will default to a default page size of 30
membership results.
page
integer
The desired page to return. Always 1
after a refresh, then incremented up by 1
as the user scrolls.
search
string
A search term.
has_active_members
boolean
Whether the API should return only memberships that have active members.
Fetch a membership
An object that can be purchased by customers which can auto-renew monthly or annually. Note that membership
refers to the object that’s managed by the provider and that a purchase
object is the object used to track when a customer has actually purchased a membership. purchase
objects may also include an array of attendances
, indicating on which dates the customers have used their memberships.
GET providers/v1/memberships/{ID}
{
"membership": {
"id": 9,
"title": "Single month membership",
"about": "Just 1",
"updated": 1547679424,
"auto_renew": true,
"pro_rata": false,
"for_kids": false,
"unique_product_id": "MEMBERSHIP_9",
"currency": "USD",
"expiration_period_interval": 1,
"expiration_period_units": "months",
"minimum_period_interval": null,
"minimum_period_units": null,
"visible": true,
"active": true,
"price_integer": 5020,
"tags": [],
"photos": [],
"members": 4,
"purchases": [
{
"id": 155,
"purchase_count": 1,
"paused": null,
"created": 1518037837,
"charge_amount_integer": 10000,
"user": {
"id": 1,
"first_name": "Max",
"last_name": "Haines-Stiles",
"phone": "9732079450",
"email": "max.hainesstiles@gmail.com",
"created": 1508685962
},
"completed_form_fields": [],
"kid_purchases": [
{
"id": 48,
"kid_id": 1,
"first_name": "Nebuchadnezzar",
"last_name": "",
"gender": null,
"allergies": "",
"notes": ""
}
],
"attendances":[
{
"id": 123,
"kid_id": 1073,
"attended_at": 1508685962,
"attendance_date": "2018-09-19",
"notes": null
},
{
"id": 123,
"kid_id": null,
"attended_at": null,
"attendance_date": "2018-09-19",
"notes": "Late for class"
}
]
}
]
}
}
Signature (providers)
These endpoints allow the client to create as well as destroy signatures captured during the process of signing attendeed in or out.
Document a signature
The signature creation endpoint requires the presence of an image file and either an array of kid_reservation_ids
or reservation_activity_ids
. The presence of at least one of these arrays ensures that the server will use either one or more existing attendance
objects (i.e. if the provider has already checked in the attendee(s)) or will create one or more new attendance
objects on the fly.
POST /providers/v1/signatures
Sample requests
{
"signature": {
"image": "...",
"caregiver_id": 1,
"signature_type": "sign_in"
},
"kid_reservation_ids": [123]
}
Sample response
{
"signature": {
"id": 1,
"image_file_name": "image.jpg",
"created": 1234567,
"small_url": "http://s3amazon.whatever_small.jpg",
"original_url": "http://s3amazon.whatever_original.jpg",
"signature_type": "sign_in",
"provider": {
"id": 1
},
"caregiver": "..."
}
}
Required
signature[image] required
file
The signature image captured by the device. The server will create a signature
object and attach that signature to each applicable attendance.
Note that this is a multipart request, meaning the client should use "Content-Type", "multipart/form-data"
.
You can set the filename via Content-Disposition
, e.g. "Content-Disposition: form-data; name="signature[image]"; filename="test_signature.jpg"\r\nContent-Type: image/jpg\r\n">
signature[caregiver_id] required
integer
The integer ID of the caregiver who’s signing the attendee in or out.
signature[signature_type] required
string
Should be either "sign_in"
or "sign_out"
.
kid_reservation_ids
array of integers
An array of integer IDs representating the kid_reservations
being signed for.
reservation_activity_ids
array of integers
An array of integer IDs representating the reservation_activities
being signed for.
Signature errors
HTTP Code | Error code | Description |
---|---|---|
422 |
“validation_error” | There was a server-side error while trying to process this signature |
Destroy a signature
This is how you destroy a signature. Duh.
DELETE /providers/v1/signatures/{ID}
Signature errors
HTTP Code | Error code | Description |
---|---|---|
403 |
“forbidden_error” | The client attempted to delete a signature that didn’t belong to that provider account |
Get enrollment (providers)
GET /providers/v1/customers/enrollment
Example request
GET /providers/v1/customers/enrollment?activity_id=100&phone=5555555555
Example response
{
"user": {
"id": 1,
"first_name": "Test",
"last_name": "User",
"kids": [
{
"id":2,
"first_name":"Kid",
"eligible": true,
"enrolled": false,
"message": null
}
],
"caregivers": [
{
"id":3,
"first_name":"Joe",
"last_name": "Caregiver"
}
]
}
}
This endpoint is used when a customer begins the check-in process at a provider kiosk. The customer will enter a phone number (and the API client will also send an activity_id
) and the API will respond with membership_purchases
, event_package_purchases
and reservations
that are eligible enrollments for this user and this particular event.
Arguments
activity_id required
integer
The integer ID for an activity object that the client is checking.
phone required
string
The phone number for the user in question.
Reservations (providers)
Reserve/enroll
POST /providers/v1/reservations
Example request
{
"reservation": {
"caregiver_ids":[50],
"activities":[
{
"activity_id": 33442,
"kid_ids": [175],
"until": "2019-11-01"
}
]
},
"customer_id": 1,
"card_id": "{CARD_ID}"
}
Example response
{
"reservation": {
"id": 316,
"canceled": false,
"attended": null,
"reviewed": false,
"purchasable": true,
"created": 1471878828,
"updated": 1471878828,
"user": {
"id": 1
},
"kids": [],
"reservation_extras": [],
"caregivers": [],
"activities": [
{
"id": 5129,
"title": "Duffel Repeat",
"price_integer": 2500,
"currency": "USD",
"start_time": 1472072400,
"end_time": 1472076000,
"provider": {
"id": 1,
"name": "Demo Galore"
},
"activity_location": {
"location": { }
}
}
]
}
}
This endpoint is used when the provider wants to create a reservation/enrollment on the customer’s behalf.
Arguments
customer_id or user_id required
integer
The integer ID for the customer.
reservation required
object
Update
PATCH /providers/v1/reservations/{ID}
Example request
{
"reservation": {
"caregiver_ids":[50],
"activities":[
{
"activity_id": 33442,
"kid_ids": [175],
"until": "2019-11-01"
}
]
},
"customer_id": 1,
"card_id": "{CARD_ID}"
}
Example response
{
"reservation": {
"id": 316,
"canceled": false,
"attended": null,
"reviewed": false,
"purchasable": true,
"created": 1471878828,
"updated": 1471878828,
"user": {
"id": 1
},
"kids": [],
"reservation_extras": [],
"caregivers": [],
"activities": [
{
"id": 5129,
"title": "Duffel Repeat",
"price_integer": 2500,
"currency": "USD",
"start_time": 1472072400,
"end_time": 1472076000,
"provider": {
"id": 1,
"name": "Demo Galore"
},
"activity_location": {
"location": { }
}
}
]
}
}
This endpoint is used when the provider wants to update an existing reservation on the customer’s behalf.
Arguments
customer_id or user_id required
integer
The integer ID for the customer.
reservation required
object
Members (providers)
Fetch all members (providers)
GET /providers/v1/members
Example response
{
"page": 1,
"total": 1,
"last_page": true,
"members": [
{
"id": 72,
"type": "User/Kid",
"first_name": "Sample",
"last_name": "User 2",
"memberships": [
{
"purchase_id": 176,
"title": "Pancakes"
}
]
}
]
}
This endpoint is used when a provider wants to see a list of all user
and kid
objects who are signed up for memberships
. Optionally provider a membership_id
if you’d like to receive members for a specific membership rather than all memberships
in a certain provider account.
User credits (providers)
Create a user credit (providers)
POST /providers/v1/user_credits
Example request
{
"user_id": 1,
"name": "Promo2000"
}
This endpoint is used when a provider needs to add a user credit value for a customer via the provider app.
Arguments
user_id required
integer
The integer ID for the user object on which to attach this caregiver.
name
string
Leave blank of the provider is simply trying to add credit to a customer’s account. If trying to redeem a promo on a customer’s behalf, use the name of the promo that the provider is trying to redeem. Note that if you pass a value for name
the server will assume you’re trying to redeem a promo and will respond with a failure if it can’t find that promo name.
Provider user credits endpoint errors
HTTP Code | Error code | Description |
---|---|---|
400 |
“bad_request” | You didn’t pass your info inside a caregiver block |
404 |
“no_user” | Couldn’t find the user account on which to add this credit/promo |
404 |
“no_promo” | Couldn’t find the promo you’re trying to redeem |
422 |
“validation_failed” | There was an unknown error while trying to create this credit. The error_message may have more info. |
Users (providers)
Reservation booking
GET /providers/v1/users/booking?activity_id={ACTIVITY ID}
GET /providers/v1/users/booking?series_id={SERIES ID}
Example response
{
"eligible": true,
"eligible_error_message": null,
"user": {},
"activity_reservation": {},
"series_reservation": {},
"activity": {},
"series": {}
}
This endpoint is designed for refreshing the client before entering the purchase flow for an activity or series. The response will include updated kid, caregiver, payment method, and credit/promo information. It’s advisable to grab booking info for both the activity and series, if applicable – it’s possible that a user may have reservations for both.
The client must pass the user’s authentication_token
in the request header, otherwise the API will respond with a 403
.
Parameters
activity_id | series_id
integer
The ID for either the activity or series in question
Response attributes
user
integer
The user’s integer-based ID
string
Email as a string. What else?
phone
string
The user’s current phone number (must be confirmed)
eligible
boolean
This attribute is present on the top level as well as each kid
object. On the top level, eligible
denotes whether the user or any kids are able to reserve this event or purchase this item. On the kid object, eligible
denotes whether or not the specific kid can reserve the event.
eligible_error_message
string
This attribute is also present on the top level as well as each kid
object. If eligible
is false
, this will be a user-friendly, printable error string explaining why the user is not eligible to reserve/purchase this object. If eligible
is set to true
, this field will either be null
or will not be present.
user
User object
Returns a user object, including cards
, caregivers
, kids
, and user_credits
.
series_reservation
Series reservation
Returns a reservation object for this series, if present.
activity_reservation
Activity reservation
Returns a reservation object for this activity, if present.
activity
Abbreviated activity object
An abbreviated activity object will be returned with the up-to-date pricing info for the signed in user. This will include any trials or discounts that may be associated with the activity.
top_line_price_integer
: The initial price of the activity before any discounts or trials are applied.price_integer
: The per-ticket price that should be used during the reservation charge calculation. If desired, mobile clients can display thetop_line_deductions
to show the user how they’re saving money.top_line_deductions
: Array of deduction objects withtype
,name
, anddeduction_amount_integer
that specify how thetop_line_price_integer
was reduced to theprice_integer
. The sum of theamount_integers
in thetop_line_deductions
should equal the different between thetop_line_price_integer
and theprice_integer
. Currently, the type will either betrial
ordiscount
.package_credits
: Array ofpackage_credit
objects withtitle
andremaining_uses
. Eachremaining_use
can be applied to one spot in the reservation. If the user reserves more spots than theremaining_uses
, then theprice_integer
should apply for each additional spot.trial
: The trial object will only be present if there is indeed an active trial on the activity.only_purchasable_as_trial
: Boolean. Atrue
value means this event can only be reserved if theuser_eligible_for_trial
istrue
(i.e. if the user has not made a reservation with this provider before).user_eligible_for_trial
: A boolean describing whether or not the user is eligible for the trial. This attribute only needs to be checked ifonly_purchasable_as_trial
istrue
.
If a trial
object is present, the client should check the user_eligible_for_trial
and only_purchasable_as_trial
attributes. If only_purchasable_as_trial == true
and user_eligible_for_trial == false
then the reservation will fail since this event can only be reserved by new customers of this provider. In that case, the client should take action to redirect the user to other activities from the provider (or some other helpful action). That is the only trial-related situation that requires active action. In other cases, the top_line_deductions
and price_integer
will contain the information needed to calculate the charge.
series
Abbreviated series object
An abbreviated series object will be returned with the up-to-date pricing info for the signed in user. This will include any discounts that may be associated with the activity.
In the reservation workflow, mobile clients should use the price_integer
as the per-ticket price. If desired, mobile clients can display the top_line_deductions
to show the user how they’re saving money.
The top_line_deductions
will be an array of objects that specify how the top_line_price
was reduced to the price_integer
. The sum of the deduction_amount_integers
in the top_line_deductions
should equal the different between the top_line_price_integer
and the price_integer
. The only type
of deduction for series is discount
.
Purchase booking
GET /providers/v1/users/booking?membership_id={MEMBERSHIP ID}
GET /providers/v1/users/booking?product_id={PRODUCT ID}
GET /providers/v1/users/booking?event_package_id={EVENT PACKAGE ID}
Example response
{
"user": {},
"product_purchase": {},
"product": {}
}
This endpoint is designed for refreshing the client before entering the purchase flow for a membership, product, event package. The response will include updated kid, payment method, and credit/promo information.
The client must pass the user’s authentication_token
in the request header, otherwise the API will respond with a 403
.
Parameters
membership_id | product_id | event_package_id
integer
The ID for the membership, product or event_package in question
Response attributes
user
User object
Returns a user object, including cards
, caregivers
, kids
, and user_credits
.
membership_purchase
Purchase object
Returns an abbreviated purchase object for this membership, if present.
product_purchase
Purchase object
Returns an abbreviated purchase object for this product, if present.
event_package_purchase
Purchase object
Returns an abbreviated purchase object for this event package, if present.
membership
Membership object
An abbreviated membership object.
product
Product object
An abbreviated product object.
event_package
Event package object
An abbreviated event_package object.
Create & update photo(s)
POST /photos
PATCH /photos/{ID}
Required
image required
file
The image/pdf that’s being uploaded from the device.
Note that this is a multipart request, meaning the client should use "Content-Type", "multipart/form-data"
.
You can set the filename via Content-Disposition
, e.g. "Content-Disposition: form-data; name="photo[image]"; filename="Photo_Test_avatar.jpg"\r\nContent-Type: image/jpg\r\n">
Optional
photo[caption]
string
Descriptive text used to provider context for the photo.
photo[activity_id] | photo[series_id]
integer
The ID for either the activity or series to be tagged in this photo.
photos[kid_ids]
integer array
An array of kid objects you’d like to tag in this photo.
photo[organization_ids]
integer array
An array of kid objects you’d like to tag in this photo.
photos[visible]
boolean
Whether the photo should be publicly visible.
Share photo(s)
POST /photos/share
Required
activity_id or series_id required
array
An integer ID for the event you’d like to share with customers.
recipient_ids required
array
An array of integers representing the users you’d like to send these photos to.
Waitlists (providers)
Add customer to waitlist (providers)
POST /providers/v1/waitlists
Example request
{
"waitlist": {
"series_id": 130,
"kid_ids": [123,1234],
"message": "Pretty please!"
}
}
Successful response
{
"waitlist": {
"id": 5,
"kids": [
{
"id": 123,
"first_name": "Idiot 1",
"last_name": "Kid"
},
{
"id": 1234,
"first_name": "Idiot 2",
"last_name": "Kid"
}
],
"spots": null,
"activity": null,
"series": {
"id": 130
},
"user": {
"id": 1
},
"message": "Pretty please!",
"created": 1463424607,
"notified": null
}
}
Arguments
activity_id or series_id required
integer
The integer ID of the Series
or Activity
the user wants to get on the waitlist for, wrapped inside a waitlist
object.
kid_ids
array
An array of integer IDs for the kids that will attend the event, wrapped inside a waitlist
object. Required if the event is for_kids
.
spots
integer
The count of spots that the customer wants reserved for the event, wrapped inside a waitlist
object. Required if the event is not for_kids
.
message
string
Exactly what you’d think. Not required.
Waitlist errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found” | There isn’t an activity or series associated with the activity_id /series_id that you passed. |
422 |
“validation_failed” | This event does not offer a waitlist or you forgot to include kid_ids or spots . |
422 |
“spots_available” | Spots are now available for this event. Note that the number of spots will also be passed in the error response, i.e. {"error": "Spots available", "spots": 2} |
Update a waitlist
PATCH /providers/v1/waitlists/{ID}
Example request
{
"waitlist": {
"activity_id": 13,
"spots": 2,
"message": "My friend is coming too"
}
}
Same arguments and error responses as the get on waitlist endpoint.
Remove from waitlist
DELETE /providers/v1/waitlists/ID
Successful response
{
"success": true
}
Waitlist errors
HTTP Code | Error code | Description |
---|---|---|
404 |
“not_found” | This waitlist either never existed or it was already destroyed. |
403 |
“forbidden” | The client tried to delete a waitlist that belonged to a different user |
Webhooks
Set up real-time webhooks to get notified when certain events happen on the platform. Just provide a valid endpoint, and we’ll send event data directly to it.
See below for details on what events are supported, when they’re triggered, and the payload structure.
Setting Up a Webhook
- Go to the Webhooks Section:
- Navigate to the Webhooks section in your dashboard.
- Add an Endpoint:
- Click the “Add an Endpoint” button.
- Fill in the Details:
- Target URL: Enter the URL where you want to receieve webhook payloads.
- Active Webhooks: Select the events you want to subscribe to (e.g.,
activity_create
,user_update
, etc.) - Ensure the Active checkbox is selected if you want the webhook to start sending immediately.
- Save the Endpoint:
- Click “Add Endpoint” to save.
Managing Webhooks
Once added, your webhook endpoints will appear in a list with the following details:
- Target URL: The endpoint receiving the events.
- Sent: The number of events sent to that endpoint.
- Status: Indicates whether the endpoint is active or inactive.
You can:
- Test the Webhook: Click the play icon to send a test event.
- Edit the Endpoint: Click the gear icon to update settings.
- Delete the Endpoint: Click the trash icon to remove the webhook.
Testing a Webhook
- Click the play icon next to the webhook you want to test.
- Select the event type from the dropdown (e.g.,
activity_update
). - Click “Send Webhook” to trigger a test event to your endpoint.
Supported Events
{
"type": "activity_create",
"sent": 1549498955,
"data": {
"activity":{}
}
}
{
"type": "activity_update",
"sent": 1549498955,
"data": {
"activity":{}
}
}
{
"type": "activity_delete",
"sent": 1549498955,
"data": {
"activity_id": 1234
}
}
{
"type": "series_create",
"sent": 1549498955,
"data": {
"series":{}
}
}
{
"type": "series_update",
"sent": 1549498955,
"data": {
"series":{}
}
}
{
"type": "series_delete",
"sent": 1549498955,
"data": {
"series_id": 1234
}
}
{
"type": "product_create",
"sent": 1549498955,
"data": {
"product":{}
}
}
{
"type": "product_update",
"sent": 1549498955,
"data": {
"product":{}
}
}
{
"type": "product_delete",
"sent": 1549498955,
"data": {
"product_id": 1234
}
}
{
"type": "user_update",
"sent": 1549498955,
"data": {
"user":{
"id": 12345,
"kids": [
{
"id": 24,
"notes": "",
"gender": 2,
"allergies": "",
"last_name": "Johnson",
"first_name": "Parent Junior",
"birthdate_string": "2011-03-03",
"schools":[
{
"id": 123,
"name": "Johnson Elementary",
"about": "The worst place 2 learn",
"start_grade": 1,
"end_grade": 5,
"locations": []
}
]
}
],
"email": "parent@getgalore.com.com",
"phone": "5555555555",
"first_name": "Parent",
"last_name": "Johnson",
"created": 1564085845,
"zip": "94110",
"purchase_count": 2,
"gross_revenue": "1000",
"gross_revenue_currency": "USD",
"first_purchase": "2017-10-22",
"first_purchase_start_time" : "2017-10-23 15:15:00 UTC",
"last_purchase": "2018-02-04"
}
}
}
{
"type": "reservation_create",
"sent": 1549498955,
"data": {
"reservation":{}
}
}
{
"type": "reservation_update",
"sent": 1549498955,
"data": {
"reservation":{}
}
}
{
"type": "purchase_create",
"sent": 1549498955,
"data": {
"purchase":{}
}
}
{
"type": "purchase_update",
"sent": 1549498955,
"data": {
"purchase":{}
}
}
{
"type": "purchase_cancel",
"sent": 1549498955,
"data": {
"purchase":{
"id": 453,
"cart_status": "purchased",
"active": false,
"purchase_count": 2,
"created": 1584993208,
"canceled_at": "Mon, 23 Mar 2020 19:58:06 UTC +00:00",
"expired_at": "Fri, 22 Jan 2021 23:59:59 UTC +00:00",
"membership": {},
"charge_amount_integer": 20000,
"payment_source": "connect",
"total_purchase_count": 306,
"user": {},
"kids": [],
"completed_form_fields": [],
"tags": []
}
}
}
activity_create
Whenever an activity
object is created.
activity_update
Whenever an activity
object is updated.
activity_delete
Whenever an activity
object is destroyed. Note that we will not pass a full activity
object here, but rather, only the activity’s unique integer ID.
series_create
Whenever an series
object is created.
series_update
Whenever an series
object is updated.
series_delete
Whenever an series
object is destroyed. Note that we will not pass a full series
object here, but rather, only the series’s unique integer ID.
product_create
Whenever an product
object is created.
product_update
Whenever an product
object is updated.
user_update
Whenever a user
object is updated.
reservation_create
Whenever a reservation
is created.
reservation_update
Whenever a reservation
object is updated.
purchase_create
Whenever a purchase
object is created.
purchase_update
Whenever a purchase
object is updated.
purchase_update
Whenever a purchase
object (i.e. for a membership, class pack, or product) is canceled.
Errors
If something goes wrong, the API will respond with JSON that includes an “error” object. Note that the error
key is deprecated. You should use the error_code
and HTTP Response Status to determine next actions. The error_message
will always be a user-friendly message to display to the user.
{
"error": "No password",
"error_code": "password_invalid",
"error_message": "Oops! It looks like you didn't enter a password."
}
Please see the Authorized Requests section for errors specific to Authorization.
Code | Meaning |
---|---|
400 | Bad Request |
401 | Unauthorized – Your API key or authorization credentials are wrong |
403 | Forbidden – You’re not allowed to access the resource requested |
404 | Not Found – The specified resource could not be found |
405 | Method Not Allowed – You tried to access a resource with an invalid method |
406 | Not Acceptable – You requested a bad format |
410 | Gone – The resource requested has been deleted |
418 | I’m a teapot |
429 | Too Many Requests – You’re requesting too much! 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. |
API Version Changelog
The current API Version is 1.25
curl "https://api.getgalore.com/v1/..."
-H "Api-Key: {YOUR API KEY}'"
-H "Api-Version: 1.25"
-H "User-Agent: ..."
-H "Content-Type: application/json"
Version | Released | Required Changes | Details |
---|---|---|---|
1.23 | Future date, 2017 | Display connections . |
Return connected_users as part of GET /events feed requests as well asGET /series/{ID} and GET /activities/{ID} requests. |
1.22 | December 18th, 2017 | Series full_price_integer deprecated in favor of top_line_price_integer . Discount object name deprecated in favor of discount_type . |
For consistency, we changed the full price of a Series to be top_line_price_integer . This attribute will be used across all events and products as the price of the item before any discounts are applied. We also released early_bird discounts, and accordingly deprecated the discount name . Instead, use the discount.discount_type attribute to decide what type of discount it is. |
1.21 | November 6th, 2017 | Require answers to assigned_form_fields that are marked as required: true . |
Reservation requests will require answers to assigned_form_fields that are marked as required: true . For old clients, we will send an email asking the customer to finish adding the required information. |
1.20 | September 20th, 2017 | Add a GET /locations endpoint. |
|
1.19 | August 30th, 2017 | Return reviews as part of GET /series/{ID} and GET /activities/{ID} requests. |
|
1.18 | August 16th, 2017 | Return all provider activities and remove series from provider /events response. |
|
1.17 | July 8th, 2017 | Don’t pass reservations or waitlists as part of login response. |
Remove max_spots_per_reservation and caregiver_string from event objects returned as part of GET /events feed response. |
1.16 | June 15th, 2017 | Require kid_ids or spots for waitlist creation. |
The POST /waitlists endpoint will now require kid_ids (for for_kids events) or spots (for grown_ups events) in order to create the waitlist. |
1.15 | April 17th, 2017 | Add past: true for requests to /users/reservations . |
The /users/reservations is now separated to only return either future or past reservations. By default, only future reservations will be returned. |
1.14 | April 11th, 2017 | 1) Remove top-level user object from /users/credits , /users/bookmarks , and /users/reservations 2) Use /users/waitlists endpoint instead of the waitlists object from /users/reservations . |
Add or unify RESTful routes on our API for user related resources: reservations, waitlists, package_credits, purchases, bookmarks, notifications, and credits. All of those endpoints will simply return an array of those objects without a top-level user object. |
1.13 | April 6th, 2017 | Use series.price_integer as the true pro-rata price instead of calculating it on the client side |
Previously, clients were calculating the pro-rata price of series on the fly based on the number of sessions and the price. Now, the returned series.price_integer will already be pro-rated as if the user were to reserve the event now. |
1.12 | March 7th, 2017 | None | Bumped API version so that older clients will not see for_kids=[nil, false] events (since they don’t have the functionality to properly add spots). |