Create a PaymentIntent server-side via POST /v1/payment_intents with amount, currency, payment_method_types=["card_present"], and capture_method=manual (recommended for in-person to allow inspection before capture)
Call POST /v1/terminal/readers/<reader_id>/process_payment_intent with payment_intent=<pi_id> to instruct the reader to collect card payment; this is the server-driven integration path requiring no SDK on the POS terminal
Poll GET /v1/terminal/readers/<reader_id> for action.status; it transitions from in_progress to succeeded when the cardholder taps or dips their card
Once action.status=succeeded, capture the PaymentIntent via POST /v1/payment_intents/<pi_id>/capture
Handle action.failure_code on the reader object if the action fails (e.g., card declined, timeout); cancel the action via POST /v1/terminal/readers/<reader_id>/cancel_action before retrying
Known gotchas
process_payment_intent requires the PaymentIntent to be in status=requires_payment_method; calling it on a PI that already has a payment method attached will fail
The server-driven integration does not support collect_inputs or tipping without additional configuration; for richer flows use the JavaScript or mobile SDK
You must cancel any in-progress action on a reader before starting a new one; attempting a second process_payment_intent while one is active returns an error
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp