Authorizes a card present payment on a physical terminal without capturing funds. An authorization places a hold on the cardholder's account for the requested amount, which can later be captured or allowed to expire. Use this endpoint for workflows that separate authorization from settlement, such as bar tabs or scenarios where the final amount is not yet known.
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 processing the authorization |
Request Body Fields
| Field | Type | Required | Description |
|---|---|---|---|
| ticket | object | Yes | See ticket object below. |
| ticket.id | string | Yes | The unique identifier of the ticket. |
| ticket.void | boolean | No | Indicates whether the ticket has been voided. |
| payment | object | Yes | Payment instruction for the terminal. |
| payment.id | string | Yes | Unique identifier for the payment. |
| payment.amount | integer | Yes | Payment amount, in cents. |
| payment.cashback | integer | No | EBT cashback amount, in cents. |
| payment.inv_number | integer | No | Transaction reference number (15-character limit). |
| user_id_external | integer | No | External user ID associated with the card being tokenized (if applicable). |
| webhook_id | string | Yes | Unique identifier for the webhook. |
| terminal_id | string | Yes | Unique identifier for the POS terminal. |
| debug | integer | No | When set to 1, enables additional diagnostic output in the response. |
Object Fields
The ticket object may be sent as a compact reference (just id) or as a fully embedded structure. When embedded, it supports the fields below. All embedded fields are optional, and monetary values are expressed in minor units (cents).
ticket object
ticket object| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | The unique identifier of the ticket. |
| name | string | No | The name of the ticket. |
| open | boolean | No | Indicates whether the ticket is still open. |
| opened_at | timestamp | No | The timestamp when the ticket was opened. |
| closed_at | timestamp | No | The timestamp when the ticket was closed. |
| ticket_number | integer | No | The ticket number. |
| customer | object | No | Customer information. See ticket.customer object below. |
| totals | object | No | Ticket totals information. See ticket.totals object below. |
| void | boolean | No | Indicates whether the ticket has been voided. |
| _embedded | object | No | Embedded ticket resources. See ticket._embedded object below. |
ticket.customer object
ticket.customer object| Field | Type | Description |
|---|---|---|
| customer_name | string | Name of the customer or guest for the transaction. |
| customer_email | string | Email address of the customer or guest for the transaction. |
ticket.totals object
ticket.totals objectAll values are integers in minor units (cents).
| Field | Type | Description |
|---|---|---|
| discounts | integer | Total ticket-level discounts, in cents. |
| due | integer | Remaining unpaid amount (total - paid), in cents. |
| exclusive_tax | integer | Taxes not included in item or service charge prices, in cents. |
| inclusive_tax | integer | Taxes included in item or service charge prices, in cents. |
| items | integer | Total cost of all items, in cents. |
| other_charges | integer | Total cost of all other charges, in cents. |
| paid | integer | Total amount paid, in cents. |
| service_charges | integer | Total service charges, in cents. |
| sub_total | integer | Subtotal before tax (items + other_charges - discounts), in cents. |
| tax | integer | Total tax, in cents. |
| tips | integer | Total tips, in cents. |
| total | integer | Final amount due (subtotal + service_charges + exclusive_tax), in cents. |
ticket._embedded object
ticket._embedded objectContainer for nested ticket entities. May include ebt_type, discounts[], items[], and payments[]. Item-level entities (employee, order_type, revenue_center, table, and modifiers[]) are nested within each items[] entry.
ebt_type
ebt_type| Field | Type | Description |
|---|---|---|
| ebt_type | string | EBT type. Possible values: FOOD_STAMP, CASH_BENEFIT, VOUCHER, INQUIRY_CASH, INQUIRY_FOOD. |
discounts[] (array)
discounts[] (array)| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier of the discount. |
| comment | string | Discount comment. |
| name | string | Discount name as it appears on the ticket. |
| value | integer | Discount value, in cents. |
items[] (array)
items[] (array)| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier of the item. |
| inclusive_tax | integer | Tax included in the item price, in cents. |
| name | string | Item name. |
| price | integer | Total item price including quantity, modifiers, and discounts, in cents. |
| quantity | integer | Item quantity numerator. |
| sent | boolean | Indicates whether the item has been sent for preparation. |
| sent_at | timestamp | Time the item was sent for preparation. |
| split | integer | Item quantity denominator. |
| _embedded | object | Embedded item resources. |
items[].employee (object)
items[].employee (object)| Field | Type | Description |
|---|---|---|
| check_name | string | Employee name as printed on receipts. |
| first_name | string | Employee first name. |
| id | string | Unique employee identifier. |
| last_name | string | Employee last name. |
| login | string | Employee POS login/PIN. |
| middle_name | string | Employee middle name. |
| pos_id | string | Employee ID shown in the POS. |
| start_date | string | Employee start date (YYYY-MM-DD). |
items[].order_type (object)
items[].order_type (object)| Field | Type | Description |
|---|---|---|
| available | boolean | Whether tickets can be opened using this order type. |
| id | string | Unique order type identifier. |
| name | string | Order type name. |
| pos_id | string | Order type ID shown in the POS. |
items[].revenue_center (object)
items[].revenue_center (object)| Field | Type | Description |
|---|---|---|
| default | boolean | Indicates whether this is the default revenue center. |
| id | string | Unique revenue center identifier. |
| name | string | Revenue center name. |
| pos_id | string | Revenue center ID shown in the POS. |
items[].table (object)
items[].table (object)| Field | Type | Description |
|---|---|---|
| available | boolean | Whether the table is available for seating. |
| id | string | Unique table identifier. |
| name | string | Table name. |
| number | integer | Table number. |
| pos_id | string | Table ID shown in the POS. |
| seats | integer | Number of seats at the table. |
payments[] (array)
payments[] (array)| Field | Type | Description |
|---|---|---|
| id | string | Unique payment identifier. |
| amount | integer | Payment amount, in cents. |
| tender_types_id | integer | Tender type identifier applied to the payment. |
| tip | integer | Tip amount, in cents. |
items[]._embedded.modifiers[] (array)
items[]._embedded.modifiers[] (array)| Field | Type | Description |
|---|---|---|
| id | integer | Unique modifier identifier. |
| name | string | Modifier name. |
| price | integer | Modifier price, in cents. |
| quantity | integer | Modifier quantity. |
| comment | string | Comment attached to the modifier. |
Request Example
{
"ticket": {
"void": false,
"id": 21
},
"payment": {
"id": "19",
"amount": 666
},
"user_id_external": 5488,
"webhook_id": "7614fc1bd4saf6",
"terminal_id": 110,
"debug": 1
}
cURL Example
curl --request POST \
--url https://sandbox-api.softpoint.io/interface/v1/locations/YOUR_LOCATION_ID/webhook/auth \
--header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"ticket": { "void": false, "id": 21 },
"payment": { "id": "19", "amount": 666 },
"user_id_external": 5488,
"webhook_id": "7614fc1bd4saf6",
"terminal_id": 110,
"debug": 1
}'
Success Response
An approved authorization returns response: "APPROVED". The total field reflects the authorized amount, while amount (the captured amount) remains 0 until a capture occurs.
{
"response": "APPROVED",
"data": {
"id": 37224,
"id_external": "7da2ab5fdd617",
"amount": 0,
"tip": 0,
"total": 1000,
"refunded_amount": 0,
"surcharge": 0,
"transaction_id": "57904823",
"card_holder": "ATH PRIMA/Test Card 01",
"reference_id": "4",
"auth_code": "TAS261",
"card_type": "VISA",
"last4": "0043",
"entry_type": "Chip",
"result_message": "OK",
"emv_tags": "{\"Status\":\"\",\"ATC\":\"0B05\",\"TVR\":\"08C0808000\",\"APPPN\":\"Visa Credit\",\"TSI\":\"E800\",\"APPLAB\":\"VISA CREDIT\",\"AID\":\"A0000000031010\",\"IAD\":\"06010A0321A804\",\"ARQC\":\"25F8FE045F8013D2\",\"Balance\":\"$0.0\",\"CID\":\"00\"}",
"status": 1
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| response | string | Transaction outcome. Either APPROVED or DECLINE. |
| data | object | Transaction detail object. |
| data.id | integer | Softpoint transaction identifier. |
| data.id_external | string | External transaction reference; may be null. |
| data.amount | integer | Captured amount, in minor units. Remains 0 for an authorization-only request. |
| data.tip | integer | Tip amount, in minor units. |
| data.total | integer | Authorized total, in minor units. |
| data.refunded_amount | integer | Amount refunded against the transaction, in minor units. |
| data.surcharge | integer | Surcharge amount, in minor units. |
| data.transaction_id | string | Processor transaction identifier. |
| data.card_holder | string | Cardholder name; may be null. |
| data.reference_id | string | Reference identifier returned by the processor. |
| data.auth_code | string | Authorization code returned by the issuer. |
| data.card_type | string | Card brand. |
| data.last4 | string | Last four digits of the card number. |
| data.entry_type | string | How the card was read, for example Chip or Swipe. |
| data.result_message | string | Human-readable processor result message. |
| data.emv_tags | string | JSON-encoded string of EMV tag data captured during the transaction. |
| data.status | integer | Numeric transaction status code. |
Error Responses
The Auth endpoint shares the error model of the Sale endpoint. A decline is returned with HTTP 200 and response: "DECLINE". Structured errors use the standard envelope.
Terminal Not Found
{
"error": {
"code": 10107,
"message": "The selected terminal doesn't exist.",
"details": null
}
}
Missing Required Parameter
{
"error": {
"code": 10109,
"message": "The request is missing one or more required parameter(s).",
"details": {
"terminal_id": [
"missing_required_parameters"
]
}
}
}
Status Codes
| Code | Description |
|---|---|
| 200 | Request processed. Inspect response for the outcome. |
| 400 | Missing or invalid request parameters. |
| 401 | Missing or invalid access token. |
| 404 | The selected terminal does not exist. |
Workflow Placement
The Auth endpoint begins a two-step card-present payment:
-
Generate an interface access token.
-
Submit an authorization to place a hold on the card.
Notes
-
Amounts are expressed in minor units (cents).
-
For an authorization, the held amount appears in
total, andamountremains 0 until the funds are captured. -
The
emv_tagsfield is a JSON-encoded string and must be parsed separately if its contents are required. -
Setting
debugto 1 enriches the response with additional processor diagnostics and is intended for development environments.
Common Mistakes
-
Assuming funds are captured at authorization. An authorization only places a hold; a separate capture is required to settle.
-
Reading the captured value from
amountrather than the authorized value intotal. -
Treating an HTTP 200 response as a guaranteed approval without checking the
responsefield. -
Omitting
terminal_id, which results in error code 10109.

