Teppi

Antes de pagar un endpoint x402 o servidor MCP, lee lo que pagar entregó: verificado, firmado, reproducible.

Servidor MCP alojado

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

Se instala en Claude Code, Codex, Cursor y más

Documentación

Comprueba antes de pagar, en el cliente que ya usas

Versión 2026.09.4.

Cada fragmento a continuación le hace una pregunta al registro de Teppi en el momento en que llega un 402, antes de que se firme un pago: qué ha entregado realmente pagar este endpoint, y a quien paga. La respuesta está firmada, es gratuita, no necesita clave y se almacena en caché durante un minuto. Una URL que el registro nunca ha visto recibe como respuesta UNRATED, nunca como mala, y se pone en cola para un handshake gratuito.

Nada de esto envía el cuerpo de tu solicitud, tu wallet ni tu pago a ningún sitio. Lo único que sale es la URL que estás a punto de pagar y la dirección payTo de su 402 cuando la pasas.

El cliente oficial x402

El cliente de @x402/core llama a onBeforePaymentCreation antes de firmar cualquier cosa. Devolver { abort: true, reason } detiene el pago. teppiHook es ese hook, y lee la URL y el payTo del propio 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 y @x402/axios envuelven este mismo cliente, así que el hook también los cubre: construye el cliente como arriba y pásalo al wrapper que ya usas.

Cualquier cliente que acepte un fetch

beforeYouPay envuelve un fetch. Ante un 402, primero consulta el registro; cuando la política lo rechaza, el 402 se convierte en un 403 que explica el motivo, antes de que se firme cualquier cosa. Funciona para cualquier 402, x402 o MPP, ya que solo lee el estado y la URL.

import { beforeYouPay } from 'teppi-client';

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

La política predeterminada rechaza un listado que el registro muestra como fallido antes del pago, y una banda por debajo de la que nombres. UNRATED se paga por defecto, ya que la mayor parte del mercado aún no tiene registro de pago. Pasa policy para tu propia regla; recibe la respuesta completa.

Pago solo bajo entrega

Cuando la respuesta incluye buy, la misma llamada se puede comprar a través de Teppi: el vendedor recibe el pago de nuestra parte, la respuesta se verifica y solo se te cobra una vez que ha pasado. El precio es el del vendedor más una comisión del 10%, con un mínimo de $0.002.

import { beforeYouPay } from 'teppi-client';

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

publish está desactivado a menos que lo configures. Activado, la llamada que compraste entra en el registro público, bytes incluidos, bajo un nombre opaco para tu wallet. Cuenta para lo que el próximo comprador lea sobre ese vendedor, y puede bajar las cifras publicadas de un vendedor pero nunca subirlas, así que un vendedor que compre su propio endpoint no gana nada con ello. Desactivado, nada de lo que enviaste se publica: solo compromisos con sal que solo tú puedes abrir.

Desde un total de $0.05 y hasta $1.00, el mismo 402 también puede ofrecer auth-capture: tu dinero espera en el escrow auditado de Base, capturado para el tesoro de Teppi solo una vez que la respuesta haya pasado y devuelto en caso contrario, y puedes recuperarlo tú mismo después de 30 minutos haga lo que haga Teppi. El cliente oficial lo paga con AuthCaptureEvmScheme, y como prefiere pagar después del hecho siempre que se ofrezcan ambas opciones, preferEscrow mantiene solo los términos del escrow:

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);

Un solo GET, desde cualquier lenguaje

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"])

Lee band junto con tier: una letra solo se otorga en un nivel por el que alguien pagó, y UNRATED significa desconocido, no malo. defects indica qué falla en el listado antes de cualquier pago, payee qué sabe el registro sobre quien recibe el pago, y buy cómo pagar solo bajo entrega.

Como herramienta que tu agente puede llamar

La misma respuesta es la herramienta check_grade en el servidor MCP de Teppi, con search_capabilities para encontrar una alternativa que haya sido pagada y verificada.

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

La segunda es para un cliente que lee una configuración json, como el .cursor/mcp.json de Cursor. Un archivo de skill que hace que un agente pregunte antes de pagar está en https://api.teppi.xyz/docs/skill.

Toda tu flota a la vez

Envía cada endpoint de pago al que llaman tus agentes, hasta 200, y haz que cada uno se consulte como se hace una verificación, y luego se sume por la dirección a la que paga cada uno. Una sola dirección suele estar detrás de muchos orígenes, así que una lista que parece dispersa puede ser un solo 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 línea lleva un standing: took_the_money (una llamada pagada liquidada y no volvió nada), listing_mismatch, lettered, paid_no_letter, handshake_only o not_in_record. Los dos últimos significan desconocido, y desconocido nunca se cuenta como fallo: los totales de gasto mantienen monthly_spend_not_yet_measured aparte de monthly_spend_where_the_record_shows_a_failure. Pasa el pay_to de un 402 y pay_to_seen_before indica si este vendedor ha sido visto pagando esa dirección. La respuesta está firmada como una verificación, y el mismo informe es la herramienta check_exposure.

Aviso cuando cae una tarjeta

Registra un receptor https y los endpoints a vigilar. Antes de guardar nada, se envía un desafío al receptor y debe repetirlo, para que nadie pueda apuntar avisos a una URL que no lo pidió. La respuesta lleva un token, mostrado una vez, que lee o detiene el vigilante.

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"]}'

El receptor responde al desafío y solo acepta avisos que se verifiquen con la clave que firma las tarjetas:

import { noticeReceiver } from 'teppi-client';

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

Un aviso nombra la tarjeta sobre la que trata, así que no hay que tomar nada del propio aviso. Lee un vigilante con GET /v1/watchers/{watcher_id} y detenlo con POST /v1/watchers/stop, cada uno con el token como bearer.

Comprobando que Teppi lo dijo

Cada respuesta está firmada por la clave que el registro publica para verificaciones, y nunca por la clave que firma las tarjetas de puntuación.

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

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

Registro de cambios

2026.09.4

CambioMotivo
Pago en escrow, con AuthCaptureEvmScheme y preferEscrowEl dinero de un comprador ahora puede esperar en el escrow auditado hasta que la respuesta pase, y el cliente oficial elige pagar después del hecho salvo que se indique lo contrario

2026.09.3

CambioMotivo
Toda tu flota a la vez (POST /v1/exposure), y aviso cuando cae una tarjeta (POST /v1/watchers con noticeReceiver)Una flota verificada una URL a la vez nunca ve que muchas de sus dependencias pagan una dirección, y los avisos existían sin forma de solicitarlos

2026.09.2

CambioMotivo
publish: true junto a payOnDelivery, y qué hace y qué no hace la publicaciónUn comprador que quería que su llamada contara tenía que configurar una cabecera a mano en el reintento pagado, lo que un wrapper oculta

2026.09.1

CambioMotivo
Primera versión: el cliente oficial x402, cualquier fetch, pago solo bajo entrega, un solo GET desde cualquier lenguaje, MCP y comprobación de la firmaCada pieza existía, y nada decía dónde encaja en el cliente que un desarrollador ya tiene abierto