Documentación de la API

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ódigoSignificado
200Correcto.
201Creado.
204Sin contenido.
400Solicitud incorrecta: datos mal formados, límite del plan o dominio no válido.
401Credenciales ausentes, no válidas o caducadas, o contraseña de página incorrecta.
403No hay un equipo activo, el token del formulario no es válido o se ha superado el límite del plan.
404No se encuentra el sitio, el archivo, el formulario, la página o el plan.
422Ha fallado la validación.
429Límite de solicitudes superado.
500Error del servidor.

Ejemplo de respuesta de error

{
    "status": "error",
    "message": "Site not found"
}

Campos de la respuesta

CampoTipoDescripción
statusstringSiempre "error" cuando falla.
messagestringExplicació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

CampoTipoDescripción
data[].pidstringIdentificador público del espacio de trabajo.
data[].namestringNombre del espacio de trabajo que se muestra.
data[].is_ownerbooleantrue si el usuario autenticado es el propietario del espacio de trabajo.
data[].is_currentbooleantrue si es el espacio de trabajo activo del usuario autenticado.
data[].is_defaultbooleantrue 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

CampoTipoDescripción
pidstringIdentificador público del espacio de trabajo activo.
namestringNombre del espacio de trabajo que se muestra.
is_ownerbooleantrue 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

NombreTipoObligatorioDescripción
pidstringobligatorioID 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

CampoTipoDescripción
statusstring"success" si todo va bien.
workspace.pidstringID público del espacio de trabajo que ahora está activo.
workspace.namestringNombre 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

CampoTipoDescripción
data[].pidstringIdentificador público del sitio.
data[].slugstringSlug de la URL del sitio.
data[].namestringNombre del sitio que se muestra.
data[].domainstringDominio principal asociado al sitio.
data[].statusbooleantrue si el sitio está activo.
data[].full_urlstringURL canónica del sitio.
data[].created_atstring (ISO-8601)Marca de tiempo de creación.
data[].updated_atstring (ISO-8601)Marca de tiempo de la última modificación.

Obtener sitio Auth

GET /v1/sites/{pid}

Ruta

NombreTipoObligatorioDescripción
pidstringobligatorioIdentificador 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

CampoTipoDescripción
pidstringIdentificador público del sitio.
slugstringSlug de la URL del sitio.
namestringNombre del sitio que se muestra.
domainstringDominio principal asociado al sitio.
statusbooleantrue si está activo.
full_urlstringURL canónica.
created_atstring (ISO-8601)Marca de tiempo de creación.
updated_atstring (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

NombreTipoObligatorioDescripción
urlstringobligatorioEnlace HTTPS a un archivo ZIP.
domainstringopcionalSubdominio personalizado. Aleatorio si se omite.
pidstringopcionalActualiza 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

CampoTipoDescripción
statusstring"success" si todo va bien.
pidstringIdentificador público del sitio creado (o actualizado).
slugstringSlug de la URL.
urlstringURL canónica del sitio.

Crear / actualizar subiendo un ZIP Auth

Sube un archivo ZIP directamente.

POST /v1/sites/zip

Cuerpo (multipart/form-data)

NombreTipoObligatorioDescripción
archivefileobligatorioEl archivo ZIP.
domainstringopcionalSubdominio personalizado.
pidstringopcionalActualiza 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

CampoTipoDescripción
statusstring"success" si todo va bien.
pidstringIdentificador público del sitio creado o actualizado.
slugstringSlug de la URL.
urlstringURL 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

NombreTipoObligatorioDescripción
domainstringobligatorioNuevo 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

CampoTipoDescripción
statusstring"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

CampoTipoDescripción
statusstring"success" si todo va bien.
messagestringConfirmació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

NombreTipoObligatorioDescripción
idsint | int[]obligatorioID 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

CampoTipoDescripción
statusstring"success" si todo va bien.
processedintegerNú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

NombreTipoObligatorioDescripción
pathstringopcionalSubdirectorio. 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

CampoTipoDescripción
statusstring"success" si todo va bien.
current_pathstringDirectorio que se lista (cadena vacía = raíz del sitio).
files[].namestringNombre del archivo o directorio.
files[].pathstringRuta relativa a la raíz del sitio.
files[].is_dirbooleantrue para los directorios.
files[].sizeinteger | nullTamaño en bytes; null para los directorios.
files[].modifiedintegerMarca de tiempo Unix de la última modificación.
files[].typestringExtensión del archivo o "directory".
files[].hashstring | nullMD5 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

NombreTipoObligatorioDescripción
pidsstring[]obligatorioArray 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

CampoTipoDescripción
statusstring"success" en el conjunto de la solicitud.
data[pid]objectResultado por sitio, indexado por el pid solicitado.
data[pid].statusstring"success" si el sitio se ha encontrado.
data[pid].filesarrayEntradas de archivos (con la misma estructura que en Listar archivos).
data[pid].messagestringMensaje 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

CampoTipoDescripción
statusstring"success" si todo va bien.
urlstringURL firmada temporal para descargar el ZIP. Caduca pasado un breve plazo.

Descargar archivos seleccionados Auth

POST /v1/sites/download-files/{pid}

Cuerpo

NombreTipoObligatorioDescripción
filesstring[]obligatorioRutas 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

CampoTipoDescripción
statusstring"success" si todo va bien.
urlstringURL firmada temporal para descargar el paquete.

Subir archivos Auth

POST /v1/sites/upload-files/{pid}

Cuerpo (multipart/form-data)

NombreTipoObligatorioDescripción
files[]file[]obligatorioUno o más archivos.
paths[]string[]opcionalRuta 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

CampoTipoDescripción
statusstring"success" si todo va bien.
uploadedintegerNúmero de archivos escritos correctamente.
files[].namestringNombre con el que se ha guardado el archivo.
files[].pathstringRuta final relativa a la raíz del sitio.
files[].sizeintegerBytes escritos.
errorsarrayMensajes de error por archivo en las entradas que han fallado.

Eliminar archivos Auth

POST /v1/sites/delete-files/{pid}

Cuerpo

NombreTipoObligatorioDescripción
pathsstring[]obligatorioRutas 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

CampoTipoDescripción
statusstring"success" si todo va bien.
deletedintegerNúmero de archivos eliminados correctamente.
pathsstring[]Rutas que se han eliminado.
errorsarrayMensajes 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

NombreTipoObligatorioDescripción
filesobject[]obligatorioHasta 200 archivos por solicitud.
files[].pathstringobligatorioRuta relativa a la raíz del sitio, p. ej. css/style.css. Se rechazan las rutas que salen del sitio.
files[].contentstringobligatorioContenido del archivo. Máximo 200 MB por archivo.
files[].encodingstringopcional"text" (por defecto) envía el contenido tal cual; "base64" es para imágenes y otros binarios.
create_onlybooleanopcionalSi 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

CampoTipoDescripción
statusstring"success" si todo va bien.
writtenintegerNúmero de archivos creados o reemplazados.
files[].namestringNombre con el que se ha guardado el archivo. Los nombres HTML se sanean igual que lo hace el importador de ZIP.
files[].pathstringRuta final relativa a la raíz del sitio.
files[].sizeintegerBytes escritos.
files[].hashstringMD5 del archivo guardado, igual al que devuelve un listado de archivos.
errorsarrayMensajes de error por archivo en las entradas que han fallado.

Errores

EstadoCuándo
409Se indicó create_only y todos los archivos ya existen.
422No 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

NombreTipoObligatorioDescripción
pathstringobligatorioRuta 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

EstadoCuándo
400Falta path o apunta fuera del sitio.
404No se encuentra el sitio o el archivo.
413El 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

NombreTipoObligatorioDescripción
fileNamestringobligatorioNombre del archivo, p. ej. data.csv.
relativePathstringopcionalDirectorio 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

CampoTipoDescripción
statusstring"success" si todo va bien.
fileNamestringEl archivo que se ha leído.
contentstringContenido 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

NombreTipoObligatorioDescripción
fileNamestringobligatorioArchivo que se va a modificar.
relativePathstringopcionalDirectorio dentro del sitio.
contentstringobligatorioTexto que se va a insertar.
positionstringobligatoriotop o bottom.
newlinebooleanopcionalInserta \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

CampoTipoDescripción
statusstring"success" si todo va bien.
fileNamestringEl archivo que se ha modificado.
sizeintegerTamaño resultante del archivo en bytes.

Formularios

Los formularios recogen envíos en un sitio. Lista los formularios y consulta sus envíos.

Listar formularios Auth

POST /v1/sites/{pid}/forms

Cuerpo

NombreTipoObligatorioDescripción
sortstringopcionalasc 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

CampoTipoDescripción
data[].pidstringIdentificador público del formulario.
data[].namestringNombre del formulario que se muestra.
data[].form_hashstringHash incrustado en la plantilla del formulario.
data[].entries_countintegerTotal de envíos de este formulario.
data[].created_atstring (ISO-8601)Marca de tiempo de creación.

Obtener formulario Auth

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

CampoTipoDescripción
pidstringIdentificador público del formulario.
namestringNombre del formulario que se muestra.
form_hashstringHash incrustado en la plantilla del formulario.
notification_emailstringCorreo que recibe los envíos.
entries_countintegerTotal de envíos.
created_atstring (ISO-8601)Marca de tiempo de creación.

Eliminar formularios Auth

DELETE /v1/sites/{pid}/forms

Cuerpo

NombreTipoObligatorioDescripción
form_idsint[]obligatorioID 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

CampoTipoDescripción
statusstring"success" si todo va bien.
messagestringConfirmación legible.

Cambiar el correo de notificación Auth

POST /v1/sites/{pid}/forms/change-email

Cuerpo

NombreTipoObligatorioDescripción
emailstringobligatorioDirecció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

CampoTipoDescripción
statusstring"success" si todo va bien.

Listar envíos de un formulario Auth

POST /v1/sites/{pid}/forms/{form_id}/entries

Cuerpo

NombreTipoObligatorioDescripción
per_pageintopcionalElementos por página. Por defecto, 20.
sortstringopcionalasc 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

CampoTipoDescripción
data[].pidstringIdentificador público del envío.
data[].pagestringRuta de la página donde se envió el formulario.
data[].fullurlstringURL completa del envío.
data[].ipstringIP de quien lo envía (puede estar vacía).
data[].is_spambooleantrue si está marcado como spam.
data[].data[].namestringNombre del campo.
data[].data[].valuestringValor del campo.
data[].created_atstring (ISO-8601)Marca de tiempo del envío.
meta.current_pageintegerPágina actual de la paginación.
meta.per_pageintegerTamaño de página.
meta.totalintegerTotal de envíos del formulario.

Eliminar envíos de un formulario Auth

DELETE /v1/sites/{pid}/forms/{form_id}/entries

Cuerpo

NombreTipoObligatorioDescripción
entry_idsint[]obligatorioID 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

CampoTipoDescripción
statusstring"success" si todo va bien.
messagestringConfirmación legible.

Marcar envíos como spam Auth

POST /v1/sites/{pid}/forms/{form_id}/entries/mark-spam

Cuerpo

NombreTipoObligatorioDescripción
entry_idsint[]obligatorioID 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

CampoTipoDescripción
statusstring"success" si todo va bien.
messagestringConfirmació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

CampoTipoDescripción
data.first_namestringNombre del usuario.
data.last_namestringApellidos del usuario.
data.emailstringCorreo del usuario.
data.imagestringURL del avatar, o cadena vacía.
data.plan.namestringSlug del plan.
data.plan.statusstringactive, pending o incomplete.
data.plan.sitesintegerCuota de sitios incluida en el plan.
data.plan.storageintegerCuota de almacenamiento en megabytes.
data.usage.sitesintegerNúmero actual de sitios.
data.usage.storagenumberUso actual de almacenamiento en megabytes.
data.sitesintegerCopia práctica de usage.sites.
data.limitbooleantrue si el uso está dentro de los límites del plan.
data.created_atstring (ISO-8601)Marca de tiempo de creación de la cuenta.