Plury API

Genera landing pages, apps web, logos, campanas de ads, auditorias SEO y mas usando agentes de IA especializados, todo via API REST.

Base URL: https://plury.co/api/v1 REST + JSON

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.

Las API keys requieren plan Agency ($149/mes) o Enterprise. Los planes Starter y Pro no tienen acceso a la API.

Rate Limits

Los limites se aplican por API key, por ventana de 1 hora:

PlanLimite/hora
Agency100 requests/hora
Enterprise500 requests/hora

Headers de respuesta incluidos en cada request:

HeaderDescripcion
X-RateLimit-LimitLimite total de la ventana
X-RateLimit-RemainingRequests restantes
Retry-AfterSegundos 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 invalida
  • 402 — Creditos insuficientes
  • 403 — Plan no soporta acceso API
  • 404 — Recurso no encontrado
  • 429 — Rate limit excedido
  • 500 — Error interno del servidor

Creditos

Cada generacion consume creditos de tu plan. El costo depende del agente y modelo usado:

RecursoCosto 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

POST /generate

Inicia una generacion asincrona. Retorna un ID para consultar el resultado.

Body (JSON)

CampoTipoDescripcion
promptstringrequeridoLo que quieres generar (min. 3 caracteres)
agentstringopcionalAgente a usar: dev, web, seo, content, ads. Default: dev
modelstringopcionalOverride del modelo LLM
webhook_urlstringopcionalURL para recibir el resultado via POST (proximamente)

Ejemplo

cURL
JavaScript
Python
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."
}
GET /generations/:id

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"
}
Tip: El campo html contiene el codigo fuente completo listo para servir. El campo published_url es la URL publica si el entregable fue publicado.
GET /generations

Lista todas tus generaciones con paginacion.

Query params

ParamTipoDefaultDescripcion
limitinteger20Resultados por pagina (max 100)
offsetinteger0Offset 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
}
GET /usage

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 }
}
GET /agents publico

Lista los agentes de IA disponibles con sus capacidades. No requiere autenticacion.

GET /docs publico

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)

agent: "dev"

Desarrollador full-stack. Genera apps web completas, landing pages, dashboards, e-commerce y formularios como SPAs con React.

Pixel (Nova)

agent: "web"

Disenador visual. Crea logos, branding, posts para redes sociales y banners con generacion de imagenes IA.

Lupa

agent: "seo"

Estratega SEO. Keyword research, analisis de competencia, auditorias tecnicas y planes de posicionamiento.

Pluma

agent: "content"

Escritor de contenido. Blog posts, secuencias de email, calendarios de redes sociales y copywriting.

Metric

agent: "ads"

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.

Nota: La Project API esta disenada para usarse dentro de las apps generadas por Plury. No es una API REST externa — se accede via el SDK JavaScript inyectado en cada pagina publicada.

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

RolDescripcion
adminAcceso completo. Puede listar usuarios y cambiar roles.
userPuede leer/escribir datos. Rol por defecto.
editorPuede leer/escribir datos (mismo nivel que user).
viewerSolo 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 }
Tip: El campo 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