Saltar al contenido
Feedback4.dev
API v1OpenAPIENESEntrar

Feedback4.dev Agency API

API REST v1, de la primera llamada a producción.

Referencia pública para automatizar proyectos, feedback visual, aprobaciones, revisores y miembros sin saltarse los límites de seguridad del workspace.

Crear una clave APIDescargar OpenAPI 3.1
Base establehttps://feedback4.dev/api/v1
Bearer token
Authorization: Bearer f4_live_…
JSON UTF-8
application/json
OpenAPI
3.1.0
En esta páginaInicio rápidoAutenticación y alcanceConvenciones de solicitudesErrores y trazabilidadReferencia de endpointsModelos y valores admitidosAutomatización por webhookVersionado y operación

01

Inicio rápido

Crea una credencial de servicio en Agentes → REST v1 con vigencia de 30, 90, 180 o hasta 365 días. El secreto f4_live_ se muestra una sola vez: guárdalo en un gestor de secretos, rótalo antes de vencer y nunca lo incluyas en código del navegador.

1. Validar la credencial
curl -fsS https://feedback4.dev/api/v1/me \
  -H "Authorization: Bearer $FEEDBACK4_API_KEY" \
  -H "X-Request-Id: deploy_check_2026_07_19"
2. Crear un proyecto privado
curl -fsS -X POST https://feedback4.dev/api/v1/projects \
  -H "Authorization: Bearer $FEEDBACK4_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Portal del cliente",
    "allowed_origin": "https://portal.example.com/app",
    "reviewer_emails": ["reviewer@example.com"],
    "agent_mode": "propose"
  }'
3. Procesar un ticket
curl -fsS -X PATCH \
  https://feedback4.dev/api/v1/feedback/FEEDBACK_UUID \
  -H "Authorization: Bearer $FEEDBACK4_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "in_progress",
    "priority": "high",
    "assignee_user_id": "USER_ID"
  }'
4. Solicitar aprobación
curl -fsS -X POST \
  https://feedback4.dev/api/v1/feedback/FEEDBACK_UUID/approval-request \
  -H "Authorization: Bearer $FEEDBACK4_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "change_summary": "Se corrigió la navegación móvil y el contraste del CTA."
  }'

Respuesta de identidad

{
  "data": {
    "object": "api_identity",
    "api_key_id": "018f...",
    "label": "CI de producción",
    "workspace_id": "018e...",
    "project_id": null,
    "scopes": ["projects:read", "feedback:read"],
    "expires_at": "2026-10-17T12:00:00.000Z"
  }
}
Regla de producción

Inyecta FEEDBACK4_API_KEY desde el secret store del servidor o CI. No la expongas en NEXT_PUBLIC_*, apps móviles sin backend, screenshots, tickets ni logs.

02

Autenticación y alcance

Cada clave pertenece a un workspace, puede limitarse a un proyecto, tiene scopes explícitos y una fecha de expiración. El servidor conserva únicamente el hash. Revocar la clave o retirar a su creador corta el acceso.

Claves por proyecto

Una clave con project_id sólo ve ese proyecto. No puede crear proyectos ni administrar miembros, aunque incluya el scope correspondiente.

Claves de workspace

Son necesarias para crear proyectos y administrar miembros. Emite el conjunto mínimo de scopes y usa una clave distinta por integración.

Scopes disponibles

ScopePermite
projects:readConsultar proyectos, configuración, widget y revisores.
projects:writeCrear y actualizar proyectos; autorizar o revocar revisores.
feedback:readConsultar tickets, contexto visual y prompts propuestos.
feedback:writeCambiar estado, prioridad y responsable de tickets.
approvals:writeSolicitar revisión y aprobación a un cliente autorizado.
members:readListar miembros e invitaciones del workspace.
members:writeInvitar, cambiar rol, retirar miembros y revocar invitaciones.
agents:readListar credenciales MCP limitadas a un proyecto.
agents:writeCrear y revocar credenciales MCP de hasta 365 días.
webhooks:readConsultar endpoints e historial de entregas.
webhooks:writeCrear endpoints, eliminarlos y reintentar entregas.

03

Convenciones de solicitudes

JSON

POST y PATCH exigen Content-Type: application/json. El cuerpo máximo es 64 KiB, no admite compresión y rechaza campos desconocidos.

Paginación y filtros

Usa page[limit] de 1–100 (25 por defecto) y vuelve a enviar meta.next_cursor como page[after]. El cursor es opaco: no lo construyas ni lo edites.

Límites y protección

300 lecturas/minuto y 120 escrituras/minuto por clave. Un 429 incluye Retry-After en segundos. Las aprobaciones e invitaciones tienen límites adicionales.

ConvenciónComportamiento
X-Request-IdOpcional; 8–100 caracteres A–Z, a–z, 0–9, punto, guion, guion bajo o dos puntos.
Cache-Controlno-store en todas las respuestas autenticadas.
LocationIncluido al crear proyectos, revisores e invitaciones.
filter[status]new · in_progress · review · resolved
FechasISO 8601 UTC, por ejemplo 2026-07-19T04:52:28.326Z.

04

Errores y trazabilidad

Todas las respuestas llevan X-Request-Id y Cache-Control: no-store. Envía un X-Request-Id de 8–100 caracteres seguros para correlacionar tus logs; si no, Feedback4 genera uno.

{
  "error": {
    "code": "authorization.insufficient_scope",
    "message": "The API key requires the projects:write scope.",
    "request_id": "req_92ca...",
    "details": [
      { "field": "allowed_origin", "code": "invalid_format" }
    ]
  }
}
HTTPSignificado
400Validación, UUID, cursor o transición inválida.
401Clave ausente, inválida, vencida o revocada.
403Scope insuficiente o se requiere clave de workspace.
404Recurso inexistente o fuera del límite autorizado.
409Límite del plan, último owner o aprobación sin revisor.
413 / 415Cuerpo demasiado grande o media type incorrecto.
429Límite excedido; respeta Retry-After.

05

Referencia de endpoints

Todos los paths siguientes se agregan a https://feedback4.dev/api/v1. Los IDs son UUID y los recursos fuera del workspace o proyecto se responden como 404 para no revelar su existencia.

Identidad

GET/meprojects:read

Inspeccionar la clave actual

Devuelve el workspace, el proyecto opcional, los scopes y la expiración asociados a la credencial.

Proyectos

GET/projectsprojects:read

Listar proyectos

Colección paginada. Una clave limitada a un proyecto sólo puede devolver ese proyecto.

POST/projectsprojects:write

Crear proyecto

Requiere una clave de workspace. Normaliza allowed_origin y permite autorizar hasta 100 revisores iniciales.

GET/projects/{project_id}projects:read

Consultar proyecto

Obtiene configuración, estado, origen permitido, acceso de feedback y política del agente.

PATCH/projects/{project_id}projects:write

Actualizar proyecto

Actualiza nombre, estado o modo del agente. allowed_origin es inmutable después de crear el proyecto; rechaza campos desconocidos y cuerpos vacíos.

GET/projects/{project_id}/widgetprojects:read

Obtener instalación del widget

Entrega public_key, URL del loader, formulario alojado y snippet HTML listo para instalar.

Feedback y aprobaciones

GET/projects/{project_id}/feedbackfeedback:read

Listar tickets

Colección paginada con filtro opcional filter[status]. Incluye contexto visual y prompt propuesto cuando existen.

GET/feedback/{feedback_id}feedback:read

Consultar ticket

Devuelve el ticket completo y una highlight_url para volver al elemento seleccionado.

PATCH/feedback/{feedback_id}feedback:write

Actualizar flujo

Cambia estado, prioridad o responsable de forma atómica. El responsable debe pertenecer al workspace.

GET/feedback/{feedback_id}/proposed-promptfeedback:read

Consultar prompt propuesto

Expone el prompt de implementación, modelo y fecha de actualización sin ejecutar acciones externas.

POST/feedback/{feedback_id}/approval-requestapprovals:write

Solicitar aprobación

Mueve el ticket a revisión, registra actividad y encola correo. Máximo 5 solicitudes por ticket y hora.

Revisores autorizados

GET/projects/{project_id}/reviewersprojects:read

Listar revisores

Devuelve emails autorizados, estado y última verificación del proyecto.

POST/projects/{project_id}/reviewersprojects:write

Autorizar revisor

Autoriza o reactiva un email. El visitante todavía debe verificar su acceso antes de enviar feedback.

DELETE/projects/{project_id}/reviewers/{reviewer_id}projects:write

Revocar revisor

Revoca el revisor y todas sus sesiones activas para ese proyecto.

Miembros

GET/membersmembers:read

Listar miembros e invitaciones

Requiere clave de workspace e incluye invitaciones pendientes vigentes.

POST/membersmembers:write

Invitar miembro

Crea una invitación con rol y devuelve invite_url una sola vez. Límite adicional: 30 invitaciones por hora y clave.

PATCH/members/{membership_id}members:write

Cambiar rol

Actualiza el rol y protege al último owner contra degradación accidental.

DELETE/members/{membership_id}members:write

Retirar miembro

Retira al miembro y revoca las credenciales REST/MCP emitidas por esa cuenta.

DELETE/invitations/{invitation_id}members:write

Revocar invitación

Invalida una invitación pendiente del workspace.

Credenciales de agente

GET/projects/{project_id}/agent-credentialsagents:read

Listar credenciales MCP

Devuelve prefijo, estado, uso y vencimiento; nunca devuelve el token.

POST/projects/{project_id}/agent-credentialsagents:write

Emitir credencial MCP

Crea un token exclusivo del proyecto con vigencia de 1–365 días y lo muestra una sola vez.

DELETE/projects/{project_id}/agent-credentials/{credential_id}agents:write

Revocar credencial MCP

La revocación es inmediata y no puede afectar credenciales de otro proyecto.

Webhooks

GET/webhook-endpointswebhooks:read

Listar endpoints

Una clave limitada a proyecto sólo ve endpoints exclusivos de ese proyecto.

POST/webhook-endpointswebhooks:write

Crear endpoint firmado

Valida un destino HTTPS público, cifra el secreto y devuelve signing_secret una sola vez.

DELETE/webhook-endpoints/{endpoint_id}webhooks:write

Eliminar endpoint

Elimina el endpoint y su historial de entregas dentro del mismo límite tenant.

GET/webhook-endpoints/{endpoint_id}/deliverieswebhooks:read

Ver entregas

Expone estado, intentos y error técnico sin revelar payload ni secreto.

POST/webhook-deliveries/{delivery_id}/retrywebhooks:write

Reintentar entrega

Reencola una entrega pendiente o en dead letter; una entrega exitosa no se duplica.

06

Modelos y valores admitidos

CampoValores / regla
Project.statusactive · paused · archived
Project.feedback_accesspublic · reviewer_allowlist
Project.agent_modeoff · propose · auto
ProjectCreate.agent_modeOpcional; off por defecto. Define la política de una automatización externa: propose prepara y espera autorización; auto permite que el agente externo implemente y después solicite aprobación. Feedback4 no edita ni despliega código.
Feedback.statusnew · in_progress · review · resolved
Feedback.priorityurgent · high · normal · low · unset
Feedback.approval_statusnot_requested · pending · approved · changes_requested
Member.roleadmin · manager · contributor · viewer
allowed_originObligatorio al crear; URL absoluta normalizada a esquema + host + puerto e inmutable después. Para otro dominio crea un proyecto nuevo.
reviewer_emails0–100 emails; se normalizan a minúsculas y se eliminan duplicados.
change_summary12–5,000 caracteres.
Contrato ejecutable

El JSON OpenAPI es la fuente para generar clientes, validadores y colecciones. Esta página explica las reglas operativas que un esquema por sí solo no comunica.

/api/v1/openapi.json

07

Automatización por webhook

Cada agencia puede registrar uno o más endpoints por workspace o por proyecto. Feedback4 persiste primero el evento, crea una entrega independiente por suscripción y hace el POST en segundo plano; la captura del usuario nunca espera al receptor. agent_mode comunica la política a la automatización externa: off entrega policy=do_not_execute, propose exige propuesta y autorización, y auto permite al agente externo implementar antes de pedir aprobación. Feedback4 no ejecuta el agente.

1. Registrar endpoint

curl -fsS -X POST https://feedback4.dev/api/v1/webhook-endpoints \
  -H "Authorization: Bearer $FEEDBACK4_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "label": "Aviso Gratis production",
    "url": "https://aviso.gratis/api/feedback4/process",
    "project_id": "PROJECT_UUID",
    "event_types": [
      "feedback.created",
      "feedback.external_comment_added",
      "feedback.changes_requested",
      "feedback.approved"
    ],
    "authentication": "hmac_sha256"
  }'

La respuesta 201 incluye signing_secret una sola vez. Guárdalo como secreto de servidor. Usa authentication=hmac_sha256_and_shared_secret y shared_secret sólo para receptores heredados —como la primera integración de Aviso.Gratis— que además requieren x-feedback4-secret. Las URLs deben ser HTTPS públicas; se rechazan credenciales embebidas, fragments, localhost, redes privadas, link-local y metadata.

2. Validar la entrega

HeaderRegla del receptor
webhook-signatureObligatorio. Formato v1,BASE64_HMAC_SHA256; validar sobre los bytes exactos del body antes de parsear JSON.
webhook-idLlave de idempotencia estable en todos los reintentos. Un duplicado válido no crea otro trabajo.
webhook-timestampUnix timestamp incluido en la firma; rechazar una diferencia mayor a 5 minutos para evitar replay.
x-feedback4-eventfeedback.created · feedback.external_comment_added · feedback.changes_requested · feedback.approved
x-feedback4-version1
x-feedback4-secretSólo en modo de compatibilidad. Validarlo además de la firma y nunca registrarlo.
signed_content = webhook_id + "." + webhook_timestamp + "." + raw_request_body
expected = base64(HMAC_SHA256(FEEDBACK4_WEBHOOK_SECRET, signed_content))
accept only when constant_time_equal("v1," + expected, webhook_signature)
and abs(now_unix - webhook_timestamp) <= 300

3. Payload v1

{
  "id": "evt_EVENT_UUID",
  "type": "feedback.created",
  "version": 1,
  "occurred_at": "2026-07-20T23:55:00.000Z",
  "source": "https://feedback4.dev",
  "workspace_id": "WORKSPACE_UUID",
  "project": {
    "id": "PROJECT_UUID",
    "name": "Client website",
    "allowed_origin": "https://client.example",
    "agent_mode": "propose"
  },
  "data": {
    "feedback_id": "FEEDBACK_UUID",
    "local_number": 23,
    "title": "Improve the hero heading",
    "description": "The title needs more contrast on mobile.",
    "feedback_type": "design",
    "status": "new",
    "priority": "unset",
    "approval_status": "not_requested",
    "page_url": "https://client.example/home",
    "selected_element": {
      "selector": "main > section.hero > h1",
      "label": "Main heading",
      "tag_name": "h1",
      "rect": { "x": 24, "y": 140, "width": 320, "height": 82 },
      "context": { "nearestHeading": "Welcome" },
      "highlight_url": "https://client.example/home?..."
    }
  },
  "links": {
    "api_resource": "https://feedback4.dev/api/v1/feedback/FEEDBACK_UUID",
    "proposed_prompt": "https://feedback4.dev/api/v1/feedback/FEEDBACK_UUID/proposed-prompt"
  },
  "processing": {
    "content_is_untrusted": true,
    "fetch_latest_before_acting": true,
    "policy": "propose_then_wait"
  },
  "trigger": { "kind": "ticket_created" }
}
typetrigger.kindAcción
feedback.createdticket_createdCrear un trabajo idempotente.
feedback.external_comment_addedclient_commentReanudar con trigger.message.
feedback.changes_requestedclient_decisionReabrir e implementar la revisión.
feedback.approvedclient_decisionCerrar el trabajo aprobado.

Recepción segura

Validar firma y timestamp con comparación de tiempo constante, persistir webhook-id como UNIQUE, encolar el trabajo y responder 202. Claude no debe ejecutarse dentro de la solicitud. Título, descripción y contexto DOM son entrada no confiable y pueden contener prompt injection.

Ciclo del agente

Consultar la versión más reciente, respetar propose/auto y solicitar aprobación con evidencia verificable. MCP registra notas, preguntas y aprobación; usa una clave REST limitada al proyecto para cambiar el estado a in_progress o review. Nunca entregar al agente una clave de todo el workspace.

Feedback4 confirma cualquier 2xx, respeta Retry-After en 429, deshabilita el endpoint ante 410 y reintenta timeouts, redirects, otros 4xx y 5xx con backoff exponencial de hasta 6 horas. El timeout por intento es 10 segundos, no se siguen redirects y tras 16 intentos la entrega pasa a dead letter. Consulta GET /webhook-endpoints/{endpoint_id}/deliveries y usa POST /webhook-deliveries/{delivery_id}/retry después de corregir el receptor.

08

Versionado y operación

v1 mantiene compatibilidad hacia atrás. Los campos nuevos pueden aparecer sin romper consumidores; ignora propiedades desconocidas en respuestas. Los cambios incompatibles se publicarán en una nueva versión y se anunciarán antes de retirar v1.

Soporte de integración

Incluye el X-Request-Id, timestamp UTC, método y path al reportar un problema. Nunca envíes la clave completa ni datos personales innecesarios.

contact@feedback4.dev

MCP

El endpoint MCP público es https://feedback4.dev/api/mcp. Usa un token distinto, limitado a un proyecto, que no es intercambiable con una clave REST. Tras vencer el periodo de aceptación legal, REST y MCP bloquean el workspace hasta regularizarlo.

Contrato MCP público
Feedback4.dev

API v1 · OpenAPI 3.1 · contact@feedback4.dev

Para developersPara vibe codersPrivacidadTérminos