Submits an order and creates a ticket at the location. This endpoint finalizes the ordering flow by recording the items, applying totals, and registering the chosen payment method. It supports both deferred payment, where the guest pays in store, and third-party payment, where payment is captured through an external processor.
Request Headers
| Header | Required | Description |
|---|---|---|
| Authorization | Yes | Bearer YOUR_ACCESS_TOKEN |
| Content-Type | Yes | application/json |
Request Parameters
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| location_id | string | Yes | Identifier of the location. |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
global_on_id | integer | Yes | The global operation ID. |
user_id | integer | Yes | The user ID performing the operation. |
flow | string | Yes | The flow type for the operation. |
i18n | string | No | Language/locale for the request. |
Request Body Fields
| Field | Type | Required | Description |
|---|---|---|---|
employee_id | integer | Yes | ID of the employee creating the order. |
ticket | object | Yes | Contains the ticket (order) details. See ticket object below. |
payment_type | string | Yes | Payment method used (for example, pay_in_store). |
payment | object | No | Payment detail. Required when payment_type is third_party. See payment object below. |
olo_info | object | No | Online ordering information (if applicable). See olo_info object below. |
ticket_name_max_length | integer | No | Maximum allowed length for the ticket name. |
loc_processor_code | string | No | ISO 3166-1 alpha-2 country code identifying the processor to use when an account has multiple processors configured. Examples: us = United States processor, ca = Canada processor. |
Object Fields
ticket object
ticket object| Field | Type | Description |
|---|---|---|
ticket_number | integer | Unique ticket number. |
employee_id | integer | ID of the employee handling the ticket. |
employee_id_external | string | External employee ID, if available. |
items | array | List of items included in the order. See ticket.items[] object below. |
name | string | Name of the ticket/order. |
order_type_id | integer | Order type ID (for example, dine-in or takeout). |
order_type_id_external | string | External order type ID. |
revenue_center_id | integer | Revenue center or POS terminal ID. |
revenue_center_id_external | string | External revenue center ID. |
guest_count | integer | Number of guests. |
guest_id | integer | ID of the guest linked to the ticket. |
tax | number | Total tax amount. |
due | number | Amount due after taxes, discounts, and adjustments. |
sub_total | number | Order subtotal before taxes and discounts. |
total | number | Final order total. |
ticket.items[] object
ticket.items[] object| Field | Type | Description |
|---|---|---|
category_id | integer | Item category ID. |
id | integer | Internal item ID. |
id_external | string | External item ID. |
modifiers | array | List of item modifiers, if applicable. |
price | number | Total price of the item. |
price_per_unit | number | Price per individual unit. |
quantity | integer | Quantity ordered. |
comment | string | Optional comment for the item. |
name | string | Item name. |
payment object
payment objectIncluded when payment_type is third_party.
| Field | Type | Description |
|---|---|---|
card_type | string | Card brand for a third-party payment. |
base_amount | integer | Base amount captured, in minor units. |
tip_amount | integer | Tip amount, in minor units. |
auto_close | boolean | Whether the ticket is closed automatically after payment. |
olo_info object
olo_info object| Field | Type | Description |
|---|---|---|
contact_info | object | Customer contact information. See olo_info.contact_info object below. |
order_type | string | Online order type (e.g., pickup or delivery). |
pickup_datetime | string | Scheduled pickup date and time, if applicable. |
vehicle | object | null | Vehicle information, if applicable. |
olo_info.contact_info object
olo_info.contact_info object| Field | Type | Description |
|---|---|---|
first_name | string | Customer's first name. |
last_name | string | Customer's last name. |
email | string | Customer's email address. |
phone | string | Customer's phone number. |
phone_global_country | integer | International country code for the phone number. |
address | string | Customer's primary address line. |
address2 | string | Secondary address line (optional). |
zip | string | ZIP or postal code. |
Request Example
The following example uses the pay-in-store flow.
{
"employee_id": 293,
"ticket": {
"ticket_number": 987607656,
"employee_id": 293,
"employee_id_external": "15",
"items": [
{
"category_id": 189588,
"id": 1672955,
"id_external": "30004",
"price": 429,
"quantity": 1,
"comment": "",
"name": "FR SILK(SLI)",
"modifiers": []
}
],
"name": "Online Order",
"order_type_id": 38,
"order_type_id_external": "1",
"revenue_center_id": 23,
"revenue_center_id_external": "1",
"guest_count": 1,
"tax": 0,
"sub_total": 758,
"total": 758,
"due": 758
},
"payment_type": "pay_in_store",
"ticket_name_max_lenght": 15
}
For a third-party payment, set payment_type to third_party and include a payment object:
{
"payment_type": "third_party",
"payment": {
"card_type": "VISA",
"base_amount": 1350,
"tip_amount": 0,
"auto_close": true
}
}
cURL Example
curl --request POST \
--url "https://sandbox-api.softpoint.io/interface/v1/locations/YOUR_LOCATION_ID/app/checkout/pay_and_create_ticket?global_on_id=16&user_id=1&flow=order&i18n=en" \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"employee_id": 293,
"ticket": { "employee_id": 293, "items": [], "name": "Online Order", "total": 758, "due": 758 },
"payment_type": "pay_in_store"
}'
Success Response
A successful request returns the created ticket. The response includes ticket metadata, a totals object, and embedded employee, order type, revenue center, and item details. The example below is trimmed for brevity.
{
"id": 1284878,
"id_external": "419",
"pos_id": "419",
"opened_at": "2025-12-09 00:08:24",
"name": "Eduardo API_A",
"open": 1,
"guest_count": 1,
"ticket_number": 547,
"totals": {
"items": 1149,
"tax": 201,
"exclusive_tax": 201,
"sub_total": 1149,
"total": 1350,
"paid": 0,
"due": 1350,
"grand_total": 1350
},
"_embedded": {
"employee": { "employee_id": 376, "first_name": "ADAM", "last_name": "GAREN", "check_name": "ADAM G." },
"order_type": { "order_type_id": 38, "name": "RESTAURANT" },
"revenue_center": { "revenue_center_id": "23", "name": "RESTAURANT" },
"items": [
{
"id": 80292,
"name": "BURGER",
"price": 1149,
"tax": 201,
"quantity": 1,
"modifiers": [
{ "id": 38193, "menu_modifier_id": 494915, "name": "HASH BROWNS", "price": 0, "quantity": 1 }
]
}
]
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| id | integer | Internal ticket identifier. |
| id_external | string | External ticket identifier. |
| pos_id | string | Point-of-sale ticket identifier. |
| opened_at | string | Timestamp when the ticket was opened (UTC). |
| opened_at_local | string | Local timestamp when the ticket was opened. |
| closed_at | string | Timestamp when the ticket was closed; null when still open. |
| name | string | Ticket display name. |
| open | integer | Indicates whether the ticket is open. 1 is open, 0 is closed. |
| guest_count | integer | Number of guests on the ticket. |
| ticket_number | integer | Sequential ticket number. |
| totals | object | Monetary totals for the ticket, in minor units. |
| totals.items | integer | Combined item price. |
| totals.tax | integer | Total tax. |
| totals.sub_total | integer | Subtotal before tax. |
| totals.total | integer | Grand total. |
| totals.paid | integer | Amount paid so far. |
| totals.due | integer | Amount still due. |
| _embedded.employee | object | Employee associated with the ticket. |
| _embedded.order_type | object | Order type applied to the ticket. |
| _embedded.revenue_center | object | Revenue center applied to the ticket. |
| _embedded.items | array | Items on the ticket, including modifiers. |
Error Responses
Pay & Create Order uses the standard error envelope. A missing channel identifier produces error code 10189.
{
"error": {
"code": 10189,
"message": "Invalid global on id.",
"details": {
"error": "The parameter global_on_id is required"
}
}
}
Status Codes
| Code | Description |
|---|---|
| 200 | Order created successfully. |
| 400 | Invalid order contents or payment information. |
| 401 | Missing or invalid access token, or missing channel identifier. |
Workflow Placement
Pay & Create Order is the final submission step in the ordering flow:
-
Build and price the cart.
-
Submit the order with the chosen payment type.
-
Retrieve the ticket to confirm status and totals.
Notes
-
The
flowquery parameter must be set toorderfor online ordering. -
All monetary values are expressed in minor units (cents).
-
Use
pay_in_storewhen the guest will pay at the location, andthird_partywhen payment is captured externally. Thepaymentobject is required forthird_party. -
The response reflects the ticket as created; for a pay-in-store order,
totals.paidis typically 0 andtotals.dueequals the total.
Common Mistakes
-
Omitting the
flowquery parameter or setting it to an unsupported value. -
Using
third_partywithout supplying thepaymentobject. -
Omitting
global_on_id, which results in error code 10189. -
Sending amounts in major units (dollars) rather than minor units (cents).

