Overview
API base url:
https://api.ems.incommapps.com
A sample endpoint:
POST https://api.ems.incommapps.com/login
curl "https://api.ems.incommapps.com/user" \
-H "Authentication: Bearer <access-token>"
You should add a header Authentication to all requests after a user logs into an account. See an example of a CURL command.
Models

Account Management Team
{
"id": "38a1f9f1-929f-4b12-9a08-988eb3e1f945",
"name": "Stanford",
"account_managers": [{...}, {...}] // An array of account managers
}
}
| Field | Description |
|---|---|
| Attribute | Description. |
Account Manager
{
"id": "7d24edf8-5250-40f4-bd62-69267a134af8",
"name": "Lyda",
"account_management_team_id": "38a1f9f1-929f-4b12-9a08-988eb3e1f945",
"meetings": [{...}, {...}] // An array of meetings
"nonbookable_intervals": [{...}, {...}] // An array of nonbookable intervals
}
| Field | Description |
|---|---|
| Attribute | Description. |
Account Manager Option
{
"meeting_id": "84113f83-91d2-4016-b403-ca87f4f2f091",
"account_manager": {...}, // An account manager object
"status": "bookable", // requires_override, nonbookable
"description": "Account manager can be assigned to this meeting"
}
| Field | Description |
|---|---|
| Attribute | Description. |
Event
{
"id": "617ce8b9-a7db-4131-9520-dae36a716867",
"name": "Partner Alliance 2023",
"event_days": [{...}, {...}], // An array of event days
"meeting_points": [{...}, {...}] // An array of meeting points
}
| Field | Description |
|---|---|
| Attribute | Description. |
Event Day
{
"id": "825f093d-fac9-485b-8935-1982163f8b52",
"date": "2023-05-09",
"timeslots": [{...}, {...}] // An array of timeslots
}
| Field | Description |
|---|---|
| Attribute | Description. |
Group Meeting
# A merchant group meeting
{
"id": "07c738c1-a210-4331-808a-a6d0d0009f89",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "9d180082-9b83-4f63-bbd2-4a5a60e1361f",
"spark_session": false,
"room": "Conference Room 1",
"description": "Walgreens group meeting"
}
# InComm group meeting
{
"id": "07c738c1-a210-4331-808a-a6d0d0009f89",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"spark_session": false,
"room": "Conference Room 2",
"description": "InComm group meeting"
}
# Spark session
{
"id": "07c738c1-a210-4331-808a-a6d0d0009f89",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"spark_session": true,
"room": "Conference Room 2",
"description": "Spark session on merchandise"
}
| Field | Description |
|---|---|
| Attribute | Description. |
Issue
{
"merchant_id": "0e034f25-8d6c-434f-bc2a-7bb0db943e74",
"meeting_id": "0e034f25-8d6c-434f-bc2a-7bb0db943e74",
"description": "Meeting overlaps with nonbookable intervals"
}
| Field | Description |
|---|---|
| Attribute | Description. |
Meeting
{
"id": "ea62a4c0-d3e9-48ca-bb28-e47798cea6f1",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050",
"account_managers": [{...}, {...}] // array of account managers
}
| Field | Description |
|---|---|
| Attribute | Description. |
Meeting Point
{
"id": "dba2f705-269f-452b-91bd-c9a56d656ab8",
"name": "303" // Table 12
}
| Field | Description |
|---|---|
| Attribute | Description. |
Meeting Point Assignment
{
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"event_day_id": "825f093d-fac9-485b-8935-1982163f8b52",
"meeting_point_id": "f82569bf-27ab-4e55-9151-0b972a387ad4"
}
| Field | Description |
|---|---|
| Attribute | Description. |
Meeting Preference
{
"id": "dc2fe3a5-d020-45d6-9957-08de0e8cde0f",
"type": "merchant_wants_to_meet", // or partner_wants_to_meet, should_not_meet
"partner_id": "e83fce63-0a84-40dd-b0e2-fcef23fa96aa",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e"
}
| Field | Description |
|---|---|
| Attribute | Description. |
Merchant
{
"id": "549141da-1e21-478a-ad10-acfb0db7670e",
"name": "711-Speedway",
"meeting_point_assignments": [{...}, {...}], // An array of meeting point assignments
"meeting_point": {...}, // The first meeting point in the :meeting_point_assignments array
"meeting_preferences": [{...}, {...}], // An array of meeting preferences
"nonbookable_intervals": [{...}, {...}], // An array of nonbookable intervals
"meetings": [{...}, {...}], // An array of meetings
"group_meetings": [{...}, {...}], // An array of group meetings
"issues_count": false,
"issues": [{...}, {...}]
}
| Field | Description |
|---|---|
| Attribute | Description. |
Nonbookable Interval
### For a merchant
{
"id": "703736b2-66f4-4962-a9fd-9025a32b0595",
"event_day_id": "825f093d-fac9-485b-8935-1982163f8b52",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"start_at": {"value": 1000, "label": "10:00"},
"end_at": {"value": 1225, "label": "12:25"}
}
### For a partner
{
"id": "703736b2-66f4-4962-a9fd-9025a32b0595",
"event_day_id": "825f093d-fac9-485b-8935-1982163f8b52",
"partner_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"start_at": {"value": 1000, "label": "10:00"},
"end_at": {"value": 1225, "label": "12:25"}
}
| Field | Description |
|---|---|
| Attribute | Description. |
Partner
{
"id":"c0f4a968-b341-4df6-bded-109cc28d1050",
"name":"Academy",
"account_manager_id":"7d24edf8-5250-40f4-bd62-69267a134af8",
"meeting_preferences": [{...}, {...}], // An array of meeting preferences
"nonbookable_intervals": [{...}, {...}], // An array of nonbookable intervals
"meetings": [{...}, {...}] // An array of meetings
}
| Field | Description |
|---|---|
| Attribute | Description. |
Partner Option
{
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"partner": {...}, // A partner object
"index": 3,
"status": "bookable", // requires_override, nonbookable
"description": "Partner can be booked for this merchant and timeslot"
}
| Field | Description |
|---|---|
| Attribute | Description. |
Timeslot
{
"id": "751ff2ea-1814-4d80-ba70-6749a4c47582",
"event_day_id": "825f093d-fac9-485b-8935-1982163f8b52",
"type": "breakfast", // or break, lunch, session, general
"start_at": {"value": 715, "label": "7:15"},
"end_at": {"value": 830, "label": "8:30"},
"description": "Skelton", // presented only if set
"group_meeting": {...} // A group meeting object if there is a group meeting
}
| Field | Description |
|---|---|
| Attribute | Description. |
User
{
"id": "9947fb18-1e4d-4296-a8b0-2bfa25a20c7f",
"email": "joe@gmail.com",
"password": "Password123!",
"account_manager": {...} // An account manager object
}
| Field | Description |
|---|---|
| User email to log in with. | |
| password | User password to log in with. Should have upper letters, lower letters, numbers and special characters. |
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| POST | /login | Log in a user. |
| GET | /user | Get user details. |
Account management teams
Get account management teams
GET /account_management_teams
# Response
[
{
"id": "38a1f9f1-929f-4b12-9a08-988eb3e1f945",
"name": "Stanford",
"account_managers": [{...}, {...}] // An array of account managers
},
...
]
Get an account management team
GET /account_management_teams/{id}
# Response
{
"id": "38a1f9f1-929f-4b12-9a08-988eb3e1f945",
"name": "Stanford",
"account_managers": [{...}, {...}] // An array of account managers
}
Account managers
Get account managers
GET /account_managers
# Response
[
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"name": "John Doe",
"meetings": [{...}, {...}], // An array of meetings
"nonbookable_intervals": [{...}, {...}] // An array of nonbookable intervals
},
...
]
Get an account manager
GET /account_managers/{id}
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"name": "John Doe",
"meetings": [{...}, {...}], // An array of meetings
"nonbookable_intervals": [{...}, {...}] // An array of nonbookable intervals
}
Update meeting assignments
PATCH /account_managers/{id}/meetings
# Request
# NOTE: it adds to or/and removes from the current meetings
{
"add": ["9924edf8-5250-40f4-bd62-69267a134af8"], // array of meeting ids to add
"remove": ["a46c39de-09f0-41a7-ac84-74c18ad885a7", "c8e4c93b-7f2a-46e9-9cd4-095a7d688b56"] // array of meeting ids to remove
}
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"name": "John Doe",
"meetings": [{...}, {...}], // An array of meetings
"nonbookable_intervals": [{...}, {...}] // An array of nonbookable intervals
}
Replace meeting assignments
PUT /account_managers/{id}/meetings
# Request
# NOTE: it replaces all the meetings with the new ones
[
"9924edf8-5250-40f4-bd62-69267a134af8",
"a46c39de-09f0-41a7-ac84-74c18ad885a7"
] // array of meeting ids
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"name": "John Doe",
"meetings": [{...}, {...}], // An array of meetings
"nonbookable_intervals": [{...}, {...}] // An array of nonbookable intervals
}
Unassign from meetings
DELETE /account_managers/{id}/meetings
# Response
{
"message":"Account manager unassigned from all meetings"
}
Account manager options
Get account manager options
GET /meetings/{meeting_id}/account_managers/options
# Response
[
{
"meeting_id": "99113f83-91d2-4016-b403-ca87f4f2f091",
"account_manager": {...}, // An account manager object
"status": "bookable", // requires_override, nonbooknable
"description": "Account manager can be assigned to this meeting"
},
...
]
Events
Get the current event
GET /event
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"name": "Partner Alliance 2024",
"event_days": [{...}, {...}, ...]
}
Issues
Get all issues
GET /issues
# Response
[
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"description": "The merchant is doublebooked."
...
},
]
Get issues by merchant
GET /merchants/{id}/issues
# Response
[
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"description": "The merchant is doublebooked."
...
},
]
Get issues by partner
GET /partners/{id}/issues
# Response
[
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"description": "The merchant is doublebooked."
...
},
]
Meetings
Create a meeting
POST /meetings
# Request
{
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050",
}
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050",
"account_managers": [] // array of account managers
}
Get a meeting
GET /meetings/{id}
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050",
"account_managers": [{...}, {...}] // array of account managers
}
Update a meeting
PATCH /meetings/{id}
# Request
{
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050"
}
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050",
"account_managers": [{...}, {...}] // array of account managers
}
Update account manager assignments
PATCH /meetings/{id}/account_managers
# Request
# NOTE: it adds to or/and removes from the current account managers
{
"add": ["7d24edf8-5250-40f4-bd62-69267a134af8"], // array of account manager ids to add
"remove": ["dc6c39de-09f0-41a7-ac84-74c18ad885a7", "1ce4c93b-7f2a-46e9-9cd4-095a7d688b56"] // array of account manager ids to remove
}
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050",
"account_managers": [{...}, {...}] // array of account managers
}
Replace account manager assignments
PUT /meetings/{id}/account_managers
# Request
# NOTE: it replaces all the account managers with the new ones
[
"7d24edf8-5250-40f4-bd62-69267a134af8",
"dc6c39de-09f0-41a7-ac84-74c18ad885a7"
] // array of account manager ids
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"partner_id": "c0f4a968-b341-4df6-bded-109cc28d1050",
"account_managers": [{...}, {...}] // array of account managers
}
Unassign all account managers
DELETE /meetings/{id}/account_managers
# Response
{
"message": "All account managers unassigned from the meeting."
}
Delete a meeting
DELETE /meetings/{id}
# Response
{
"message": "Meeting deleted successfully."
}
Merchants
Get merchants
GET /merchants
# Response
[
{
"id": "549141da-1e21-478a-ad10-acfb0db7670e",
"name": "711-Speedway",
"meeting_point_assignments": [{...}, {...}], // An array of meeting point assignments
"meeting_preferences": [{...}, {...}], // An array of meeting preferences
"nonbookable_intervals": [{...}, {...}], // An array of nonbookable intervals
"meetings": [{...}, {...}], // An array of meetings
"issues_count": false,
"issues": [{...}, {...}]
},
...
]
Get a merchant
GET /merchants/{id}
# Response
{
"id": "549141da-1e21-478a-ad10-acfb0db7670e",
"name": "711-Speedway",
"meeting_point_assignments": [{...}, {...}], // An array of meeting point assignments
"meeting_preferences": [{...}, {...}], // An array of meeting preferences
"nonbookable_intervals": [{...}, {...}], // An array of nonbookable intervals
"meetings": [{...}, {...}], // An array of meetings
"issues_count": false,
"issues": [{...}, {...}]
}
Export merchant master schedule
GET /merchants/exports/master_schedule
# Response: attachment
Content-Disposition: attachment; filename="merchant_master_schedule.xlsx"
Nonbookable intervals
Create a nonbookable interval
POST /merchants/{id}/nonbookable_intervals
POST /partners/{id}/nonbookable_intervals
POST /account_managers/{id}/nonbookable_intervals
# Request
{
"start_at": 1000, // optional
"end_at": 1615, // optional
"event_day_id": "a0f4a968-b341-4df6-bded-109cc28d1059",
}
# Response
{
"id": "affd47dc-9231-45b3-8b47-7b5c34a16f44",
"event_day_id": "a0f4a968-b341-4df6-bded-109cc28d1059",
"start_at": 1000, // optional
"end_at": 1615, // optional
"attendee_type": "Merchant",
"attendee_id": "549141da-1e21-478a-ad10-acfb0db7670e"
}
Get nonbookable intervals
GET /merchants/{id}/nonbookable_intervals
GET /partners/{id}/nonbookable_intervals
GET /account_managers/{id}/nonbookable_intervals
# Response
[
{
"id": "affd47dc-9231-45b3-8b47-7b5c34a16f44",
"event_day_id": "a0f4a968-b341-4df6-bded-109cc28d1059",
"start_at": 1000, // optional
"end_at": 1615, // optional
"attendee_type": "Merchant",
"attendee_id": "549141da-1e21-478a-ad10-acfb0db7670e"
},
...
]
Get a nonbookable interval
GET /nonbookable_intervals/{id}
# Response
{
"id": "affd47dc-9231-45b3-8b47-7b5c34a16f44",
"event_day_id": "a0f4a968-b341-4df6-bded-109cc28d1059",
"start_at": 1000, // optional
"end_at": 1615, // optional
"attendee_type": "Merchant",
"attendee_id": "549141da-1e21-478a-ad10-acfb0db7670e"
}
Update a nonbookable interval
PATCH /nonbookable_intervals/{id}
# Request
{
"start_at": 1100, // optional
"end_at": null, // optional
}
# Response
{
"id": "affd47dc-9231-45b3-8b47-7b5c34a16f44",
"event_day_id": "a0f4a968-b341-4df6-bded-109cc28d1059",
"start_at": 1100, // optional
"attendee_type": "Merchant",
"attendee_id": "549141da-1e21-478a-ad10-acfb0db7670e"
}
Delete a nonbookable interval
DELETE /nonbookable_intervals/{id}
# Response
{
"message": "Nonbookable interval deleted successfully."
}
Partners
Get partners
GET /partners
# Response
[
{
"id":"c0f4a968-b341-4df6-bded-109cc28d1050",
"name":"Academy",
"account_manager_id":"7d24edf8-5250-40f4-bd62-69267a134af8",
"meeting_preferences": [{...}, {...}], // An array of meeting preferences
"nonbookable_intervals": [{...}, {...}], // An array of nonbookable intervals
"meetings": [{...}, {...}] // An array of meetings
},
...
]
Get a partner
GET /partners/{id}
# Response
{
"id":"c0f4a968-b341-4df6-bded-109cc28d1050",
"name":"Academy",
"account_manager_id":"7d24edf8-5250-40f4-bd62-69267a134af8",
"meeting_preferences": [{...}, {...}], // An array of meeting preferences
"nonbookable_intervals": [{...}, {...}], // An array of nonbookable intervals
"meetings": [{...}, {...}] // An array of meetings
}
Export partner master schedule
GET /partners/exports/master_schedule
# Response: attachment
Content-Disposition: attachment; filename="partner_master_schedule.xlsx"
Partner options
Get partner options
GET /merchants/{merchant_id}/timeslots/{timeslot_id}/partners/options
# Response
[
{
"merchant_id": "549141da-1e21-478a-ad10-acfb0db7670e",
"timeslot_id": "77113f83-91d2-4016-b403-ca87f4f2f097",
"partner": {...}, // A partner object
"index": 3,
"status": "bookable", // requires_override, nonbooknable
"description": "Partner can be booked for this merchant and timeslot"
},
...
]
Users
Log in
POST /login
# Request
{
"email": "andrew@leansquad.com",
"password": "Password123!"
}
# Response
{
"access_token": "eyJhbGciOiJIUzI1NiJ9.eyJ...extM"
}
Get user details
GET /user
# Response
{
"id": "8ffd47dc-9231-45b3-8b47-7b5c34a16f65",
"email": "andrew.johns@leansquad.com",
"name": "Andrew Johns",
"account_manager": {...} // An account manager object
}