Resumen
Conceptos básicos: URL base, autenticación, formato de los errores e identificadores de sitio.
URL base
La API de gestión completa se encuentra en un subdominio propio y está versionada:
https://api.static.app/v1
Colección de Postman
Descarga la colección lista para importar, con todos los endpoints preconfigurados (autenticación, variables y cuerpos de ejemplo):
Descargar la colección de Postman (v2.1)
Tras importarla, asigna tu clave a la variable apiKey y el ID público de un sitio a pid.
Autenticación
Los endpoints marcados con Auth requieren una clave de API personal. Crea una en Cuenta → API. Las claves empiezan por sk_. Envía la clave en la cabecera Authorization :
Authorization: Bearer sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Los endpoints marcados como Público funcionan sin clave, pero se limitan a un dominio o a un contexto de solicitud.
Errores
La API usa códigos de estado HTTP estándar y devuelve JSON con status/message en los errores.
| Código | Significado |
| 200 | Correcto. |
| 201 | Creado. |
| 204 | Sin contenido. |
| 400 | Solicitud incorrecta: datos mal formados, límite del plan o dominio no válido. |
| 401 | Credenciales ausentes, no válidas o caducadas, o contraseña de página incorrecta. |
| 403 | No hay un equipo activo, el token del formulario no es válido o se ha superado el límite del plan. |
| 404 | No se encuentra el sitio, el archivo, el formulario, la página o el plan. |
| 422 | Ha fallado la validación. |
| 429 | Límite de solicitudes superado. |
| 500 | Error del servidor. |
Ejemplo de respuesta de error
{
"status": "error",
"message": "Site not found"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | Siempre "error" cuando falla. |
message | string | Explicación legible. |
Identificador de sitio (pid)
Cada sitio tiene un identificador público alfanumérico de 10 caracteres (p. ej. 0aw4jtby1z). Úsalo siempre que aparezca {pid} en la URL o un campo pid en el cuerpo.
Espacios de trabajo
Los espacios de trabajo (equipos) agrupan sitios y miembros. Cada solicitud se ejecuta en tu espacio de trabajo activo. Puedes listarlos, consultar el actual, cambiar de espacio o sobrescribirlo por solicitud.
Listar espacios de trabajo Auth
Devuelve todos los espacios de trabajo a los que puedes acceder: los tuyos y aquellos de los que eres miembro.
GET /v1/workspaces
Ejemplo de solicitud
curl https://api.static.app/v1/workspaces \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"data": [
{
"pid": "xxxxxxxxxx",
"name": "My workspace",
"is_owner": true,
"is_current": true,
"is_default": true
},
{
"pid": "yyyyyyyyyy",
"name": "Side project",
"is_owner": false,
"is_current": false,
"is_default": false
}
]
}
Campos de la respuesta
| Campo | Tipo | Descripción |
data[].pid | string | Identificador público del espacio de trabajo. |
data[].name | string | Nombre del espacio de trabajo que se muestra. |
data[].is_owner | boolean | true si el usuario autenticado es el propietario del espacio de trabajo. |
data[].is_current | boolean | true si es el espacio de trabajo activo del usuario autenticado. |
data[].is_default | boolean | true si es el espacio de trabajo predeterminado del usuario. |
Espacio de trabajo actual Auth
Devuelve el espacio de trabajo en el que se ejecutan las solicitudes por defecto.
GET /v1/workspaces/current
Ejemplo de solicitud
curl https://api.static.app/v1/workspaces/current \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"pid": "xxxxxxxxxx",
"name": "My workspace",
"is_owner": true
}
Campos de la respuesta
| Campo | Tipo | Descripción |
pid | string | Identificador público del espacio de trabajo activo. |
name | string | Nombre del espacio de trabajo que se muestra. |
is_owner | boolean | true si el usuario es su propietario. |
Cambiar de espacio de trabajo Auth
Guarda un nuevo espacio de trabajo activo para tu cuenta. Las solicitudes siguientes lo usan hasta que vuelvas a cambiar.
POST /v1/workspaces/switch
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
pid | string | obligatorio | ID público del espacio de trabajo al que se cambia. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/workspaces/switch \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"pid":"yyyyyyyyyy"}'
Ejemplo de respuesta
{
"status": "success",
"workspace": {
"pid": "yyyyyyyyyy",
"name": "Side project"
}
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
workspace.pid | string | ID público del espacio de trabajo que ahora está activo. |
workspace.name | string | Nombre que se muestra. |
Sobrescribir por solicitud
Sin cambiar de espacio de forma global, puedes ejecutar una sola solicitud en otro espacio de trabajo con la cabecera X-Team-Pid (o la cadena de consulta ?team_pid=):
curl https://api.static.app/v1/sites \
-H "Authorization: Bearer sk_xxxx" \
-H "X-Team-Pid: 9af1zr5w0e"
Si se omite la cabecera, se usa el espacio de trabajo activo (current_team_id, o default_team_id si falta).
Sitios
Los sitios son los proyectos publicados en tu espacio de trabajo. Lista, crea, actualiza y elimina.
Listar sitios Auth
Devuelve todos los sitios del espacio de trabajo activo.
GET /v1/sites
Ejemplo de solicitud
curl https://api.static.app/v1/sites \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"data": [
{
"pid": "xxxxxxxxxx",
"slug": "example-site",
"name": "Example Site",
"domain": "example.static.app",
"status": true,
"full_url": "https://example.static.app",
"created_at": "2025-01-15T10:00:00Z",
"updated_at": "2025-02-01T12:30:00Z"
}
]
}
Campos de la respuesta
| Campo | Tipo | Descripción |
data[].pid | string | Identificador público del sitio. |
data[].slug | string | Slug de la URL del sitio. |
data[].name | string | Nombre del sitio que se muestra. |
data[].domain | string | Dominio principal asociado al sitio. |
data[].status | boolean | true si el sitio está activo. |
data[].full_url | string | URL canónica del sitio. |
data[].created_at | string (ISO-8601) | Marca de tiempo de creación. |
data[].updated_at | string (ISO-8601) | Marca de tiempo de la última modificación. |
Obtener sitio Auth
GET /v1/sites/{pid}
Ruta
| Nombre | Tipo | Obligatorio | Descripción |
pid | string | obligatorio | Identificador público del sitio. |
Ejemplo de solicitud
curl https://api.static.app/v1/sites/xxxxxxxxxx \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"pid": "xxxxxxxxxx",
"slug": "example-site",
"name": "Example Site",
"domain": "example.static.app",
"status": true,
"full_url": "https://example.static.app",
"created_at": "2025-01-15T10:00:00Z",
"updated_at": "2025-02-01T12:30:00Z"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
pid | string | Identificador público del sitio. |
slug | string | Slug de la URL del sitio. |
name | string | Nombre del sitio que se muestra. |
domain | string | Dominio principal asociado al sitio. |
status | boolean | true si está activo. |
full_url | string | URL canónica. |
created_at | string (ISO-8601) | Marca de tiempo de creación. |
updated_at | string (ISO-8601) | Marca de tiempo de la última modificación. |
Crear / actualizar desde una URL Auth
Importa un sitio desde un ZIP remoto. Indica pid para actualizar un sitio existente.
POST /v1/sites
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
url | string | obligatorio | Enlace HTTPS a un archivo ZIP. |
domain | string | opcional | Subdominio personalizado. Aleatorio si se omite. |
pid | string | opcional | Actualiza un sitio existente en lugar de crear uno. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/site.zip","domain":"example-site"}'
Ejemplo de respuesta
{
"status": "success",
"pid": "xxxxxxxxxx",
"slug": "example-site",
"url": "https://example-site.static.app"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
pid | string | Identificador público del sitio creado (o actualizado). |
slug | string | Slug de la URL. |
url | string | URL canónica del sitio. |
Crear / actualizar subiendo un ZIP Auth
Sube un archivo ZIP directamente.
POST /v1/sites/zip
Cuerpo (multipart/form-data)
| Nombre | Tipo | Obligatorio | Descripción |
archive | file | obligatorio | El archivo ZIP. |
domain | string | opcional | Subdominio personalizado. |
pid | string | opcional | Actualiza un sitio existente. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/zip \
-H "Authorization: Bearer sk_xxxx" \
-F "[email protected]" \
-F "pid=xxxxxxxxxx"
Ejemplo de respuesta
{
"status": "success",
"pid": "xxxxxxxxxx",
"slug": "example-site",
"url": "https://example-site.static.app"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
pid | string | Identificador público del sitio creado o actualizado. |
slug | string | Slug de la URL. |
url | string | URL canónica. |
Eliminar sitio Auth
DELETE /v1/sites/{pid}
Devuelve 204 No Content.
Ejemplo de solicitud
curl -X DELETE https://api.static.app/v1/sites/xxxxxxxxxx \
-H "Authorization: Bearer sk_xxxx"
Renombrar subdominio gratuito Auth
POST /v1/sites/{pid}/rename-free-domain
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
domain | string | obligatorio | Nuevo nombre del subdominio (sin la extensión). |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/xxxxxxxxxx/rename-free-domain \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"domain":"new-example-name"}'
Ejemplo de respuesta
{
"status": "success"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
Vaciar caché Auth
POST /v1/sites/{pid}/purge-cache
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/xxxxxxxxxx/purge-cache \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"status": "success",
"message": "Cache purged successfully"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
message | string | Confirmación legible. |
Pausar / reanudar sitios Auth
Desactiva temporalmente (pausa) o reactiva (reanuda) uno o más sitios.
POST /v1/sites/hold
POST /v1/sites/unhold
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
ids | int | int[] | obligatorio | ID de sitio o array de ID de sitios. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/hold \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"ids":[101, 102, 103]}'
Ejemplo de respuesta
{
"status": "success",
"processed": 3
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
processed | integer | Número de sitios afectados por la operación. |
Archivos
Los archivos viven dentro de un sitio. Lista, lee, escribe, sube, descarga y elimina.
Listar los archivos de un sitio Auth
GET /v1/sites/files/{pid}
Consulta
| Nombre | Tipo | Obligatorio | Descripción |
path | string | opcional | Subdirectorio. Por defecto, la raíz del sitio. |
Ejemplo de solicitud
curl "https://api.static.app/v1/sites/files/xxxxxxxxxx?path=images" \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"status": "success",
"current_path": "",
"files": [
{
"name": "index.html",
"path": "index.html",
"is_dir": false,
"size": 1234,
"modified": 1715600000,
"type": "html",
"hash": "0123456789abcdef0123456789abcdef"
},
{
"name": "images",
"path": "images",
"is_dir": true,
"size": null,
"modified": 1715600000,
"type": "directory",
"hash": null
}
]
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
current_path | string | Directorio que se lista (cadena vacía = raíz del sitio). |
files[].name | string | Nombre del archivo o directorio. |
files[].path | string | Ruta relativa a la raíz del sitio. |
files[].is_dir | boolean | true para los directorios. |
files[].size | integer | null | Tamaño en bytes; null para los directorios. |
files[].modified | integer | Marca de tiempo Unix de la última modificación. |
files[].type | string | Extensión del archivo o "directory". |
files[].hash | string | null | MD5 del contenido del archivo; null para los directorios. |
Listar los archivos de varios sitios Auth
Versión por lotes del endpoint anterior.
POST /v1/sites/files-by-pids
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
pids | string[] | obligatorio | Array de PID de sitios. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/files-by-pids \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"pids":["xxxxxxxxxx","yyyyyyyyyy"]}'
Ejemplo de respuesta
{
"status": "success",
"data": {
"xxxxxxxxxx": {
"status": "success",
"files": [
{
"name": "index.html",
"path": "index.html",
"is_dir": false,
"size": 1234,
"modified": 1715600000,
"type": "html",
"hash": "0123456789abcdef0123456789abcdef"
}
]
},
"yyyyyyyyyy": {
"status": "error",
"message": "Site not found"
}
}
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" en el conjunto de la solicitud. |
data[pid] | object | Resultado por sitio, indexado por el pid solicitado. |
data[pid].status | string | "success" si el sitio se ha encontrado. |
data[pid].files | array | Entradas de archivos (con la misma estructura que en Listar archivos). |
data[pid].message | string | Mensaje de error cuando el estado no es "success". |
Descargar el sitio como ZIP Auth
GET /v1/sites/download/{pid}
Ejemplo de solicitud
curl https://api.static.app/v1/sites/download/xxxxxxxxxx \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"status": "success",
"url": "https://static.app/storage/zip/abcdef0123456789_download.zip"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
url | string | URL firmada temporal para descargar el ZIP. Caduca pasado un breve plazo. |
Descargar archivos seleccionados Auth
POST /v1/sites/download-files/{pid}
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
files | string[] | obligatorio | Rutas relativas de los archivos que se van a agrupar. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/download-files/xxxxxxxxxx \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"files":["index.html","css/style.css"]}'
Ejemplo de respuesta
{
"status": "success",
"url": "https://static.app/storage/zip/abcdef0123456789_files.zip"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
url | string | URL firmada temporal para descargar el paquete. |
Subir archivos Auth
POST /v1/sites/upload-files/{pid}
Cuerpo (multipart/form-data)
| Nombre | Tipo | Obligatorio | Descripción |
files[] | file[] | obligatorio | Uno o más archivos. |
paths[] | string[] | opcional | Ruta de destino de cada archivo. Por defecto, la raíz del sitio. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/upload-files/xxxxxxxxxx \
-H "Authorization: Bearer sk_xxxx" \
-F "files[][email protected]" \
-F "files[][email protected]" \
-F "paths[]=index.html" \
-F "paths[]=css/style.css"
Ejemplo de respuesta
{
"status": "success",
"uploaded": 2,
"files": [
{ "name": "index.html", "path": "index.html", "size": 1234 },
{ "name": "style.css", "path": "css/style.css", "size": 567 }
],
"errors": []
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
uploaded | integer | Número de archivos escritos correctamente. |
files[].name | string | Nombre con el que se ha guardado el archivo. |
files[].path | string | Ruta final relativa a la raíz del sitio. |
files[].size | integer | Bytes escritos. |
errors | array | Mensajes de error por archivo en las entradas que han fallado. |
Eliminar archivos Auth
POST /v1/sites/delete-files/{pid}
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
paths | string[] | obligatorio | Rutas relativas que se van a eliminar. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/delete-files/xxxxxxxxxx \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"paths":["old.html","images/legacy.png"]}'
Ejemplo de respuesta
{
"status": "success",
"deleted": 1,
"paths": ["old.html"],
"errors": []
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
deleted | integer | Número de archivos eliminados correctamente. |
paths | string[] | Rutas que se han eliminado. |
errors | array | Mensajes de error por ruta en las entradas que han fallado. |
Escribir archivos Auth
Crea o reemplaza archivos a partir de contenido incluido en la propia solicitud. A diferencia de Subir archivos, recibe JSON en lugar de multipart, de modo que quien llama sin acceso al sistema de archivos puede crear archivos que aún no existen. Los directorios que falten se crean por el camino.
POST /v1/sites/write-files/{pid}
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
files | object[] | obligatorio | Hasta 200 archivos por solicitud. |
files[].path | string | obligatorio | Ruta relativa a la raíz del sitio, p. ej. css/style.css. Se rechazan las rutas que salen del sitio. |
files[].content | string | obligatorio | Contenido del archivo. Máximo 200 MB por archivo. |
files[].encoding | string | opcional | "text" (por defecto) envía el contenido tal cual; "base64" es para imágenes y otros binarios. |
create_only | boolean | opcional | Si es true, un archivo existente no se toca y la solicitud falla con 409. Por defecto, false. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/write-files/xxxxxxxxxx \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{
"files": [
{ "path": "index.html", "content": "<!doctype html><h1>Hello</h1>" },
{ "path": "css/style.css", "content": "body{margin:0}" },
{ "path": "img/logo.png", "content": "iVBORw0KGgo...", "encoding": "base64" }
]
}'
Ejemplo de respuesta
{
"status": "success",
"written": 3,
"files": [
{ "name": "index.html", "path": "index.html", "size": 34, "hash": "0123456789abcdef0123456789abcdef" },
{ "name": "style.css", "path": "css/style.css", "size": 14, "hash": "fedcba9876543210fedcba9876543210" },
{ "name": "logo.png", "path": "img/logo.png", "size": 2048, "hash": "89abcdef0123456789abcdef01234567" }
],
"errors": []
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
written | integer | Número de archivos creados o reemplazados. |
files[].name | string | Nombre con el que se ha guardado el archivo. Los nombres HTML se sanean igual que lo hace el importador de ZIP. |
files[].path | string | Ruta final relativa a la raíz del sitio. |
files[].size | integer | Bytes escritos. |
files[].hash | string | MD5 del archivo guardado, igual al que devuelve un listado de archivos. |
errors | array | Mensajes de error por archivo en las entradas que han fallado. |
Errores
| Estado | Cuándo |
409 | Se indicó create_only y todos los archivos ya existen. |
422 | No se pudo escribir ningún archivo: extensión no admitida, ruta no válida o base64 incorrecto. |
Leer un archivo Auth
Devuelve el contenido de un archivo. El texto llega tal cual; cualquier binario se codifica en base64 y se indica mediante encoding.
GET /v1/sites/read-file/{pid}
Consulta
| Nombre | Tipo | Obligatorio | Descripción |
path | string | obligatorio | Ruta relativa a la raíz del sitio, p. ej. css/style.css. |
Ejemplo de solicitud
curl "https://api.static.app/v1/sites/read-file/xxxxxxxxxx?path=css/style.css" \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"status": "success",
"path": "css/style.css",
"encoding": "text",
"size": 14,
"hash": "fedcba9876543210fedcba9876543210",
"content": "body{margin:0}"
}
Errores
| Estado | Cuándo |
400 | Falta path o apunta fuera del sitio. |
404 | No se encuentra el sitio o el archivo. |
413 | El archivo pesa más de 1 MB: usa mejor Descargar archivos seleccionados. |
Leer archivo (heredado) Auth
Endpoint antiguo y sin versión que se mantiene para las integraciones existentes. Recibe el nombre del archivo y el directorio como campos separados. El código nuevo debería usar Leer un archivo.
POST /api/files/{pid}/read
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
fileName | string | obligatorio | Nombre del archivo, p. ej. data.csv. |
relativePath | string | opcional | Directorio dentro del sitio. |
Ejemplo de solicitud
curl -X POST https://api.static.app/api/files/xxxxxxxxxx/read \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"fileName":"data.csv","relativePath":"public_html"}'
Ejemplo de respuesta
{
"status": "success",
"fileName": "data.csv",
"content": "id,name\n1,foo\n2,bar\n"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
fileName | string | El archivo que se ha leído. |
content | string | Contenido completo del archivo. |
Añadir al final o al principio de un archivo Auth
Escribe contenido al principio o al final de un archivo que ya existe. Pensado para actualizaciones incrementales, como añadir filas a un CSV. El archivo debe existir: si no, devuelve 404; usa Escribir archivos para crear uno.
POST /api/files/{pid}/edit
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
fileName | string | obligatorio | Archivo que se va a modificar. |
relativePath | string | opcional | Directorio dentro del sitio. |
content | string | obligatorio | Texto que se va a insertar. |
position | string | obligatorio | top o bottom. |
newline | boolean | opcional | Inserta \n entre el contenido antiguo y el nuevo. |
Ejemplo de solicitud
curl -X POST https://api.static.app/api/files/xxxxxxxxxx/edit \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"fileName":"data.csv","content":"3,baz","position":"bottom","newline":true}'
Ejemplo de respuesta
{
"status": "success",
"fileName": "data.csv",
"size": 28
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
fileName | string | El archivo que se ha modificado. |
size | integer | Tamaño resultante del archivo en bytes. |
Formularios
Los formularios recogen envíos en un sitio. Lista los formularios y consulta sus envíos.
POST /v1/sites/{pid}/forms
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
sort | string | opcional | asc o desc. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/xxxxxxxxxx/forms \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"sort":"desc"}'
Ejemplo de respuesta
{
"data": [
{
"pid": "zzzzzzzzzz",
"name": "Contact form",
"form_hash": "0123456789abcdef0123456789abcdef",
"entries_count": 42,
"created_at": "2025-01-15T10:00:00Z"
}
]
}
Campos de la respuesta
| Campo | Tipo | Descripción |
data[].pid | string | Identificador público del formulario. |
data[].name | string | Nombre del formulario que se muestra. |
data[].form_hash | string | Hash incrustado en la plantilla del formulario. |
data[].entries_count | integer | Total de envíos de este formulario. |
data[].created_at | string (ISO-8601) | Marca de tiempo de creación. |
POST /v1/sites/{pid}/forms/{form_id}
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/xxxxxxxxxx/forms/42 \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"pid": "zzzzzzzzzz",
"name": "Contact form",
"form_hash": "0123456789abcdef0123456789abcdef",
"notification_email": "[email protected]",
"entries_count": 42,
"created_at": "2025-01-15T10:00:00Z"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
pid | string | Identificador público del formulario. |
name | string | Nombre del formulario que se muestra. |
form_hash | string | Hash incrustado en la plantilla del formulario. |
notification_email | string | Correo que recibe los envíos. |
entries_count | integer | Total de envíos. |
created_at | string (ISO-8601) | Marca de tiempo de creación. |
DELETE /v1/sites/{pid}/forms
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
form_ids | int[] | obligatorio | ID de los formularios que se van a eliminar. |
Ejemplo de solicitud
curl -X DELETE https://api.static.app/v1/sites/xxxxxxxxxx/forms \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"form_ids":[42, 43]}'
Ejemplo de respuesta
{
"status": "success",
"message": "2 forms deleted."
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
message | string | Confirmación legible. |
POST /v1/sites/{pid}/forms/change-email
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
email | string | obligatorio | Dirección de correo a la que llegan los envíos. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/xxxxxxxxxx/forms/change-email \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]"}'
Ejemplo de respuesta
{
"status": "success"
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
POST /v1/sites/{pid}/forms/{form_id}/entries
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
per_page | int | opcional | Elementos por página. Por defecto, 20. |
sort | string | opcional | asc o desc. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/xxxxxxxxxx/forms/42/entries \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"per_page":20,"sort":"desc"}'
Ejemplo de respuesta
{
"data": [
{
"pid": "qqqqqqqqqq",
"page": "/contact",
"fullurl": "https://example.static.app/contact",
"ip": "203.0.113.42",
"is_spam": false,
"data": [
{ "name": "name", "value": "Jane Doe" },
{ "name": "email", "value": "[email protected]" },
{ "name": "message", "value": "Hello!" }
],
"created_at": "2025-02-01T12:34:56Z"
}
],
"meta": {
"current_page": 1,
"per_page": 20,
"total": 42
}
}
Campos de la respuesta
| Campo | Tipo | Descripción |
data[].pid | string | Identificador público del envío. |
data[].page | string | Ruta de la página donde se envió el formulario. |
data[].fullurl | string | URL completa del envío. |
data[].ip | string | IP de quien lo envía (puede estar vacía). |
data[].is_spam | boolean | true si está marcado como spam. |
data[].data[].name | string | Nombre del campo. |
data[].data[].value | string | Valor del campo. |
data[].created_at | string (ISO-8601) | Marca de tiempo del envío. |
meta.current_page | integer | Página actual de la paginación. |
meta.per_page | integer | Tamaño de página. |
meta.total | integer | Total de envíos del formulario. |
DELETE /v1/sites/{pid}/forms/{form_id}/entries
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
entry_ids | int[] | obligatorio | ID de los envíos que se van a eliminar. |
Ejemplo de solicitud
curl -X DELETE https://api.static.app/v1/sites/xxxxxxxxxx/forms/42/entries \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"entry_ids":[101, 102]}'
Ejemplo de respuesta
{
"status": "success",
"message": "2 entries deleted."
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
message | string | Confirmación legible. |
POST /v1/sites/{pid}/forms/{form_id}/entries/mark-spam
Cuerpo
| Nombre | Tipo | Obligatorio | Descripción |
entry_ids | int[] | obligatorio | ID de los envíos. |
Ejemplo de solicitud
curl -X POST https://api.static.app/v1/sites/xxxxxxxxxx/forms/42/entries/mark-spam \
-H "Authorization: Bearer sk_xxxx" \
-H "Content-Type: application/json" \
-d '{"entry_ids":[101]}'
Ejemplo de respuesta
{
"status": "success",
"message": "1 entries marked as spam."
}
Campos de la respuesta
| Campo | Tipo | Descripción |
status | string | "success" si todo va bien. |
message | string | Confirmación legible. |
Usuarios
El perfil de tu cuenta. Lee los datos del usuario con sesión iniciada.
Obtener perfil Auth
Devuelve el perfil del usuario autenticado, su plan actual y las estadísticas de uso.
GET /v1/users/profile
Ejemplo de solicitud
curl https://api.static.app/v1/users/profile \
-H "Authorization: Bearer sk_xxxx"
Ejemplo de respuesta
{
"data": {
"first_name": "Jane",
"last_name": "Doe",
"email": "[email protected]",
"image": "",
"plan": {
"name": "large",
"status": "active",
"sites": 30,
"storage": 10000
},
"usage": {
"sites": 10,
"storage": 262.15
},
"sites": 10,
"limit": true,
"created_at": "2021-03-19T20:38:55Z"
}
}
Campos de la respuesta
| Campo | Tipo | Descripción |
data.first_name | string | Nombre del usuario. |
data.last_name | string | Apellidos del usuario. |
data.email | string | Correo del usuario. |
data.image | string | URL del avatar, o cadena vacía. |
data.plan.name | string | Slug del plan. |
data.plan.status | string | active, pending o incomplete. |
data.plan.sites | integer | Cuota de sitios incluida en el plan. |
data.plan.storage | integer | Cuota de almacenamiento en megabytes. |
data.usage.sites | integer | Número actual de sitios. |
data.usage.storage | number | Uso actual de almacenamiento en megabytes. |
data.sites | integer | Copia práctica de usage.sites. |
data.limit | boolean | true si el uso está dentro de los límites del plan. |
data.created_at | string (ISO-8601) | Marca de tiempo de creación de la cuenta. |