Go SDK for the Machine Payments Protocol
MPP lets any client — agents, apps, or humans — pay for any service in the same HTTP request. It standardizes HTTP 402 with an open IETF specification, so servers can charge and clients can pay without API keys, billing accounts, or checkout flows.
You can get started today by reading the Go SDK docs, the module-level Go doc reference, exploring the protocol overview, or jumping straight to the quickstart.
Package docs:
go get github.com/tempoxyz/mpp-gopackage main
import (
"encoding/json"
"net/http"
"github.com/tempoxyz/mpp-go/pkg/server"
"github.com/tempoxyz/mpp-go/pkg/tempo"
charge "github.com/tempoxyz/mpp-go/pkg/tempo/server"
)
func main() {
intent, _ := charge.NewIntent(charge.IntentConfig{
RPCURL: "https://rpc.moderato.tempo.xyz",
})
method := charge.NewMethod(charge.MethodConfig{
Intent: intent,
ChainID: 42431,
Currency: tempo.DefaultCurrencyForChain(42431),
Recipient: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8",
})
payment := server.New(method, "api.example.com", "replace-me")
handler := server.ChargeMiddleware(payment, server.ChargeParams{
Amount: "0.50",
Description: "Paid content",
})(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_ = json.NewEncoder(w).Encode(map[string]any{
"data": "paid content",
"payer": server.CredentialFromContext(r.Context()).Source,
})
}))
_ = http.ListenAndServe(":8080", handler)
}package main
import (
"context"
"encoding/json"
"fmt"
"github.com/tempoxyz/mpp-go/pkg/client"
"github.com/tempoxyz/mpp-go/pkg/mpp"
charge "github.com/tempoxyz/mpp-go/pkg/tempo/client"
)
func main() {
method, _ := charge.New(charge.Config{
PrivateKey: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d",
ChainID: 42431,
RPCURL: "https://rpc.moderato.tempo.xyz",
})
c := client.New([]client.Method{method})
response, err := c.Get(context.Background(), "https://api.example.com/paid")
if err != nil {
panic(err)
}
defer response.Body.Close()
receipt, _ := mpp.ParseReceipt(response.Header.Get("Payment-Receipt"))
var body struct {
Data string `json:"data"`
Payer string `json:"payer"`
}
_ = json.NewDecoder(response.Body).Decode(&body)
fmt.Printf("paid request for %q from %s with receipt %s\n", body.Data, body.Payer, receipt.Reference)
}| Example | Description |
|---|---|
| basic | Separate-process demo with a long-running server and standalone client, mirroring the mpp-rs sample layout |
| charge-basic | Generic Tempo charge flow using the high-level MPP client and server helpers, available in both one-command and separate-process layouts |
| charge-hash | Push-mode charge flow with a hash credential, available in both one-command and separate-process layouts |
| charge-fee-payer | Sponsored Tempo charge flow where the server co-signs as a fee payer, available in both one-command and separate-process layouts |
Built on the "Payment" HTTP Authentication Scheme, an open specification proposed to the IETF. See mpp.dev/protocol for the full protocol overview, or the IETF specification for the wire format.
git clone https://github.com/tempoxyz/mpp-go
cd mpp-go
go test ./...
See SECURITY.md for reporting vulnerabilities.
Licensed under either of Apache License, Version 2.0 or MIT License at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.