Introducción

La API REST de DeployFast te permite controlar toda tu infraestructura desde scripts, pipelines CI/CD o agentes de IA. Puedes gestionar proyectos, disparar deploys, leer logs, configurar variables de entorno y manejar bases de datos.

URL base: https://deployfast.app/api/v1

Autenticación

Todas las peticiones deben incluir una API Key en el header Authorization. Genera tus claves en Mi cuenta → API Keys.

Authorization: Bearer dfk_live_a3f8c21e9b047d6e...

Tipos de clave

readMétodos: GETUso: Monitorización, dashboards
read+writeMétodos: GET, POST, PUT, DELETEUso: Agentes IA, CI/CD

Errores de autenticación

401API key inválida, revocada o expirada
403La clave no tiene scope write para esta operación

Quick start

Despliega un proyecto en 4 comandos:

# 1. Obtén tu API key en /account → API Keys

# 2. Crea un proyecto
curl -X POST https://deployfast.app/api/v1/projects \
  -H "Authorization: Bearer $DEPLOYFAST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"mi-app","repoUrl":"https://github.com/tu/repo","branch":"main"}'

# 3. Dispara el primer deploy
curl -X POST https://deployfast.app/api/v1/projects/{id}/deploy \
  -H "Authorization: Bearer $DEPLOYFAST_KEY"

# 4. Consulta el estado
curl https://deployfast.app/api/v1/deployments/{deploymentId} \
  -H "Authorization: Bearer $DEPLOYFAST_KEY"
# → {"status":"SUCCESS","url":"https://mi-app--usuario.deployfast.app"}

Referencia de endpoints

Cuenta

GET
/me

Info del usuario autenticado: email, plan, límites

Proyectos

GET
/projects

Listar todos los proyectos con último deploy

GET
/projects/:id

Detalle del proyecto

POST
/projects

Crear proyecto (name, repoUrl, branch, rootDir)· requiere scope write

DELETE
/projects/:id

Eliminar proyecto (soft delete)· requiere scope write

Deployments

GET
/projects/:id/deployments

Historial paginado (?page=1&limit=20)

POST
/projects/:id/deploy

Disparar deploy (?body: branch opcional)· requiere scope write

GET
/deployments/:id

Estado de un deploy (QUEUED/BUILDING/SUCCESS/FAILED)

GET
/deployments/:id/logs

Últimas N líneas de log (?lines=100, max 500)

POST
/deployments/:id/rollback

Rollback a un deploy SUCCESS· requiere scope write

Variables de entorno

GET
/projects/:id/env

Listar claves (sin valores, por seguridad)

PUT
/projects/:id/env/:key

Crear o actualizar variable (body: value, environment)· requiere scope write

DELETE
/projects/:id/env/:key

Eliminar variable (?environment=PRODUCTION)· requiere scope write

Bases de datos

GET
/databases

Listar bases de datos del usuario

GET
/databases/:id

Detalle de una base de datos

POST
/databases

Crear base de datos (name, engine: POSTGRES|REDIS)· requiere scope write

POST
/databases/:id/start

Arrancar base de datos· requiere scope write

POST
/databases/:id/stop

Parar base de datos· requiere scope write

Ejemplos

Node.js — Trigger de deploy y esperar resultado

const KEY = process.env.DEPLOYFAST_KEY;
const BASE = 'https://deployfast.app/api/v1';

async function deployAndWait(projectId) {
  // 1. Disparar deploy
  const { data: deployment } = await fetch(`${BASE}/projects/${projectId}/deploy`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${KEY}` },
  }).then(r => r.json());

  // 2. Polling cada 5s hasta que termine
  while (true) {
    await new Promise(r => setTimeout(r, 5000));
    const { data } = await fetch(`${BASE}/deployments/${deployment.id}`, {
      headers: { Authorization: `Bearer ${KEY}` },
    }).then(r => r.json());

    if (data.status === 'SUCCESS') {
      console.log('✓ Deploy completado:', data.url);
      return data;
    }
    if (data.status === 'FAILED') {
      throw new Error('Deploy fallido');
    }
    console.log('⠸ Estado:', data.status);
  }
}

Python — Listar proyectos y estado

import os, requests

KEY = os.environ['DEPLOYFAST_KEY']
BASE = 'https://deployfast.app/api/v1'
HEADERS = {'Authorization': f'Bearer {KEY}'}

# Listar proyectos
projects = requests.get(f'{BASE}/projects', headers=HEADERS).json()
for p in projects:
    last = p['deployments'][0] if p['deployments'] else None
    status = last['status'] if last else 'sin deploys'
    print(f"{p['name']:30} {status}")

GitHub Actions — Deploy automático en merge a main

name: Deploy to DeployFast
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger deploy
        run: |
          RESPONSE=$(curl -s -X POST \
            https://deployfast.app/api/v1/projects/${{ vars.PROJECT_ID }}/deploy \
            -H "Authorization: Bearer ${{ secrets.DEPLOYFAST_KEY }}")
          echo "Deploy ID: $(echo $RESPONSE | jq -r .id)"

      - name: Wait for deploy
        run: |
          while true; do
            STATUS=$(curl -s \
              https://deployfast.app/api/v1/deployments/$DEPLOY_ID \
              -H "Authorization: Bearer ${{ secrets.DEPLOYFAST_KEY }}" | jq -r .status)
            echo "Status: $STATUS"
            [ "$STATUS" = "SUCCESS" ] && exit 0
            [ "$STATUS" = "FAILED" ] && exit 1
            sleep 5
          done

Post-deploy command

Configura un comando que se ejecuta dentro del contenedor recién arrancado, justo después de que el deploy sea exitoso. Ideal para migraciones de base de datos, seeding o cualquier tarea de inicialización.

Cómo configurarlo

  1. Ve a /projects/:id/settings
  2. Sección "Pipeline" → "Post-deploy command"
  3. Escribe el comando y guarda
# Migraciones con Prisma
npx prisma migrate deploy

# Migraciones con Django
python manage.py migrate

# Seed de base de datos
npm run db:seed

# Múltiples comandos
npx prisma migrate deploy && npm run db:seed

El output aparece en el stream de logs del deployment en tiempo real.

Si falla (exit code ≠ 0), el deployment queda en FAILED y no se ejecuta el smoke test.

Smoke test automático

Después de cada deploy exitoso, DeployFast hace un GET a tu app para verificar que responde con HTTP 2xx. Si no responde correctamente, el deployment queda en DEGRADED en lugar de SUCCESS. El contenedor sigue corriendo — solo es un aviso.

Flujo de estados

BUILDINGSUCCESS → smoke test → SUCCESS ✓ o DEGRADED ⚠

Configurar Health Check URL

Por defecto el smoke test llama a la URL raíz. Para usar un endpoint específico: /projects/:id/settings → Pipeline → Health Check URL.

Ejemplo de endpoint /health

// Express
app.get('/health', (req, res) => res.json({ ok: true }));

# FastAPI
@app.get('/health')
def health(): return {'ok': True}

# Django (urls.py)
path('health', lambda r: JsonResponse({'ok': True})),
⚠️ Un deployment DEGRADED no interrumpe el servicio — el contenedor sigue corriendo. Revisa los logs para más detalles.

Para agentes de IA

DeployFast está diseñado para ser usado por agentes de IA como Cursor, Claude o Windsurf. Dale tu API key al agente y podrá gestionar tus deploys directamente desde el editor.

Cursor / Windsurf

Añade esto a tu configuración del agente:

DEPLOYFAST_KEY=dfk_live_tu_clave_aqui

Y dale este contexto al agente:

Tienes acceso a DeployFast via API en https://deployfast.app/api/v1
Authorization: Bearer $DEPLOYFAST_KEY

Puedes:
- Listar proyectos: GET /projects
- Ver estado del último deploy: GET /projects/:id
- Hacer deploy: POST /projects/:id/deploy
- Ver logs si falla: GET /deployments/:id/logs?lines=100
- Rollback: POST /deployments/:id/rollback
- Gestionar env vars: PUT /projects/:id/env/:KEY

Claude (MCP / Tools)

Ejemplo de herramienta para Claude:

{
  "name": "deployfast_deploy",
  "description": "Dispara un deploy en DeployFast para un proyecto",
  "parameters": {
    "project_id": { "type": "string", "description": "ID del proyecto" },
    "branch": { "type": "string", "description": "Rama a desplegar (default: main)" }
  }
}

Principio de mínimo privilegio

Para agentes IA de monitorización, crea una clave de solo lectura. Solo usa claves con escritura cuando el agente necesite hacer deploys activamente.

HTTPS & reverse proxy

DeployFast termina TLS en el edge (nginx) y reenvía las peticiones a tu contenedor por HTTP interno. Tu app recibe las cabeceras X-Forwarded-Proto, X-Forwarded-Host y X-Forwarded-For con los valores reales. Para que tu framework confíe en ellas debes indicárselo explícitamente.

Síntoma más frecuente

Tu app genera URLs http:// en producción (redirecciones, assets, links) aunque esté servida por https://. Esto rompe CSS, imágenes y provoca bucles de redirect.

FastAPI / Starlette ✓ automático

DeployFast inyecta --proxy-headers --forwarded-allow-ips=* automáticamente en el comando uvicorn. No necesitas hacer nada.

# start command generado automáticamente:
uvicorn main:app --host 0.0.0.0 --port 3000 --proxy-headers --forwarded-allow-ips=*

Flask / Gunicorn

# En tu app Flask (app.py)
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

Django

Añade estas variables de entorno en Settings → Env Vars:

SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https
USE_X_FORWARDED_HOST=True

Express / Node.js

// En tu app Express
app.set('trust proxy', true);

// O con variable de entorno (sin tocar código):
// TRUST_PROXY=1  →  añádela en Settings → Env Vars
// y en tu app:
if (process.env.TRUST_PROXY) app.set('trust proxy', true);

Rails

# config/environments/production.rb
config.force_ssl = true
config.action_dispatch.trusted_proxies = [ "127.0.0.1", ::1 ]

Cabeceras que envía el edge de DeployFast

X-Forwarded-Proto: https

X-Forwarded-Host: tu-app.deployfast.app

X-Forwarded-For: <IP real del cliente>

X-Forwarded-Port: 443

X-Real-IP: <IP real del cliente>

Bases de datos vía API

Crea y gestiona bases de datos PostgreSQL y Redis directamente desde tu código o agente.

# Crear una base de datos PostgreSQL
curl -X POST https://deployfast.app/api/v1/databases \
  -H "Authorization: Bearer $DEPLOYFAST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"mi-postgres","engine":"POSTGRES","version":"16"}'
# → {"id":"db_xxx","status":"PROVISIONING",...}

# Consultar estado (esperar RUNNING)
curl https://deployfast.app/api/v1/databases/db_xxx \
  -H "Authorization: Bearer $DEPLOYFAST_KEY"
# → {"status":"RUNNING","internalHost":"postgres-mi-postgres.user-42.internal",...}