Skip to main content
Glama

invoice_create

Create a payment request: who receives, which token, how much, on which network. Returns invoice.id, invoice.label (INV-XXXX-XXXX, what people copy), invoice.url (share this; it previews with the QR on WhatsApp and Telegram) and invoice.qr (PNG). No signature or API key needed. New invoices only receive VERIFIED dollar stablecoins on the network allowlist, even without paid analysis. Without paid analysis there is no split fee. Previously created invoices keep their terms. Tokens resolve by address or symbol — an unverified token is refused because a cloned "USDC" with its own pool would let the creator sell a fake at any price. The payer can pay with ANY token on that network. Optional paid checks (see checks): "scorechain" (0.15 USDC) adds the Scorechain sanctions API and "merkle-science" (0.60 USDC) the Merkle Science analysis via Didit, both on BOTH wallets (payer and receiver), paid by the creator before the invoice can be paid (0.75 USDC in one transfer with both). They send both wallets to the third party, so they run only when chosen. A wallet listed by Scorechain is refused (payer_blocked or receiver_blocked); when Scorechain cannot be read the payment is not held, because the OFAC list is already checked here. On Solana the model is different (see payerChecks): the free screening of the receiving wallet must pass for the invoice to be created (receiver_blocked 403, screening_unavailable 503), and the paid analysis of the payer wallet is paid out of the amount through a split in the payment transaction.

Input Schema

NameRequiredDescriptionDefault
memoNoOptional note, up to 80 chars, visible to anyone with the link.
tokenYesToken to receive: address/mint or symbol of a verified dollar stablecoin on the network allowlist. Other tokens return stablecoin_required, even without paid analysis.
amountYesHuman decimal amount, e.g. "100". Decimals come from the token list, not from you.
checksNoOptional extra screening chosen by the invoice creator; default none. Any other value is refused with invalid_check. Both checks are PAID by the creator, for both wallets (payer and receiver), before the invoice can be paid. EVM networks only (the old model): on Solana paid checks here are refused with paid_check_moved; use payerChecks instead, and the payer contracts the receiver analysis with invoice_analysis_pay. "scorechain" (0.15 USDC): the Scorechain sanctions API, which sends both wallets to Scorechain. Available on Optimism, BNB Chain, Gnosis, Unichain, Polygon, Base, Arbitrum, Avalanche and Solana. "merkle-science" (0.60 USDC): the Merkle Science analysis via Didit (score, summary, risk factors and where the money came from), which sends both wallets to Didit/Merkle Science. Available on Base, Optimism, Arbitrum, BNB Chain, Polygon and Solana. Both together: one transfer of 0.75 USDC. Ethereum answers check_not_available_on_chain for both (coming soon), as do the networks a check does not cover. The invoice comes back with analysis {status: "awaiting_payment", checks, amount (the sum), token (USDC of that network), to (Vurto fee wallet), chainId}: the creator pays it first with invoice_analysis_pay (sign) and invoice_report_analysis_payment; until then the invoice cannot be paid (analysis_unpaid). The creator is the signed-in wallet, or the receiving wallet when there is no session (always the receiving wallet over MCP), and only the creator can pay the analysis. The analysis is not sold when the free screening rejects the receiving or the creating wallet (screening_blocked, 403).
chainIdYesEVM: integer from GET /v1/chains (1, 10, 56, 100, 137, 8453, 42161, 43114, 130). Solana: string from GET /v1/svm/chains ("solana-mainnet").
recipientYesWallet that receives. EVM 0x address, or base58 on Solana (case-sensitive).
payerChecksNoSolana and EVM networks with invoiceSplit=true in /v1/chains, stablecoin invoices only: USDC, USDT (including USDT0), PYUSD, USDG and USD1, by verified address on each network. Availability differs by network. The PAID analysis of the PAYER wallet is chosen by you (the receiver) and paid out of the amount you receive. Price per wallet: "merkle-science" 0.30, "scorechain" 0.075 (both 0.375). The fee that goes to the Vurto fee wallet is the LARGER of that sum and 0.5% of the amount. The percentage rounds down on Solana and up on EVM to the token's smallest unit; EVM fees cannot exceed 10% of the amount: a 100 USDC invoice with merkle-science has fee 0.50 (you receive 99.50); a 20 USDC invoice has fee 0.30 (you receive 19.70). invoice.split comes back with fee, receiverAmount and feeWallet. It runs only when the payer clicks pay (invoice_pay), after the free screening passes, and the payer cannot switch it off. The payment is then ONE transaction that splits the amount between you and the fee wallet; a payment without the fee in that same transaction does not settle the invoice. Refused: split_not_available_on_chain where no split contract is configured, stablecoin_required for tokens outside the network allowlist, amount_below_fee, fee_above_maximum (EVM fee exceeds 10%), analysis_offer_suspended (403) when this receiving wallet left 2 approved paid analyses without payment (each completed payment gives 2 back).
confidentialNoNot available yet: private invoices are coming soon, with the Vurto vault. Any value other than false is refused with private_coming_soon and nothing is created. A payment is a direct transfer, so the transaction shows the receiving wallet on-chain; omit this field.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / checks / description
      Previous value: -"Optional extra screening chosen by the invoice creator; default none. \"scorechain\": when this invoice is paid, both wallets (payer and receiver) are also checked against the Scorechain sanctions API, which means both are sent to Scorechain. Runs only when chosen. Any other value is refused with invalid_check."New value: +"Optional extra screening chosen by the invoice creator; default none. Any other value is refused with invalid_check. Both checks are PAID by the creator, for both wallets (payer and receiver), before the invoice can be paid. EVM networks only (the old model): on Solana paid checks here are refused with paid_check_moved; use payerChecks instead, and the payer contracts the receiver analysis with invoice_analysis_pay. \"scorechain\" (0.15 USDC): the Scorechain sanctions API, which sends both wallets to Scorechain. Available on Optimism, BNB Chain, Gnosis, Unichain, Polygon, Base, Arbitrum, Avalanche and Solana. \"merkle-science\" (0.60 USDC): the Merkle Science analysis via Didit (score, summary, risk factors and where the money came from), which sends both wallets to Didit/Merkle Science. Available on Base, Optimism, Arbitrum, BNB Chain, Polygon and Solana. Both together: one transfer of 0.75 USDC. Ethereum answers check_not_available_on_chain for both (coming soon), as do the networks a check does not cover. The invoice comes back with analysis {status: \"awaiting_payment\", checks, amount (the sum), token (USDC of that network), to (Vurto fee wallet), chainId}: the creator pays it first with invoice_analysis_pay (sign) and invoice_report_analysis_payment; until then the invoice cannot be paid (analysis_unpaid). The creator is the signed-in wallet, or the receiving wallet when there is no session (always the receiving wallet over MCP), and only the creator can pay the analysis. The analysis is not sold when the free screening rejects the receiving or the creating wallet (screening_blocked, 403)."
    • changedInput schema / properties / checks / items / enum
      Previous value: -[
      -  "scorechain"
      -]New value: +[
      +  "scorechain",
      +  "merkle-science"
      +]
    • addedInput schema / properties / payerChecks
      Added value: +{
      +  "description": "Solana and EVM networks with invoiceSplit=true in /v1/chains, stablecoin invoices only: USDC, USDT (including USDT0), PYUSD, USDG and USD1, by verified address on each network. Availability differs by network. The PAID analysis of the PAYER wallet is chosen by you (the receiver) and paid out of the amount you receive. Price per wallet: \"merkle-science\" 0.30, \"scorechain\" 0.075 (both 0.375). The fee that goes to the Vurto fee wallet is the LARGER of that sum and 0.5% of the amount. The percentage rounds down on Solana and up on EVM to the token's smallest unit; EVM fees cannot exceed 10% of the amount: a 100 USDC invoice with merkle-science has fee 0.50 (you receive 99.50); a 20 USDC invoice has fee 0.30 (you receive 19.70). invoice.split comes back with fee, receiverAmount and feeWallet. It runs only when the payer clicks pay (invoice_pay), after the free screening passes, and the payer cannot switch it off. The payment is then ONE transaction that splits the amount between you and the fee wallet; a payment without the fee in that same transaction does not settle the invoice. Refused: split_not_available_on_chain where no split contract is configured, stablecoin_required for tokens outside the network allowlist, amount_below_fee, fee_above_maximum (EVM fee exceeds 10%), analysis_offer_suspended (403) when this receiving wallet left 2 approved paid analyses without payment (each completed payment gives 2 back).",
      +  "items": {
      +    "enum": [
      +      "scorechain",
      +      "merkle-science"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / token / description
      Previous value: -"Token to receive: address/mint or symbol of a verified token on this network."New value: +"Token to receive: address/mint or symbol of a verified dollar stablecoin on the network allowlist. Other tokens return stablecoin_required, even without paid analysis."
  2. Changed1 schema field changed
    • addedInput schema / properties / checks
      Added value: +{
      +  "description": "Optional extra screening chosen by the invoice creator; default none. \"scorechain\": when this invoice is paid, both wallets (payer and receiver) are also checked against the Scorechain sanctions API, which means both are sent to Scorechain. Runs only when chosen. Any other value is refused with invalid_check.",
      +  "items": {
      +    "enum": [
      +      "scorechain"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / confidential / description
      Previous value: -"Optional, Solana only. A private (confidential) invoice hides the receiving wallet from anyone with the link (invoice_get returns recipient: null), and every payment route screens the payer first: OFAC SDN list plus the issuer freeze of USDC and EURC (Circle), USDT (Tether), PYUSD and USDG (Paxos) and USD1 (World Liberty), the issuer freeze index, and a fund trail up to three hops back through the same checks (a flagged sender on the first hop blocks; on hops two and three it only warns). These are checks of the paying wallet, whatever token it pays with. A blocked payer gets payer_blocked."New value: +"Not available yet: private invoices are coming soon, with the Vurto vault. Any value other than false is refused with private_coming_soon and nothing is created. A payment is a direct transfer, so the transaction shows the receiving wallet on-chain; omit this field."
  4. Changed1 schema field changed
    • addedInput schema / properties / confidential
      Added value: +{
      +  "description": "Optional, Solana only. A private (confidential) invoice hides the receiving wallet from anyone with the link (invoice_get returns recipient: null), and every payment route screens the payer first: OFAC SDN list plus the issuer freeze of USDC and EURC (Circle), USDT (Tether), PYUSD and USDG (Paxos) and USD1 (World Liberty), the issuer freeze index, and a fund trail up to three hops back through the same checks (a flagged sender on the first hop blocks; on hops two and three it only warns). These are checks of the paying wallet, whatever token it pays with. A blocked payer gets payer_blocked.",
      +  "type": "boolean"
      +}
  5. Added

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readonly, open-world, non-idempotent behavior, and the description adds substantial context: no signature/API key needed, verified stablecoin allowlist, split-fee conditions, third-party data sharing, error codes, and Solana-specific screening. This is rich behavioral disclosure beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is front-loaded and clear, but the description is very long and dense, with repeated error and check details that could be tightened. It is appropriately structured for a complex tool but not concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description explains the returned invoice fields and covers major behavioral conditions, error cases, paid checks, and Solana differences. For an 8-parameter creation tool with rich annotations, this is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents each parameter in detail. The description reinforces token resolution, amount decimals, checks, payerChecks, and confidential behavior, but adds little parameter-specific meaning beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Create a payment request," then names the key dimensions (recipient, token, amount, network) and the returned invoice fields. An agent can distinguish this creation tool from retrieval/payment siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains when optional paid checks apply, when to use payerChecks instead on Solana, and that invoice_analysis_pay handles payment of analysis. It does not explicitly route retrieval to invoice_get or state when not to create an invoice, but the creation context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources