tmr_ and belongs to exactly one Merchant and
mode. A Terminal accepts payments through
POST /terminals/{id}/process_payment_intent; the same call works for a
simulated Terminal and a physical one.
Every test account automatically receives three ready simulated Terminals
across two Ionic test Locations. Their IDs are unique to the Account. The
universal test_profile values—approved, declined, and delayed—identify
their deterministic default behavior.
Related objects
Every Terminal belongs to a Location. A Merchant can operate many Terminals
across many Locations; each Terminal processes one payment at a time.
Refund receipts
Whether a card-present Refund names aterminal_id, where it runs, and the
Account’s automatic refund receipts setting decide how its receipt prints.
terminal_id marks a refund done at the counter, so its receipt prints on that
Terminal:
Ionic turns on refunds on the Terminal only together with automatic refund
receipts, so on those Accounts every card-present refund with
terminal_id
prints once with no print request. Use the print route for a refund without
terminal_id, or for an additional copy; a request for a refund that already
printed prints another copy.
Request a receipt for a succeeded card-present Refund on any ready Terminal
of the same Account and mode:
payments:write; platforms select authorized connected
Accounts with Ionic-Account. The response reports status: "printed" when
the Terminal confirms printing, or status: "failed" when it does not. Retrying
with the same idempotency key replays that result. To request another print,
use a new key. The API reference
lists every field and error.
Automatic refund receipts are off by default. Ionic staff can enable them for
an Account separately in test and live mode. GET /v1/account reports this
policy as refund_receipts.auto_print. When enabled, a card-present Refund
that includes terminal_id requests a receipt on that Terminal after the
Refund is saved; a Refund without terminal_id does not print on its own.
Printing starts immediately in the background; the refund response does not
wait for the printer and does not confirm that paper printed. The Dashboard
also offers Print receipt for manual copies. Allow automatic printing to finish
before requesting another copy.
Printing briefly occupies the Terminal, and an interrupted print frees it within
30 seconds. A sale or manual print submitted while it is busy can return
409 TERMINAL_BUSY and sends nothing to the Terminal. Retry after the current
operation finishes with a new idempotency key, because a repeated key returns
the saved 409 response. If an automatic receipt finds the Terminal busy before sending the
print, it waits and tries again. An offline Terminal may not print, and printing
cannot change an approved Refund. Unconfirmed print attempts are not automatically retried,
because paper may already have printed. Online refunds are unaffected. Refunds
that run on the Terminal print there and do not request an additional automatic
receipt.
Refunds on the Terminal
Ionic staff can turn on refunds on the Terminal for an Account, separately in test and live mode, together with automatic refund receipts. Then a full refund that includesterminal_id, made before the sale’s batch settles, voids
the sale on the Terminal that took it. No card is needed, and the Terminal
prints the receipt as part of the refund. Naming another Terminal returns
422 CHARGE_NOT_REFUNDABLE and sends nothing. A partial refund must wait until
the batch settles; until then it returns 422.
After the batch settles, a refund goes back to the original card, with or
without terminal_id. With terminal_id, it prints
automatically on that Terminal. A settled PIN-debit refund always needs
terminal_id, because a PIN-debit refund needs the card.
The customer presents the card on that Terminal, which prints the receipt.
Send terminal_id only for refunds done at the counter. A Terminal that is
offline or busy fails the refund before anything is sent; retry with a new
idempotency key. If the
Terminal’s answer is unclear, the refund returns 504 GATEWAY_UNCERTAIN and
stays uncertain with its amount held. Ionic never sends it again or through
another channel, and a sale on that Terminal can start right away.
Three independent states
A Terminal reports three states that answer different questions. They change independently, so read the one that matches your question.Status
status tracks setup, not reachability. During physical Terminal provisioning,
the provisioning request moves through its own lifecycle and exposes a
terminal_id only when it becomes ready; the resulting Terminal is then
available as ready. A built-in simulated Terminal is provided as ready. Do not use
Terminal status to infer the state of an unfinished provisioning request.
Payments require ready; a payment sent to a Terminal in any other status
fails without reaching the device.
Connection status
connection_status reports observed reachability, together with
connection_observed_at and connection_status_stale. A ready Terminal
can be offline: the device is set up correctly but unplugged or off the
store network. When the last observation is too old to trust, Ionic reports
connection_status as unknown and sets connection_status_stale to
true; connection_observed_at preserves when the last real observation
happened.
Capabilities
capabilities maps each tender, such as credit or debit_pin, to two values:
support states whether the capability can be offered at all, while status
states whether it is operationally ready now. A conditional support value
means availability depends on the Merchant, device, payment setup, or
approval. A payment that selects payment_type: debit requires the Terminal’s
debit_pin capability to be ready, independently of its setup and connection
states.
Simulated and physical Terminals
Both kinds are the same object with the same fields and the same payment call.
List a test account’s simulated Terminals with
GET /terminals, choose one by
test_profile, and retain its Account-owned tmr_…. The default profile works
through the normal PaymentIntent processing call without a helper. Use an
exact Terminal payment override
only when a focused test needs a different outcome for one PaymentIntent.
A physical Terminal arrives through a provisioning request. Create the
request at a Location, then retrieve it until status is ready; its
terminal_id then references the new Terminal. Ionic manages fulfillment,
and required_actions lists anything Ionic needs from you to continue.
Identifiers
Send only Ionic IDs. Requests never identify a Terminal by a hardware serial number, device credential, or another external device identifier. Ionic manages device identity so a Terminal can keep itstmr_… across hardware
replacement.
