NAV Navbar
Crcm logo
curl

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:

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

Facebook

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

email

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:

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:

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:

  1. iPhone: 1
  2. iPad: 2
  3. 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.

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.

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)

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:

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.

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:

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.

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.

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

email

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.

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:

  1. The purchase of one or more spots at an event whose ticketing is being wholly or partially managed by Galore.
  2. 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.

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
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.

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.

email

string

The instructor’s contact email address

about

string

Text that describes the instructor, i.e. a short bio.

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:

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.

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.

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

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:

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.

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
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
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:

bookmarkable_type required

string

The class name for the object the user is attempting to bookmark. Can be:

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:

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 ids.

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_fields 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_fields 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:

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:

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

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:

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.

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”

email

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.

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

email

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.

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

  1. Go to the Webhooks Section:
    • Navigate to the Webhooks section in your dashboard.
  2. Add an Endpoint:
    • Click the “Add an Endpoint” button.
  3. 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.
  4. Save the Endpoint:
    • Click “Add Endpoint” to save.

Managing Webhooks

Once added, your webhook endpoints will appear in a list with the following details:

You can:

Testing a Webhook

  1. Click the play icon next to the webhook you want to test.
  2. Select the event type from the dropdown (e.g., activity_update).
  3. 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).