Plury API
Genera landing pages, apps web, logos, campanas de ads, auditorias SEO y mas usando agentes de IA especializados, todo via API REST.
Autenticacion
Todas las llamadas autenticadas requieren una API key. Puedes enviarla de dos formas:
# Opcion 1: Header X-API-Key
curl https://plury.co/api/v1/usage \
-H "X-API-Key: pk_live_tu_clave_aqui"
# Opcion 2: Authorization Bearer
curl https://plury.co/api/v1/usage \
-H "Authorization: Bearer pk_live_tu_clave_aqui"
Obtener tu API key
Ve a Configuracion > API Keys en tu cuenta de Plury para crear una clave. La clave solo se muestra una vez al crearla. Maximo 5 claves activas por cuenta.
Rate Limits
Los limites se aplican por API key, por ventana de 1 hora:
| Plan | Limite/hora |
|---|---|
| Agency | 100 requests/hora |
| Enterprise | 500 requests/hora |
Headers de respuesta incluidos en cada request:
| Header | Descripcion |
|---|---|
| X-RateLimit-Limit | Limite total de la ventana |
| X-RateLimit-Remaining | Requests restantes |
| Retry-After | Segundos para esperar (solo en 429) |
Errores
Todas las respuestas de error tienen el formato:
{
"error": "Descripcion del error"
}
400— Request invalido (parametros faltantes o incorrectos)401— API key faltante o invalida402— Creditos insuficientes403— Plan no soporta acceso API404— Recurso no encontrado429— Rate limit excedido500— Error interno del servidor
Creditos
Cada generacion consume creditos de tu plan. El costo depende del agente y modelo usado:
| Recurso | Costo aprox. |
|---|---|
| Claude Sonnet (texto) | ~3 creditos / 1K tokens output |
| Claude Haiku (texto) | ~1 credito / 1K tokens output |
| Generacion de imagen (Imagen 4) | 10 creditos / imagen |
| Generacion de video (Veo 3) | 50 creditos / video |
Usa el endpoint GET /usage para monitorear tu balance en tiempo real.
Endpoints
Inicia una generacion asincrona. Retorna un ID para consultar el resultado.
Body (JSON)
| Campo | Tipo | Descripcion | |
|---|---|---|---|
| prompt | string | requerido | Lo que quieres generar (min. 3 caracteres) |
| agent | string | opcional | Agente a usar: dev, web, seo, content, ads. Default: dev |
| model | string | opcional | Override del modelo LLM |
| webhook_url | string | opcional | URL para recibir el resultado via POST (proximamente) |
Ejemplo
curl -X POST https://plury.co/api/v1/generate \
-H "X-API-Key: pk_live_tu_clave" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Landing page para una pizzeria con pedidos online",
"agent": "dev"
}'
const res = await fetch('https://plury.co/api/v1/generate', {
method: 'POST',
headers: {
'X-API-Key': 'pk_live_tu_clave',
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: 'Landing page para una pizzeria con pedidos online',
agent: 'dev',
}),
})
const { id, poll_url } = await res.json()
console.log(`Generacion iniciada: ${id}`)
import requests
res = requests.post(
"https://plury.co/api/v1/generate",
headers={"X-API-Key": "pk_live_tu_clave"},
json={
"prompt": "Landing page para una pizzeria con pedidos online",
"agent": "dev",
},
)
data = res.json()
print(f"Generacion iniciada: {data['id']}")
Respuesta (202)
{
"id": "clx9abc123...",
"status": "processing",
"prompt": "Landing page para una pizzeria...",
"agent": "dev",
"poll_url": "/api/v1/generations/clx9abc123...",
"message": "Generation started. Poll the status endpoint or use webhook."
}
Consulta el estado y resultados de una generacion. Haz polling cada 3-5 segundos hasta que status sea "completed".
Ejemplo
curl https://plury.co/api/v1/generations/clx9abc123 \
-H "X-API-Key: pk_live_tu_clave"
Respuesta (200)
{
"id": "clx9abc123...",
"status": "completed",
"results": [
{
"id": "del_xyz...",
"title": "Landing Page - Pizzeria",
"type": "code",
"html": "<!DOCTYPE html>...",
"agent": "dev",
"version": 1,
"published_url": "https://plury.co/p/pizzeria-abc",
"created_at": "2026-03-07T10:30:00.000Z"
}
],
"tasks": [
{
"id": "task_1",
"title": "Disenar estructura HTML",
"agent": "dev",
"status": "done"
}
],
"credits_used": 15,
"created_at": "2026-03-07T10:29:00.000Z"
}
html contiene el codigo fuente completo listo para servir. El campo published_url es la URL publica si el entregable fue publicado.
Lista todas tus generaciones con paginacion.
Query params
| Param | Tipo | Default | Descripcion |
|---|---|---|---|
| limit | integer | 20 | Resultados por pagina (max 100) |
| offset | integer | 0 | Offset para paginacion |
Respuesta (200)
{
"data": [
{
"id": "clx9abc123...",
"title": "Landing page para una pizzeria...",
"status": "completed",
"deliverable_count": 1,
"created_at": "2026-03-07T10:29:00.000Z",
"updated_at": "2026-03-07T10:31:00.000Z"
}
],
"total": 42,
"limit": 20,
"offset": 0
}
Consulta tu balance de creditos y desglose de uso.
Respuesta (200)
{
"balance": 4250,
"plan": "agency",
"monthly_credits": 5000,
"consumed_this_cycle": 750,
"cycle_start": "2026-03-01T00:00:00.000Z",
"by_agent": { "dev": 500, "seo": 250 },
"by_model": { "claude-sonnet": 600, "claude-haiku": 150 }
}
Lista los agentes de IA disponibles con sus capacidades. No requiere autenticacion.
Retorna la especificacion OpenAPI 3.0 en formato JSON. Util para generar SDKs o importar en Postman.
Agentes disponibles
Cada agente esta especializado en un tipo de entregable. Usa el parametro agent en POST /generate.
Code (Logic)
Desarrollador full-stack. Genera apps web completas, landing pages, dashboards, e-commerce y formularios como SPAs con React.
Pixel (Nova)
Disenador visual. Crea logos, branding, posts para redes sociales y banners con generacion de imagenes IA.
Lupa
Estratega SEO. Keyword research, analisis de competencia, auditorias tecnicas y planes de posicionamiento.
Pluma
Escritor de contenido. Blog posts, secuencias de email, calendarios de redes sociales y copywriting.
Metric
Publicista digital. Planificacion de campanas, copywriting de ads, gestion de Meta Ads y segmentacion de audiencias.
Project API
Cada app generada por Plury tiene acceso a un backend completo a traves de window.__PROJECT_API.
Este objeto se inyecta automaticamente en las paginas publicadas y provee autenticacion, base de datos,
subida de archivos y roles de usuario — sin configuracion.
Referencia rapida
const api = window.__PROJECT_API
// Auth
await api.register({ email, password, displayName })
await api.login({ email, password })
api.logout()
api.getUser() // usuario actual o null
// CRUD
await api.from('products').select()
await api.from('products').insert({ name, price })
await api.from('products').update(id, { price: 29.99 })
await api.from('products').delete(id)
// Consultas avanzadas
await api.from('orders').select(null, { mine: true }) // solo mis filas
await api.from('orders').select(null, { expand: 'products' }) // join automatico
await api.from('products').count({ category: 'pizza' })
await api.from('orders').aggregate('total', 'sum')
// Archivos
await api.uploadFile(file) // retorna { url }
// Admin
await api.listUsers()
await api.setUserRole(userId, 'editor')
Project API: Autenticacion
Cada proyecto tiene su propio sistema de usuarios aislado. El primer usuario registrado es automaticamente admin.
Registro
const { token, user } = await api.register({
email: 'maria@ejemplo.com',
password: 'secreto123',
displayName: 'Maria Lopez',
})
// user.role sera 'admin' si es el primer usuario, 'user' para los demas
Login
const { token, user } = await api.login({
email: 'maria@ejemplo.com',
password: 'secreto123',
})
Usuario actual
const user = api.getUser()
// { id, email, displayName, role } o null si no esta logueado
Logout
api.logout() // limpia token y datos locales
Roles disponibles
| Rol | Descripcion |
|---|---|
| admin | Acceso completo. Puede listar usuarios y cambiar roles. |
| user | Puede leer/escribir datos. Rol por defecto. |
| editor | Puede leer/escribir datos (mismo nivel que user). |
| viewer | Solo lectura (depende de implementacion en el frontend). |
Project API: CRUD de datos
La Project API usa un modelo schemaless: puedes crear tablas y columnas al vuelo sin migraciones. Cada proyecto soporta hasta 10,000 filas en total.
Leer datos
// Todas las filas
const products = await api.from('products').select()
// Con filtros
const pizzas = await api.from('products').select({ category: 'pizza' })
// Fila individual
const product = await api.from('products').select({ id: 'abc123' })
Crear datos
const newProduct = await api.from('products').insert({
name: 'Pizza Margherita',
price: 12.99,
category: 'pizza',
available: true,
})
// retorna { id, name, price, category, available, user_id, _createdAt }
user_id se agrega automaticamente si el usuario esta autenticado. Esto permite usar mine: true para filtrar por usuario.
Actualizar datos
const updated = await api.from('products').update('abc123', {
price: 14.99,
available: false,
})
// merge: los campos no enviados se mantienen
Eliminar datos
await api.from('products').delete('abc123')
// retorna { deleted: true }
Project API: Subida de archivos
Sube imagenes, PDFs y otros archivos (max 10 MB). Formatos permitidos: jpg, png, gif, webp, svg, pdf, doc, docx, xls, xlsx, csv, txt, mp4, mp3.
const input = document.querySelector('input[type="file"]')
const file = input.files[0]
const { url } = await api.uploadFile(file)
// url: "https://plury.co/uploads/projects/1709847123-a1b2c3d4.jpg"
// Guardar la URL en una fila
await api.from('products').update(productId, { image: url })
Project API: Schema
Consulta o define la estructura de tablas. Esto es informativo — la base de datos es schemaless, pero el schema ayuda a los agentes de IA a generar codigo correcto.
Ver schema
// GET /api/project/:projectId/schema
// Retorna:
[
{
"tableName": "products",
"columns": [
{ "name": "name", "type": "string" },
{ "name": "price", "type": "number" },
{ "name": "category", "type": "string" }
]
}
]
Project API: Consultas avanzadas
Row-level security (mis datos)
// Solo retorna filas donde user_id === usuario actual
const myOrders = await api.from('orders').select(null, { mine: true })
Relaciones (expand / join)
// Expande la relacion: carga la categoria de cada producto
const products = await api.from('products').select(null, {
expand: 'categories'
})
// Cada producto tendra un campo _category con los datos de la categoria
// La FK se deduce automaticamente: category_id -> categories.id
Count
const { count } = await api.from('orders').count({ status: 'completed' })
// { count: 47 }
Agregaciones
// Suma
const { value } = await api.from('orders').aggregate('total', 'sum')
// Promedio
const { value } = await api.from('products').aggregate('price', 'avg')
// Operaciones disponibles: sum, avg, min, max
Paginacion y orden
// Via REST directo (usado internamente por el SDK):
// GET /api/project/:id/data/products?_sort=price&_order=asc&_limit=10&_offset=20
// Via SDK:
const page = await api.from('products').select(null, {
sort: 'price',
order: 'asc',
limit: 10,
offset: 20,
})
Admin: gestionar usuarios
// Solo accesible para usuarios con rol 'admin'
// Listar todos los usuarios del proyecto
const users = await api.listUsers()
// [{ id, email, displayName, role, createdAt }]
// Cambiar rol de un usuario
await api.setUserRole(userId, 'editor')
// Roles validos: admin, user, editor, viewer
Quickstart
Genera tu primera landing page en 3 pasos:
1. Obtener API key
Ve a plury.co → Configuracion → API Keys → Crear clave.
2. Iniciar generacion
curl -X POST https://plury.co/api/v1/generate \
-H "X-API-Key: pk_live_tu_clave" \
-H "Content-Type: application/json" \
-d '{"prompt": "Landing page para un gimnasio con horarios y precios"}'
3. Consultar resultado
# Espera 10-30 segundos y consulta:
curl https://plury.co/api/v1/generations/TU_ID \
-H "X-API-Key: pk_live_tu_clave"
# Cuando status sea "completed", el campo results[0].html
# contiene el codigo HTML completo listo para usar.
Ejemplos completos
Generar y esperar resultado (JavaScript)
const API_KEY = 'pk_live_tu_clave'
const BASE = 'https://plury.co/api/v1'
async function generate(prompt, agent = 'dev') {
// 1. Iniciar generacion
const res = await fetch(`${BASE}/generate`, {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({ prompt, agent }),
})
const { id } = await res.json()
console.log(`Generando... ID: ${id}`)
// 2. Poll hasta completar
while (true) {
await new Promise(r => setTimeout(r, 5000))
const poll = await fetch(`${BASE}/generations/${id}`, {
headers: { 'X-API-Key': API_KEY },
})
const data = await poll.json()
if (data.status === 'completed') {
console.log(`Listo! ${data.results.length} entregable(s)`)
console.log(`Creditos usados: ${data.credits_used}`)
return data
}
console.log('Procesando...')
}
}
// Uso
const result = await generate(
'Landing page para un restaurante mexicano con menu y reservas'
)
console.log(result.results[0].html) // HTML completo
Monitorear creditos (Python)
import requests
API_KEY = "pk_live_tu_clave"
headers = {"X-API-Key": API_KEY}
usage = requests.get(
"https://plury.co/api/v1/usage",
headers=headers,
).json()
print(f"Balance: {usage['balance']} creditos")
print(f"Plan: {usage['plan']}")
print(f"Consumidos este ciclo: {usage['consumed_this_cycle']}")
for agent, credits in usage.get("by_agent", {}).items():
print(f" {agent}: {credits} creditos")
© 2026 Plury — plury.co