Integrar con un agente de IA

Si vas a pedirle a Claude Code, Cursor o ChatGPT que integre TipTap Go, empieza por aquí: prompts listos y las reglas que evitan que se invente endpoints.

Las llaves mueven dinero real

Una llave tiptap_sk_… es de producción: cada cobro que haga tu agente se le cobra de verdad a una tarjeta de verdad. Todavía no existen llaves de prueba separadas (el modo de prueba depende del ambiente — ver Modo de prueba). Revisa lo que tu agente escribió antes de dejarlo cobrar.

Las dos URLs que tu agente necesita

Pásale estas dos y ya tiene todo. La primera es la guía completa en markdown —un solo fetch, sin HTML que parsear— y la segunda es la especificación de la API:

CampoTipoDescripción
https://go.paytiptap.com/llms-full.txtguíaTodo lo necesario para integrar, en texto plano: endpoints, auth, firma de webhooks, errores.
https://go.paytiptap.com/api/v1/openapi.jsonOpenAPI 3.1La fuente de verdad. Si un endpoint no aparece ahí, no existe.

Prompts listos

Cópialos tal cual. Están escritos para anclar al agente a la especificación en vez de dejarlo improvisar a partir de lo que recuerde de otras pasarelas.

Cobrar con un link de pago
Integra TipTap Go en mi sitio para cobrar con un link de pago.

Antes de escribir código, lee estas dos fuentes:
- https://go.paytiptap.com/llms-full.txt (guía completa)
- https://go.paytiptap.com/api/v1/openapi.json (especificación)

Reglas:
- Usa SOLO endpoints que aparezcan en ese OpenAPI. Si no está ahí, no existe: no lo inventes ni lo deduzcas de Stripe.
- La API key va en el servidor, nunca en el navegador.
- Los montos son dólares con 2 decimales (25.00), no centavos.
- El header Idempotency-Key protege los COBROS (POST /v1/customers/{id}/charges), no los links: POST /v1/payment_links lo ignora y repetirlo crea OTRO link. Si crear el link da timeout, busca en GET /v1/payment_links si ya quedó creado antes de repetir el POST.

Criterio de aceptación: crear un link de pago con POST /v1/payment_links y mostrarme la URL que devuelve.
Recibir webhooks (con verificación de firma)
Agrega a mi sitio la recepción de webhooks de TipTap Go.

Lee https://go.paytiptap.com/llms-full.txt antes de empezar.

Requisitos, sin excepción:
- Verifica la firma del header Tiptap-Signature ANTES de confiar en el contenido: v1 es el HMAC-SHA256 de "${t}.${cuerpo_crudo}" con el secreto whsec_ del endpoint.
- Firma sobre el cuerpo CRUDO, antes de parsear el JSON. Si lo parseas y reserializas, la firma no coincide.
- Compara en tiempo constante y rechaza timestamps de más de 5 minutos.
- Responde 2xx en menos de 10 segundos y procesa después.
- Sé idempotente usando el header Tiptap-Delivery.

Maneja al menos payment.succeeded. Criterio de aceptación: un POST con firma inválida devuelve 400 y uno válido devuelve 200.
Cobros recurrentes
Quiero cobrar mensualidades recurrentes con TipTap Go desde mi sistema.

Lee https://go.paytiptap.com/llms-full.txt y https://go.paytiptap.com/api/v1/openapi.json.

Importante antes de diseñar:
- TipTap Go NO tiene endpoint de suscripciones. Los cobros recurrentes se arman con clientes y cobros: POST /v1/customers y POST /v1/customers/{id}/charges. No inventes /v1/subscriptions ni /v1/plans: no existen.
- OJO con el default: POST /v1/customers/{id}/charges SIN "use_saved_card": true NO cobra nada, solo genera un link para que el cliente pague. Si quieres cobrar el período de una vez, manda "use_saved_card": true — si no, vas a creer que cobraste y no cobraste.
- La tarjeta la registra el CLIENTE al pagar por un link de afiliación; no hay endpoint de tokenización. Si el cliente todavía no tiene tarjeta guardada, el cobro devuelve 409 con código no_saved_card: en ese caso manda el link en vez de reintentar.
- Cobrar la tarjeta guardada es un cargo real e inmediato. Manda SIEMPRE Idempotency-Key (una cadena de 8-255 caracteres; por ejemplo, derivada del periodo: "cobro-{customerId}-2026-08"): sin ella, dos llamadas iguales son dos cobros. Ante timeout, reintenta con LA MISMA llave. Pero si recibes 409 charge_unresolved, la misma llave solo repite ese 409: verifica en GET /v1/payments si el cobro existe y SOLO si no existe usa una llave nueva. Un rechazo (402 charge_declined) también queda guardado en la llave: para reintentar un cobro rechazado usa una llave nueva (p.ej. cobro-{customerId}-2026-08-intento-2).

Propón primero el diseño (dónde guardo el customer id, cómo programo el cobro del período, qué hago si falla) y espera mi visto bueno antes de escribir código.

Todos los endpoints que existen

Esta lista es cerrada. Si tu agente usa algo que no está aquí, se lo inventó — casi siempre copiando el modelo de Stripe.

CampoTipoDescripción
GET /v1/meDatos de la cuenta
GET /v1/balanceSaldo del comercio
GET /v1/payment_linksListar links de pago
POST /v1/payment_linksCrear un link de pago
GET /v1/payment_links/{id}Ver un link
POST /v1/payment_links/{id}/cancelCancelar un link
GET /v1/paymentsListar pagos
GET /v1/payments/{id}Ver un pago
GET /v1/customersListar clientes
POST /v1/customersCrear un cliente
GET /v1/customers/{id}Ver un cliente
PATCH /v1/customers/{id}Actualizar un cliente
POST /v1/customers/{id}/chargesCobrar a un cliente. Por defecto SOLO genera el link para que pague; con use_saved_card: true cobra al instante su tarjeta guardada.
GET /v1/settlementsListar liquidaciones
GET /v1/settlements/{id}Ver una liquidación

No existen: reembolsos por API, suscripciones, disputas, payouts ni tokenización de tarjeta. Un reembolso hoy se resuelve fuera de la API.

Manda Idempotency-Key en todo cobro

POST /v1/customers/{id}/charges acepta el header Idempotency-Key (una cadena tuya de 8 a 255 caracteres). Con ella, el reintento devuelve el mismo cobro y la respuesta trae Idempotent-Replay: true; sin ella, dos POST iguales son dos cobros. Reusar la misma llave con otro cuerpo responde 422 a propósito: eso es un error del integrador, no un reintento. Ante un timeout se reintenta con la misma llave; pero un 409 charge_unresolved queda guardado en la llave y reintentarla solo lo repite — ahí se verifica en GET /v1/payments y, solo si el cobro no existe, se usa una llave nueva.

Lo mínimo que tiene que salir bien

  1. Crear un link con POST /v1/payment_links y recibir su url.
  2. Pagarlo en esa URL (con tarjeta de prueba si el ambiente está en modo prueba).
  3. Recibir el webhook payment.succeeded y verificar su firma.

Si ese recorrido funciona, la integración está bien hecha. Si tu agente se saltó la verificación de firma, no lo está: un POST sin verificar es cualquiera diciendo que te pagaron.