Physical cards free to order Top up by SEPA, to an IBAN of their own Freeze any card in one tap
Virtual
Software & tools•••• •••• •••• 4242Halcyon & Co
LimitsActive
Per purchase€50.00
This month€182.40 of €500.00
MerchantsSoftware only
A person approves€100 and over
Approve €240.00 at Halcyon & Co?An agent asks to spend it+€500.00 top-upBy SEPA, to the card balance
Two kinds of card
Virtual in one call. Physical for people.
Software & tools · 4242Standing · €500.00 a monthActive
Ads agent · 1881Standing · advertising onlyFrozen
Lumen Labs only · 0716Single use · up to €24.00Ready
Virtual cards, for your business or your agents
Use one for your team’s software and subscriptions, or give an agent cards of its own. Each card is ready to spend as soon as it’s issued.
Standing cards for everyday spending
Single-use cards for one purchase, up to an amount you set
Lock a card to one merchant
Your cardOn its way
OrderedStandard post
ShippedWith a tracking number
DeliveredDue Thursday
ActivateWhen it arrives
Physical cards, for your team
One card per person, posted with tracking. They activate it when it arrives.
Standard, express or priority post, with tracking
Lost or stolen: the old card is blocked at once and a new one is posted
Damaged or expired: the old card works until the new one is activated
Spend limits and rules
Decide what every card can spend.
Set limits on each card, and apply a spend policy to one card or all of an agent’s cards at once. Every purchase is checked as the merchant charges.
Limits per purchase, per day, week or month, or all time. Every card has one, €500 a day unless you change it.
Allow kinds of merchant: software and cloud, advertising, travel, food and drink, office supplies, phone and internet, professional services, and postage and couriers.
Allow or block category codes, or restrict a card to certain countries or one merchant.
Every edit to a policy is a new version, and each purchase records the version that decided it.
Spending rulesResearch tools · version 3
Software and cloud only, up to €50 a purchase and €500 a month. A person approves from €100.
Software and cloudAdvertisingTravelOffice supplies
Per purchase€50.00
Monthly€500.00
CountriesAny
Unusual activityAsk a person
Used by 3 cards
Approvals
A person says yes to the big ones.
Purchases at or over your threshold wait for an owner or admin, as do purchases unusual for that agent: far more than it normally spends, a new merchant, or an hour it never buys in.
A push notification with Approve and Decline, plus email, the dashboard and a Slack message
Approve in the iPhone and iPad app with Face ID Beta
24 hours to decide. An API key can never approve.
Agents can ask before they buy, so the merchant never sees a decline
Approve €240.00 at Halcyon & Co?An agent asks to spend it: “Annual data licence”.
€240.00
Research agent wants to pay Halcyon & Co
“Annual data licence”
DeclineApprove
Only an owner or admin can decide.
Made for AI agents
Let agents buy, within what a person agreed.
Mandates
A person agrees once to what an agent may buy: the most per purchase, how many purchases and which merchants. Carts the agent signs within it go through without asking again.
Agent keys
Each agent signs with its own key. Its public keys are published, so anyone can check a signature, and revoking a key works at once.
Twelve tools: create_agent_card, get_card_details, freeze_card, get_card_balance, request_approval, get_approval, list_card_authorizations, list_card_transactions, and list_topup_options, create_topup, list_topups and get_topup to top up the cards.
Each attempt is kept, approved or declined, with the reason and the policy version that decided it.
A timeline
Asked, approved, authorised, captured and refunded, in order, for every purchase.
Disputes
Dispute a purchase for fraud, goods not received, a duplicate charge and more. If you win, you get the money back.
Freeze in one tap
Freeze a card in the app and unfreeze it with Face ID, or do both through the API.
Running a platform? Issue cards for your businesses.
With Tuppence Connect, each business on your platform gets cards through the same calls. Cards on Connect.
Top up the cards by SEPA.
Cards spend their own euro balance, kept apart from what customers pay you. Top it up by SEPA transfer from any business bank account to the card balance’s own IBAN, shown under Cards in the dashboard and by the API. A transfer takes about a day to arrive. Keep enough in the balance: a purchase it can’t cover is declined.
Tuppence cards in the eurozone are Visa commercial cards, for business use only, issued by Stripe Technology Europe Limited, an electronic money institution authorised by the Central Bank of Ireland. Tuppence is not a bank and does not issue the cards itself. The cards are governed by the card issuer’s terms, which you accept in the dashboard before your first card.
For developers
Issue a card in one call.
A card with limits, from the Node or Python SDK or plain HTTP. Add a spend policy or give a card to an agent when you need to. In test mode, top up the cards and make purchases without real money.
const tuppence = newTuppence(process.env.TUPPENCE_SECRET_KEY!);
// A virtual card, ready to spend.const card = await tuppence.cards.create({
limits: { per_authorization: 5000, monthly: 50000 },
});
// Optional: the rules it spends under.const policy = await tuppence.spendPolicies.create({
name: "Software only",
allowed_merchant_kinds: ["software"],
approval_threshold: 10000, // a person says yes from €100
});
await tuppence.cards.update(card.id, { spend_policy: policy.id });
// Optional: a card of its own for an AI agent.const agent = await tuppence.agents.create({ name: "Research agent" });
await tuppence.cards.create({ agent: agent.id });
import { Tuppence } from"@tuppence/node";
const tuppence = newTuppence(process.env.TUPPENCE_SECRET_KEY);
// What the cards can spend now.const balance = await tuppence.request("GET", "/v1/issuing/balance");
// { spendable: 25000, currency: "eur",// spends_from: "issuing_balance", … }// The card balance's own IBAN, for SEPA transfers.const bank = await tuppence.request(
"GET",
"/v1/issuing/funding_instructions",
);
// Test mode: a €100 SEPA transfer arrives.await tuppence.request("POST", "/v1/test_helpers/issuing/fund", {
body: { amount: 10000 },
});
import os
from tuppence import Tuppence
tuppence = Tuppence(os.environ["TUPPENCE_SECRET_KEY"])
# What the cards can spend now.
balance = tuppence.request("GET", "/v1/issuing/balance")
print(balance["spendable"], balance["spends_from"])
# The card balance's own IBAN, for SEPA transfers.
bank = tuppence.request("GET", "/v1/issuing/funding_instructions")
print(bank["available"])
# Test mode: a €100 SEPA transfer arrives.
tuppence.request(
"POST", "/v1/test_helpers/issuing/fund", body={"amount": 10000}
)
# What the cards can spend now.
curl https://api.tuppence.ai/v1/issuing/balance \
-H "Authorization: Bearer $TUPPENCE_SECRET_KEY"# The card balance's own IBAN, for SEPA transfers.
curl https://api.tuppence.ai/v1/issuing/funding_instructions \
-H "Authorization: Bearer $TUPPENCE_SECRET_KEY"# Test mode: a €100 SEPA transfer arrives.
curl https://api.tuppence.ai/v1/test_helpers/issuing/fund \
-H "Authorization: Bearer $TUPPENCE_SECRET_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"amount": 10000}'
// Cents, per purchase, day, week, month or all time.// null removes a limit; a card always keeps one.await tuppence.cards.setLimits(card.id, {
monthly: 100000, // €1,000 a month
per_authorization: null,
});
// One purchase, at one merchant, up to €24.const once = await tuppence.cards.create({
usage: "single_use",
amount: 2400,
merchant: { name: "Lumen Labs" },
});
// Stop it at once, and start it again.await tuppence.cards.freeze(card.id);
await tuppence.cards.unfreeze(card.id);
// The card pays wherever its policy allows,// and the policy decides the moment the merchant charges it.const { data } = await tuppence.cardAuthorizations.list({
card: card.id,
});
// [{ amount: 1800, merchant: { name: "Lumen Labs", … },// approved: true, decided_by: "policy", … }]// Over the threshold? Ask first, so the merchant never sees a decline.const approval = await tuppence.approvals.create({
card: card.id,
amount: 24000, // €240.00
merchant: { name: "Halcyon & Co" },
description: "Annual data licence",
});
// A person says yes in the dashboard or the app. Then buy.
# Test mode: a purchase, decided as a real one would be.
curl https://api.tuppence.ai/v1/test_helpers/issuing/authorizations \
-H "Authorization: Bearer $TUPPENCE_SECRET_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"card": "card_01K…", "amount": 1800,
"merchant": {"name": "Lumen Labs", "mcc": 5734}}'
{
"object": "card_authorization",
"amount": 1800,
"approved": true,
"decided_by": "policy",
"spend_policy": "pol_01K…",
…
}
Webhooks
card.created
card.shipped
approval.requested
approval.decided
card_transaction.created
card_dispute.closed
Test mode
Make a SEPA transfer arrive in the card balance
Make a purchase, then capture, reverse or refund it
Companies in the eurozone countries we serve, once they accept the card issuer's terms in the dashboard.
Do I need an AI agent to use cards?
No. A virtual card is your business's own unless you give it to an agent. Use it for your team's software, subscriptions and suppliers. Issue a card.
Can I see a card's number?
Yes. Owners and admins see any card's number, expiry and CVC in the dashboard or the app, after confirming it's them. A cardholder sees their own card and its PIN. The details show inside a secure frame and hide again after a minute.
Can my code or an agent read a card's number?
Yes, once an owner switches it on. A restricted key with card_details:read reads your virtual cards' numbers to pay at a checkout, and an agent that signs its requests sees only its own. Every read is logged and sent to your webhook. How it works.
Can an agent have a physical card?
No. Physical cards are for people, one each. Agents get virtual cards.
What currency do cards spend in?
Your account's own currency: pounds in the UK, dollars in the US, euros in the eurozone. They can still buy in other currencies.
What happens when someone approves a purchase?
The card can then be used at that merchant for 30 minutes, up to the approved amount plus 5% for tax or exchange rates.
Does a cardholder need a mobile number?
Yes. 3-D Secure codes for online purchases are texted to it. The card issuer’s 3-D Secure screens are in English, French, German, Italian and Spanish; in another language, they show in English.
What does it cost?
Physical cards are free to order. On purchases in another currency, the card network’s conversion is passed through. See pricing.
Who issues the cards?
Tuppence cards in the eurozone are Visa commercial cards, for business use only, issued by Stripe Technology Europe Limited, an electronic money institution authorised by the Central Bank of Ireland. Tuppence is not a bank and does not issue the cards itself. See who issues the cards.
Not yet. Card issuing is new. Not yet available:
Adding cards to Apple Pay and Google Pay
Approving from Slack (Slack tells you about a request today)