TL;DR
Las API de DigitalOcean gestionan droplets, volúmenes, firewalls, balanceadores de carga, clústeres de Kubernetes y más. Autentícate con tokens de acceso personal, llama a api.digitalocean.com/v2 y gestiona los límites de tasa. Para realizar pruebas, usa Apidog para validar configuraciones, probar el aprovisionamiento de infraestructura y documentar tus flujos de trabajo de automatización.
Introducción
DigitalOcean simplifica la computación en la nube. Mientras que AWS y GCP ofrecen cientos de servicios, DigitalOcean se centra en lo esencial: computación (droplets), almacenamiento (volúmenes), redes (IP flotantes, firewalls), Kubernetes gestionado y plataforma de aplicaciones. La API coincide con esta simplicidad.
Los desarrolladores utilizan la API de DigitalOcean para:
- Levantar entornos de desarrollo automáticamente
- Gestionar clústeres de Kubernetes
- Infraestructura como código con Terraform o Pulumi
- Aprovisionamiento de pipelines de CI/CD
- Implementaciones multirregionales
Autenticación
Tokens de acceso personal
- Ve al Panel de DigitalOcean → API → Generar nuevo token
- Nombra el token y establece la expiración
- Copia y almacena de forma segura
Usando el token:
curl -X GET "https://api.digitalocean.com/v2/account" \
-H "Authorization: Bearer YOUR_TOKEN"
Formato de respuesta
{
"account": {
"droplet_limit": 25,
"email": "you@example.com",
"name": "Your Name",
"uuid": "abc123xyz",
"email_verified": true,
"status": "active"
}
}
Droplets (máquinas virtuales)
Listar todos los droplets
curl -X GET "https://api.digitalocean.com/v2/droplets" \
-H "Authorization: Bearer YOUR_TOKEN"
Crear un droplet
curl -X POST "https://api.digitalocean.com/v2/droplets" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-droplet",
"region": "nyc1",
"size": "s-2vcpu-4gb",
"image": "ubuntu-20-04-x64",
"ssh_keys": ["ssh-rsa AAAA..."],
"backups": false,
"ipv6": true,
"tags": ["web", "production"]
}'
Tamaños populares:
s-1vcpu-1gb- 1 vCPU, 1GB RAM ($5/mes)s-2vcpu-2gb- 2 vCPU, 2GB RAM ($10/mes)s-2vcpu-4gb- 2 vCPU, 4GB RAM ($20/mes)s-4vcpu-8gb- 4 vCPU, 8GB RAM ($40/mes)
Regiones:
nyc1,nyc3- Nueva Yorksfo3- San Franciscoams3- Ámsterdamsgp1- Singapur
Obtener detalles del droplet
curl -X GET "https://api.digitalocean.com/v2/droplets/DROPLET_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
Eliminar un droplet
curl -X DELETE "https://api.digitalocean.com/v2/droplets/DROPLET_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
Acciones de droplet
Reiniciar:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "reboot"
}'
Redimensionar:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "resize",
"size": "s-4vcpu-8gb"
}'
Instantánea:
curl -X POST "https://api.digitalocean.com/v2/droplets/DROPLET_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "snapshot",
"name": "my-snapshot"
}'
Volúmenes (almacenamiento en bloque)
Crear un volumen
curl -X POST "https://api.digitalocean.com/v2/volumes" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"size_gigabytes": 100,
"name": "my-volume",
"region": "nyc1",
"description": "Data volume for web servers"
}'
Adjuntar volumen a droplet
curl -X POST "https://api.digitalocean.com/v2/volumes/VOLUME_ID/actions" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "attach",
"droplet_id": DROPLET_ID
}'
Listar volúmenes
curl -X GET "https://api.digitalocean.com/v2/volumes" \
-H "Authorization: Bearer YOUR_TOKEN"
Redes
Listar IPs flotantes
curl -X GET "https://api.digitalocean.com/v2/floating_ips" \
-H "Authorization: Bearer YOUR_TOKEN"
Asignar IP flotante
curl -X POST "https://api.digitalocean.com/v2/floating_ips" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"droplet_id": DROPLET_ID,
"region": "nyc1"
}'
Crear firewall
curl -X POST "https://api.digitalocean.com/v2/firewalls" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "web-firewall",
"inbound_rules": [
{
"protocol": "tcp",
"ports": "80",
"sources": {
"addresses": ["0.0.0.0/0"]
}
},
{
"protocol": "tcp",
"ports": "443",
"sources": {
"addresses": ["0.0.0.0/0"]
}
},
{
"protocol": "tcp",
"ports": "22",
"sources": {
"addresses": ["your-ip/32"]
}
}
],
"outbound_rules": [
{
"protocol": "tcp",
"ports": "80",
"destinations": {
"addresses": ["0.0.0.0/0"]
}
}
],
"droplet_ids": [DROPLET_ID]
}'
Balanceadores de carga
Crear un balanceador de carga
curl -X POST "https://api.digitalocean.com/v2/load_balancers" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-lb",
"region": "nyc1",
"algorithm": "round_robin",
"health_check": {
"protocol": "http",
"port": 80,
"path": "/",
"check_interval_seconds": 10,
"response_timeout_seconds": 5,
"healthy_threshold": 3,
"unhealthy_threshold": 3
},
"forwarding_rules": [
{
"entry_protocol": "http",
"entry_port": 80,
"target_protocol": "http",
"target_port": 80
},
{
"entry_protocol": "https",
"entry_port": 443,
"target_protocol": "https",
"target_port": 443,
"tls_passthrough": true
}
],
"droplet_ids": [DROPLET_ID_1, DROPLET_ID_2]
}'
Clústeres de Kubernetes
Crear un clúster de Kubernetes
curl -X POST "https://api.digitalocean.com/v2/kubernetes/clusters" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "my-cluster",
"region": "nyc1",
"version": "1.28",
"node_pools": [
{
"name": "worker-pool",
"size": "s-2vcpu-4gb",
"count": 3,
"auto_scale": true,
"min_nodes": 2,
"max_nodes": 6
}
]
}'
Listar pools de nodos
curl -X GET "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/node_pools" \
-H "Authorization: Bearer YOUR_TOKEN"
Escalar pool de nodos
curl -X PUT "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/node_pools/POOL_ID" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"count": 5
}'
Eliminar clúster
curl -X DELETE "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID" \
-H "Authorization: Bearer YOUR_TOKEN"
Probando con Apidog
El aprovisionamiento de infraestructura es costoso. Prueba a fondo antes de crear recursos.

1. Configuración del entorno
DIGITALOCEAN_TOKEN: your_token
BASE_URL: https://api.digitalocean.com/v2
DEFAULT_REGION: nyc1
DEFAULT_SIZE: s-2vcpu-4gb
2. Validar respuestas
pm.test('Droplet created successfully', () => {
const response = pm.response.json()
pm.expect(response.droplet).to.have.property('id')
pm.expect(response.droplet.status).to.eql('new')
})
pm.test('Token is valid', () => {
const response = pm.response.json()
pm.expect(response.account).to.exist
pm.expect(response.account.status).to.eql('active')
})
3. Conceptos de "Dry Run" (ejecución en seco)
DigitalOcean no ofrece ejecuciones en seco reales, pero puedes validar las entradas:
const validRegions = ['nyc1', 'sfo3', 'ams3', 'sgp1']
const validSizes = ['s-1vcpu-1gb', 's-2vcpu-2gb', 's-2vcpu-4gb']
pm.test('Region is valid', () => {
const requestBody = JSON.parse(pm.request.body.raw)
pm.expect(validRegions).to.include(requestBody.region)
})
pm.test('Size is valid', () => {
const requestBody = JSON.parse(pm.request.body.raw)
pm.expect(validSizes).to.include(requestBody.size)
})
Prueba las API de infraestructura de DigitalOcean con Apidog - gratis
Errores comunes y soluciones
401 No autorizado
Causa: Token inválido o expirado.
Solución: Regenera tu token desde el panel. Verifica el formato del encabezado de Autorización.
422 Entidad no procesable
Causa: Parámetros inválidos (región, tamaño, imagen incorrectos, etc.).
Solución: Consulta la documentación de la API de DigitalOcean para obtener valores válidos. Problemas comunes:
- La región no soporta el tamaño solicitado
- El ID de imagen no existe
- Se alcanzó el límite de droplets
429 Demasiadas solicitudes
Causa: Se excedió el límite de tasa (predeterminado 2000 solicitudes/hora).
Solución: Implementa una estrategia de retroceso (backoff):
async function doRequest(url, options, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await fetch(url, options)
if (response.status === 429) {
await sleep(Math.pow(2, i) * 1000)
continue
}
return response
}
throw new Error('Rate limited')
}
Límite de droplets alcanzado
Causa: La cuenta tiene demasiados droplets.
Solución: Elimina droplets no utilizados o solicita un aumento de límite al soporte.
Alternativas y comparaciones
| Característica | DigitalOcean | AWS | GCP |
|---|---|---|---|
| Tamaños de droplet | Fijos | Personalizados | Personalizados |
| Kubernetes | DOKS gestionado | EKS | GKE |
| Almacenamiento de objetos | Spaces | S3 | Cloud Storage |
| Almacenamiento en bloque | Volúmenes | EBS | Persistent Disk |
| Balanceadores de carga | Integrados | ELB | Cloud Load Balancing |
| Nivel gratuito | $200 de crédito | Limitado | $300 de crédito |
| Simplicidad de la API | ★★★★★ | ★★☆☆☆ | ★★★☆☆ |
DigitalOcean gana en simplicidad. La API es sencilla, y la mayoría de las operaciones funcionan sin tener que lidiar con docenas de servicios anidados.
Casos de uso en el mundo real
Entornos de desarrollo. Una startup crea entornos de desarrollo aislados por rama. Cada PR activa llamadas a la API para crear un droplet con el código más reciente. Después de la fusión, el droplet se destruye. Los desarrolladores prueban en entornos similares a la producción sin configuración manual.
Servidores web con autoescalado. Una aplicación web monitorea la carga. Cuando la CPU excede el 70%, la API crea nuevos droplets y los añade al balanceador de carga. Cuando la carga disminuye, los droplets se destruyen. Los costos se mantienen bajos mientras el rendimiento se mantiene alto.
Clústeres de bases de datos. Un servicio de base de datos gestionada aprovisiona volúmenes primarios y de réplica en diferentes regiones. La API gestiona la configuración de replicación, la programación de copias de seguridad y la configuración de conmutación por error automáticamente.
Conclusión
Esto es lo que has aprendido:
- Autenticar con tokens de acceso personal
- Crear y gestionar droplets programáticamente
- Trabajar con volúmenes para almacenamiento persistente
- Configurar firewalls y balanceadores de carga
- Gestionar clústeres de Kubernetes
- Probar la infraestructura con Apidog antes del aprovisionamiento
Preguntas frecuentes
¿Cuánto cuesta un droplet?Los precios comienzan en $5/mes por 1 vCPU/1GB. Consulta la página de precios para las tarifas actuales. La facturación por horas está disponible.
¿Puedo usar claves SSH con droplets creados por la API?Sí. Incluye la huella digital de la clave SSH en el array ssh_keys al crear droplets.
¿Cuál es la diferencia entre volúmenes y Spaces?Los volúmenes son almacenamiento en bloque adjunto a los droplets. Spaces son almacenamiento de objetos (como S3). Usa volúmenes para bases de datos, Spaces para archivos.
¿Cómo obtengo la configuración de Kubernetes?
curl -X GET "https://api.digitalocean.com/v2/kubernetes/clusters/CLUSTER_ID/kubeconfig" \
-H "Authorization: Bearer YOUR_TOKEN"
¿Puedo redimensionar un droplet?Sí, usa la acción de redimensionar. Las reducciones de tamaño requieren un apagado. Las ampliaciones se pueden hacer mientras está en funcionamiento.
¿Cuál es la diferencia entre copias de seguridad y instantáneas?Las copias de seguridad son copias automáticas semanales/diarias gestionadas por DigitalOcean. Las instantáneas son imágenes manuales bajo demanda que tú creas.
¿Cuánto tiempo tardan en crearse los droplets?Generalmente 30-60 segundos. Algunas regiones y tamaños pueden tardar más.
¿Puedo usar Terraform con DigitalOcean?Sí. DigitalOcean tiene un proveedor oficial de Terraform. Es excelente para la infraestructura como código.
