Crear aplicación desde imagen
curl --request POST \
--url https://api.vertracloud.app/v1/apps/image \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"image_id": "<string>",
"name": "<string>",
"memory": 123,
"web": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({image_id: '<string>', name: '<string>', memory: 123, web: true})
};
fetch('https://api.vertracloud.app/v1/apps/image', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.vertracloud.app/v1/apps/image"
payload = {
"image_id": "<string>",
"name": "<string>",
"memory": 123,
"web": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vertracloud.app/v1/apps/image"
payload := strings.NewReader("{\n \"image_id\": \"<string>\",\n \"name\": \"<string>\",\n \"memory\": 123,\n \"web\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"response": {
"id": "app-abc123def456",
"name": "my-api-prod",
"status": "building",
"ram": 512,
"subdomain": "myapp.vertraweb.app",
"custom_image": {
"id": "app-abc123def456",
"name": "my-api-prod",
"version_id": null,
"outdated": false,
"image_id": "img-abc123def456",
"port": 3000
}
}
}
Aplicaciones
Crear aplicación desde imagen
Crea una aplicación que se ejecuta desde una imagen Docker personalizada.
POST
/
v1
/
apps
/
image
Crear aplicación desde imagen
curl --request POST \
--url https://api.vertracloud.app/v1/apps/image \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"image_id": "<string>",
"name": "<string>",
"memory": 123,
"web": true
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({image_id: '<string>', name: '<string>', memory: 123, web: true})
};
fetch('https://api.vertracloud.app/v1/apps/image', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.vertracloud.app/v1/apps/image"
payload = {
"image_id": "<string>",
"name": "<string>",
"memory": 123,
"web": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vertracloud.app/v1/apps/image"
payload := strings.NewReader("{\n \"image_id\": \"<string>\",\n \"name\": \"<string>\",\n \"memory\": 123,\n \"web\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"response": {
"id": "app-abc123def456",
"name": "my-api-prod",
"status": "building",
"ram": 512,
"subdomain": "myapp.vertraweb.app",
"custom_image": {
"id": "app-abc123def456",
"name": "my-api-prod",
"version_id": null,
"outdated": false,
"image_id": "img-abc123def456",
"port": 3000
}
}
}
La imagen debe estar lista (
status: "success"). Varias aplicaciones pueden compartir una misma imagen, cada una con sus propias variables. El lenguaje, la versión, el archivo principal y los comandos de inicio y de build no se aplican: vienen de la imagen. Necesita el scope apps:write cuando se llama con una clave de API. Consulta Imágenes Docker personalizadas.
string
requerido
El ID de la imagen desde la que se ejecuta la aplicación.
string
requerido
El nombre visible de la aplicación. Máximo 50 caracteres.
integer
requerido
La cantidad de RAM que se asigna, en MB.
string
Una descripción de la aplicación.
boolean
requerido
true publica la aplicación en la web (aplican subdomain y port). false crea una aplicación sin tráfico, como un bot o un worker.string
El subdominio de la aplicación. Envía
random para que la plataforma elija uno. Solo con web: true.integer
El puerto en el que escucha la aplicación. Solo con
web: true. Por defecto: el primer EXPOSE del Dockerfile de la imagen, o 80. La plataforma lo inyecta como la variable de entorno PORT.object[]
Variables de entorno, cada una con
key, value y un note opcional. Longitud máxima de la clave 255, del valor 3072 y de la nota 50.string
El workspace que se asocia a la aplicación.
Respuesta
La creación es asíncrona: la respuesta es202 Accepted con la aplicación en status: "building" y custom_image rellenado (image_id, port, version_id, outdated). La aplicación tiene los mismos campos que en Crear aplicación. Después, consulta los Detalles de la aplicación hasta que status sea up o down.
{
"response": {
"id": "app-abc123def456",
"name": "my-api-prod",
"status": "building",
"ram": 512,
"subdomain": "myapp.vertraweb.app",
"custom_image": {
"id": "app-abc123def456",
"name": "my-api-prod",
"version_id": null,
"outdated": false,
"image_id": "img-abc123def456",
"port": 3000
}
}
}
Respuestas de error
string
El código de error que indica el motivo del fallo. Valores posibles:
API_KEY_SCOPE_DENIED: La clave de API no tiene el scopeapps:write(403).VALIDATION_ERROR: El cuerpo no superó la validación (400).IMAGE_NOT_FOUND: La imagen no existe o no tienes acceso a ella (404).IMAGE_NOT_READY: La imagen todavía no tiene ningún build correcto (409).MAX_APPS_REACHED: Se alcanzó el límite de aplicaciones del plan (403).MEMORY_BELOW_MINIMUM,MEMORY_LIMIT_EXCEEDED: La memoria está por debajo del mínimo o por encima de lo que aún tiene el plan (400).SUBDOMAIN_TAKEN,SUBDOMAIN_FORBIDDEN: El subdominio está en uso o reservado (409,400).PLAN_DOES_NOT_SUPPORT_WEB_PUBLISH:web: trueen un plan sin publicación web (403).DEPLOY_RATE_LIMITED: Se alcanzó el presupuesto de despliegues por hora de la cuenta (429).INTERNAL_SERVER_ERROR: Error inesperado (500).
{
"code": "IMAGE_NOT_READY"
}
Última modificación el 28 de octubre de 2026