curl --request GET \
--url 'https://api.lovable.dev/v1/projects/project-id/publish/deployment-id' \
--header 'Lovable-API-Key: lov_your-api-key' \
--header 'Lovable-Version: 2026-09-11'{
"error_class": "transient",
"error_message": "<string>",
"id": "<string>",
"status": "running",
"url": "<string>"
}{
"detail": "validation failed",
"errors": [
{
"location": "body.members",
"message": "expected array length >= 1"
}
],
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 400,
"title": "Bad Request",
"type": "invalid_request"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 401,
"title": "Authorization header required",
"type": "unauthorized"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 402,
"title": "You need to upgrade your plan to access this feature",
"type": "payment_required"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 403,
"title": "You don't have the permissions to perform this action",
"type": "forbidden"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 404,
"title": "Not Found",
"type": "deployment_not_found"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 406,
"title": "This endpoint produces application/json. Send a matching Accept header, */*, or omit the header.",
"type": "not_acceptable"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 429,
"title": "Too Many Requests",
"type": "rate_limited"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 503,
"title": "Request timed out",
"type": "request_timeout"
}{
"detail": "validation failed",
"errors": [
{
"location": "body.workspace_id",
"message": "expected string"
}
],
"props": {
"finding_refs": [
"supabase/finding-1"
]
},
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 429,
"title": "Too Many Requests",
"type": "rate_limited"
}Get publish status
Plan: Business or higher
Scope: projects:read
Returns the status of an async publish started with POST /v1/projects//publish, keyed by the id it returned. Poll until deployment succeeds (url is set) or fails (error_message explains the failure). Poll no more than once every 2 seconds and honor Retry-After on 429 responses.
On failure, use error_class to choose the next action.
| error_class | Action |
|---|---|
| transient | Retry publishing with backoff and a bounded retry limit. |
| code | Fix the app code or SQL, then publish again. |
| configuration | Fix configuration committed in the project, such as an oversized file, then publish again. |
| data | Review the migration against production data. Obtain human approval before changing data, then publish again. |
| integration | Repair external credentials, quota, or the connected service, then publish again. |
| policy | Ask the workspace administrator to lift the blocking policy or approve the publish. |
| internal | Contact Lovable support with the deployment ID. |
If error_class is null or unrecognized, show error_message and contact support instead of automatically retrying.
curl --request GET \
--url 'https://api.lovable.dev/v1/projects/project-id/publish/deployment-id' \
--header 'Lovable-API-Key: lov_your-api-key' \
--header 'Lovable-Version: 2026-09-11'{
"error_class": "transient",
"error_message": "<string>",
"id": "<string>",
"status": "running",
"url": "<string>"
}{
"detail": "validation failed",
"errors": [
{
"location": "body.members",
"message": "expected array length >= 1"
}
],
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 400,
"title": "Bad Request",
"type": "invalid_request"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 401,
"title": "Authorization header required",
"type": "unauthorized"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 402,
"title": "You need to upgrade your plan to access this feature",
"type": "payment_required"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 403,
"title": "You don't have the permissions to perform this action",
"type": "forbidden"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 404,
"title": "Not Found",
"type": "deployment_not_found"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 406,
"title": "This endpoint produces application/json. Send a matching Accept header, */*, or omit the header.",
"type": "not_acceptable"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 429,
"title": "Too Many Requests",
"type": "rate_limited"
}{
"detail": null,
"errors": null,
"props": null,
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 503,
"title": "Request timed out",
"type": "request_timeout"
}{
"detail": "validation failed",
"errors": [
{
"location": "body.workspace_id",
"message": "expected string"
}
],
"props": {
"finding_refs": [
"supabase/finding-1"
]
},
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"status": 429,
"title": "Too Many Requests",
"type": "rate_limited"
}Authorizations
Lovable API key. Send its value in the Lovable-API-Key header.
Headers
Stable API version to serve, as a YYYY-MM-DD date. Omit for the oldest supported stable version, currently 2026-09-11.
Comma-separated beta revision strings to enable on top of the stable version.
Path Parameters
Project ID.
Deployment ID returned by POST /v1/projects/{project_id}/publish.
Response
OK
Where to address the failure; see the operation description for the action for each class. Null when no failure category is available. More values may be added; for unknown values, show error_message and contact support instead of automatically retrying.
transient, code, configuration, data, integration, policy, internal, null Human-readable reason for a deployment failure; null unless the deployment failed.
Deployment ID.
Deployment progress. running means the deployment was accepted and has not reported completion. completed means the deployment succeeded and url is set. unknown means the deployment exists but its workflow state has no recognized public mapping; it confirms neither success nor failure. Poll again with backoff and a bounded timeout, then report an indeterminate result if it persists. Unknown or mismatched deployment IDs return HTTP 404. Clients must tolerate new values.
running, completed, error, unknown URL produced by this successful deployment; null until this deployment succeeds, even when an older version is published.
Was this page helpful?