Skip to main content

Data Integration

With Data integration, you take care of presenting an interface to customers where they can select tips.

An endpoint can require a location identifier if it performs a function that can work differently from location to location. Location identifiers will be assigned to you by tippy.

v1/data/app/locations#

Before you can start making transaction, we need to map your locations with ours. This endpoint allows you to send a list of all locations that a business owns. For each location you are sending in the payload we need a unique identifier and either address fields or geo fields. If you provide geo fields (lat, long), the address fields are not required. If you send address fields (address, address2, city, state, zip and country), the geo fields are not required.

Many of subsequent calls to endpoints require that you provide the unique locationId (in this call known as identifier). We recommend to use the location id from your system that you can easily reference to in the future.

Once mapping is successful the given identifier could not be used for the other location in a Tippy system. If there is a mistake in data mapping and identifier is already mapped, you will get LocationMappingError. If such error with mapping is returned and you want to re-map identifier you should reach out to our support to remove existing mapping.

Request body structure (TS notation)

interface MapLocationsRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
locations: {
// Array of locations to map
identifier: string; // Your location identifier goes here
address: string; // Location address line goes here
address2: string; // Location address 2 line goes here
city: string; // Location city goes here
state: string; // Location state goes here
zip: string; // Location zip goes here
country: string; // Location country goes here
lat: number; // GPS location latitude
long: number; // GPS location longitude
}[];
};
}

When we receive the payload, we will attempt to match addresses on our side based on accountToken and either geo fields or address fields. The endpoint will return the list of locations that were successfully mapped together with the count of requested mappings and count of successful mappings. Locations must already exist in our system for mapping to work. This endpoint will not create new locations if mapping was unsuccessful.

Response body structure (TS notation)

interface MapLocationsResponse {
data: {
appLocations: {
// An array of locations that ware mapped successfully
locationId: number; // Id in the tippy system that this location was mapped with
identifier: string; // Location id specified in the request
}[];
mappingsRequested: number; // Number of locations sent in the request to map
mappedSuccessfully: number; // Number of locations that ware successfully mapped
};
}

Request example

POST /v1/data/app/locations HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"locations":[
{
"identifier": "BB-LOC-20",
"address": "2755 E Okland Park Blv",
"city": "Fort Lauderdale",
"state": "FL",
"zip": "33306"
}
]
}
}

Response example

{
"data": {
"appLocations": [
{
"locationId": 1765,
"identifier": "BB-LOC-20"
}
],
"mappingsRequested": 1,
"mappedSuccessfully": 1
}
}

v1/data/tips/proposals#

Start the checkout process by calling this v1/data/tips/proposals with the service amounts for which you want to receive tip proposals.

Request body structure (TS notation)

interface GetProposalsRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
locationId: string; // The location identifier for which you want the data
serviceAmounts: number[]; // An array of service amounts
};
}

For each service amount, you'll get back a low, medium and high proposal. You should present these to the customer so they can pick one. It's recommended to still leave them the option to enter a custom amount if they don't want to use any of the predefined proposals.

Response body structure (TS notation)

interface GetProposalsResponse {
data: {
// An array of objects, each representing one tip proposal
serviceAmount: number; // The service amount passed to the endpoint
low: {
// The low proposal
type: "amount" | "percent"; // Whether to display this proposal as an amount or percentage
percent: number; // The percentage of the service amount this tip proposal equals
amount: number; // The actual dollar amount for this tip proposal
fee: number; // Tippy's fee for this proposal
total: number; // How much the customer will be charged in total for this tip
};
medium: {
// The medium proposal
type: "amount" | "percent"; // Whether to display this proposal as an amount or percentage
percent: number; // The percentage of the service amount this tip proposal equals
amount: number; // The actual dollar amount for this tip proposal
fee: number; // Tippy's fee for this proposal
total: number; // How much the customer will be charged in total for this tip
};
high: {
// The high proposal
type: "amount" | "percent"; // Whether to display this proposal as an amount or percentage
percent: number; // The percentage of the service amount this tip proposal equals
amount: number; // The actual dollar amount for this tip proposal
fee: number; // Tippy's fee for this proposal
total: number; // How much the customer will be charged in total for this tip
};
}[];
}

For example, if two staff members were involved in a service and one provided a service for which the customer will be charged $20 and the other provided a service for $50, serviceAmounts equals [20,50].

Request example

POST /v1/data/tips/proposals HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"locationId": "HN76GLM672",
"serviceAmounts": [20, 50]
}
}

Response example

{
"data": [
{
"serviceAmount": 20,
"low": {
"type": "amount",
"percent": 10,
"amount": 2,
"fee": 0.52,
"total": 2.52
},
"medium": {
"type": "amount",
"percent": 15,
"amount": 3,
"fee": 0.54,
"total": 3.54
},
"high": {
"type": "amount",
"percent": 20,
"amount": 4,
"fee": 0.58,
"total": 4.58
}
},
{
"serviceAmount": 50,
"low": {
"type": "amount",
"percent": 10,
"amount": 5,
"fee": 0.64,
"total": 5.64
},
"medium": {
"type": "amount",
"percent": 15,
"amount": 7.5,
"fee": 0.68,
"total": 8.18
},
"high": {
"type": "amount",
"percent": 20,
"amount": 10,
"fee": 1.02,
"total": 11.02
}
}
]
}

v1/data/tips/fees#

Returns the fees for a given array of tip amounts. Fees are returned when you fetch proposals, so you don't usually have to call this endpoint. However, v1/data/tips/proposals should only be called when you have the full list of service amounts.

If you want to display fees as the customer is entering tips or after the customer enters a custom tip, you'll have to call this endpoint to get an informative calculation.

Request body structure (TS notation)

interface GetFees {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
locationId: string; // The location identifier for which you want the data
amounts: number[]; // An array of tip amounts for which to get fees
};
}

Response body structure (TS notation)

interface GetFeesResponse {
data: {
// An array of objects, each representing a fee calculation for a given tip amount
amount: number; // The original amount that you passed in
fee: number; // The fee Tippy will charge for the tip amount
total: number; // The total, meaning amount + fee
}[];
}

Request example

POST /v1/data/tips/fees HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"locationId": "HN76GLM672",
"amounts": [5, 10]
}
}

Response example

{
"data": [
{
"amount": 5,
"fee": 0.64,
"total": 5.64
},
{
"amount": 10,
"fee": 1.02,
"total": 11.02
}
]
}

v1/data/transaction/intent#

Once the customer has chosen their tips, call v1/data/transaction/intent to start a tip transaction. Pass the customer info and the tip selections. Returns a transactionId an array of chosen tips with fees, the fees summed together and the total.

Tipping without serviceAmount is also available. What this means is that those kind of tips will not be counted in aggregate reports. You could use this option in cases when a customer wants to tip an assistant, etc. Sending 0 for serviceAmount will be treated as not sending it at all.

Request body structure (TS notation)

interface CreateTxIntentRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
locationId: string; // The location identifier for which you want the data
device?: {
// The device info (optional, used with leased iPads)
identifier: string; // Device app install identifier
name: string; // Device name
};
customer: {
// The customer info
id: string; // Unique id for this customer
firstName: string;
lastName: string;
};
tipSelections: {
// An array of tip selections
employeeId: string; // Unique employee id
firstName: string; // First name of staff member
lastName: string; // Last name of staff member
avatar: string; // URL for displaying staff member's picture
serviceAmount: number; // The service amount for this staff member, used for tip proposal calculation
amount: number; // The tip amount chosen
level: "low" | "medium" | "high" | "custom"; // The level of the tip chosen
}[];
};
}

Response body structure (TS notation)

interface CreateTxIntentResponse {
data: {
transactionId: string; // A unique tx id generated by us
tips: {
// An array of objects representing the chosen tips, along with fees
employeeId: string; // Unique employee id
level: "low" | "medium" | "high" | "custom"; // The level of the tip chosen
amount: number; // The tip amount chosen
fee: number; // Tippy's fee for this tip
}[];
fees: {
// The total tips involved in this charge
tippy: number; // The fees that Tippy charges
pos: number; // The fees that you charge
total: number; // The total fees on this tx
};
total: number; // Fees + amounts for this tx
};
}

Request example

POST /v1/data/transaction/intent HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"customer": {
"id": "pos-customer-1",
"firstName": "John",
"lastName": "Doe"
},
"device:": {
"identifier": "88b1c60c-b743-4ba2-851c-a3122def7661"
"name": "DirectTips LLC 1"
}
"tipSelections": [
{
"employeeId": "sa234kjh23kjh423j",
"firstName": "Shaniqua",
"lastName": "Simmons",
"avatar": "https://path.to/profile-picture.png",
"serviceAmount": 50.00,
"level": "medium",
"amount": 5
},
{
"employeeId": "asdasd87a787sdshg",
"firstName": "Barbara",
"lastName": "Stamets",
"avatar": "https://path.to/profile-picture.png",
"amount": 150.00,
"level": "high",
"amount": 10
}
]
}
}

Response example

{
"data": {
"transactionId": "trx_hckmacyk161dhjp1qhckmacyk171dhjp1q",
"tips": [
{
"employeeId": "sa234kjh23kjh423j",
"amount": 5.0,
"level": "medium",
"fee": 0.64
},
{
"employeeId": "asdasd87a787sdshg",
"amount": 10.0,
"level": "low",
"fee": 1.02
}
],
"fees": {
"tippy": 1.0,
"pos": 0.66,
"total": 1.66
},
"total": 16.66
}
}

v1/data/transaction/confirm#

Once you've charged the customer, call this to let us know that the payment was successful. We'll distribute the tips among the staff members involved.

Returns a 200 response on success.

Request body structure (TS notation)

interface ConfirmTxRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
transactionId: string; // The transaction id you wish to confirm
};
}

Request example

POST /v1/data/transaction/confirm HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "trx_hckmacyk161dhjp1qhckmacyk171dhjp1q"
}
}

v1/data/transaction/cancel#

If a transaction you've created is unable to be completed, call v1/data/transaction/cancel to let us know. We'll mark it as canceled on our end.

Request body structure (TS notation)

interface CancelTxRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
transactionId: string; // The transaction id you wish to cancel
note?: string; // Optional reason for cancellation
};
}

Request example

POST /v1/data/transaction/confirm HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "trx_hckmacyk161dhjp1qhckmacyk171dhjp1q",
"note": "Tx canceled"
}
}

v1/data/transaction/details#

This endpoint allows you to retrieve the details of a specific transaction based on its unique ID. You will need to provide the unique transaction ID in order to access this endpoint.

A successful call to this endpoint will return a 200 OK response with a JSON structure containing the following properties:

  • transactionId (string): The unique ID of the transaction.
  • status (string): The status of the transaction.
  • isAsync (boolean): Indicates whether the transaction is running in async mode. This will always be false for transactions with data integration.
  • createdAt (string): The date and time when the transaction was created.
  • customer (object): Information about the customer associated with the transaction.
  • tipSelections (array): A list of employees and the amounts used to create the transactions.
  • tips (array): A list of tips for each employee involved in the transaction.
  • refunds (array): A list of refunds created for this transaction.
  • gross (number): The gross value of the transaction.
  • net (number): The net value of the transaction.
  • fee (number): The fee associated with the transaction.

The status property can be one of the following values:

  • pending: The transaction was created and is awaiting further action.
  • confirmed: The transaction has been successfully confirmed and processed.
  • failed: The transaction has been marked as failed.
  • canceled: The transaction has been canceled before it was completed.
  • refunded: The transaction has been fully refunded.

The tips array in the response contains objects representing tips for each employee involved in the transaction. Each tip object has the following properties:

  • employeeId (string): The ID of the employee who received the tip.
  • status (string): The status of the tip.
  • level (string): The tip level, which can be one of the following values: "low," "medium," "high," or "custom."
  • serviceAmount (number): The amount of the service for which the tip is intended.
  • gross (number): The gross value of the tip.
  • net (number): The net value of the tip.
  • fee (number): The fee associated with the tip.
  • createdAt (string): The date and time when the tip was created.

The status property of the tip can be one of the following values:

  • pending: The tip has been created, but the transaction is awaiting confirmation.
  • confirmed: The tip has been confirmed and sent to the employee.
  • void: The tip has been canceled or refunded.

Request body structure (TS notation)

interface TxDetailsRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
transactionId: string; // An id of the transaction being retrieved
};
}

Request example

POST /v1/display/transaction/details HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "t_132984982",
}
}

Response example

{
"data": {
"transactionId": "fa912330-46ad-4e78-81ae-2a41a7751393",
"status": "confirmed",
"isAsync": false,
"createdAt": "2022-05-17T13:40:21.442Z",
"customer": {
"id": "61b9959d-092d-4822-971e-4a88c1b644a6",
"lastName": "Doe",
"firstName": "Johnny"
},
"tips": [
{
"employeeId": "68",
"status": "confirmed",
"level": "low",
"serviceAmount": 27,
"gross": 5.28,
"net": 4.55,
"fee": 0.73,
"createdAt": "2022-05-17T13:41:20.851Z"
},
{
"employeeId": "68",
"status": "void",
"level": "low",
"serviceAmount": 27,
"gross": 7.78,
"net": 7,
"fee": 0.78,
"createdAt": "2022-05-17T13:40:21.486Z"
},
{
"employeeId": "67",
"status": "confirmed",
"level": "low",
"serviceAmount": 27,
"gross": 5.28,
"net": 4.55,
"fee": 0.73,
"createdAt": "2022-05-17T13:41:20.239Z"
},
{
"employeeId": "67",
"status": "void",
"level": "low",
"serviceAmount": 27,
"gross": 7.78,
"net": 7,
"fee": 0.78,
"createdAt": "2022-05-17T13:40:21.486Z"
}
],
"refunds": [
{
"transactionId": "fa912330-46ad-4e78-81ae-2a41a7751393-11999086-1684330880838",
"employeeId": "68",
"status": "completed",
"isPartial": true,
"gross": 2.5,
"net": 2.45,
"fee": 0.05,
"reason": "Place refund reason here.",
"createdAt": "2022-05-17T13:41:20.851Z"
},
{
"transactionId": "fa912330-46ad-4e78-81ae-2a41a7751393-11999085-1684330880231",
"employeeId": "67",
"status": "completed",
"isPartial": true,
"gross": 2.5,
"net": 2.45,
"fee": 0.05,
"reason": "Place refund reason here.",
"createdAt": "2022-05-17T13:41:20.239Z"
}
],
"tipSelections": [
{
"level": "low",
"amount": 7,
"avatar": "https://k8s-mediagw-prod.s3.us-east-1.amazonaws.com/87aa2678713e3430d2616182c2e69544.jpg",
"lastName": "Oldham",
"firstName": "Taelor",
"employeeId": "67",
"serviceAmount": 27
},
{
"level": "low",
"amount": 7,
"avatar": "https://k8s-mediagw-prod.s3.us-east-1.amazonaws.com/454500ccb68b4b8d2da201032cdf33ac.jpg",
"lastName": "Trevino",
"firstName": "Jasmine",
"employeeId": "68",
"serviceAmount": 27
}
],
"gross": 15.55,
"net": 14,
"fee": 1.55
}
}

v1/data/transaction/refund#

If a transaction is refunded, notify Tippy by calling v1/data/transaction/refund. That way, we can keep track on our side and subtract the refunded amounts from the staff members' tip balances.

A refund can be full or partial. In the case of a full refund, just set partial to false and leave out the amount field. In the case of a partial refund, set partial to true and specify the amount.

If you want to control distribution of the refunded tips between staff members who were part of a service whose transaction is being refunded, use the talents field. talents is an array of object, each object containing an employeeId field that uniquely identifies the staff member and an amount field that specifies what the amount subtracted from that employee's tip balance should be. If you don't specify talents, we split the refund evenly between staff members.

A partial refund amount will always be deducted from the gross amount of the entire transaction (including fees).

If you want to simulate a refund, you can set the parameter dryRun to true. This will return the result with the calculations as if the refund had actually taken place, but nothing will be executed or saved. Suitable if you want to check the numbers before making the refund.

Returns a 200 response on success.

Request body structure (TS notation)

interface TxRefundRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
transactionId: string; // An id of the transaction being refunded
partial?: boolean; // Whether this is a partial refund (default: false)
dryRun?: boolean; // Whether this refund should execute or just simulate execution (default: false)
amount?: number; // Partial refund amount
talents?: {
// List of objects specifying distribution amount staff members
employeeId: string; // The employee id of the staff member
amount: number; // The amount to subtract from their tip balance
}[];
reason?: string; // Optional reason for refund
};
}

Response body structure (TS notation)

interface RefundResponse {
data: {
transactionId?: string; // Transaction id of the executed refund
isPartial: boolean; // Whether this was a partial refund or not
employeeId?: string; // The employee id of the staff member effected by the refund if partial refund was set
createdAt: string; // Date time of refund in ISO format
status: string; // Status of refund (for this use case the value will always set to `completed`)
reason: string; // Reason for refund if specified upon request
gross: number; // Refunded amount out of the gross value of the transaction
net: number; // Refunded amount out of the net tip received by the employee
fee: number; // Refunded amount out of the fee paid by the customer
}[];
}

Refund response is an array of objects. If you refund the entire transaction, a response will be single refund object without employeeId information. If you initiate a partial refund with a specific amount, you will receive response object for each of the employees involved in the original transaction.

Request examples

POST /v1/data/transaction/refund HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "t_132984982",
}
}
POST /v1/data/transaction/refund HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "t_132984982",
"partial": true,
"amount": 21.2,
}
}
POST /v1/data/transaction/refund HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "t_132984982",
"amount": 50,
"talents": [
{
"employeeId": "employee_1234",
"amount": 30
},
{
"employeeId": "employee_1235",
"amount": 20
}
]
}
}

Response example

Full refund:

{
"data": [
{
"transactionId": "8e24b727-dbd0-4853-a017-f24a4e7b1130-1677691291322",
"isPartial": false,
"createdAt": "2022-03-01T17:21:31.357Z",
"status": "completed",
"reason": null,
"gross": 13,
"net": 11.92,
"fee": 1.08
}
]
}

Partial refund (amount $6):

{
"data": [
{
"transactionId": "44ce6a10-09ca-4dad-afb3-cc0213ed5826-8254-1677691403832",
"isPartial": true,
"employeeId": "4839",
"createdAt": "2022-03-01T17:23:23.880Z",
"status": "completed",
"reason": null,
"gross": 3.23,
"net": 2.7,
"fee": 0.53
},
{
"transactionId": "44ce6a10-09ca-4dad-afb3-cc0213ed5826-8253-1677691404444",
"isPartial": true,
"employeeId": "1020",
"createdAt": "2022-03-01T17:23:24.480Z",
"status": "completed",
"reason": null,
"gross": 2.77,
"net": 2.4,
"fee": 0.37
}
]
}

v1/data/transaction/transfer#

If you want to re-distribute tips between different staff members once you already collected payments, and do not want to swipe card again, notify Tippy by calling v1/data/transaction/transfer. That way, the tip net amount will be re-distributed.

If you want to control distribution of the transferred tips between staff members who were part of a service, use the talents field. talents is an array of object, each object containing an employeeId field that uniquely identifies the staff member, it's firstName, lastName, and avatar. Those fields are required if we want to distribute tips to staff member that is not created yet on Tippy side. The last field of talents object is amount. That field specifies what amount should be re-distributed to each talent. If you specify amounts, it should be specified for each talent, if not endpoint will return an error, also amounts sum must match the net tip amount of transaction. If you don't specify amount to any talent, we split the net amount evenly between staff members.

Returns a 200 response on success.

Request body structure (TS notation)

interface TxTransferRequest {
appId: string; // Your app ID
appSecret: string; // Your app secret
accountToken: string; // The account token for the business where the tx is taking place
payload: {
transactionId: string; // A unique identifier for this transaction
talents?: {
// List of objects specifying distribution amount staff members
employeeId: string; // The employee id of the staff member
firstName: string; // First name of staff member
lastName: string; // Last name of staff member
avatar: string; // URL for displaying staff member's picture
amount?: number; // The amount of each staff member to distribute
}[];
};
}

Request examples

POST /v1/data/transaction/transfer HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "t_132984982",
"talents": [
{
"employeeId": "employee_1234",
"firstName": "John",
"lastName": "Doe",
"avatar": "https://i.pravatar.cc/150?img=15",
"amount": 20
},
{
"employeeId": "employee_1235",
"firstName": "Lindsay",
"lastName": "Von",
"avatar": "https://i.pravatar.cc/150?img=15",
"amount": 10
}
]
}
}
POST /v1/data/transaction/transfer HTTP/1.1
Host: https://developer.tippy.app
Content-Type: application/json
{
"appId": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRET",
"accountToken": "BUSINESS_ACCOUNT_TOKEN",
"payload": {
"transactionId": "t_132984982",
"talents": [
{
"employeeId": "employee_1234",
"firstName": "John",
"lastName": "Doe",
"avatar": "https://i.pravatar.cc/150?img=15"
},
{
"employeeId": "employee_1235",
"firstName": "Lindsay",
"lastName": "Von",
"avatar": "https://i.pravatar.cc/150?img=15"
}
]
}
}