Skip to main content
Glama
Payware MCP Server

Payware MCP Server

Official
by payware

payware MCP Server

npm version

Official MCP (Model Context Protocol) server for payware payment API integration. This server enables AI assistants to interact with payware APIs, automating integration workflows for all partner types.

Releases are published to npm as @payware/mcp-server and to the official MCP Registry as io.github.payware/mcp-server. MIT licensed, see LICENSE.

Who Is This For?

  • Merchants - Accept payments, manage products, generate transaction reports

  • ISVs (Independent Software Vendors) - Build multi-merchant platforms with OAuth2 token management

  • Payment Institutions - Process A2A transfers, handle Payment Choice Architecture with multiple payment methods

Related MCP server: PayHere Documentation MCP Server

What's New in 2.2.0

  • Execution lock - A payment institution finalizes with EXECUTING immediately before money moves, then CONFIRMED once the Merchant Leg has completed, or FAILED; transferType and feeLegOutcome are new

  • Deferred Merchant Leg - Merchants, and ISVs for them, can allow a credit transfer that settles later with deferredAllowed

  • Code examples - payware_generate_code_example writes complete, signed programs for real routes only, including the institution finalize flow

Features

🔐 Authentication Tools

  • RSA Key Generation: Generate secure 2048-bit RSA key pairs

  • JWT Token Creation: Create properly formatted JWT tokens

  • Sandbox Setup: Configure sandbox authentication

💳 Transaction Tools

  • Create Transaction: Support PLAIN, QR, and BARCODE transactions

  • Process Transaction: Process transactions with Payment Choice Architecture support

  • Transaction Status: Check transaction status by ID

  • Transaction History: Get finalized transaction details

  • Callback Simulation: Test callback scenarios for merchants and payment institutions

📍 Point of Interaction (POI) Tools

  • Set Price: Configure POI with amount, currency, and payment details

  • Cancel Price: Clear active price from POI

  • Get POI: Retrieve POI details and current state

  • Get Status: Check POI transaction status

  • Get QR Code: Generate QR code for POI payments

  • List POIs: List all POIs for a merchant

📣 Campaign, Placement and Airing Tools

For merchants, and for ISVs acting for them. Changes need the merchant's PRM plan; reading works on every plan.

  • Placements: Distribute a product through posters, TV spots, packaging, links or tags, each with its own pl ID, so every payment it starts is attributed to it. Includes the QR code, barcode and short link of each placement

  • Campaigns: Group placements, across products, and read their combined results

  • Airing Rules: Schedule when a placement is on air, with recurrences, time windows and time zones, and replace a whole schedule in one call

  • Airing Calendar: Every airing across all products in a time range

  • Results: Offers shown, payments started and confirmed, and confirmed amounts per placement or campaign

📋 Logs Tools (Premium)

  • Query Logs: Search and filter application logs by level, logger, message content, and date range

  • Log Status: Check log availability and storage information

  • Download Logs: Get compressed archive of logs for offline analysis

🛠️ Utility Tools

  • Code Examples: A complete program for one API call, or the JWT helper, in Python, Node.js, PHP, Java, C# or curl, signed as payware requires and calling the real route

  • Integration Overview: Base URLs, request signing and every operation the code examples cover, per partner type

  • Request Formatting: Format and validate API requests

Quick Start

1. Installation

From npm (recommended):

npm install -g @payware/mcp-server

From source:

git clone https://github.com/payware/mcp-server.git
cd mcp-server
npm install

2. Environment Configuration

Copy the example environment file and configure your credentials:

cp .env.example .env

Edit .env file:

# Partner ID from payware dashboard
PAYWARE_PARTNER_ID=your_partner_id_here

# Path to private key file (relative to project root)
PAYWARE_SANDBOX_PRIVATE_KEY_PATH=keys/sandbox-your-private-key.pem
PAYWARE_PRODUCTION_PRIVATE_KEY_PATH=keys/production-your-private-key.pem

# Optional: Sandbox base URL (defaults to https://sandbox.payware.eu/api)
PAYWARE_SANDBOX_URL=https://sandbox.payware.eu/api

⚠️ Security Note: Never commit the .env file to version control. It contains sensitive credentials.

Choosing toolsets

Every tool definition goes into the assistant's context on every turn, and a merchant has over 70 of them. To offer only the groups you use, set PAYWARE_MCP_TOOLSETS to a comma-separated list:

PAYWARE_MCP_TOOLSETS=products,placements

Toolsets: auth, transactions, products, placements, data, logs, poi, shops, onboarding, utils. Unset, or all, loads every tool. An unknown name is ignored with a warning in the server log. A tool outside the chosen toolsets is neither listed nor callable; this narrows what the assistant is offered and does not change what your partner account may do. An ISV that obtains OAuth2 tokens through this server includes auth.

3. Start the MCP Server

npm start

4. Basic Integration Flow

  1. Generate RSA Keys

    Tool: payware_authentication_generate_rsa_keys
  2. Create JWT Token

    Tool: payware_authentication_create_jwt_token
    Parameters:
    - partnerId: (from PAYWARE_PARTNER_ID)
    - privateKey: (from environment-specific key path)
  3. Setup Sandbox

    Tool: payware_authentication_setup_sandbox_auth
    Parameters:
    - partnerId: (from PAYWARE_PARTNER_ID)
  4. Create Transaction

    Tool: payware_operations_create_transaction
    Parameters:
    - partnerId: (from PAYWARE_PARTNER_ID)
    - privateKey: (from environment-specific key path)
    - amount: 10.00
    - currency: EUR
    - reasonL1: "Payment description"
    - type: PLAIN
  5. Check Status

    Tool: payware_operations_get_transaction_status
    Parameters:
    - partnerId: (from PAYWARE_PARTNER_ID)
    - privateKey: (from environment-specific key path)
    - transactionId: TRANSACTION_ID

API Request Structure

The payware MCP server transforms flat parameter inputs into the proper nested JSON structure required by the payware API:

Create Transaction Request Structure

{
  // ROOT LEVEL - Transaction metadata
  "shop": "SHOP001",                    // Optional: Shop code
  "account": "GB29NWBK60161331926810",  // Optional: Account identifier
  "friendlyName": "Your Shop Name",     // Optional: Account holder name
  "callbackUrl": "https://callback.url", // Optional: HTTPS callback URL
  "passbackParams": "{\"orderId\":\"12345\"}", // Optional: Callback parameters
  
  // TRANSACTION DATA - Required transaction information
  "trData": {
    "amount": "25.50",              // String/Number: Amount (can be "0.00" for flexible amounts)
    "currency": "EUR",              // REQUIRED: ISO 3-character currency code
    "reasonL1": "Payment for services", // REQUIRED: Transaction description (max 100 chars)
    "reasonL2": "Order #12345"      // Optional: Additional description (max 100 chars)
  },
  
  // TRANSACTION OPTIONS - Transaction behavior settings
  "trOptions": {
    "type": "QR",                   // PLAIN, QR, or BARCODE (default: PLAIN)
    "timeToLive": 300               // Seconds: 60-600 (default: 120)
  },
  
  // QR OPTIONS - Only included when type=QR
  "qrOptions": {
    "qrFormat": "PNG",              // PNG, JPG, SVG (default: SVG)
    "qrBorder": 4,                  // Border modules: 1-10 (default: 4)
    "qrErrorCorrection": "QUARTILE", // LOW, MEDIUM, QUARTILE, HIGH (default: QUARTILE)
    "qrScale": 16,                  // Pixel size: 1-100 (default: 16, irrelevant for SVG)
    "qrVersion": 10                 // QR version: 1-40 (default: 3)
  },
  
  // BARCODE OPTIONS - Only included when type=BARCODE
  "barOptions": {
    "barFormat": "SVG",             // PNG, SVG, JPG (default: SVG)
    "barModuleWidth": 2,            // Module width: 1-10 (default: 2)
    "barBarHeight": 100,            // Height: 15-1000 (default: 100)
    "barFontSize": 12,              // Font size: 0-24 (default: 12)
    "barHumanReadableLocation": "NONE" // NONE, BOTTOM, TOP (default: NONE)
  }
}

Parameter Mapping

When using MCP tools, parameters are automatically mapped to the correct API structure:

MCP Tool Parameter

API Location

Description

partnerId, privateKey

Authentication

Used for JWT signing, not sent in request

account, friendlyName, shop, callbackUrl, passbackParams

Root Level

Transaction metadata

amount, currency, reasonL1, reasonL2

trData object

Core transaction data

type, timeToLive, deferredAllowed

trOptions object

Transaction behavior (deferredAllowed: the merchant's opt-in to a deferred Merchant Leg, sent only when true)

qrFormat, qrBorder, etc.

qrOptions object

QR code settings (when type=QR)

barFormat, barModuleWidth, etc.

barOptions object

Barcode settings (when type=BARCODE)

Available Tools

Code Generation & Documentation

payware_generate_code_example

A complete program for one payware API call, in Python, Node.js, PHP, Java, C# or curl

Each program signs its request with an RS256 JWT (contentSha256 for a body; on behalf of a merchant for an ISV, except the OAuth2 endpoints) and calls a route the server has. The operations, by partner type:

  • Transactions (all): create_transaction, get_transaction_status, process_transaction, cancel_transaction, get_transaction_history

  • Institution finalize (payment_institution): finalize_transaction, the whole flow - process, then EXECUTING immediately before money moves, then CONFIRMED once the Merchant Leg has completed or FAILED, on PATCH /api/transactions/{transactionId}

  • Products and audio (merchant, isv): create_product, get_product, list_products, update_product, delete_product, register_audio, get_audios, get_audio, update_audio, delete_audio

  • OAuth2 (isv): obtain_token, get_token_info, rotate_token

  • Reports (all, production only): list_reports, generate_report, get_report_status, export_report

  • authentication: the JWT helper on its own

payware_generate_documentation

An integration overview for one partner type

Base URLs, how requests are signed, and every operation above that the partner type has, with its route.

Authentication

payware_authentication_generate_rsa_keys

Generate RSA key pair for API authentication.

Parameters:

  • keySize (optional): RSA key size in bits (default: 2048)

payware_authentication_create_jwt_token

Create JWT token for API authentication.

Parameters:

  • partnerId (required): Partner ID from payware

  • privateKey (required): RSA private key in PEM format

payware_authentication_validate_jwt

Validate JWT token format and signature.

Parameters:

  • token (required): JWT token to validate

  • partnerId (required): Partner ID for validation

payware_authentication_test_jwt

Test JWT token with payware API.

Parameters:

  • token (required): JWT token to test

  • partnerId (required): Partner ID

payware_authentication_setup_sandbox_auth

Setup sandbox authentication configuration.

Parameters:

  • partnerId (required): Partner ID from payware

  • privateKey (optional): Private key for validation

Transactions

Transaction Status Overview

payware transactions can have the following statuses:

ACTIVE Status:

  • ⏳ ACTIVE: Active transaction pending processing or finalizing. Once the payer's institution has started the payment it stays ACTIVE past timeToLive until the money has moved (seconds for an instant transfer, days with deferredAllowed), so never infer EXPIRED from the clock

  • This is the only status returned by payware_operations_get_transaction_status (a payment institution also sees EXECUTING on a transaction it has locked)

  • Use GET /transactions/{id} endpoint

Final Statuses:

  • ✅ CONFIRMED: Successfully finalized

  • ❌ DECLINED: Declined by the user, processing or finalizing payment institutions

  • 💥 FAILED: Failed due to technical reasons or other

  • ⏰ EXPIRED: Time to live of the transaction has passed

  • 🚫 CANCELLED: Transaction canceled by the originator

These final statuses are only available through payware_operations_get_transaction_history using GET /transactions-history/{id} endpoint.

payware_operations_create_transaction

Create a new transaction with full API structure support.

Key Parameters:

  • currency (required): ISO 4217 code payware knows (an unknown code is refused)

  • reasonL1 (required): Transaction description (max 100 chars)

  • partnerId (required): Partner ID from payware dashboard

  • privateKey (required): RSA private key for JWT signing

  • amount (optional): Currency value (default: "0.00" for flexible amounts)

  • type (optional): PLAIN, QR, or BARCODE (default: PLAIN)

  • timeToLive (optional): Payment timeout in seconds, 60-600 (default: 120)

  • deferredAllowed (optional): true lets the payer's institution pay by a credit transfer that settles later; refused with producer or terminal fields (ERR_DEFERRED_TRANSFER_NOT_ALLOWED). A deferred payment stays ACTIVE until it settles, which can take days

QR Options (when type=QR):

  • qrFormat: PNG, JPG, SVG (default: SVG)

  • qrErrorCorrection: LOW, MEDIUM, QUARTILE, HIGH (default: QUARTILE)

  • qrScale (1-100, default 16), qrBorder (1-10, default 4), qrVersion (1-40, default 3): size and appearance

Barcode Options (when type=BARCODE):

  • barFormat: PNG, SVG, JPG (default: SVG)

  • barModuleWidth (1-10, default 2), barBarHeight (15-1000, default 100), barFontSize (0-24, default 12), barHumanReadableLocation (NONE, BOTTOM, TOP, default NONE)

payware_operations_get_transaction_status

Get status of ACTIVE transactions only. For completed/finalized transactions use history tool.

Parameters:

  • transactionId (required): Transaction ID (starts with 'pw')

  • partnerId (required): Partner ID

  • privateKey (required): Private key for JWT signing

payware_operations_simulate_callback

Simulate callback scenarios for testing.

Parameters:

  • transactionId (required): Transaction ID

  • status (optional): CONFIRMED, DECLINED, FAILED, EXPIRED, or CANCELLED (default: CONFIRMED)

  • callbackUrl (optional): URL where callback would be sent

  • amount (optional): Transaction amount (default: 10.00)

  • currency (optional): Currency (default: EUR)

  • type (optional): Transaction type (default: PLAIN)

Utilities

payware_generate_code_example

Generate a complete program for one payware API call. The operations are listed under Code Generation & Documentation above.

Parameters:

  • operation (required): the operation, for example create_transaction or finalize_transaction

  • language (optional): python, nodejs, php, java, csharp, curl (default: python)

  • partner_type (optional): merchant, isv, payment_institution (default: merchant)

  • include_comments (optional): the program with comments, inside a page naming the route (default: true); false gives the program alone

  • include_error_handling (optional): report a failed status or a network error (default: true)

The programs read PAYWARE_PARTNER_ID and PAYWARE_PRIVATE_KEY_PATH (a PKCS#8 PEM), PAYWARE_BASE_URL when set, and for an ISV's call on behalf of a merchant PAYWARE_MERCHANT_PARTNER_ID and PAYWARE_OAUTH2_TOKEN.

payware_generate_documentation

An integration overview for one partner type.

Parameters:

  • language (optional): the language the next steps refer to (default: python)

  • partner_type (optional): merchant, isv, payment_institution (default: merchant)

payware_utils_format_request

Format and validate API requests with deterministic JSON serialization for SHA-256 consistency.

Parameters:

  • type (required): transaction, headers, or curl

  • data (optional): Data to format

  • jwtToken (optional): JWT token for headers

  • signature (optional): Request signature

  • endpoint (optional): API endpoint for curl

  • method (optional): HTTP method (default: POST)

payware_utils_format_json_deterministic

Format JSON with deterministic property ordering for consistent SHA-256 calculation.

Parameters:

  • data (required): Object to serialize

  • minimize (optional): Remove whitespace (default: true)

payware_utils_server_info

Get MCP server information and configuration.

Note: All transaction data is serialized using consistent property ordering to prevent content hash mismatch errors.

Dependencies

  • @modelcontextprotocol/sdk: MCP server framework

  • axios: HTTP client for API calls

  • jsonwebtoken: JWT token creation

  • dotenv: reads .env

  • express, cors: the HTTP proxy mode only

RSA keys are generated with Node's own crypto, and multipart uploads use Node's own FormData.

Environment

  • Sandbox by default, production on request: tools that call payware take useSandbox (default true); false calls production and signs with the production key (PAYWARE_PRODUCTION_PRIVATE_KEY_PATH). Reports run on production only.

  • Base URLs: https://sandbox.payware.eu/api and https://api.payware.eu/api; the OAuth2 endpoints sit at the host root (/oauth2/...); soundbite recognition has its own hosts, https://soundbite-sandbox.payware.eu/api and https://soundbite.payware.eu/api

  • Currencies: any ISO 4217 code payware knows; amounts follow the currency's minor unit

  • Transaction media types: PLAIN, QR, BARCODE

Security

⚠️ Important Security Notes:

Environment Variables

  • REQUIRED: Use environment variables for all credentials

  • Never commit .env files to version control

  • Use different credentials for development and production

  • Store private key files outside web-accessible directories

Private Key Security

  • Generate separate key pairs for sandbox and production

  • Store private keys with restricted file permissions (600)

  • Never embed private keys in source code

  • Rotate keys regularly according to security policies

API Security

  • Calls go to sandbox unless a tool is given useSandbox: false

  • Keep sandbox and production keys apart: each environment refuses the other's signature

  • Implement proper error handling in production

  • Use HTTPS for all API communications

  • Validate all input parameters

  • Implement rate limiting and monitoring

JSON Serialization & SHA-256 Consistency

⚠️ CRITICAL: payware API requires deterministic JSON serialization for SHA-256 calculation

  • Property Order: JSON objects must have consistent property ordering

  • Minimized Format: No whitespace or formatting in request bodies

  • SHA-256 Calculation: Must be calculated from the exact same JSON string sent to API

  • Implementation: This server uses deterministic JSON serialization to ensure consistency

Example of correct JSON format:

{"trData":{"amount":"25.50","currency":"EUR","reasonL1":"Payment description"},"trOptions":{"timeToLive":300,"type":"PLAIN"}}

Why this matters:

  • Different property orders produce different SHA-256 hashes

  • Hash mismatch results in ERR_INVALID_CONTENT_HASH errors

  • Server validates that JWT contentSha256 matches request body SHA-256

Troubleshooting

Common Issues

  1. Authentication Failed (ERR_INVALID_SIGNATURE)

    • Root Cause: Public key registered with payware doesn't match your private key

    • Solution: Ensure the public key registered on payware site corresponds to your private key

    • Verification: Use openssl rsa -in privateKey.pem -pubout to extract public key from private key

    • Status: ✅ Resolved - Keys must be properly registered on payware partner portal

  2. Content Hash Mismatch Error (ERR_INVALID_CONTENT_HASH)

    • Root Cause: Inconsistent JSON property ordering

    • Solution: Use deterministic JSON serialization (implemented in this server)

    • Symptoms: Server logs show different expected vs actual SHA-256 hashes

    • Prevention: Always use createMinimizedJSON() from /src/core/utils/json-serializer.js

    • Status: ✅ Fixed - Deterministic JSON serialization implemented

  3. Transaction Creation Failed

    • Ensure all required parameters are provided

    • Check amount is non-negative

    • Verify transaction type is supported

    • Status: ✅ Working - Create and cancel operations confirmed functional

  4. MCP Connection Issues

    • Ensure server is started with npm start

    • Check that MCP client is properly configured

    • Verify no firewall blocking stdio communication

    • Note: Use MCP Inspector (npm run inspector) for debugging

Proxy and Bridge Tools

HTTP Proxy Server (npm run proxy):

  • Bridges MCP tools to HTTP REST API

  • Useful for testing tools via HTTP requests

  • Documentation: README-proxy.md

MCP Bridge (npm run bridge):

  • Connects MCP server to MCP Inspector

  • Essential for debugging and development

  • Use with: npm run inspector

Testing Status

npm test runs every tool of every role against a local fake payware server (no credentials, no network): verb and path against the server's routes, the JWT and its contentSha256, sandbox against production keys, the server's validation rules for the fields the tools send, and the MCP result shape, including isError on a refusal. The fake server is a model of payware, not payware: the suite does not call the real sandbox, so a server change it does not model can still break a tool.

Support

For issues related to:

  • MCP Server: Check server logs and MCP client configuration

  • payware API: Refer to payware documentation and sandbox status

  • Integration: Use code examples and formatting tools provided

  • Key Issues: Ensure public key is registered on payware partner portal

License

MIT License

Available Tools

75 tools
payware_authentication_create_jwt_tokenC
Read-onlyIdempotent

[Merchant] Create JWT token for payware API authentication according to official documentation

Inputs: partnerId, privateKey, useSandbox, requestBody.

payware_authentication_generate_rsa_keysC
Read-onlyIdempotent

[Merchant] Generate RSA key pair for payware API authentication

Inputs: keySize.

payware_authentication_setup_sandbox_authC
Read-onlyIdempotent

[Merchant] Setup sandbox authentication configuration for payware API

Inputs: partnerId, privateKey.

payware_authentication_test_jwtB
Read-onlyIdempotent

[Merchant] Test JWT token creation process with detailed step-by-step breakdown, showing deterministic JSON serialization, SHA-256 hash calculation, and final JWT structure

Inputs: partnerId, useSandbox, requestPayload, showPrivateKey.

payware_authentication_validate_jwtA
Read-onlyIdempotent

[Merchant] Validate and debug a payware JWT: decode header and payload, check the claims against the API's rules (algorithm, audience including the ISV on-behalf form, 5-minute freshness), and verify the contentSha256 hash against the request body when one is given

Inputs: jwtToken (required), expectedPayload.

payware_campaigns_create_campaignA

[Merchant] Create a campaign. Attach placements to it by giving its campaignId when you create or replace a placement.

Endpoint: POST /campaigns (PRM plan)

Inputs: name (required), endsOn, status, startsOn, +2 more.

payware_campaigns_delete_campaignA
DestructiveIdempotent

[Merchant] Delete a campaign. Its placements stay, detached from it, and keep working.

Endpoint: DELETE /campaigns/{campaignId} (PRM plan)

Inputs: campaignId (required), useSandbox.

payware_campaigns_get_campaignA
Read-onlyIdempotent

[Merchant] Get a campaign, with the IDs of its placements you can see.

Endpoint: GET /campaigns/{campaignId}

Inputs: campaignId (required), useSandbox.

payware_campaigns_get_campaign_statsA
Read-onlyIdempotent

[Merchant] A campaign's results over [from, to): offers shown when a bank resolved one of its placement IDs (resolutions), offers shown after a recognised soundbite tap (recognitions), payments started (transactions) and confirmed, and confirmed amounts by currency.

Endpoint: GET /campaigns/{campaignId}/stats (PRM plan)

Inputs: campaignId (required), to, from, useSandbox.

payware_campaigns_list_campaignsA
Read-onlyIdempotent

[Merchant] List the merchant's campaigns. A campaign groups placements, possibly of different products, and reports their combined results.

Endpoint: GET /campaigns

Changing anything here needs the PRM plan, and below it a change answers 403 ERR_UNAUTHORIZED_OPERATION; reading works on every plan, results only on PRM. A merchant that leaves PRM keeps its placements read-only, and a printed placement code then pays as its plain product with no attribution.

Inputs: useSandbox.

payware_campaigns_update_campaignA
DestructiveIdempotent

[Merchant] Replace a campaign's details. An omitted startsOn, endsOn or externalRef is cleared; an omitted status keeps the current one. Get the campaign first and send every value you want to keep.

Endpoint: PUT /campaigns/{campaignId} (PRM plan)

Inputs: name (required), campaignId (required), endsOn, status, +3 more.

payware_data_cancel_exportA
DestructiveIdempotent

[Merchant] Cancel a running export process. Only exports in QUEUED status can be cancelled.

Inputs: exportId (required), partnerId, privateKey.

payware_data_cancel_reportA
DestructiveIdempotent

[Merchant] Cancel a running report generation. Only reports in QUEUED status can be cancelled.

Inputs: requestId (required), partnerId, privateKey.

payware_data_download_exportA
Idempotent

[Merchant] Download a READY export file (production only). A text export (CSV, HTML, XML) is previewed; with saveToFile the file is written to payware-mcp-downloads in the system temp directory and the result names its path. A binary export (PDF, XLS(X), DOCX, ODT, ODS, RTF) needs saveToFile.

Inputs: exportId (required), partnerId, privateKey, saveToFile.

payware_data_export_reportA

[Merchant] Export a READY report in a specific format (PDF, CSV, Excel, JSON). The report must be in READY status first.

Inputs: requestId (required), partnerId, privateKey, outputFormat.

payware_data_generate_reportA

[Merchant] Generate an asynchronous data report for merchant data analysis and reporting. Production only - not supported in sandbox.

⚠️ Running a report is entitlement-checked as of 2026-08-22. Naming a report answers 403 ERR_REPORT_NOT_AVAILABLE when that report is not included in the caller's plan or partner type. Until that date only the menu was filtered - the door was not - so a caller that hard-coded a report id it had never been offered could still run it, and may now start failing.

Always resolve the id from payware_data_list_reports rather than hard-coding one. That call and this check share a single rule, so the menu and the door cannot drift apart: if a report is in that list, this call will accept it.

Distinguish the two failures:

  • 403 ERR_REPORT_NOT_AVAILABLE - the report exists, this caller may not run it. Not retryable; it is a plan boundary, not a transient error.

  • 404 ERR_REPORT_UNIT_ID_NOT_FOUND - no report is registered under that id at all. Usually a typo or a stale id.

For an ISV acting on behalf of a merchant, the plan that applies is the merchant's, and reports are outside the Basic plan entirely.

Inputs: reportUnitId (required), dateTo, locale, dateFrom, +4 more.

payware_data_get_export_listA
Read-onlyIdempotent

[Merchant] Get all export attempts for a specific report request. Returns list of exports in various formats with their status and download information. Production only - not supported in sandbox.

Inputs: requestId (required), partnerId, privateKey.

payware_data_get_export_statusB
Read-onlyIdempotent

[Merchant] Get the status of a report export request. Use this to monitor export progress.

Inputs: exportId (required), partnerId, privateKey.

payware_data_get_report_requestsA
Read-onlyIdempotent

[Merchant] Get all execution requests for a specific report type. Returns historical execution records with status and parameters. Production only - not supported in sandbox.

Inputs: reportId (required), partnerId, privateKey.

payware_data_get_report_statusA
Read-onlyIdempotent

[Merchant] Get the status of an asynchronous report generation request. Use this to monitor report progress.

Inputs: requestId (required), partnerId, privateKey.

payware_data_list_reportsA
Read-onlyIdempotent

[Merchant] List all available report types with their configurations, descriptions, and visibility settings. Production only - not supported in sandbox.

Inputs: partnerId, privateKey.

payware_generate_code_exampleA
Read-onlyIdempotent

[Merchant] Generate a complete program for one payware API call, or the JWT helper, in python, nodejs, php, java, csharp, curl. Each program signs its request as payware requires (RS256 JWT with contentSha256 for a body, on behalf of a merchant for an ISV) and calls the real route. finalize_transaction (payment institutions) is the whole institution flow: process, EXECUTING immediately before money moves, then CONFIRMED once the Merchant Leg has completed, or FAILED.

Inputs: operation (required), language, partner_type, include_comments, +1 more.

payware_generate_documentationB
Read-onlyIdempotent

[Merchant] An integration overview for one partner type: base URLs, how requests are signed, and every operation payware_generate_code_example can write, with its route.

Inputs: language, partner_type.

payware_logs_download_urlA
Read-onlyIdempotent

[Merchant] Get download URL for logs archive. Premium plan required. Returns URL for downloading logs as gzipped JSON file.

Inputs: to, from, partnerId, privateKey, +1 more.

payware_logs_queryA
Read-onlyIdempotent

[Merchant] Query application logs with filters. Premium plan required. Returns paginated JSON log entries for debugging and monitoring your integration.

Inputs: to, from, level, limit, +6 more.

payware_logs_statusA
Read-onlyIdempotent

[Merchant] Get log availability and storage information. Premium plan required. Shows if logs are available, total size, and file count.

Inputs: partnerId, privateKey, useSandbox.

payware_operations_cancel_transactionA
DestructiveIdempotent

[Merchant] Cancel an ACTIVE transaction created by this merchant. Only the merchant who created the transaction can cancel it, and only before it has been processed.

Inputs: statusMessage (required), transactionId (required), partnerId, privateKey, +1 more.

payware_operations_create_transactionA

[Merchant] Create a new payware transaction. Parameters map to the following API structure:

📋 ROOT LEVEL (Transaction metadata):

  • shop, account, friendlyName, callbackUrl, passbackParams

  • producerPartnerId, terminalId, terminalManufacturer (POS terminal producer attribution - see below)

💰 TRANSACTION DATA (trData object):

  • amount, currency, reasonL1, reasonL2

⚙️ TRANSACTION OPTIONS (trOptions object):

  • type, timeToLive, deferredAllowed (deferred Merchant Leg opt-in - see below)

📱 QR OPTIONS (qrOptions object - only when type=QR):

  • qrFormat, qrBorder, qrErrorCorrection, qrScale, qrVersion

🔗 BARCODE OPTIONS (barOptions object - only when type=BARCODE):

  • barFormat, barModuleWidth, barBarHeight, barFontSize, barHumanReadableLocation

🔐 AUTHENTICATION (not sent to API, used for JWT signing):

  • partnerId, privateKey

Actual API Request Structure:

{
  "shop": "...",
  "account": "...",
  "friendlyName": "...",
  "callbackUrl": "...",
  "passbackParams": "...",
  "trData": {
    "amount": "25.50",
    "currency": "EUR", 
    "reasonL1": "...",
    "reasonL2": "..."
  },
  "trOptions": {
    "type": "QR",
    "timeToLive": 300
  },
  "qrOptions": { ... }
}

⏳ DEFERRED MERCHANT LEG (optional, trOptions.deferredAllowed)

By default the payer's institution pays this transaction with an instant or an internal transfer. deferredAllowed: true also lets it use an ordinary credit transfer that settles later. Rules:

  • Honoured only on your own call without POS terminal producer fields. With producerPartnerId, terminalId or terminalManufacturer the transaction is refused with 400 ERR_DEFERRED_TRANSFER_NOT_ALLOWED: a till payment stays instant or internal.

  • A deferred payment stays ACTIVE, i.e. pending, until the transfer settles, which can take days, and so can stay ACTIVE past its timeToLive. Keep polling or wait for the callback; never treat it as expired yourself. CONFIRMED arrives once the money has reached your account.

  • Echoed as deferredAllowed: true in the create response and on status reads when set; absent otherwise. Leave it out for instant or internal only.

🏭 POS TERMINAL PRODUCER ATTRIBUTION (optional, root level)

Only relevant if the transaction originates on a POS terminal whose producer has a revenue-share agreement with payware. Three fields, all optional:

  • producerPartnerId - the 8-character partnerId payware issued to the terminal producer. An unrecognised value fails the transaction with a 400 (ERR_INVALID_PRODUCER_ID) - it is deliberately not ignored, so that a terminal configured with the wrong id fails on its first sale where an installer can see it. Omit the field entirely when there is no producer arrangement; never send an empty string.

  • terminalId - the producer's own identifier for the physical terminal. Max 64 chars, no control characters. payware records it and never interprets it: no format, no uniqueness enforcement, and nothing about pricing or attribution depends on it.

  • terminalManufacturer - device manufacturer as the terminal reports it. Max 64 chars, no control characters. Recorded for provenance. payware's internal attribution review counts each producer's sales by reported manufacturer, so a build running on another vendor's hardware stands out; it is never blocked.

Two things worth knowing:

  1. It never changes what the merchant is charged. The producer's share comes out of payware's own fee, not out of a higher price for the merchant, whose fee always follows the fee hierarchy.

  2. None of the three is returned. They do not appear in the create response, in get_transaction_status, in transaction history, or in any callback. What a producer earned is visible on their own dashboard and settlements - attribution is recorded against the fee, not against the transaction.

If an ISV's software made the call, the ISV is attributed and the producer is not, even when the ISV's software is running on that producer's hardware.

Inputs: currency (required), reasonL1 (required), shop, type, +25 more.

payware_operations_get_transaction_historyA
Read-onlyIdempotent

[Merchant] Get history of completed/finalized transactions with final statuses.

Endpoint: GET /transactions-history/{transactionId} Use Case: Retrieve transactions with final statuses: CONFIRMED, DECLINED, FAILED, EXPIRED, CANCELLED. Note: For ACTIVE transactions, use 'payware_operations_get_transaction_status' instead.

📦 This is where the delivery address lives. For a SHIPPABLE transaction, deliveryAddress (fullName, streetAddressLine1/2, zipCode, city, region, country, phoneNumber, email) is returned here and only here. It was removed from the finalized callback on 2026-08-07: a callback is delivered to whatever certificate the merchant's endpoint happens to present, which is an acceptable trade for a transaction id and an amount and not one for a shopper's home address. This endpoint is JWT-authenticated, tenant-scoped and runs over a verified channel. So the pattern is: the callback tells you the shipment is ready, and this call gives you the address to ship to.

⚠️ Requires Standard or Premium. This endpoint was ungated until 2026-08-21 and is now on the same plan gate as the rest of the transaction surface, so a Basic merchant - or an ISV acting on behalf of one - now gets 403. If reading history started failing without a code change, this is why. Financial institutions are unaffected; banks are always Premium.

⏱️ Rate limited, like every payware endpoint. A 429 carries ERR_RATE_LIMIT_EXCEEDED and a Retry-After header, in seconds; the request was not processed, so the identical request is safe to retry once the window passes. The failure result exposes this as error.throttled, error.retryable and error.retryAfterSeconds.

Inputs: transactionId (required), partnerId, privateKey, useSandbox.

payware_operations_get_transaction_statusA
Read-onlyIdempotent

[Merchant] Get status of an ACTIVE transaction by ID (for completed/expired transactions use transaction history tool).

Endpoint: GET /transactions/{transactionId} Use Case: Check status of ACTIVE transactions only. This endpoint only returns transactions with ACTIVE status. Note: For transactions with final statuses (CONFIRMED, DECLINED, FAILED, EXPIRED, CANCELLED), use 'payware_operations_get_transaction_history' instead.

⏳ ACTIVE can outlast timeToLive. Never infer EXPIRED from the clock. Once the payer's institution has started the payment (it locks the transaction immediately before the money moves, which you do not see), the transaction stays ACTIVE past timeToLive until the money has moved: seconds for an instant or internal transfer, days for a deferred one (a transaction created with deferredAllowed: true). Its timeToLive then stops at the value it had when the payment started. Keep polling, or wait for the callback: a transaction is EXPIRED only when payware says so, in the callback or in transaction history, and one that is no longer returned here has a final status there.

🛍️ Product-originated transactions carry a nested product object. Since 2026-07-22 the presentation fields are grouped under product rather than sitting flat on the response - the old top-level imageUrl is gone. Discriminate a product-originated transaction by the presence of the object, not by probing individual fields:

{ "transactionId": "pw7e4rCToG", "amount": "57.60", "currency": "EUR",
  "product": { "productId": "pr7e4rCToG", "type": "ITEM", "name": "Cotton T-shirt, black",
               "shortDescription": "...", "longDescription": "...",
               "imageUrl": "https://...", "imageDigest": "9f86d081...", "imageContentType": "image/png",
               "imageBytes": 20480, "termsUrl": "https://...", "termsText": "...",
               "regularPrice": "63.36", "shippable": false, "quickPay": true, "shopName": "My shop" } }

Three things about that object:

  • imageDigest is an obligation, not decoration. It is the SHA-256 payware pinned for the image at imageUrl. Fetch the image, verify its bytes against this digest before rendering it to a payer, and fall back to a neutral placeholder on mismatch. Present only when imageUrl is the product's own image.

  • regularPrice is display-only, and appears only when there is a genuine saving - i.e. when it is higher than the transaction amount. The top-level amount and currency are authoritative and are what the payer pays; the object does not repeat them.

  • Availability follows the merchant's plan. imageUrl and termsUrl are Standard and above; termsText and the descriptions are universal. A missing field is a plan boundary, not an error.

For a pr/ps product identifier the values are resolved live; for the resulting pw transaction they are the snapshot frozen at creation, so the response always reflects what the payer could have been shown at scan time.

💰 Amounts follow the currency, not a fixed two decimals. amount, fee, payerAmount and payeeAmount are decimal strings at the smallest unit their own currency can be paid in - none for JPY, two for EUR, eight for BTC. Parse them with a decimal type; never compare them as strings, and never assume two places. feeRate carries up to six decimals and feeFixed full stored precision: both are informational, and recomputing the fee from them and submitting that at finalize is rejected with ERR_FEE_MISMATCH. Echo fee back unchanged instead.

Inputs: transactionId (required), partnerId, privateKey, useSandbox.

payware_operations_process_transactionA
Destructive

[Merchant] Process a PEER transaction (for merchants accepting payments by scanning customer QR/barcode).

Use Case: Merchant scans customer's payware QR code or barcode to accept payment. Note: Only PEER transactions (created by customers) can be processed by merchants. Flow: Customer creates transaction → Merchant scans QR/barcode → Merchant processes transaction

API Request Structure:

{
  "shop": "...",
  "account": "...", 
  "friendlyName": "...",
  "callbackUrl": "...",
  "passbackParams": "...",
  "trData": {
    "amount": "25.50",    // REQUIRED for processing
    "currency": "EUR",    // REQUIRED for processing
    "reasonL1": "...",    // REQUIRED for processing
    "reasonL2": "..."
  },
  "trOptions": {
    "timeToLive": 300     // Overwrites original transaction TTL
  }
}

Inputs: amount (required), currency (required), reasonL1 (required), transactionId (required), +11 more.

payware_operations_simulate_callbackA
Read-onlyIdempotent

[Merchant] Simulate callback scenarios for testing webhook handling.

Generates the payload a merchant's callbackUrl actually receives, so a handler can be built and tested against the real shape. Four properties of that shape are easy to get wrong:

1. Absent means absent, not zero. The payload omits properties with no value rather than sending null or 0. statusMessage, passbackParams, fee, feeFixed and feeRate are all simply missing when they do not apply. A missing fee means the fee is unknown for that transaction - it does not mean the transaction was free. Do not write a handler that reads payload.fee as a number without checking it is there.

2. finalized is absent on EXPIRED. An expired transaction is closed by the platform's expiry sweep, which sets no finalization moment. Every other status carries one.

3. EXPIRED is a non-payment, not a failure. The payer never paid within timeToLive. Release the order or the stock, as you would for a cancellation - do not treat it as an error to retry.

4. Deduplicate on (transactionId, callbackType). payware retries a callback up to 15 times, backing off from about a second to at most 5 minutes between attempts, until the endpoint answers any 2xx. That pair is stable across every retry of the same event, and it is the key payware guarantees. A handler that does not deduplicate will eventually process one payment twice.

Not on this payload: deliveryAddress (removed 2026-08-07 - fetch it from payware_operations_get_transaction_history, which is authenticated and tenant-scoped), producerPartnerId, transactionType and initiatedBy (the last two are carried on TRANSACTION_PROCESSED, which merchants do not receive).

Inputs: transactionId (required), fee, poiId, amount, +8 more.

payware_poi_cancel_priceA
DestructiveIdempotent

[Merchant] Cancel a pending price on a POI, resetting it to IDLE state.

Authentication: your own JWT (an ISV makes the same call on your behalf). Endpoint: DELETE /poi/{poiId}/price Use Case: Cancel a price that was set but not yet scanned (e.g., order cancelled).

The POI returns to IDLE and is ready for a new price.

Only before the scan. The scan is the customer's bank processing the payment, so from then on a POI sale cannot be cancelled by the merchant or an ISV, on any plan: this answers 409 ERR_POI_NO_PENDING_PAYMENT, and cancelling the transaction itself answers 409 ERR_ALREADY_PROCESSED. The sale completes or expires; the POI accepts the next price meanwhile.

Required: POI ID.

Inputs: poiId (required), useSandbox.

payware_poi_createA

[Merchant] Create a single POI (Point of Interaction) - a physical payment point a payer scans.

Endpoint: POST /poi -> 201 Created

A POI belongs to a shop, and a shop belongs to a merchant. shopCode is required - use payware_shops_list to find one rather than guessing. Banks do not own POIs; a financial-institution principal gets 403 on every POI endpoint, not an empty result.

ttlSeconds is the price-session TTL, not the POI's lifetime. It bounds how long a price set on this POI stays claimable before the POI returns to IDLE. Range 60-600 seconds; the server defaults it to 300.

Creating many at once? Use payware_poi_create_batch instead. It creates up to 50 in one atomic call, which is both faster and safer than a loop over this tool: a loop that fails halfway leaves a half-built estate with no record of where it stopped.

Inputs: shopCode (required), name, partnerId, privateKey, +3 more.

payware_poi_create_batchA

[Merchant] Create up to 50 POIs in a single atomic call - the tool for rolling out a terminal estate.

Endpoint: POST /poi/batch -> 201 Created, returning { created, pois: [...] }

Atomic means all or nothing. Either every entry is created or none is. That is the reason to prefer this over a loop of payware_poi_create: a loop that fails on entry 27 leaves 26 POIs behind with nothing recording where it stopped, and re-running it duplicates them.

A POI belongs to a shop, and a shop belongs to a merchant. shopCode is required - use payware_shops_list to find one rather than guessing. Banks do not own POIs; a financial-institution principal gets 403 on every POI endpoint, not an empty result.

ttlSeconds is the price-session TTL, not the POI's lifetime. It bounds how long a price set on this POI stays claimable before the POI returns to IDLE. Range 60-600 seconds; the server defaults it to 300.

Defaults and overrides. shopCode, ttlSeconds and callbackUrl at the top level apply to every entry. An entry may override name, ttlSeconds and callbackUrl for itself. shopCode is top-level only - one batch builds one shop.

Limits: 1 to 50 entries. An empty list is ERR_BATCH_EMPTY; more than 50 is ERR_BATCH_TOO_LARGE. Both are refused locally before the request is sent. For a larger rollout, split it into batches of 50 - each batch is atomic on its own, so record which batches succeeded.

Inputs: pois (required), shopCode (required), partnerId, privateKey, +3 more.

payware_poi_getA
Read-onlyIdempotent

[Merchant] Get details of a specific POI (Point of Interaction).

Authentication: your own JWT (an ISV makes the same call on your behalf). Endpoint: GET /poi/{poiId} Use Case: Retrieve full details of a physical payment point including configuration and current state.

Required: POI ID.

Inputs: poiId (required), useSandbox.

payware_poi_get_qrcodeA
Read-onlyIdempotent

[Merchant] Generate a QR code image for a POI that customers can scan.

Endpoint: GET /poi/{poiId}/image Authentication: your own JWT Use Case: Generate QR codes for printing or displaying on screens.

Formats: PNG (default), SVG, JPG

Returns the image itself (MCP image content); an SVG comes back as its markup.

Required: POI ID.

Inputs: poiId (required), format, useSandbox.

payware_poi_get_statusA
Read-onlyIdempotent

[Merchant] Get the current status of a POI and the outcome of its sales.

Authentication: your own JWT (an ISV makes the same call on your behalf). Endpoint: GET /poi/{poiId}/status[?sessionToken=...] Use Case: Follow a sale to its outcome - the backup to callbacks, and on Basic (no transaction endpoints) the only way when a callback is lost or there is no backend.

POI States:

  • IDLE: no pending price and no sale running

  • READY: price set, waiting for a scan (wins over BUSY: the POI can take the next price while a sale runs)

  • BUSY: a customer scanned and the sale is running

Every response carries lastTransactionId / lastTransactionStatus - the POI's most recent sale, running (ACTIVE) or finished (CONFIRMED, DECLINED, FAILED, CANCELLED, EXPIRED). Once the POI is back to IDLE, lastTransactionStatus is how the last sale ended.

With sessionToken (from payware_poi_set_price) the response also carries transactionId / transactionStatus for exactly that sale - use it when the POI may be re-armed before the previous sale finishes. Poll every 2-3 seconds and stop at a final status; the read is rate limited.

Required: POI ID.

Inputs: poiId (required), useSandbox, sessionToken.

payware_poi_listA
Read-onlyIdempotent

[Merchant] List all POIs (Points of Interaction) for a merchant.

Authentication: your own JWT (an ISV makes the same call on your behalf). Endpoint: GET /poi Use Case: Retrieve all physical payment points configured for a merchant.

POI states: IDLE (no price, no sale running), READY (price set, waiting for a scan), BUSY (scanned, sale running). A disabled POI is not a state: it shows isActive false.

Inputs: useSandbox.

payware_poi_set_priceA
DestructiveIdempotent

[Merchant] Set a pending price on a POI for customer payment.

Authentication: your own JWT (an ISV makes the same call on your behalf). Endpoint: PUT /poi/{poiId}/price Use Case: Set the amount a customer should pay when they scan the POI.

The POI moves to READY and waits for a scan until the TTL expires. The scan creates the transaction and the POI is BUSY until the sale is final.

Only amount, currency and ttlSeconds are accepted. There is no description, callback URL or passback field on a price - the callback URL is set on the POI when it is created, and a POI without one sends no callbacks.

Keep the returned sessionToken until the sale has a final status: pass it to payware_poi_get_status to read that sale's transaction and outcome.

Required: POI ID, amount, currency.

Inputs: poiId (required), amount (required), currency (required), ttlSeconds, +1 more.

payware_products_create_airingA

[Merchant] Add an airing rule to a placement: up to 100 rules per placement. Example: "daily 08:00-08:30 and 15:40-16:10" is one DAILY rule with two windows. Check warnings in the response: AIRING_OVERLAP means another soundbite placement of the same product airs at the same time in an overlapping region, and a tap then is attributed to neither.

Endpoint: POST /products/{productId}/placements/{placementId}/airings (PRM plan)

Inputs: windows (required), frequency (required), productId (required), startDate (required), +11 more.

payware_products_create_placementA

[Merchant] Create a placement for a product; a product has no limit on its placements. The response carries its placementId, which goes on the medium wherever the product ID would: a QR code (its payware link, or payware:{placementId}), an NFC tag, a BLE beacon, a link, a barcode or an SMS. A bank resolving it pays for the product, and the payment is attributed to the placement. For a SOUNDBITE carrier, add airing rules so taps during the airing are attributed.

Endpoint: POST /products/{productId}/placements (PRM plan)

Inputs: name (required), medium (required), carriers (required), productId (required), +9 more.

payware_products_create_productB

[Merchant] Create a new product for inventory management and payment processing.

Product Structure: 📦 PRODUCT METADATA: name, shortDescription, longDescription, sku, upc, shippable, active, shop 💰 PRODUCT DATA (prData object): type, regularPrice, currency, overlapPriority, timeToLive, activeFrom, activeTo, timeZone ⚙️ PRODUCT OPTIONS (prOptions object): imageUrl, termsUrl, termsText

Required: name Optional: All other parameters have sensible defaults

Inputs: name (required), sku, upc, shop, +18 more.

payware_products_create_scheduleA

[Merchant] Create a price schedule for a product to manage time-based pricing. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: productId (required), dateTo, dateFrom, partnerId, +6 more.

payware_products_delete_airingA
DestructiveIdempotent

[Merchant] Delete one airing rule.

Endpoint: DELETE /products/{productId}/placements/{placementId}/airings/{ruleId} (PRM plan)

Inputs: ruleId (required), productId (required), placementId (required), useSandbox.

payware_products_delete_audioA
DestructiveIdempotent

[Merchant] Delete an audio file from a product. This action cannot be undone. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: audioId (required), productId (required), partnerId, privateKey, +1 more.

payware_products_delete_placementA
DestructiveIdempotent

[Merchant] Delete a placement. Its printed codes and its payware link stop resolving, and its ID is never reused. To stop airing and attribution but keep printed codes working, replace it with active false instead.

Endpoint: DELETE /products/{productId}/placements/{placementId} (PRM plan)

Inputs: productId (required), placementId (required), useSandbox.

payware_products_delete_productB
DestructiveIdempotent

[Merchant] Delete a product from the merchant account. This action cannot be undone.

Inputs: productId (required), partnerId, privateKey, useSandbox.

payware_products_delete_scheduleA
DestructiveIdempotent

[Merchant] Delete a price schedule. This action cannot be undone. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: productId (required), scheduleId (required), partnerId, privateKey, +1 more.

payware_products_get_airingB
Read-onlyIdempotent

[Merchant] Get one airing rule.

Endpoint: GET /products/{productId}/placements/{placementId}/airings/{ruleId}

Inputs: ruleId (required), productId (required), placementId (required), useSandbox.

payware_products_get_airing_calendarA
Read-onlyIdempotent

[Merchant] Every airing of the merchant's placements between from and to, across all products, ordered by start time and each in its rule's time zone. Answers "what is on air this week" in one call. The range may span at most 400 days.

Endpoint: GET /placements/calendar

Inputs: to (required), from (required), useSandbox.

payware_products_get_audioA
Read-onlyIdempotent

[Merchant] Get detailed information about a specific audio file. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: audioId (required), productId (required), partnerId, privateKey, +1 more.

payware_products_get_audiosB
Read-onlyIdempotent

[Merchant] Get all registered audio files for a product. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: productId (required), partnerId, privateKey, useSandbox.

payware_products_get_next_airingsA
Read-onlyIdempotent

[Merchant] A placement's next airings, each in its rule's time zone so daylight-saving shifts are visible. Use it to check a rule does what was meant before relying on it.

Endpoint: GET /products/{productId}/placements/{placementId}/airings/next

Inputs: productId (required), placementId (required), count, useSandbox.

payware_products_get_placementB
Read-onlyIdempotent

[Merchant] Get a placement.

Endpoint: GET /products/{productId}/placements/{placementId}

Inputs: productId (required), placementId (required), useSandbox.

payware_products_get_placement_imageA
Read-onlyIdempotent

[Merchant] A placement's QR code (carrying the placement's payware link, https://go.payware.eu/{placementId}, which needs no API call) or Code 128 barcode (carrying the plain ID), for print. PNG and JPG come back as an image, SVG as its markup.

Endpoint: GET /products/{productId}/placements/{placementId}/image

Inputs: productId (required), placementId (required), type, format, +1 more.

payware_products_get_placement_statsA
Read-onlyIdempotent

[Merchant] A placement's results over [from, to): offers shown when a bank resolved its ID (resolutions), offers shown after a recognised soundbite tap (recognitions), payments started (transactions) and confirmed, and confirmed amounts by currency.

Endpoint: GET /products/{productId}/placements/{placementId}/stats (PRM plan)

Inputs: productId (required), placementId (required), to, from, +1 more.

payware_products_get_productB
Read-onlyIdempotent

[Merchant] Get detailed information about a specific product by ID

Inputs: productId (required), partnerId, privateKey, useSandbox.

payware_products_get_product_imageB
Read-onlyIdempotent

[Merchant] Generate a QR code or barcode image for a product.

QR Code Options: Format, border, error correction, scale, version Barcode Options: Format, module width, bar height, font size, text location

Inputs: productId (required), type, qrScale, qrBorder, +11 more.

payware_products_get_scheduleA
Read-onlyIdempotent

[Merchant] Get detailed information about a specific price schedule. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: productId (required), scheduleId (required), partnerId, privateKey, +1 more.

payware_products_get_schedulesA
Read-onlyIdempotent

[Merchant] Get all price schedules for a product. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: productId (required), partnerId, privateKey, useSandbox.

payware_products_list_airingsA
Read-onlyIdempotent

[Merchant] List a placement's airing rules. A rule is a recurrence with time windows, in an IANA time zone; a soundbite tap during an airing is attributed to the placement.

Endpoint: GET /products/{productId}/placements/{placementId}/airings

Inputs: productId (required), placementId (required), useSandbox.

payware_products_list_placementsA
Read-onlyIdempotent

[Merchant] List a product's placements. A placement is one way the product is distributed - a poster, a TV spot, a packaging label - with its own ID (pl + 8 characters), so every payment it starts is attributed to it. One page at a time, newest first: a product has no limit on its placements, and the response is { content, number, size, totalElements, totalPages }, so ask for the next page while number + 1 < totalPages.

Endpoint: GET /products/{productId}/placements

Changing anything here needs the PRM plan, and below it a change answers 403 ERR_UNAUTHORIZED_OPERATION; reading works on every plan, results only on PRM. A merchant that leaves PRM keeps its placements read-only, and a printed placement code then pays as its plain product with no attribution.

Inputs: productId (required), page, size, useSandbox.

payware_products_list_productsA
Read-onlyIdempotent

[Merchant] Get a list of all products for the merchant account

Inputs: partnerId, privateKey, useSandbox.

payware_products_register_audioA

[Merchant] Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Register an audio file (soundbite) for a product to enable audio-based payment initiation.

Supported formats: MP3, WAV, OGG, M4A, FLAC, AAC, WMA, MP4, MOV, up to 100 MB, holding 2 to 120 seconds of audio Note: For video files, only the audio channel is registered

Inputs: audioPath (required), productId (required), partnerId, privateKey, +1 more.

payware_products_replace_airingsA
DestructiveIdempotent

[Merchant] Replace all of a placement's airing rules with this list, all or nothing: when any rule is refused, nothing is saved and each refused rule is listed by its index. An empty list removes every rule. Suited to loading an agency's schedule in one call.

Endpoint: PUT /products/{productId}/placements/{placementId}/airings (PRM plan)

Inputs: rules (required), productId (required), placementId (required), useSandbox.

payware_products_update_airingA
DestructiveIdempotent

[Merchant] Replace one airing rule: every field is replaced, so send the whole rule. Check warnings in the response for AIRING_OVERLAP.

Endpoint: PUT /products/{productId}/placements/{placementId}/airings/{ruleId} (PRM plan)

Inputs: ruleId (required), windows (required), frequency (required), productId (required), +12 more.

payware_products_update_audioA
DestructiveIdempotent

[Merchant] Update audio information (title) or reassign audio to another product. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: audioId (required), productId (required), title, partnerId, +3 more.

payware_products_update_placementA
DestructiveIdempotent

[Merchant] Replace a placement's details. Every field is replaced, so an omitted optional field is cleared - an omitted campaignId detaches it from its campaign; an omitted active keeps the current value. Get the placement first and send every value you want to keep. The placement ID does not change, so printed codes keep working.

Endpoint: PUT /products/{productId}/placements/{placementId} (PRM plan)

Inputs: name (required), medium (required), carriers (required), productId (required), +10 more.

payware_products_update_productA
DestructiveIdempotent

[Merchant] Update an existing product. Only provide the fields you want to change. The tool reads the product first and sends it whole: the server resets a field a partial update leaves out (active, shippable and quickPay to FALSE, type, time zone and time to live to defaults), a server defect.

Product Structure: 📦 PRODUCT METADATA: name, shortDescription, longDescription, sku, upc, shippable, active, shop 💰 PRODUCT DATA (prData object): type, regularPrice, currency, overlapPriority, timeToLive, activeFrom, activeTo, timeZone ⚙️ PRODUCT OPTIONS (prOptions object): imageUrl, termsUrl, termsText

Inputs: productId (required), sku, upc, name, +19 more.

payware_products_update_scheduleA
DestructiveIdempotent

[Merchant] Update an existing price schedule. Only provide fields you want to change. The tool reads the schedule (and the product's time zone) first and sends it whole: the server resets a field a partial update leaves out (the discount to 0%, the dates to today), a server defect. Premium (PRM) plan only: the server answers 403 on any other plan (for an ISV, the merchant's plan).

Inputs: productId (required), scheduleId (required), dateTo, dateFrom, +7 more.

payware_shops_listA
Read-onlyIdempotent

[Merchant] List the merchant outlets (shops) the caller can act on.

Endpoint: GET /shops

Use this before any call that takes a shop / shopCode. Creating a transaction, creating a product, creating a POI and batching POIs all take one, and an invalid code is a 400 (ERR_INVALID_SHOP_CODE). Omitting it falls back to the merchant's default shop, which is a reasonable guess for a single-outlet merchant and the wrong outlet for everyone else - the sale lands against the wrong shop, and nothing about the response says so.

Returned per shop (server ShopDTO): code (the value to pass as shop / shopCode), name, isDefault, ecommerce, country and the shop's label, image and terms URLs.

⚠️ Requires Standard or Premium. A Basic merchant gets 403.

Note on financial institutions: banks do not own shops. A bank principal calling this gets 403, not an empty list.

Inputs: partnerId, privateKey, useSandbox.

payware_utils_format_json_deterministicB
Read-onlyIdempotent

[Merchant] Format JSON payload with deterministic key sorting for consistent SHA-256 calculation and payware API compliance

Inputs: payload (required), showComparison, calculateSHA256, validateConsistency.

payware_utils_format_requestB
Read-onlyIdempotent

[Merchant] Format and validate payware API requests with proper structure and headers

Inputs: type (required), data, method, endpoint, +1 more.

payware_utils_server_infoA
Read-onlyIdempotent

[Merchant] Get MCP server version, status, and environment information

Inputs: includeEnvironment.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 75 tools

    Disambiguation4/5

    Tools are organized by domain (products, placements, airings, campaigns, transactions, POI, reports, logs, auth, utils) and each generally targets a distinct resource+action, with explicit cross-references such as get_transaction_status vs get_transaction_history. A few pairs still blur: validate_jwt vs test_jwt (both JWT debugging), generate_code_example vs generate_documentation (both emit integration guidance), and the four report/export read tools require careful reading to separate. With 75 tools, an agent will occasionally misselect, but the descriptions largely disambiguate.

    Naming Consistency3/5

    All names are snake_case with a payware_ prefix and a domain segment, which is readable and predictable at the top level. However the sub-convention varies by domain: products/placements/airings/campaigns use verb_noun (create_product, update_airing), while POI and shops use noun_verb (poi_create, shops_list, poi_set_price). Two tools (generate_code_example, generate_documentation) lack a domain segment entirely, breaking the pattern.

    Tool Count2/5

    75 tools is heavy for any single agent context, and while the underlying platform is genuinely broad (payments, catalog, placements, campaigns, reporting, logging, auth), many tools are narrow Premium-only CRUD variants (five audio tools, six airing tools, nine data/report tools). The surface could be consolidated into higher-level operations without losing capability, and the sheer count forces expensive tool selection.

    Completeness4/5

    Coverage is deep: full CRUD for products, schedules, audio, placements, airings and campaigns, plus transaction lifecycle (create/process/status/history/cancel), POI management, reports/exports and JWT tooling. Minor gaps exist, notably no POI update/delete, no shop management beyond list, no transaction search/listing for merchants, and no refund/settlement operations — workable but not airtight.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables AI agents to integrate Midtrans payments by providing comprehensive documentation, API references, and code examples for 15+ payment methods across 5 languages. Includes tools for generating charge requests, webhook handlers, and searching documentation without requiring API keys.
      9
      17 PyPI
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides AI-ready documentation for the PayHere payment gateway, enabling access to API references, SDK guides, and documentation search through MCP tools.
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables AI assistants to securely interact with Payre's Web3 payment gateway for generating crypto checkout invoices, monitoring settlements, managing payout destinations, and inspecting analytics.
      18
      MIT