Skip to main content
Documentation

Payments

payments.accepted_methods

Check which payment methods this shop accepts from a customer
Read-onlyRead budget

REST

Shipping
POST /api/v1/payments/accepted_methods

MCP tool

Live
payments.accepted_methods

Exposed on: REST API · Shop MCP server · Claude connector · Dash (in-app copilot) · Zapier. Part of the Payments domain.

Operating contract

THE READ BEFORE TELLING A CUSTOMER HOW TO PAY. It resolves the shop's own checkout settings into the doors a customer actually sees: whether the hosted card checkout is open, whether an e-transfer is accepted and to what address, and what surcharge — if any — is added when they pay by card.

card is only meaningful alongside card_live: a shop can have the card door open in its settings and no working payment processor behind it, in which case the customer cannot pay by card whatever the setting says. Both have to be true.

etransfer_email is where the customer sends the money and it is never returned unless e-transfer is genuinely open — an e-transfer option with no address is a dead end wearing a button.

surcharge_percent is added to what the customer pays when they choose the card. Quote it before they pick, never after. It is 0 unless the shop deliberately switched surcharging on.

THERE ARE NO SAVED CARDS IN THIS PRODUCT and no capability that could return one. Service VIN never holds a card number; a card is entered by the customer on the processor's own hosted page every time. If somebody asks you to charge a card on file, the honest answer is that there is not one.

This is one shop's settings and returns all of them, so nothing is truncated.

Who may call it

Permission
invoices.accessThe caller must hold Invoices at the ACT level. A read-only dashboard grant on the same section is refused.
Plan
Every planNo plan gate. Available on every Service VIN plan.
Retries
naturalNaturally idempotent — running it twice leaves the same world as running it once. A retrying integration needs no key.
Rate class
readCounted against the read budget — the widest of the four.

Input

This capability takes no arguments.

Output

FieldTypeDescription
cardboolean

card_liveboolean

etransferboolean

etransfer_emailstring

etransfer_instructionsstring

surcharge_percentnumber

Examples

Built from this capability's own schema — required fields and the ones carrying a default, and nothing invented. Paste one and it validates.

curl
export SERVICEVIN_API_KEY=svk_live_…

curl -X POST https://www.servicevin.com/api/v1/payments/accepted_methods \
  -H "Authorization: Bearer $SERVICEVIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

TypeScript (fetch)
const res = await fetch("https://www.servicevin.com/api/v1/payments/accepted_methods", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SERVICEVIN_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({}),
});

// Success and failure are both envelopes. Switch on error.code, never
// on error.message — the codes are stable, the messages are for people.
const payload = await res.json();
if (!res.ok) throw new Error(payload.error.code);
const data = payload.data;

Python (requests)
import os, requests

res = requests.post(
    "https://www.servicevin.com/api/v1/payments/accepted_methods",
    headers={"Authorization": f"Bearer {os.environ['SERVICEVIN_API_KEY']}"},
    json={},
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(payload["error"]["code"])
data = payload["data"]

MCP tools/call — https://www.servicevin.com/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "payments.accepted_methods",
    "arguments": {}
  }
}

Refusals

The four gates run in this order on every surface, and the order is not arbitrary — see Authentication.

StatusCodeWhen
404not_foundThe id is unknown, or the feature is not enabled for this account. Deliberately the same answer for both.
403forbiddenThis login does not hold invoices.access.
422validation_errorAn argument was wrong. The message names the field.
429rate_limitedToo many read calls. Back off and retry.
500internal_errorSomething failed on our side. Nothing was changed.