Teppi

Antes de pagar um endpoint x402 ou servidor MCP, leia o que o pagamento entregou: verificado, assinado, reproduzível.

Servidor MCP hospedado

npx add-mcp 'https://api.teppi.xyz/mcp'

Instala no Claude Code, Codex, Cursor e outros

Documentação

Verifique antes de pagar, no cliente que você já usa

Versão 2026.09.4.

Cada trecho abaixo faz uma pergunta ao registro Teppi no momento em que um 402 chega, antes de um pagamento ser assinado: o que pagar por este endpoint, e quem ele paga, realmente entregou. A resposta é assinada, gratuita, não precisa de chave e fica em cache por um minuto. Uma url que o registro nunca viu recebe a resposta UNRATED, nunca como ruim, e entra na fila para um handshake gratuito.

Nada aqui envia seu corpo de requisição, sua carteira ou seu pagamento para lugar algum. A única coisa que sai é a url que você está prestes a pagar, e o endereço payTo do 402 quando você o passa.

O cliente x402 oficial

O cliente de @x402/core chama onBeforePaymentCreation antes de assinar qualquer coisa. Retornar { abort: true, reason } interrompe o pagamento. teppiHook é esse hook, e ele lê a url e o payTo do próprio 402.

npm install teppi-client
import { x402Client } from '@x402/core/client';
import { teppiHook } from 'teppi-client';

const client = new x402Client()
  .register('eip155:*', evmScheme)
  .onBeforePaymentCreation(teppiHook({ minBand: 'C' }));

@x402/fetch e @x402/axios envolvem este mesmo cliente, então o hook também os cobre: construa o cliente como acima e entregue-o ao wrapper que você já usa.

Qualquer cliente que aceite um fetch

beforeYouPay envolve um fetch. Em um 402, ele consulta o registro primeiro; quando a política recusa, o 402 vira um 403 que explica o motivo, antes que qualquer coisa seja assinada. Funciona para qualquer 402, x402 ou MPP, já que lê apenas o status e a url.

import { beforeYouPay } from 'teppi-client';

const guarded = beforeYouPay(fetch, { minBand: 'C', unrated: 'allow' });

A política padrão recusa uma listagem que o registro mostra como falha antes do pagamento, e uma faixa abaixo da que você nomeia. UNRATED é pago por padrão, já que a maior parte do mercado ainda não tem registro pago. Passe policy para sua própria regra; ele recebe a resposta completa.

Pago somente na entrega

Onde a resposta traz buy, a mesma chamada pode ser comprada via Teppi: o vendedor é pago por nós, a resposta é verificada, e você é cobrado somente depois que ela passou. O preço é o do vendedor mais uma taxa de 10%, no mínimo $0.002.

import { beforeYouPay } from 'teppi-client';

const guarded = beforeYouPay(fetch, { payOnDelivery: true, publish: true });

publish fica desligado a menos que você o configure. Configurado, a chamada que você comprou entra no registro público, bytes e tudo, sob um nome opaco para sua carteira. Isso conta para o que o próximo comprador lê sobre aquele vendedor, e pode puxar os números publicados de um vendedor para baixo, mas nunca para cima, então um vendedor comprando seu próprio endpoint não ganha nada com isso. Desligado, nada que você enviou é publicado: apenas compromissos com sal que só você pode abrir.

De um total de $0.05, e até $1.00, o mesmo 402 também pode oferecer auth-capture: seu dinheiro espera no escrow auditado da Base, capturado para o tesouro do Teppi somente depois que a resposta passou e devolvido caso contrário, e você pode retirá-lo sozinho após 30 minutos, não importa o que o Teppi faça. O cliente oficial paga com AuthCaptureEvmScheme, e como ele prefere pagar depois do fato sempre que ambos são oferecidos, preferEscrow mantém os termos do escrow sozinho:

import { x402Client } from '@x402/core/client';
import { AuthCaptureEvmScheme } from '@x402/evm/auth-capture/client';
import { preferEscrow } from 'teppi-client';

const client = new x402Client()
  .register('eip155:8453', new AuthCaptureEvmScheme(signer))
  .registerPolicy(preferEscrow);

Um GET, de qualquer linguagem

curl -sS 'https://api.teppi.xyz/v1/check?url=https%3A%2F%2Fseller.example%2Fv1%2Fprice&pay_to=0x2a462db85807f0ff497ddd15f5978317d079a3a1'
import requests

answer = requests.get(
    "https://api.teppi.xyz/v1/check",
    params={"url": url, "pay_to": pay_to},
    timeout=5,
).json()
if answer["defects"]:
    raise RuntimeError(answer["defects"][0]["says"])

Leia band com tier ao lado: uma letra só é dada em um nível pelo qual alguém pagou, e UNRATED significa desconhecido, não ruim. defects diz o que a listagem erra antes de qualquer pagamento, payee o que o registro sabe sobre quem recebe o pagamento, e buy como pagar somente na entrega.

Como uma ferramenta que seu agente pode chamar

A mesma resposta é a ferramenta check_grade no servidor MCP do Teppi, com search_capabilities para encontrar uma alternativa que foi paga e verificada.

claude mcp add --transport http teppi https://api.teppi.xyz/mcp
{ "mcpServers": { "teppi": { "url": "https://api.teppi.xyz/mcp" } } }

A segunda é para um cliente que lê uma configuração json, como o .cursor/mcp.json do Cursor. Um arquivo de skill que faz um agente perguntar antes de pagar está em https://api.teppi.xyz/docs/skill.

Toda a sua frota de uma vez

Envie todos os endpoints pagos que seus agentes chamam, até 200, e receba cada um consultado da mesma forma que uma verificação é feita, e então somados pelo endereço que cada um paga. Um endereço muitas vezes está por trás de várias origens, então uma lista que parece dispersa pode ser um único operador.

curl -sS https://api.teppi.xyz/v1/exposure \
  -H 'content-type: application/json' \
  -d '{"dependencies":[{"url":"https://seller.example/v1/price","calls_per_month":3000},"https://other.example/v1/lookup"]}'

Cada linha traz um standing: took_the_money (uma chamada paga liquidada e nada voltou), listing_mismatch, lettered, paid_no_letter, handshake_only ou not_in_record. Os dois últimos significam desconhecido, e desconhecido nunca é contado como falha: os totais de gastos mantêm monthly_spend_not_yet_measured separado de monthly_spend_where_the_record_shows_a_failure. Passe o pay_to de um 402 e pay_to_seen_before diz se este vendedor foi visto pagando aquele endereço. A resposta é assinada como uma verificação, e o mesmo relatório é a ferramenta check_exposure.

Avisado quando um cartão cai

Registre um receptor https e os endpoints a observar. Antes que qualquer coisa seja mantida, o receptor recebe um desafio e deve ecoá-lo, para que ninguém possa apontar avisos para uma url que não pediu. A resposta traz um token, mostrado uma vez, que lê ou interrompe o observador.

curl -sS https://api.teppi.xyz/v1/watchers \
  -H 'content-type: application/json' \
  -d '{"url":"https://you.example/teppi","watch":["https://seller.example/v1/price"]}'

O receptor responde ao desafio e aceita apenas avisos que verificam contra a chave que assina os cartões:

import { noticeReceiver } from 'teppi-client';

export const POST = noticeReceiver(async (notice) => {
  console.log(notice.capability_id, notice.change, notice.from, '->', notice.to);
});

Um aviso nomeia o cartão sobre o qual é, então nada precisa ser tirado do próprio aviso. Leia um observador de volta com GET /v1/watchers/{watcher_id} e interrompa-o com POST /v1/watchers/stop, cada um com o token como bearer.

Verificando que o Teppi disse isso

Cada resposta é assinada pela chave que o registro publica para verificações, e nunca pela chave que assina scorecards.

import { check, publishedKeys, verify } from 'teppi-client';

const answer = await check('https://seller.example/v1/price');
const result = await verify(answer, await publishedKeys());

Changelog

2026.09.4

MudançaMotivo
Pagamento em escrow, com AuthCaptureEvmScheme e preferEscrowO dinheiro de um comprador agora pode esperar no escrow auditado até a resposta passar, e o cliente oficial escolhe pagar depois do fato, a menos que seja instruído de outra forma

2026.09.3

MudançaMotivo
Toda a sua frota de uma vez (POST /v1/exposure), e avisado quando um cartão cai (POST /v1/watchers com noticeReceiver)Uma frota verificada uma url por vez nunca vê que muitas de suas dependências pagam um endereço, e avisos existiam sem nenhuma maneira de solicitá-los

2026.09.2

MudançaMotivo
publish: true ao lado de payOnDelivery, e o que publicar faz e não fazUm comprador que queria que sua chamada contasse tinha que definir um cabeçalho manualmente na nova tentativa paga, o que um wrapper esconde

2026.09.1

MudançaMotivo
Primeira versão: o cliente x402 oficial, qualquer fetch, pago somente na entrega, um GET de qualquer linguagem, MCP, e verificação da assinaturaCada peça existia, e nada dizia onde ela se encaixa no cliente que um desenvolvedor já tem aberto