API REST
Lee formularios y envíos, mueve envíos dentro y fuera del spam y elimínalos con una clave secreta.
La API REST permite a tu servidor leer formularios y envíos, mover envíos dentro y fuera del spam y eliminarlos. Es JSON por HTTPS en https://ikiform.com/api/v1. El documento OpenAPI 3.1 está en /api/v1/openapi.json.
/api/v1. En su lugar, envía al endpoint del formulario con una clave secreta; consulta Desde un servidor.Claves de API
Crea las claves en el panel, en API keys. Una clave pertenece a un espacio de trabajo y solo ve ese espacio de trabajo. La clave completa se muestra una sola vez; Ikiform solo guarda su hash.
| Tipo | Prefijo | Uso |
|---|---|---|
| Secreta | ik_sk_ | Para servidores. Llama a la API REST con los permisos que elijas y puede crear envíos. |
| Publicable | ik_pub_ | Para navegadores. Solo puede enviar formularios, y solo desde los dominios que indiques en la clave. |
Permisos
| Permiso | Concede |
|---|---|
forms:read | GET /forms, GET /forms/:formId |
submissions:read | GET /submissions, GET /submissions/:id |
submissions:write | DELETE /submissions/:id, POST /submissions/:id/spam y /not-spam, y enviar a /f/:formId |
Autenticación
Envía la clave secreta como token Bearer. La API es solo de servidor a servidor: no envía cabeceras CORS y responde a los preflights del navegador con 405, así que una clave secreta nunca puede funcionar desde una página web.
curl https://ikiform.com/api/v1/forms \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"- Una clave ausente, mal formada, desconocida, revocada o caducada recibe
401 unauthorizedconWWW-Authenticate: Bearer. - Una clave publicable recibe
403 forbidden(Publishable keys can only submit forms.). Una clave sin el permiso necesario recibe403 forbiddencon el permiso indicado en el mensaje. - Las respuestas se envían con
Cache-Control: no-store.
Los ejemplos del SDK de abajo comparten un mismo cliente:
import { createClient } from "@ikiform/sdk";
const ikiform = createClient({ apiKey: process.env.IKIFORM_SECRET_KEY! });Compositor de peticiones
curl "https://ikiform.com/api/v1/submissions?form_id=frm_xxxxxxxxxxxxxxxx&status=received&limit=50" \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Ejecútalo desde tu servidor. La API REST rechaza las peticiones del navegador, así que esta página nunca la envía.
Endpoints
| Método | Ruta | Permiso | Devuelve |
|---|---|---|---|
GET | /forms | forms:read | Lista los formularios |
GET | /forms/:formId | forms:read | Obtiene un formulario |
GET | /submissions | submissions:read | Lista los envíos |
GET | /submissions/:id | submissions:read | Obtiene un envío |
POST | /submissions/:id/spam | submissions:write | Marca como spam |
POST | /submissions/:id/not-spam | submissions:write | Marca como no spam |
DELETE | /submissions/:id | submissions:write | Elimina un envío |
GET | /openapi.json | Ninguno | El documento OpenAPI |
GET | /health | Ninguno | { "ok": true } |
Lista los formularios
GET /forms con el permiso forms:read.
- De más reciente a más antiguo. Acepta
limit(de 1 a 100, por defecto 25) ycursor.
curl "https://ikiform.com/api/v1/forms?limit=10" \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Obtiene un formulario
GET /forms/:formId con el permiso forms:read.
- Un id de formulario de otro espacio de trabajo devuelve
404, exactamente igual que uno que no existe.
curl https://ikiform.com/api/v1/forms/frm_xxxxxxxxxxxxxxxx \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Lista los envíos
GET /submissions con el permiso submissions:read.
| Parámetro | Valores | Por defecto |
|---|---|---|
form_id | Un id de formulario | Todos los formularios del espacio de trabajo |
status | received o spam | Ambos |
limit | De 1 a 100 | 25 |
cursor | next_cursor de la página anterior | La primera página |
- De más reciente a más antiguo. Un
form_idde otro espacio de trabajo devuelve una lista vacía en lugar de un error, para que no se puedan sondear ids.
curl "https://ikiform.com/api/v1/submissions?form_id=frm_xxxxxxxxxxxxxxxx&status=received&limit=50" \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Obtiene un envío
GET /submissions/:id con el permiso submissions:read.
- Los ids de otro espacio de trabajo devuelven
404, exactamente igual que los ids que no existen.
curl https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3 \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Marca como spam
POST /submissions/:id/spam con el permiso submissions:write.
- Mueve un envío recibido a spam, reduce el
submission_countdel formulario y cancela sus entregas de webhook pendientes. - Llamarlo sobre un envío que ya es spam lo devuelve sin cambios.
curl -X POST https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3/spam \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Marca como no spam
POST /submissions/:id/not-spam con el permiso submissions:write.
- Lo devuelve a recibidos, borra su puntuación y sus motivos de spam, y envía
submission.createda todos los endpoints de webhook correspondientes. - Llamarlo sobre un envío recibido lo devuelve sin cambios.
curl -X POST https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3/not-spam \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Elimina un envío
DELETE /submissions/:id con el permiso submissions:write.
- Elimina de forma permanente el envío y sus entregas de webhook. No se puede deshacer. Eliminarlo otra vez devuelve
404.
curl -X DELETE https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3 \
-H "Authorization: Bearer $IKIFORM_SECRET_KEY"Objetos
Los objetos son JSON en snake_case con un campo object. Las marcas de tiempo están en ISO 8601 en UTC con milisegundos. Los ids de envío están ordenados por tiempo (sub_ más 26 caracteres); los ids de formulario son aleatorios (frm_ más 16 caracteres).
| Campo del formulario | Descripción |
|---|---|
status | active, paused o disabled |
submission_count | Envíos recibidos, sin contar el spam |
| Campo del envío | Descripción |
|---|---|
status | received o spam |
fields | Los valores guardados |
meta | user_agent, origin, referrer, country, subject, reply_to. Todas las claves están presentes y cualquier valor puede ser null. El hash de la IP nunca se devuelve |
spam.score, spam.reasons | La puntuación y los motivos de spam, como honeypot u origin_mismatch |
Paginación
Las listas van de más reciente a más antiguo y usan cursores opacos.
- Haz la petición sin cursor.
- Si
has_morees true, envíanext_cursorcomocursorcon los mismos filtros. - Para cuando
next_cursorseanull.
Las páginas se mantienen estables mientras llegan envíos nuevos: los nuevos aparecen en la primera página, nunca como duplicados más abajo. No construyas ni analices los cursores tú mismo; uno no válido devuelve 400 invalid_request.
for await (const submission of ikiform.submissions.iterate({ formId: "frm_xxxxxxxxxxxxxxxx" })) {
console.log(submission.id, submission.fields);
}Errores
Los errores usan el mismo formato que los envíos de formularios. Cada respuesta tiene una cabecera X-Request-Id, que los errores repiten como request_id.
{
"ok": false,
"error": { "code": "forbidden", "message": "This API key is missing the forms:read scope." },
"request_id": "req_01k7v2c9t3e8m5q4x6z0a1b2c3"
}| Estado | Código | Cuándo |
|---|---|---|
| 400 | invalid_request | limit, status, form_id o cursor no es válido; el mensaje indica cuál |
| 401 | unauthorized | Clave ausente o no válida |
| 403 | forbidden | Clave publicable o falta un permiso |
| 404 | not_found | Ruta o id desconocidos, o un id de otro espacio de trabajo |
| 405 | method_not_allowed | Un preflight del navegador |
| 429 | rate_limited | Se superó el límite de frecuencia por clave |
| 500 | server_error | Algo falló de nuestro lado; indica el request_id |
Límite de frecuencia
Cada clave puede hacer 100 peticiones cada 60 segundos. Por encima del límite, la API devuelve 429 rate_limited con una cabecera Retry-After en segundos. El SDK la expone como error.retryAfter.