Auth

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

HeaderRequiredDescription
AuthorizationYesBearer YOUR_ACCESS_TOKEN
Content-TypeYesapplication/json

Request Parameters

Path Parameters

ParameterTypeRequiredDescription
location_idstringYesIdentifier of the location processing the authorization

Request Body Fields

FieldTypeRequiredDescription
ticketobjectYesSee ticket object below.
ticket.idstringYesThe unique identifier of the ticket.
ticket.voidbooleanNoIndicates whether the ticket has been voided.
paymentobjectYesPayment instruction for the terminal.
payment.idstringYesUnique identifier for the payment.
payment.amountintegerYesPayment amount, in cents.
payment.cashbackintegerNoEBT cashback amount, in cents.
payment.inv_numberintegerNoTransaction reference number (15-character limit).
user_id_externalintegerNoExternal user ID associated with the card being tokenized (if applicable).
webhook_idstringYesUnique identifier for the webhook.
terminal_idstringYesUnique identifier for the POS terminal.
debugintegerNoWhen 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

FieldTypeRequiredDescription
idstringYesThe unique identifier of the ticket.
namestringNoThe name of the ticket.
openbooleanNoIndicates whether the ticket is still open.
opened_attimestampNoThe timestamp when the ticket was opened.
closed_attimestampNoThe timestamp when the ticket was closed.
ticket_numberintegerNoThe ticket number.
customerobjectNoCustomer information. See ticket.customer object below.
totalsobjectNoTicket totals information. See ticket.totals object below.
voidbooleanNoIndicates whether the ticket has been voided.
_embeddedobjectNoEmbedded ticket resources. See ticket._embedded object below.

ticket.customer object

FieldTypeDescription
customer_namestringName of the customer or guest for the transaction.
customer_emailstringEmail address of the customer or guest for the transaction.

ticket.totals object

All values are integers in minor units (cents).

FieldTypeDescription
discountsintegerTotal ticket-level discounts, in cents.
dueintegerRemaining unpaid amount (total - paid), in cents.
exclusive_taxintegerTaxes not included in item or service charge prices, in cents.
inclusive_taxintegerTaxes included in item or service charge prices, in cents.
itemsintegerTotal cost of all items, in cents.
other_chargesintegerTotal cost of all other charges, in cents.
paidintegerTotal amount paid, in cents.
service_chargesintegerTotal service charges, in cents.
sub_totalintegerSubtotal before tax (items + other_charges - discounts), in cents.
taxintegerTotal tax, in cents.
tipsintegerTotal tips, in cents.
totalintegerFinal amount due (subtotal + service_charges + exclusive_tax), in cents.

ticket._embedded object

Container 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

FieldTypeDescription
ebt_typestringEBT type. Possible values: FOOD_STAMP, CASH_BENEFIT, VOUCHER, INQUIRY_CASH, INQUIRY_FOOD.

discounts[] (array)

FieldTypeDescription
idstringUnique identifier of the discount.
commentstringDiscount comment.
namestringDiscount name as it appears on the ticket.
valueintegerDiscount value, in cents.

items[] (array)

FieldTypeDescription
idstringUnique identifier of the item.
inclusive_taxintegerTax included in the item price, in cents.
namestringItem name.
priceintegerTotal item price including quantity, modifiers, and discounts, in cents.
quantityintegerItem quantity numerator.
sentbooleanIndicates whether the item has been sent for preparation.
sent_attimestampTime the item was sent for preparation.
splitintegerItem quantity denominator.
_embeddedobjectEmbedded item resources.

items[].employee (object)

FieldTypeDescription
check_namestringEmployee name as printed on receipts.
first_namestringEmployee first name.
idstringUnique employee identifier.
last_namestringEmployee last name.
loginstringEmployee POS login/PIN.
middle_namestringEmployee middle name.
pos_idstringEmployee ID shown in the POS.
start_datestringEmployee start date (YYYY-MM-DD).

items[].order_type (object)

FieldTypeDescription
availablebooleanWhether tickets can be opened using this order type.
idstringUnique order type identifier.
namestringOrder type name.
pos_idstringOrder type ID shown in the POS.

items[].revenue_center (object)

FieldTypeDescription
defaultbooleanIndicates whether this is the default revenue center.
idstringUnique revenue center identifier.
namestringRevenue center name.
pos_idstringRevenue center ID shown in the POS.

items[].table (object)

FieldTypeDescription
availablebooleanWhether the table is available for seating.
idstringUnique table identifier.
namestringTable name.
numberintegerTable number.
pos_idstringTable ID shown in the POS.
seatsintegerNumber of seats at the table.

payments[] (array)

FieldTypeDescription
idstringUnique payment identifier.
amountintegerPayment amount, in cents.
tender_types_idintegerTender type identifier applied to the payment.
tipintegerTip amount, in cents.

items[]._embedded.modifiers[] (array)

FieldTypeDescription
idintegerUnique modifier identifier.
namestringModifier name.
priceintegerModifier price, in cents.
quantityintegerModifier quantity.
commentstringComment 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

FieldTypeDescription
responsestringTransaction outcome. Either APPROVED or DECLINE.
dataobjectTransaction detail object.
data.idintegerSoftpoint transaction identifier.
data.id_externalstringExternal transaction reference; may be null.
data.amountintegerCaptured amount, in minor units. Remains 0 for an authorization-only request.
data.tipintegerTip amount, in minor units.
data.totalintegerAuthorized total, in minor units.
data.refunded_amountintegerAmount refunded against the transaction, in minor units.
data.surchargeintegerSurcharge amount, in minor units.
data.transaction_idstringProcessor transaction identifier.
data.card_holderstringCardholder name; may be null.
data.reference_idstringReference identifier returned by the processor.
data.auth_codestringAuthorization code returned by the issuer.
data.card_typestringCard brand.
data.last4stringLast four digits of the card number.
data.entry_typestringHow the card was read, for example Chip or Swipe.
data.result_messagestringHuman-readable processor result message.
data.emv_tagsstringJSON-encoded string of EMV tag data captured during the transaction.
data.statusintegerNumeric 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

CodeDescription
200Request processed. Inspect response for the outcome.
400Missing or invalid request parameters.
401Missing or invalid access token.
404The selected terminal does not exist.

Workflow Placement

The Auth endpoint begins a two-step card-present payment:

  1. Generate an interface access token.

  2. 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, and amount remains 0 until the funds are captured.

  • The emv_tags field is a JSON-encoded string and must be parsed separately if its contents are required.

  • Setting debug to 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 amount rather than the authorized value in total.

  • Treating an HTTP 200 response as a guaranteed approval without checking the response field.

  • Omitting terminal_id, which results in error code 10109.

Body Params
Response

Language
Credentials
Bearer
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json