Free trial
One free score to get started. Inspect the API shape with no payment, no headers and no rail to choose. Every other match is pay-per-view.
curl https://www.payforgoals.com/api/v1/scores/trial
Matchday · On demand
Every iconic result, ready to relive in a single request. PayForGoals.com returns the scoreline - the comeback, the collapse, the impossible final - straight to your terminal.
Same scores, two ways to pay: on-chain over Tempo, or by card over Stripe. Pick the endpoint that matches your agent's wallet.
One detail. We return the score, and only the score. Team names are a premium feature, coming soon.
How it works
Agentic commerce, made concrete: a software agent pays per request over the Machine
Payments Protocol. Free to browse, then pick how your agent pays. The same scoreline is exposed twice -
under /tempo/ for on-chain settlement and
/stripe/ for cards - differing only by rail.
Either way the client pays per request: no signup, no checkout page. Copy a command and run it.
One free score to get started. Inspect the API shape with no payment, no headers and no rail to choose. Every other match is pay-per-view.
curl https://www.payforgoals.com/api/v1/scores/trial
One result by id. 0.01 pathUSD per request, settled on-chain.
npx mppx https://www.payforgoals.com/api/v1/tempo/scores/match/1 \
--network testnet
One payment of 0.05 pathUSD unlocks the 80s, 90s and 00s - three calls on a reusable session.
npx mppx https://www.payforgoals.com/api/v1/tempo/scores/classics/80s \
--network testnet
Same result by id. $1.00 USD per request - priced to clear Stripe's card minimum.
# native MPP 402 - an SPT-capable agent
# presents a Shared Payment Token and retries
curl https://www.payforgoals.com/api/v1/stripe/scores/match/1
One payment of $3.00 USD unlocks all three decades - same metered session, settled on a PaymentIntent.
curl https://www.payforgoals.com/api/v1/stripe/scores/classics/80s
The first paid request returns a 402. After the client settles and retries, the API serves the scoreline with a payment receipt.
{
"tier": "pay-per-view",
"scoreline": {
"id": 1,
"home_score": 7,
"away_score": 1,
"year": 2014,
"teams": null
}
}
Levelling with you
Yes, in the way a score API without teams can be real. PayForGoals.com is a working demo of the Machine Payments Protocol (MPP), built by Square1 on our open-source package square1/laravel-mpp.
MPP lets a server charge for a request using nothing but HTTP. There's no signup, no checkout page, no stored card. The buyer is usually a software agent, and it pays per request, in the moment, then moves on. This is what agentic commerce looks like in practice: machine payments settled inline, with no human at a checkout.
Those paid PayForGoals.com endpoints above are gated by exactly this package. The same 402 loop runs on two rails: a pathUSD transfer on Tempo's test network, or a Stripe PaymentIntent confirmed from a Shared Payment Token.
The unpaid request comes back with a signed challenge: amount, method, scope and expiry.
The agent settles on its rail, then retries the same request with a payment credential.
The server verifies settlement, serves the data, and returns a receipt with the settlement reference.
Getting started
Pick a settlement rail. Tempo runs fully end to end with the stock npx mppx
client. Stripe returns the same kind of paid resource after the buyer presents an SPT through Link or a test token.
A throwaway wallet, funded with test pathUSD. No real money touches this.
npx mppx account create
npx mppx account fund --network testnet
mppx fetches the 402, signs the transfer, and retries - all in one command.
npx mppx https://www.payforgoals.com/api/v1/tempo/scores/match/1 \
--network testnet --account main
HTTP/1.1 402 Payment Required
WWW-Authenticate: Payment id="LRt7…w7k",
realm="www.payforgoals.com", method="tempo",
intent="charge", request="<base64>",
expires="2026-06-23T12:57:10.224Z"
{
"type": "https://paymentauth.org/problems/payment-required",
"title": "Payment Required",
"status": 402,
"detail": "Payment is required.",
"challengeId": "LRt7…w7k"
}
request decodes to →
{"amount":"10000","currency":"0x20c00000…","methodDetails":{"chainId":42431},"recipient":"0x0dcd39…"}
10000 = 0.01 pathUSD at 6 decimals.
HTTP/1.1 200 OK
Payment-Receipt: <base64url-json>
# decoded receipt:
{
"method": "tempo",
"status": "success",
"timestamp": "2026-06-23T12:51:42.163Z",
"reference": "0x3da1…913b"
}
reference is the settled transaction hash. The funds - 0.01 pathUSD - land at the recipient on Tempo testnet. View the recipient wallet.
A metered endpoint charges once and hands back a Payment-Session
with credits. Present that session on the sibling endpoints and they're served with no
new payment, until the credits run out.
# 1 · pay once - issues a 3-credit session
npx mppx https://www.payforgoals.com/api/v1/tempo/scores/classics/80s \
--network testnet --account main -i
→ Payment-Session: id="sess_…EP",
remaining="2", scope="tempo.classics"
# 2 · reuse it - no charge, credits decrement
curl https://www.payforgoals.com/api/v1/tempo/scores/classics/90s \
-H 'Authorization: Payment session="sess_…EP"'
→ 200 OK · Payment-Session remaining="1"
curl https://www.payforgoals.com/api/v1/tempo/scores/classics/00s \
-H 'Authorization: Payment session="sess_…EP"'
→ 200 OK · Payment-Session remaining="0"
A Stripe endpoint returns a native MPP accepts[]
challenge. From the client side, you can pay it with Stripe Link, or mint a test Shared
Payment Token yourself and replay the request.
Copy the challengeId and
sig from the response. The Stripe
accept also includes the seller's network_id
for Link wallets.
curl -i https://www.payforgoals.com/api/v1/stripe/scores/match/1
HTTP/1.1 402 Payment Required
Content-Type: application/json
{
"challengeId": "chal_...",
"accepts": [
{
"method": "stripe",
"amount": "1.00",
"currency": "USD",
"network_id": "profile_...",
"sig": "..."
}
]
}
Link is the production buyer wallet for Stripe SPTs. It currently requires a US Link account. The buyer approves the spend, then the wallet presents the token to this API.
link-cli auth login
link-cli spend-request create \
--network-id profile_... \
--amount 100 \
--credential-type shared_payment_token
link-cli mpp pay https://www.payforgoals.com/api/v1/stripe/scores/match/1 \
--spend-request-id lsrq_...
For a quick test, mint an SPT from a buyer Stripe test account, then echo the challenge signature back with the token. This exercises the same payment retry shape.
curl -s -u "sk_test_buyer_...:" \
-H "Stripe-Version: 2026-05-27.preview" \
-X POST https://api.stripe.com/v1/test_helpers/shared_payment/granted_tokens \
-d payment_method=pm_card_visa \
-d "usage_limits[currency]=usd" \
-d "usage_limits[max_amount]=100"
curl -i https://www.payforgoals.com/api/v1/stripe/scores/match/1 \
-H 'Authorization: Payment method="stripe", challengeId="chal_...", sig="...", spt="spt_..."'
HTTP/1.1 200 OK
Payment-Receipt: id="rcpt_...", method="stripe",
amount="1.00", currency="USD",
ref="pi_3Q...", settledAt="..."
{
"tier": "pay-per-view",
"scoreline": { "id": 1, "home_score": 7, "away_score": 1, "teams": null }
}
The /api/v1/stripe/scores/classics/{80s|90s|00s} endpoint
settles a single $3.00 USD PaymentIntent and issues a 3-credit
Payment-Session - the same metered session as Tempo, paid by card instead of on-chain.
# 1 · pay the first decade with an SPT - issues a 3-credit session
curl -i https://www.payforgoals.com/api/v1/stripe/scores/classics/80s \
-H 'Authorization: Payment method="stripe", challengeId="chal_...", sig="...", spt="spt_..."'
→ Payment-Session: id="sess_...",
remaining="2", scope="stripe.classics"
# 2 · reuse it on the other decades - no charge, credits decrement
curl https://www.payforgoals.com/api/v1/stripe/scores/classics/90s \
-H 'Authorization: Payment session="sess_..."'
→ 200 OK · Payment-Session remaining="1"
curl https://www.payforgoals.com/api/v1/stripe/scores/classics/00s \
-H 'Authorization: Payment session="sess_..."'
→ 200 OK · Payment-Session remaining="0"
FAQ
The short version of what this demo is and how an agent pays for a request.
Agentic commerce is buying and selling where the customer is a software agent rather than a person clicking through a checkout. The agent discovers a price, pays for exactly what it needs, and moves on. PayForGoals.com is a small working example: an agent pays per request for a single football scoreline.
The Machine Payments Protocol (MPP) is an open way for a server to charge for an HTTP request and for a client to pay it using standard web mechanics. An unpaid request returns an HTTP 402 Payment Required challenge; the client settles it and retries, and the server returns the resource plus a receipt. It is the rail-agnostic plumbing underneath this demo.
Machine payments happen inline, per request. There is no account, no checkout page and no stored card. The agent reads the 402 challenge, settles it on one of two rails, then replays the request with an Authorization: Payment header. Settlement is verified before the resource is served.
Two. Stripe Shared Payment Tokens (SPTs), settled inline as a PaymentIntent, and Tempo pathUSD, an on-chain stablecoin transfer on the Tempo testnet. The same scoreline is sold over both rails; only the wire dialect of the 402 differs.
No. That is the point of agentic commerce: the buyer pays for one request in the moment, then leaves. Nothing is stored and there is no signup. You can inspect the API shape for free with a single trial score before paying for anything.
The demo is real and the payments settle for real (Stripe in test mode, Tempo on testnet). The gating is provided by Square1's open-source package square1/laravel-mpp, which drops into any Laravel app. Stripe live acceptance is currently US-gated; Tempo runs on testnet.