NAV
shell

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

Entity Relationship Diagram

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
email 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
}