402Signal
Verifica rutas x402 en vivo en Base, Solana y Algorand antes de que los agentes gasten; $0.003 USDC se liquida solo para una ruta válida y elegible en vivo, con fallos tipados normales no liquidados y el pago al vendedor por separado.
Documentación
402Signal
402Signal verifica rutas x402 en Base, Solana y Algorand antes de gastar. $0.003 solo cuando se encuentra una ruta válida en vivo. Los fallos normales tipados no se liquidan. El pago al vendedor es separado. Tu agente conserva la billetera. La evidencia de enrutamiento entra en el registro de confianza PQ en Algorand MainNet. El require_route_binding=true opcional añade un recibo v4 firmado para que el comprador compare con los términos actuales del vendedor antes de firmar. Guía: https://402signal.com/developers#route-binding Falcon autoriza una transacción de punto de control, no un pago a un comerciante. Esto no es un riel de pago PQ ni una afirmación de que el producto sea totalmente resistente a la computación cuántica.
- Sitio en vivo: https://402signal.com
- API de pago:
POST /route— autoriza $0.003 USDC; la liquidación es solo tras éxito - MCP: https://402signal.com/mcp.json
- OpenAPI: https://402signal.com/openapi.json
Fecha: 2026-08-29. Verificación y liquidación en producción. Sin claves de pago privadas. Nunca pagamos aguas arriba.
Ejecutar localmente
Python 3.12 (stdlib más cryptography fijado para JWTs de Coinbase CDP y firmas de registro Ed25519). El valor local predeterminado es 127.0.0.1:8081. Fly / Docker enlazan 0.0.0.0:$PORT (predeterminado 8080).
PYTHONPATH=. python3 -m live402
Luego abre http://127.0.0.1:8081
POST /route no pagado devuelve HTTP 402. Bucle de operador local (omite el muro de pago, aún sondea):
LOCAL_FREE=1 PYTHONPATH=. python3 -m live402
LOCAL_FREE=1 es solo para pruebas. Producción no debe configurarlo.
Sin conexión / pruebas (sin red, catálogo de fixtures):
LIVE402_FIXTURE=1 LOCAL_FREE=1 PYTHONPATH=. python3 -m live402
Pruebas:
LIVE402_FIXTURE=1 PYTHONPATH=. python3 -m unittest discover -s tests -v
POST /route
Cuerpo:
{ "need": "erc20 token balance", "url": "https://example.com/x402/balance", "prefer_network": "base" }
`need` or `url` (or both) is required.
- Sin pago válido y
LOCAL_FREEsin configurar → HTTP 402. Un 402 lista tres aceptaciones (Base, Solana, Algorand) más la extensión de bazar. No sondeamos. - Autorización válida: coincide exactamente con el riel anunciado, reserva su huella de reproducción de forma duradera, verifica con el facilitador correspondiente, valida el cuerpo, luego descubre y sondea. Liquida solo después de que una ruta elegible válida en vivo pase la compuerta final de ganador facturable. Un encabezado no verificado nunca abre la compuerta.
- Si
urlestá configurado: debe serhttps. Las URL públicas desconocidas son solo puerto 443; las listas conocidas del catálogo pueden usar el puerto HTTPS ya presente en esa lista. La sonda no pagada es GET primero, luego POST{}solo cuando GET es 405/501 Y el catálogo declara explícitamente POST Y no requiere cuerpo de solicitud. Nunca hagas POST{}después de GET 200/400/401/403/404/500. Nunca hagas POST de cuerpos de entrada declarados por el vendedor o el catálogo. Si un cuerpo requerido significa que no se puede construir una sonda no pagada válida, el fallo tipado esunsafe_to_probe. DNS usa un grupo de resolutores acotado (getaddrinfo, 2s); la conexión TCP/TLS está fijada a esas IP públicas verificadas contra SSRF con SNI TLS y Host HTTP configurados al nombre de host original (reverificado y re-fijado en cada salto de redirección). Cierre seguro si no se puede aplicar pin/SNI/Host. Tiempo de espera ~4s. La respuesta incluyelive,status,latency_ms,has_402_challenge,selected_payment,billingy una instantánea dehealth. $0.003 solo cuando se encuentra una ruta válida en vivo. Los fallos normales tipados no se liquidan. El pago al vendedor es separado. - Si solo
need: búsqueda federada por necesidad (FTS local encatalog.sqlite+ Coinbase / PayAI / GoPlausible) en el momento de la solicitud (CDP/discovery/search; búsqueda de PayAI / GoPlausible o una pequeña búsqueda de primeras páginas), unión/deduplicación/clasificación de ese conjunto de trabajo, hidratar solo los ~5–10 finalistas principales con método/esquema/nombre de herramienta reclamados (acotado, TTL, gzip opcional en disco; nunca un índice de esquema RAM de 44k), luego sondear adaptativamente (primeros 3, expandir 2–4 si no hay ganador; techo duro 20). Devuelve la mejor opción en vivo actualmente observada (no la primera URL en vivo, no un riel solo de catálogo). Un ganador HTTP 200 es un recurso más la opción de pago exacta observada que lo hizo ganar:selected_paymentnunca es nulo, nunca se copia de una afirmación del catálogo, y cuandonetworksestá configurado, sunetworkdebe estar en ese bloqueo. Los aciertos en vivo se actualizan por escritura en disco. Las afirmaciones del catálogo permanecen enclaimed.payment_optionsycatalog.sqliteaccept_claims;target.acceptsy la selección usan solo el sobre HTTP 402 actual. Los esquemas reclamados no son opciones de pago observadas. Un fallo normal completado → HTTP 200 conlive:false,payable:false,selected_payment:null,billing.settlement_attempted=falseybilling.settled=false; la autorización verificada se convierte en un resultado de reproducción terminal duraderonot_settled. Las restricciones estructuradas opcionales son campos de nivel superior de la solicitud:max_price_usd,max_total_cost_usd(comerciante + tarifas conocidas; tarifa desconocida cierra con fallo),max_probe_latency_ms,max_service_latency_ms(p50 histórico, no RTT de sonda),max_settlement_latency_ms(liquidación/finalidad, no RTT de sonda),require_invocable,networks(bloqueo de política dura),min_observations,min_observed_success,min_reputation_score,min_reputation_confidence. Un objeto anidadoconstraintsse rechaza en lugar de ignorarse silenciosamente.prefer_networkes solo una preferencia de clasificación débil; no se convierte en filtro.max_latency_mses un alias de RTT de sonda. Valores medidos desconocidos cierran con fallo.objectiveopcional:best/cheapest/fastest/most_reliable/lowest_total_cost/fastest_settlement.cheapest,fastestymost_reliableclasifican los candidatos elegibles actualmente sondeados, no cada endpoint descubierto.fastestes el RTT de sonda de esta solicitud, no la latencia de liquidación (fastest_settlementpermanece separado).policyopcional / redacción de necesidad comoweather under $0.01 and 300msse compila en restricciones estructuradas; "uso establecido" / "evidencia observada fuerte" se compila enmin_observations=10; "alta reputación" vaga permanece sin resolver; lenguaje de liquidación / costo total se compila solo con un límite numérico. El motor usa solo valores estructurados.interpreted_constraints/applied_constraintsreflejan las restricciones realmente utilizadas. Los ganadores liquidados/routey los no pagados/previewincluyen componentes transparentes dereputation(observado / uso / antigüedad / estabilidad / recuento_de_fuentes) más V1reputation_score,reputation_confidenceyscoring_model_id/scoring_model_hash. Los fallos gratuitos permanecen tentativos y no promueven historial de confianza. Loseconomicsdel riel (precio del comerciante, tarifas, liquidación/finalidad) se ubican en la opción de pago seleccionada y encompared[], cada campo etiquetado402signal_observed,protocol_referenceounknown. Mismo modelo en Base, Solana y Algorand (sin bonificación de algoritmo). El catálogo no es una insignia de 0–100. Pulse permanece en hechos; las tasas permanecen ocultas por debajo den=10. Las direcciones de pagador únicas nunca se listan. La mayoría de los campos de uso/liquidación/pagador único son desconocidos en el primer lanzamiento porque 402Signal tiene historial de sonda, no un libro de liquidación. - Upstream muerto es 503 con la instantánea, nunca una URL en vivo falsa.
LIVE402_FIXTURE=1usalive402/data/fixtures.json. Sin red.- HTTP 200 liquidado incluye
target: { method, inputSchema, outputSchema, accepts, facilitator, amountAtomic, displayAmount, timeoutSeconds }(solo aceptaciones del sobre),selected_payment: { rail, network, asset, amount_atomic, display_amount, normalized_usd, payTo, facilitator }ybilling: { model, condition, asset, amount_atomic, display_amount, rail, settlement_attempted, settled, settlement_state }.selected_paymentdebe coincidir exactamente con una opción válida del sobre actual.payablerequiere una opción observada completa;invocablees pagadero más esquema de entrada. Si falta el esquema,livepuede seguir siendo verdadero coninvocable: falseymiss_reason: "no_input_schema".accepts[].extra.facilitatorse copia como{url, feePayer, caip2, scheme}— no uses el valor predeterminado x402.org. miss_reasones una enumeración cerrada:no_candidates,no_402_envelope,no_payto,reachable_200,probe_timeout,quote_expired,invalid_need,upstream_5xx,ssrf,no_input_schema,constraints_unmet,probe_budget_exhausted,probe_limit_reached,unsafe_to_probe,settlement_unknown. HTTP 402 sin payTo utilizable esno_payto(fallo tipado, no reintentar pago). El presupuesto de sonda es inferior a 60s; un cuelgue devuelve 503 JSON inmediatamente.stop_reasonyprobe_ceilingdicen por qué se detuvo la sonda.GET /healthes HTTP 200{ "ok": true }para verificaciones de Fly. No es una lista de pago. No es un volcado de rieles.GET /readyverifica el acceso a catálogo/historial/registro y la consistencia del registro, más una sonda real de escritura en el libro de reproducción, modo de diario duradero y capacidad de admisión de almacenamiento. La respuesta es solo booleanos (sin rutas, sin secretos). Las verificaciones de catálogo/historial/registro no simulan escrituras de disco lleno. La salud de Fly permanece en/healthhasta que/readyse demuestre seguro en staging.GET /preview?need=es una búsqueda de catálogo no pagada en el momento de la solicitud (not_probed: true, aciertos + precios + frescura + facilitador/método/inputSchema_presente/rieles_activos,also_on[]opcional).prefer_network=base|solana|algorandopcional es una preferencia de clasificación débil: clasifica ese riel primero pero aún busca en los tres.networks=solanaopcional (repetir o separar por comas) es un bloqueo de política dura sobre qué rieles se consultan.discovery_viaes un mapa compacto de cómo se encontró por riel;discovery_exhaustivees verdadero solo cuando el conjunto devuelto se sabe completo. No sondea y no cobra.POST /routepagado sigue siendo la sonda 402 de cierre con fallo.GET /railslista las tres redes de pago, activo, cantidadAtómica, facilitadores, pagadoresDeTarifas, maxTimeoutSegundos y actividad+latencia por riel. En caché. No se mete en/health.GET /pulsees una instantánea JSON. Los totales del catálogo permanecen sin publicar. El descubrimiento usa catálogos upstream actuales más una sombra local del proceso (no un índice RAM de mundo completo).index_statusesupstream-live,shadow-warm,bothofixture.n_7dobservado proviene de402signal_observed. Las tasas (success_7d,payable_rate_7d,invocable_rate_7d) se omiten por debajo den=10. No hayhealthybinario niexecutable_now_rate. Los parámetros de consulta se ignoran — sin URL proporcionadas por el llamador. En caché ~15s. Apertura con fallo: nunca espera un rastreo de descubrimiento. El refrescador de goteo nunca bloquea/route.
Etiquetas de capacidad
Las capacidades son sugerencias de descubrimiento conservadoras basadas en reglas, no garantías de calidad de salida o intercambiabilidad. market.price cubre cotizaciones, precios y datos OHLCV; market.analysis cubre análisis financiero como régimen de mercado, amplitud sectorial, liderazgo, indicadores técnicos y retornos probabilísticos. Palabras amplias como "análisis", "señal" y "liderazgo" necesitan contexto financiero en la misma fuente de evidencia; "mercado" o "trading" solos ya no implican precios. RSI/MACD son términos distintivos de indicadores; OHLC/OHLCV proporcionan contexto financiero. El análisis financiero específico resuelve la superposición de precios/pronósticos; los conflictos de categorías no relacionados permanecen ambiguos. La prioridad de evidencia existente permanece en etiquetas, nombre de herramienta, descripción, nombre de servicio, luego una URL distintiva.
Pon el trabajo específico en need (por ejemplo, "régimen de mercado de acciones" o "liderazgo de amplitud sectorial"). "Inteligencia de mercado" es un sinónimo de búsqueda para "análisis de mercado", no una segunda capacidad. Los recuentos y límites de solicitudes de búsqueda no cambian. Pulse mantiene el tema amplio market para ambos.
Las versiones de clasificación conviven con las etiquetas almacenadas. Los registros más antiguos se reclasifican
al leerlos para el ranking y se reindexan en lotes de como máximo 100 en el
trabajador de goteo en segundo plano existente. Esto cambia solo las etiquetas derivadas y su índice de búsqueda:
las marcas de tiempo de reclamación/verificación, las reclamaciones de pago, las generaciones de fuentes, el historial y los
eventos de reclamación se conservan. No se necesita una reconstrucción completa del catálogo al reiniciar.
Hasta que el relleno se complete, las búsquedas que dependen únicamente del texto indexado de la nueva capacidad
pueden omitir registros más antiguos tanto en /preview como en /route; la clasificación al leer
corrige los candidatos devueltos, no la cobertura de recuperación. El texto descriptivo de need aún
busca en las descripciones de endpoints retenidas. El trabajo pendiente avanza solo mientras el
trabajador de goteo esté habilitado y el almacenamiento sea escribible. Los fallos de reclasificación emiten
catalog_reclassification_failed como máximo una vez por minuto y dejan la actualización ordinaria de reclamaciones
en ejecución. No se registran contenidos de excepciones ni metadatos de vendedores.
Los nombres de herramientas previamente no retenidos no se pueden recuperar mediante reclasificación; la
actualización ordinaria ascendente proporciona esa evidencia. Los nuevos registros reducidos retienen nombres de herramientas limitados.
Los cambios futuros de taxonomía deben incrementar CAPABILITY_VERSION y probar tanto ejemplos positivos
como intenciones vecinas/ambiguas, incluidas las actualizaciones de catálogo persistidas.
Cola de actualización del catálogo en la sombra
El goteo en segundo plano es un paso limitado a la vez (unas pocas URL obsoletas, o una página COLD). No reconstruye un catálogo RAM de 44k y no añade fanout de red más allá de los presupuestos existentes de descubrimiento/sondeo.
Prioridad (la primera razón que coincida gana; luego last_fetched / URL). Mismo orden en live402/shadow.py REFRESH_REASONS:
- recent_search — buscado en la última hora, reclamación más antigua que
LIVE402_HOT_REFRESH_S - recent_route — enrutado en la última hora, reclamación obsoleta
- source_disagreement — dos catálogos no coinciden en el monto o payTo para el mismo riel
- price_change — evento de reclamación
price_changedreciente - payto_change — evento de reclamación
payTo_changedreciente - schema_change — evento de reclamación
schema_changedreciente - failed_probe — el último sondeo independiente no estaba activo
- stale_observation — nunca verificado, o la última verificación tiene más de un día
- high_demand_capability — capacidad con al menos dos listados buscados recientemente
Si la cola está vacía, el actualizador toma una página de generación COLD.
GET /dashboardson las mismas muestras que HTML. Búsquedas por cadena que puedes probar; haz clic para precargar el formulario de la página de inicio. También gratis.- GET
/la página de inicio está en inglés sencillo: una línea sobre qué es/route, humanos dirigidos aGET /previewgratis, agentes a POST / MCP. El pie de página es 402signal.com / @402Signal. Soporte oculto de autorización Base (solo billetera inyectada) firma una autorización EIP-3009 de $0.003 y hace POST de PAYMENT-SIGNATURE; se liquida solo para una ruta elegible válida y activa. Algorand y Solana permanecen para agente/CLI. Un recuadro breve "para agentes" muestraPOST https://402signal.com/routemás enlaces a/llms.txt,/preview,/rails,/openapi.json,/.well-known/x402.jsony/mcp.json. La navegación es Inicio / Pulse (GET/pulse); sin/dashboarden la navegación de la página de inicio. GET /routese divide porAccept: los navegadores (text/html) obtienen la página humana (HTTP 200). Los agentes (application/json) y curl sin Accept obtienen HTTP 402 + bazaar + accepts (monto3000). Los agentes que pretendan autorizar deben hacer POST, no GET.- Descubrimiento:
GET /openapi.json,GET /mcp.json,GET /.well-known/x402,GET /.well-known/x402.json,GET /robots.txt,GET /llms.txt,GET /preview,GET /rails. ElPOST /routede pago está documentado conx-payment-infoy HTTP 402. El tipo de bazaar MCP esmcp+toolName: route. POST /validate(tambiénGET /validate?url=) es un sondeo de vendedor no remunerado: ¿está este endpoint listo para agentes? Solo se sondean URLs ya en el catálogo o fixture (sin búsqueda pública arbitraria). El mismo ayudante no remunerado que/route: GET primero, POST{}justificado solo, nunca un cuerpo declarado en el catálogo, IP-pin DNS, SSRF de cierre por fallo. No escribe402signal_observed. No es un bypass de pago/route. Devuelve preparación, reclamado vs observado, banderas. Nunca una bandera binariahealthy.GET /attestationes un sha256 público de JSON canónico de un lote de sondeo402signal_observedreciente (batch_id,created_at,n,algo,hash). No en cadena. Sin firmas ni claves.?batch_id=opcional.GET /pq/log/checkpointyGET /pq/log/tile/*son un registro de transparencia C2SP experimental (tlog-checkpoint@v1.0.0 + tlog-tiles@v0.1.0). La identidad de producción es solo MainNet: origen402signal.com/pq/log/mainnet-v1, épocamainnet-v1, DB/data/pq-log-mainnet.sqlite,LIVE402_PQ_FALCON_NETWORK=mainnet, pq-anchor/3, dirección Falcon MainNet y respuestas autenticadas del firmante MainNet. La red no establecida o desconocida falla de forma cerrada. No hay respaldo PQ TestNet en vivo. Las constantes TestNet,LIVE402_PQ_LOG_SK,LIVE402_PQ_SIGNER_TOKEN,LIVE402_PQ_FALCON_BROADCAST,LIVE402_PQ_FALCON_ADDRESS,/data/pq-log.sqlitey pq-anchor/1 permanecen como SOPORTE DE PRUEBA (pruebas y archivo) únicamente. El anclaje automático MainNet es de aceptación exacta y está desactivado por defecto; su controlador duradero está fuera de la ruta de solicitud. La persistencia AUTHORIZED de producción requiere una HMAC de respuesta verificada sobre los bytes exactos de SignedTxn seguida de una validación semántica estricta; los bytes proporcionados por el llamante no pueden llegar a la persistencia. La evidencia confirmada existente sigue siendo legible. AUTHORIZED / SEND_ATTEMPTED / SUBMITTED nunca se representan como CONFIRMED. Los enlaces de explorador siguen la red/génesis registrada de forma independiente. La evidencia MainNet nunca usa URLs TestNet. La SK Falcon nunca debe vivir en 402signal. El firmante aislado nunca lee BROADCAST y nunca hace POST.last_confirmedse persiste solo después de una búsqueda+decodificación+verificación independiente. El éxito de firma o POST no es confirmación. ElPOST /routeliquidado no espera la inclusión en la cadena. Falcon autoriza una transacción de checkpoint, no un pago de comerciante. Un ganador liquidado puede incluirpq_trust.transparency{status: pending|logged_uncheckpointed|unavailable, state, log_origin, index, checkpoint_size, receipt, reveal}opcional. Una falla gratuita no añade una hoja de decisión de ruta y no puede activar un ancla solo para esa solicitud. La liquidación y el anexo de registro no son atómicos (SEC-ROUTER-004 / A-14): un ganador liquidado no requiere una hoja firmada duradera a menos querequire_transparencyorequire_route_bindingsea verdadero. Si la transparencia requerida falla después de la liquidación, la respuesta sigue siendo veraz de que la liquidación ocurrió y no se intenta una segunda liquidación.pendingsignifica una hoja duradera más un checkpoint firmado (estadocheckpoint_signed).logged_uncheckpointedsignifica que la hoja es duradera sin un checkpoint firmado y nunca es éxito cuandorequire_transparencyes verdadero.unavailablesignifica que no se pudo producir un recibo firmado; un anexo puede ya haber ocurrido. No está pendiente ni confirmado. Nunca digas firmado si no hay checkpoint. Los recibos de ruta predeterminados usan402signal.route_decision.v3: la hoja pública es tipo, ts redondeado a minutos, nonce y solo compromiso sha256. Las hojas históricas v1 y v2 siguen siendo verificables con su semántica original. Una hoja pública no es una afirmación de tráfico anónimo o no vinculable. Elrevealdel cliente contiene evidencia privada, sal, compromiso esperado y versión de evento.verify_route_receipt()verifica la versión de evento, revelación, compromiso, leaf_hash, inclusión y el checkpoint Ed25519.receipt.leaf_hashestá presente para queverify_receipt()aún pueda hacer round-trip.payment_authorization.pq_nativesiempre es falso. Sin página/trust. La tarjeta PQ de la página de inicio se renderiza solo cuandolast_confirmedtiene un txid confirmado real. La firma Ed25519 de producción usa soloLIVE402_PQ_LOG_SK_MAINNET(nunca horneada en git; nunca autogenerada al arrancar; nunca recurre aLIVE402_PQ_LOG_SK). Verdocs/pq-automatic-anchoring.md.POST /routeestá limitado por tasa en memoria (~12/min por IP por defecto; configurable por operador). User-Agent no otorga cuota extra. En Fly la clave del limitador esFly-Client-IP; de lo contrario, el peer del socket.X-Forwarded-Forno es confiable. Los mapas de límite de tasa y los semáforos de sondeo por host están acotados por TTL/LRU.GET /previewy el MCPtools/call previewno remunerado comparten un limitador más flexible (~180/min por IP, al menos 2× el tope de ruta).GET /pulseyGET /railstienen cada uno su propio limitador de ~180/min por IP (mismo orden que preview, aún más flexible que/routede pago).GET /healthpermanece ilimitado{ok:true}.429cuando se excede. Los registros de solicitud de producción son id de solicitud, método, ruta solo, estado, latencia y un endpoint grueso. Las cadenas de consulta, necesidad, política, búsqueda/preview, URL objetivo/validate, JSON de solicitud,PAYMENT-SIGNATURE,X-PAYMENT, cargas de pago y cuerpos de respuesta del vendedor no se registran. Los registros de liquidación son resultado grueso éxito/omitido más riel e id de solicitud, no txids completos. Las respuestas envíanX-Content-Type-Options: nosniff,X-Frame-Options: DENY,Referrer-Policy: no-referrer,Strict-Transport-Security: max-age=31536000(sin includeSubDomains; www es un CNAME y Fly no tiene hostnames extra) yContent-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; style-src 'self'; img-src 'self' data:; base-uri 'self'; frame-ancestors 'none'. script-src permanece'self'(sin CDN, sin scripts de billetera de proveedor). connect-src es solo'self'; el POST de pago Base de la página de inicio/route. HEAD 200 en/llms.txt/openapi.json/mcp.json/preview/rails/pulse. El recurso de pago / OpenAPIservers/ recurso MCP están fijados ahttps://402signal.com(Host no se refleja). El DNS de sondeo usa un poolgetaddrinfoacotado (2s); la conexión TCP/TLS está fijada a esas IPs públicas verificadas por SSRF con SNI TLS y Host HTTP establecidos al hostname original (re-fijado en redirecciones). Los cuerpos de catálogo declarados por el vendedor nunca se envían por POST; el POST{}injustificado se omite; las fallas de cuerpo requerido sonunsafe_to_probe. El/routede pago usa un plazo de tiempo anunciado para verificar, sondear y liquidación opcional.
Los clientes de PQ Trust que necesiten verificación posterior deben retener de forma segura la respuesta completa de /route de pago, incluido compared[]; como mínimo, mantén pq_trust.transparency.receipt y pq_trust.transparency.reveal juntos. Los resultados de reproducción privados pueden retener la revelación; no son un servicio de recuperación. Mantén tu propia copia. La evidencia modificada falla la verificación contra el registro público. Debido a que la revelación contiene evidencia privada de solicitud y decisión, no debe escribirse en registros públicos.
Rutas opcionales con prueba: envía require_route_binding: true para requerir un
recibo firmado v4 que vincule la URL real del vendedor observada, el método, el hash
del cuerpo de la solicitud, el sobre x402 actual completo y una ventana de frescura corta. Esto también
requiere transparencia. Las fallas tipadas normales siguen siendo gratuitas; un recibo
requerido no disponible después de la liquidación aún reporta billing.settled=true. Las claves del comprador,
la validación de transacciones, la firma y la ejecución permanecen con el comprador. El recibo
inmediato usa la clave de registro Ed25519 fijada; la confirmación acumulativa posterior de Falcon es
separada. Ver el contrato y verificador v1 para
formas de solicitud admitidas, caducidad, privacidad y limitaciones. Los valores predeterminados, los clientes
v3 existentes y la configuración de anclaje automático no cambian. Comienza con el
recorrido para desarrolladores, luego
integra el guardia local Node/TypeScript o el
verificador Python. El módulo Node se distribuye como fuente del repositorio, no publicado en
npm. La caducidad del lado del cliente o un desafío de vendedor cambiado no deshacen una
tarifa de enrutamiento ya liquidada.
Los clientes envían PAYMENT-SIGNATURE v2 (base64 PaymentPayload) o X-PAYMENT v1. El eco de éxito/liquidación es PAYMENT-RESPONSE.
Reputación V1 y economía de rieles
Los componentes vienen primero. Una puntuación nunca se devuelve sin ellos.
| Componente | Qué es | Qué no es |
|---|---|---|
| observed | recuento de sondas exitosas, n, días distintos, frescura, estabilidad de resultados | tiempo de actividad, una insignia de salud |
| usage | recuentos de sondas 402signal_observed solamente | reputación, liquidaciones (desconocido — sin libro mayor), pagadores únicos (omitido — sin identidades) |
| tenure | primera vez visto, días listado | calidad |
| stability | cambios en payTo / precio / esquema / rail | una garantía |
| source_count | fuentes de catálogo independientes | popularidad |
Puntuación V1 (0–1, neutral entre cadenas, documentada en live402/reputation.py y en el registro sqlite scoring_models):
- observed_performance 0.50 — la única señal similar a fiabilidad que medimos. La popularidad no puede dominar.
- stability 0.20 — la rotación reciente de identidad/cotización es una señal de riesgo.
- tenure 0.10 — la antigüedad ≠ calidad. Limitada logarítmicamente a 365 días.
- usage 0.10 — recuentos de sondas limitados logarítmicamente (
log1p(n)/log1p(100)). 0 sondas y uso desconocido se descartan para que 0 no parezca peor que desconocido. Las liquidaciones y los pagadores únicos nunca se inventan a partir de sondas. - distribution 0.10 —
min(source_count, 3) / 3. No estar en el catálogo ≠ 0 fuentes.
Los componentes faltantes se descartan y reducen reputation_confidence. n_7d < 10 limita la confianza a 0.35. Sin porcentaje público de fiabilidad por debajo de n=10. Misma función en Base, Solana y Algorand. Sin algo_bonus.
Economía (mismas claves en cada rail, procedencia en cada campo):
402signal_observed— lo medimos (precio del comerciante desde la opción 402 actual).protocol_reference— una cifra oficial citada (inclusión L2 de Base ~2s; finalidad de bloque de Algorand 2.82s). La finalidad de reloj de pared de Solana es desconocida (sin ms oficiales actuales).unknown— faltante. Las tarifas de cadena y de facilitador son desconocidas en USD (sin oráculo FX).lowest_total_cost/max_total_cost_usdfallan cerrados.fastest_settlement/max_settlement_latency_msusan finalidad de liquidación o protocolo, nunca RTT de sonda.
Rails
| Rail | payTo | activo | red (cuerpo 402) | Facilitador verificar / liquidar |
|---|---|---|---|---|
| Base | 0xb18fc2275f36dae99eb215caeff03b431f887d16 | USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | base (el facilitador ve eip155:8453) | https://api.cdp.coinbase.com/platform/v2/x402/verify y /settle |
| Solana | HCM423cyKYVUoq9GvmqUphZwYVB6M2wez34i9jzSewLy | mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp | https://facilitator.payai.network/verify y /settle |
| Algorand | N2JSJZCSORMYGYO2NSIYRUEMBFRHEOMYODVXV2MXYYHB5H2JVUGG6NJ4NQ | ASA 31566704 | algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8= | https://facilitator.goplausible.xyz/verify y /settle |
La autorización de enrutamiento es $0.003 USDC (3000 atómico, 6 decimales) en cada rail. Se liquida solo cuando se encuentra una ruta elegible válida y en vivo. Los fallos normales tipados devuelven HTTP 200 con live:false, payable:false, selected_payment:null y settlement_state:not_attempted. Los fallos operativos conservan HTTP 503. El pago del vendedor es separado. Bazaar se repite en la liquidación exitosa para que los catálogos puedan indexar. Inspecciona billing.settlement_state en cada HTTP 503: not_attempted es un fallo operativo no pagado (o un fallo antiguo en caché), settled puede ser un fallo de transparencia requerida después de una liquidación exitosa, y unknown significa que la liquidación pudo haber ocurrido y la autorización no debe reutilizarse.
Las llamadas CDP de Base necesitan CDP_API_KEY_ID + CDP_API_KEY_SECRET (o CDP_ACCESS_TOKEN). PayAI es de nivel gratuito sin clave; PAYAI_API_KEY opcional. GoPlausible no requiere autenticación. Nunca pongas una clave privada de billetera en env.
Env
| Variable | Predeterminado | Significado |
|---|---|---|
LIVE402_PORT | 8081 | puerto de enlace (local) |
PORT | no establecido | puerto Fly / Docker; si se establece, el host predeterminado es 0.0.0.0 |
LIVE402_HOST | 127.0.0.1 local / 0.0.0.0 cuando PORT está establecido | host de enlace |
PAYTO_ADDRESS | payTo de Base arriba | payTo de Base |
PAYTO_SOLANA | payTo de Solana arriba | payTo de Solana |
PAYTO_ALGORAND | payTo de Algorand arriba | payTo de Algorand |
CDP_API_KEY_ID / CDP_API_KEY_SECRET | no establecido | JWT CDP para verificar/liquidar en Base |
CDP_ACCESS_TOKEN | no establecido | Bearer CDP pre-acuñado (opcional) |
PAYAI_API_KEY | no establecido | Bearer PayAI opcional más allá del nivel gratuito |
LOCAL_FREE | no establecido | 1 omite el muro de pago (solo pruebas) |
LIVE402_FIXTURE | no establecido | 1 usa JSON local, sin red |
LIVE402_PROBE_TIMEOUT | 4 | tiempo de espera de sonda en segundos |
LIVE402_HISTORY_DB | /data/live402-history.sqlite en Fly (respaldo /tmp) | historial de sondas sqlite (WAL, 0600, limitado). Solo observed. |
LIVE402_CATALOG_DB | /data/catalog.sqlite en Fly (respaldo /tmp) | catálogo sombra sqlite de reclamaciones CDP/PayAI/GoPlausible. Local al proceso en el volumen /data existente. No expuesto por HTTP (sin endpoint de volcado/descarga, no bajo static/, no en OpenAPI). Archivo separado del historial. FTS5. Nunca una lista RAM de 44k. |
LIVE402_PQ_LOG_DB | /data/pq-log-mainnet.sqlite en Fly (respaldo /tmp) | registro C2SP de PRODUCCIÓN. Separado del catálogo, historial y del archivo TestNet /data/pq-log.sqlite (SOLO SOPORTE DE PRUEBAS). No expuesto por HTTP como volcado sqlite; la API de lectura es solo /pq/log/*. Reinicio vacío solo Ross: docs/runbooks/mainnet-prelaunch-reset.md. |
LIVE402_PQ_LOG_EPOCH | mainnet-v1 en fly.toml | PRODUCCIÓN requiere mainnet-v1. No establecido/desconocido falla cerrado. testnet-v1 es SOLO SOPORTE DE PRUEBAS. |
LIVE402_PQ_LOG_ORIGIN | 402signal.com/pq/log/mainnet-v1 en fly.toml | origen de PRODUCCIÓN. El origen TestNet es archivo/SOLO SOPORTE DE PRUEBAS. |
LIVE402_PQ_LOG_VKEY | no establecido | clave verificadora de registro Ed25519 de SOPORTE DE PRUEBAS (pública). Producción nunca la usa. Nunca una clave privada. |
LIVE402_PQ_LOG_VKEY_MAINNET | no establecido | clave verificadora de registro Ed25519 de PRODUCCIÓN (pública). Si se establece con LIVE402_PQ_LOG_SK_MAINNET, debe coincidir exactamente con la vkey C2SP derivada de esa SK (falla cerrado; env no se sobrescribe). Si SK está establecida y VKEY no, el arranque escribe la vkey derivada (ops puede preparar SK primero). Si SK no está establecida, no hay firmante MainNet. Nunca una clave privada. |
LIVE402_PQ_LOG_SK | no establecido | semilla Ed25519 de SOPORTE DE PRUEBAS solamente. Producción nunca la carga. Nunca la comprometas, nunca la pegues en el chat. |
LIVE402_PQ_LOG_SK_MAINNET | no establecido | semilla Ed25519 de PRODUCCIÓN solamente. El código rechaza el respaldo silencioso a LIVE402_PQ_LOG_SK. Instala vía stdin/archivo (NAME=-); nunca un argumento secreto de CLI. Nunca la establezcas desde este PR. |
LIVE402_PQ_FALCON_ADDRESS | no establecido | dirección Falcon TestNet de SOPORTE DE PRUEBAS. No es un predeterminado de producción. Nunca una clave privada. |
LIVE402_PQ_FALCON_NETWORK | mainnet en fly.toml | PRODUCCIÓN requiere mainnet. No establecido/desconocido falla cerrado. testnet es SOLO SOPORTE DE PRUEBAS. |
LIVE402_PQ_FALCON_BROADCAST | no establecido | env 402signal (enrutador) de SOPORTE DE PRUEBAS. 1 permite POST de un SignedTxn aprobado por el firmante a algod TestNet fijado. Producción nunca usa esto. Predeterminado no establecido: nunca POST. 402security debe dar el visto bueno antes de que alguien lo establezca a 1. El firmante nunca lee BROADCAST. Esta bandera nunca envía MainNet. |
LIVE402_PQ_FALCON_MAINNET_BROADCAST | no establecido | bandera de capacidad MainNet distinta. Predeterminado apagado. Un POST también requiere exactamente un modo: automático o canario humano. No establecido detiene el envío MainNet mientras el enrutamiento continúa. |
LIVE402_PQ_FALCON_MAINNET_CANARY | no establecido | compuerta canario humano de un solo uso. Predeterminado apagado. Worker, tick y arranque nunca la leen. El POST en vivo aún necesita este =1 y LIVE402_PQ_FALCON_MAINNET_BROADCAST=1. |
LIVE402_PQ_FALCON_MAINNET_AUTO | no establecido | 1 exacto opta por el controlador automático duradero después de la revisión de despliegue. Predeterminado apagado. Nunca se establece junto con la bandera canario. |
LIVE402_PQ_FALCON_MAINNET_AUTO_KILL | no establecido | 1 exacto detiene la firma automática y el POST inmediatamente mientras el enrutamiento y el registro de transparencia continúan. Conserva todo el estado en vuelo. |
LIVE402_PQ_FALCON_MAINNET_ADDRESS | fly.toml (dirección pública MainNet) | dirección pública MainNet Falcon f1 de PRODUCCIÓN. Distinta de la dirección TestNet archivada. Nunca una clave privada. |
LIVE402_PQ_SIGNER_TOKEN | no establecido | HMAC de SOPORTE DE PRUEBAS para el cliente TestNet pq-anchor/1. Producción nunca llama a ese firmante. |
LIVE402_PQ_SIGNER_MAINNET_TOKEN | no establecido | HMAC de solicitud/respuesta de PRODUCCIÓN para 402signal-pq-signer-mainnet (pq-anchor/3). Nombrado, nunca valorado en git. |
LIVE402_PQ_LOG | no establecido | 0 fuerza la transparencia unavailable incluso si un firmante está configurado. |
LIVE402_HOT_REFRESH_S | 600 (limitado 300–900) | umbral de reclamación obsoleta para la cola de actualización de valor de información |
LIVE402_WARM_REFRESH_S | 7200 (limitado 3600–10800) | intervalo de actualización WARM (helper due_warm heredado) |
LIVE402_COLD_SWEEP_S | 64800 (limitado 12–24h) | cadencia de barrido de generación rodante COLD |
LIVE402_TRICKLE_SLEEP_S | 2 (limitado 1–30) | sueño entre páginas de goteo |
LIVE402_CATALOG_REFRESH | 1 | 0 desactiva el goteo de fondo |
LIVE402_ROUTE_RPM | 12 | POST /route pagado por IP por minuto. Sin privilegio de User-Agent. CI usa explícitamente 60. |
LIVE402_PREVIEW_RPM | 180 (o 2× ruta, lo que sea mayor) | GET /preview no pagado y vista previa MCP por IP por minuto |
LIVE402_PUBLIC_RPM | 180 (o 2× ruta, lo que sea mayor) | GET /pulse, GET /rails y GET /attestation no pagados por IP por minuto (cubos separados) |
LIVE402_VALIDATE_RPM | 60 | POST /validate / GET /validate no pagados y MCP tools/call validate por IP por minuto |
Fly (no ejecutes hasta que tengas una cuenta)
Aplicación única 402signal. No HA. Sin segundo hostname.
fly launch --ha=false --name 402signal --no-deploy
fly secrets set CDP_API_KEY_ID=… CDP_API_KEY_SECRET=…
# After 402security GO only. An admin sets these; never paste values into chat. 402dev never holds them.
# fly secrets set LIVE402_PQ_LOG_SK_MAINNET=…
# fly secrets set LIVE402_PQ_SIGNER_MAINNET_TOKEN=…
fly deploy
fly ips list
fly.toml establece app = "402signal", internal_port = 8080, auto_stop_machines = "off", min_machines_running = 1 en el proceso HTTP de la aplicación (shared-cpu-1x 1GB). Un proceso de aplicación. No despliegues, fly scale ni establezcas secretos desde este PR. Producción es solo MainNet. LIVE402_PQ_FALCON_BROADCAST, LIVE402_PQ_SIGNER_TOKEN y LIVE402_PQ_LOG_SK permanecen no establecidos en el enrutador público. El anclaje automático no se activa por fly.toml; consulta docs/pq-automatic-anchoring.md para la opción revisada separada.
Namecheap BasicDNS (no cambies hasta el despliegue)
Mantén los servidores de nombres de Namecheap. Usa solo registros BasicDNS. No uses CNAME en el apex. Elimina primero los registros de parking / marketplace.
| Tipo | Host | Valor |
|---|---|---|
| A | @ | IPv4 compartido de Fly desde fly ips list |
| AAAA | @ | IPv6 de Fly desde fly ips list |
| CNAME | www | 402signal.fly.dev |
Bazaar
El cuerpo 402 incluye extensions.bazaar con info + schema para POST /route, siguiendo x402 bazaar. Los clientes deben repetirlo; también lo adjuntamos al liquidar para que los facilitadores puedan indexar.
Diseño
live402/ package (server, route, probe, payment, facilitator, fixtures, shadow)
live402/shadow.py on-disk catalog.sqlite (claims + FTS5). Not 402signal_observed.
live402/hydrate.py finalist claimed-contract cache (bounded, TTL, gzip). Not 44k RAM schemas.
live402/policy.py NL → structured constraints. Engine uses structured values only.
live402/reputation.py transparent components + documented V1 score + scoring-model hash.
live402/economics.py rail economics with provenance. Same model for Base / Solana / Algorand.
live402/pq/ experimental C2SP log (RFC 9162 Merkle + tiles + receipts). PRODUCTION is MainNet-only.
live402/static/ GET / homepage (app.js, styles, dashboard.js)
live402/algod.py pinned algod suggestedParams for the unpaid Algorand 402 extra
live402/data/ fixture catalog
tests/ unittest
Dockerfile Python 3.12.14-slim (gh-150743), 0.0.0.0:$PORT, UID/GID 10001
fly.toml app 402signal, internal_port 8080, one machine
docs/backup.md sqlite backup tooling + Fly human checklist (backups not claimed active)
docs/github-protection.md branch protection (Protect main ruleset is active)
docs/automation-security-boundaries.md bot and human roles. production command bans
docs/docker.md non-root runtime and required existing-volume migration
docs/merkle-bench.md honest 10k/100k/1m frontier timings; SQLite commit is the bottleneck