Vopify MCP Integration

Vopify exposes a Model Context Protocol (MCP) endpoint that allows AI assistants and automation tools to run payee verifications, retrieve verification history, and check account status on behalf of authenticated users. Compatible with Claude, ChatGPT, n8n, and any MCP-compatible tool.

Endpoint:   https://vopify.io/mcp
Transport:  Streamable HTTP (MCP spec 2025-06-18)
Auth:       OAuth 2.1 — Bearer token

Authentication

Vopify's MCP uses OAuth 2.1 with bearer tokens issued by Vopify's sign-in service. When connecting a new tool, you will be redirected to log in with your Vopify account credentials. The resulting bearer token is scoped to your account — all verifications consume credits from your balance.

Token audience: authenticated
Each tool or platform that connects to Vopify MCP must complete its own OAuth flow. If you connect both Claude and n8n, each will use a separate session tied to whichever Vopify account authenticated it.
Never share your bearer token. It provides full access to your Vopify account including the ability to consume credits.

Available tools

Vopify exposes 3 tools via MCP. All tools return the standard MCP CallToolResult shape — a content array where content[0].text contains the JSON-stringified payload, and a structuredContent object containing the same data parsed.

typescript
{ content: [{ type: "text", text: string }], // JSON-stringified payload structuredContent?: object, // same payload as parsed object isError?: boolean // true for tool-level failures where set }

verify_payee

WritesConsumes credits

Runs a real-time Verification of Payee check against the specified payment network and account details. Attempts to deduct 1 credit only when a verification result is returned (errorCategory: "verification_complete"). Credits are not charged for input errors, account issues, bank limitations, or temporary failures.

ParameterTypeRequiredDescription
networkstring✅ AlwaysPayment network: EUR, GBP, VND, INR, IDR, KRW, CNY; unsupported values receive INVALID_FIELD
namestring✅ AlwaysAccount holder name — 1–200 characters
holderTypeenum✅ Except CNYindividual or business — ignored for CNY
ibanstring✅ EUR, optional GBPRequired for EUR. For GBP use either iban or sortCode + accountNumber
sortCodestringGBP only6-digit UK sort code — dashes stripped automatically
accountNumberstringGBP (if no iban), INR, IDR, KRW, VNDBank account number
ifscCodestringINR onlyIndian IFSC code e.g. HDFC0001234
bankCodestringIDR, KRW, VNDBank identifier code
alipayIdstringCNY onlyAlipay registered phone number or email address

Network quick-reference

NetworknetworkholderTypeibansortCode + accountNumberifscCodebankCodealipayId
SEPA / EUREUR✅✅————
UK CoP / GBPGBP✅IBAN orsort code + account———
Vietnam / VNDVND✅—✅—✅—
India / INRINR✅—✅✅——
Indonesia / IDRIDR✅—✅—✅—
South Korea / KRWKRW✅—✅—✅—
China / AlipayCNY❌————✅

Result — structuredContent

typescript
{ errorCategory: "input_validation" | "account_action_required" | "bank_limitation" | "verification_complete" | "transient_error", verificationOutcome: "match" | "partial_match" | "no_match" | null, errorCode: string | null, resolvedName: string | null, // partial_match only — always null for CNY message: string, // user-facing, safe to display directly creditCharged: boolean, // true when a completed check deducted a credit creditsRemaining: number | null, network: string | null, // unsupported input can be returned unchanged referenceId?: string // only on unexpected TEMPORARILY_UNAVAILABLE failures }
FieldDescription
errorCategoryClassification of the result. verification_complete — result returned, creditCharged indicates whether a credit was deducted. input_validation — invalid inputs, no credit charged. account_action_required — your account needs attention (session expired, not enough credits, or suspended), no credit charged. bank_limitation — verification is restricted or unavailable, no credit charged. transient_error — temporary failure, no credit charged.
verificationOutcomeThe match result. Only populated when errorCategory is verification_complete.
resolvedNameThe correct name held by the bank. Populated on partial_match only. Always null for CNY.
messageUser-facing description of the result — safe to display directly in your UI or workflow.
creditChargedtrue only when a completed check actually deducted a credit.
creditsRemainingUpdated balance when available; null if it could not be read.
referenceIdPresent only for an unexpected temporary failure; include it when contacting support.
CNY/Alipay returns match or no_match only — partial_match is not supported on this network. resolvedName will always be null for CNY.

Example responses

json
{ "errorCategory": "verification_complete", "verificationOutcome": "match", "errorCode": null, "resolvedName": null, "message": "Verification complete — the name matches the account holder. ✓ One credit was used.", "creditCharged": true, "creditsRemaining": 147, "network": "EUR" }

Error codes

The following codes are returned as structured results, not isError: true. A completed verification has errorCode: null.

errorCodeerrorCategoryMeaning
MISSING_REQUIRED_FIELDinput_validationA required network-specific field or name is missing.
INVALID_FIELDinput_validationUnsupported network, invalid field length or format.
MISSING_FIELDSinput_validationRequired account details are missing during server validation.
INVALID_NAME_FORMATinput_validationAccount holder name format is invalid.
INVALID_IBANinput_validationIBAN format or country is invalid.
INVALID_IBAN_CHECKSUMinput_validationIBAN check digits do not match.
SWIFT_NOT_IFSCinput_validationA SWIFT/BIC code was entered instead of an IFSC.
INVALID_IFSC_FORMATinput_validationIFSC format is invalid.
IFSC_UNKNOWN_BANKinput_validationIFSC does not match a recognized bank.
INVALID_ACCOUNT_FORMATinput_validationAccount number or routing format is invalid.
INVALID_BANK_CODEinput_validationBank code is missing, invalid or unrecognized.
INVALID_UPI_FORMATinput_validationUPI ID format is invalid.
INVALID_ALIPAY_FORMATinput_validationAlipay ID is not a valid phone number or email.
BANK_REJECTED_ACCOUNTinput_validationAccount number was rejected.
BANK_REJECTED_ACCOUNT_IFSCinput_validationAccount number and IFSC combination was rejected.
BANK_REJECTED_IFSCinput_validationIFSC was rejected.
UPI_NOT_RECOGNIZEDinput_validationUPI ID was not recognized.
ACCOUNT_NOT_EXISTinput_validationAccount number does not exist at the selected bank.
INVALID_ACCOUNT_BANK_PAIRinput_validationAccount number does not match the selected bank.
ALIPAY_COMBO_INVALIDinput_validationAlipay ID and name combination could not be verified.
SESSION_EXPIREDaccount_action_requiredReconnect Vopify in your assistant. No credit was used.
INSUFFICIENT_CREDITSaccount_action_requiredAdd credits at vopify.io/billing. No credit was used.
ACCOUNT_SUSPENDEDaccount_action_requiredContact operations@vopify.io. No credit was used.
CANNOT_VERIFYbank_limitationAccount cannot be verified on this network.
ACCOUNT_CLOSEDbank_limitationAccount has been closed.
NETWORK_NOT_ENABLEDbank_limitationVerification is not enabled on this network.
COULD_NOT_CHECKtransient_errorCheck could not be completed right now.
PROVIDER_ERRORtransient_errorTemporary verification service failure.
NETWORK_ERRORtransient_errorTemporary connection failure.
AUTH_FAILUREtransient_errorTemporary internal service error — retry later. This is not a problem with your session; no need to reconnect.
TEMPORARILY_UNAVAILABLEtransient_errorUnexpected failure; use referenceId when contacting support.

For an invalid network the message is “Please choose a supported network: EUR, GBP, INR, IDR, KRW, VND or CNY. No credit was used.” For insufficient credits it is “Your Vopify account doesn't have enough credits for this check. Add credits at vopify.io/billing and try again. No credit was used.” Other results include a user-facing message.

list_verifications

Read only

Returns the authenticated user's recent verification history, most recent first. Results are scoped to the authenticated account — you cannot retrieve another user's history.

ParameterTypeRequiredDefaultConstraintsDescription
limitinteger❌201–100Number of recent records to return
content[0].text contains the JSON-stringified array directly — not wrapped in an object. structuredContent contains { rows: [...] }. Always read from structuredContent in n8n and programmatic clients to avoid double-parsing.
typescript
{ rows: Array<{ created_at: string | null, // ISO 8601 timestamp network: string | null, // payment network iban_suffix: string | null, // last 4 characters of account identifier provided_name: string | null, result_status: "FULL_MATCH" | "PARTIAL_MATCH" | "NO_MATCH" | "UNAVAILABLE", suggested_name: string | null }> }
json
{ "rows": [ { "created_at": "2025-07-10T14:32:00Z", "network": "EUR", "iban_suffix": "4300", "provided_name": "Sample Payee", "result_status": "FULL_MATCH", "suggested_name": null }, { "created_at": "2025-07-10T13:11:00Z", "network": "EUR", "iban_suffix": "7890", "provided_name": "Sample-Payee", "result_status": "PARTIAL_MATCH", "suggested_name": "Sample Payee" } ] }

Error responses (isError: true)

  • Expired session — reconnect Vopify in your assistant
  • History query failure — “Your verification history couldn't be loaded right now. Please try again in a moment.” Internal details are logged, not returned.

account_status

Read only

Returns the authenticated user's credit balance and active plan. Takes no parameters — pass an empty object {}.

Parameters: None.

typescript
{ email: string | null, credits: number, plan: "Starter" | "Growth" | "Scale" | "Pay-as-you-go" | "Subscription", subscription: null | { status: "active" | "trialing" | "past_due", renewsAt: string | null, cancelAtPeriodEnd: boolean } }

The most recent live subscription is preferred, otherwise the most recent eligible subscription. A recognized subscription maps to Starter, Growth or Scale; an unrecognized subscription is labeled Subscription. Without an active, trialing or past-due subscription, the plan is Pay-as-you-go and subscription is null.

json
{ "email": "sample@example.com", "credits": 1348, "plan": "Growth", "subscription": { "status": "active", "renewsAt": "2026-11-03T00:00:00Z", "cancelAtPeriodEnd": false } }

Error responses (isError: true)

  • Expired session — reconnect Vopify in your assistant
  • Account or subscription query failure — “Your account status couldn't be loaded right now. Please try again in a moment.”

Connecting Vopify MCP

  1. In Claude, open Settings → Connectors → Add custom connector
  2. Enter Vopify and the server URL https://vopify.io/mcp. Vopify is not in the connector directory yet.
  3. Click Connect and log in with your Vopify account credentials
  4. Once connected, Claude can call all three tools on your behalf
  5. Try: "Verify that IBAN NL91ABNA0417164300 belongs to Sample Payee — individual account, SEPA network"

Error handling

verify_payee returns structured results for invalid input, expired sessions, suspended accounts, insufficient credits, bank limitations and temporary errors; it does not set isError: true in its handler. Use errorCategory and errorCode for these outcomes. list_verifications and account_status return isError: true with safe plain text on expired sessions or query failures. Protocol, authentication or schema rejections can also occur before a tool handler returns a structured result. Always check isError when present, then inspect structuredContent.

javascript
const result = await mcpClient.callTool("verify_payee", params); if (result.isError) { // Tool-level or protocol failure — re-authenticate or retry console.error(result.content[0].text); return; } const data = result.structuredContent; switch (data.errorCategory) { case "verification_complete": // 1 credit charged — process the result console.log(data.verificationOutcome); // "match" | "partial_match" | "no_match" console.log(data.resolvedName); // suggested name for partial_match break; case "input_validation": // No credit charged — fix the inputs console.log(data.message); break; case "bank_limitation": // No credit charged — bank doesn't support verification console.log(data.message); break; case "transient_error": // No credit charged — retry after a delay break; case "account_action_required": // No credit charged — reconnect, top up credits, or contact support console.log(data.message); break; }

Credits and billing

  • 1 credit is deducted on a completed verify_payee check; check creditCharged for confirmation
  • While a check runs, 1 credit is held on your balance. It is kept only if the check completes and returned automatically otherwise. Held-and-returned credits don't appear in your transaction history.
  • No credit is charged for input_validation, account_action_required, bank_limitation, or transient_error outcomes
  • creditCharged: true in the response confirms a credit was consumed
  • creditsRemaining shows your balance when available; it can be null if it could not be read
  • If your balance is too low, verify_payee returns errorCategory: "account_action_required" with an insufficient credits message — no credit consumed
  • Check your balance anytime using account_status or at vopify.io/billing

Changelog

October 3, 2026. Changed:

  • Expired session, suspended account, insufficient credits — Before: errorCategory: "input_validation" with codes SESSION_EXPIRED, ACCOUNT_SUSPENDED, INSUFFICIENT_CREDITS; structured result, isError not set. Now: errorCategory: "account_action_required", same codes, new reconnect / support / billing messages; structured result, isError not set.
  • Unsupported network value — Before: rejected by the connector's input schema before reaching Vopify; no errorCategory or errorCode; may previously have returned a tool error (isError: true). Now: errorCategory: "input_validation", errorCode: "INVALID_FIELD" with the supported-network message; structured result, isError not set.
  • Missing required field — Before: generic validation error. Now: errorCategory: "input_validation", errorCode: "MISSING_REQUIRED_FIELD" naming the field; structured result, isError not set.
  • Unexpected failures — Before: the raw error was surfaced as a tool error (isError: true) with no category or code. Now: errorCategory: "transient_error", errorCode: "TEMPORARILY_UNAVAILABLE" with a referenceId for support; structured result, isError not set.
  • Check order — Now: input validation, then session, then suspension, then credits, so input problems are reported before account problems.
  • account_status — Before: no plan field. Now: returns plan and a subscription object.
  • list_verifications — Before: no network field. Now: each item includes network.

Need help?

For integration support, email operations@vopify.io with subject line MCP Integration Support. Include your client platform (n8n, Claude, ChatGPT, or custom), the tool you're calling, the parameters you're sending (redact any real IBANs or account numbers), and the full response you're receiving.