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
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:
| Campo | Tipo | Descripción |
|---|---|---|
https://go.paytiptap.com/llms-full.txt | guía | Todo lo necesario para integrar, en texto plano: endpoints, auth, firma de webhooks, errores. |
https://go.paytiptap.com/api/v1/openapi.json | OpenAPI 3.1 | La 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.
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.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.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.
| Campo | Tipo | Descripción |
|---|---|---|
GET /v1/me | Datos de la cuenta | |
GET /v1/balance | Saldo del comercio | |
GET /v1/payment_links | Listar links de pago | |
POST /v1/payment_links | Crear un link de pago | |
GET /v1/payment_links/{id} | Ver un link | |
POST /v1/payment_links/{id}/cancel | Cancelar un link | |
GET /v1/payments | Listar pagos | |
GET /v1/payments/{id} | Ver un pago | |
GET /v1/customers | Listar clientes | |
POST /v1/customers | Crear un cliente | |
GET /v1/customers/{id} | Ver un cliente | |
PATCH /v1/customers/{id} | Actualizar un cliente | |
POST /v1/customers/{id}/charges | Cobrar 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/settlements | Listar 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
- Crear un link con
POST /v1/payment_linksy recibir suurl. - Pagarlo en esa URL (con tarjeta de prueba si el ambiente está en modo prueba).
- Recibir el webhook
payment.succeededy 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.