프로젝트를 빌드하고 배포합니다.
프로젝트 게시
플랜:
Business 이상
스코프: projects:write
프로젝트를 빌드하고 배포합니다. 이 엔드포인트는 202와 Deployment 표현을 반환합니다. 처음 상태는 running이고 url 및 오류 필드는 null입니다. 배포가 끝날 때까지 GET /v1/projects/{project_id}/publish/{deployment_id}를 poll하세요.
필요하면 audience로 게시된 앱을 열 수 있는 대상을 선택할 수 있습니다. 프로젝트 읽기 응답에서는 이 값이 publish_audience로 보고됩니다. audience를 생략하면 현재 설정을 유지합니다. audience 변경은 새 배포가 끝나기 전에 현재 게시된 버전에 즉시 적용됩니다. 앱을 다시 빌드하지 않고 접근 설정만 바꾸려면 PATCH /v1/projects/{project_id}/publish를 사용합니다. 앱을 오프라인으로 전환하려면 DELETE /v1/projects/{project_id}/publish를 사용합니다.
OpenAPI
| 항목 | 값 |
|---|---|
| Method | POST |
| Path | /v1/projects/{project_id}/publish |
| Operation ID | publishProject |
| Source spec | https://api.lovable.dev/v1/openapi.yaml |
| Local snapshot | YAML 스냅샷 (SHA-256: 2207bf766a00ae7f62efa6f199f565cd2d67ef91296d8ba7b91b26fe838c4685) |
POST /v1/projects/{project_id}/publish인증
Lovable-API-Key: lov_your-api-key 또는 Authorization: Bearer <key>를 보냅니다. 이 엔드포인트는 projects:write 스코프가 필요합니다.
매개변수
| 이름 | 위치 | 필수 | 타입 | 설명 |
|---|---|---|---|---|
project_id | path | 예 | string | 프로젝트 ID입니다. |
Lovable-Version | header | 아니요 | string | 제공받을 안정 API 버전입니다. YYYY-MM-DD 날짜 형식으로 보냅니다. 생략하면 현재 가장 오래된 지원 안정 버전인 2026-09-11이 사용됩니다. |
Lovable-Beta | header | 아니요 | string | 안정 버전 위에 활성화할 베타 리비전 문자열입니다. 여러 개는 쉼표로 구분합니다. |
요청 본문
요청 본문은 필수입니다. Content-Type은 application/json입니다. 본문은 PublishProjectRequest 스키마를 사용합니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
name | string | 아니요 | 관리형 게시 URL의 slug입니다. 예를 들어 acme-landing-page는 https://acme-landing-page.lovable.app을 만듭니다. 커스텀 도메인과 워크스페이스 브랜딩은 hostname을 바꿀 수 있습니다. |
audience | string | 아니요 | 게시된 앱을 열 수 있는 대상입니다. public, workspace, custom 중 하나입니다. 프로젝트 읽기 응답에서는 publish_audience로 보고됩니다. UI에서 관리하는 기존 grant를 포함한 custom audience를 사용할 수 있습니다. 생략하면 현재 설정을 유지합니다. |
audience_targets | PublishAudienceTarget[] | 아니요 | 앱을 열 수 있는 그룹입니다. audience가 custom일 때만 허용됩니다. 목록을 제공하면 모든 그룹 및 사용자 grant를 대체하고 워크스페이스 전체 접근을 제거합니다. 빈 목록은 해당 grant를 제거합니다. UI에서 관리하는 기존 조직 접근과 이메일 초대는 보존됩니다. 생략하면 audience 변경 중에도 저장된 target을 유지합니다. custom 모드 밖에서는 target이 비활성입니다. null은 허용되지 않습니다. 최대 100개까지 보낼 수 있습니다. |
PublishAudienceTarget은 type과 id를 필수로 가집니다. 현재 type은 group만 지원하며 id는 GET /v1/workspaces/{workspace_id}/groups가 반환한 그룹 ID입니다. id는 빈 문자열일 수 없으며(minLength: 1), audience_targets는 최대 100개까지 보낼 수 있습니다.
예시
curl --request POST \
--url 'https://api.lovable.dev/v1/projects/project-id/publish' \
--header 'Lovable-API-Key: lov_your-api-key' \
--header 'Lovable-Version: 2026-09-11' \
--header 'Content-Type: application/json' \
--data '{}'const response = await fetch("https://api.lovable.dev/v1/projects/project-id/publish", {
method: "POST",
headers: {
"Lovable-API-Key": process.env.LOVABLE_API_KEY ?? "lov_your-api-key",
"Lovable-Version": "2026-09-11",
"Content-Type": "application/json",
},
body: JSON.stringify({}),
});
if (!response.ok) {
throw new Error(`Lovable API ${response.status}: ${await response.text()}`);
}
console.log(await response.json());응답
| 상태 | 본문 | 설명 |
|---|---|---|
202 | Deployment | 배포가 시작되었습니다. 반환된 id를 사용해 Location 헤더의 GET /v1/projects/{project_id}/publish/{deployment_id}를 poll합니다. |
400 | ErrorResponse | 요청 본문 또는 매개변수 형식이 잘못되었거나 검증에 실패했습니다. |
401 | ErrorResponse | API 키, 세션 토큰 또는 OAuth access token이 없거나 유효하지 않습니다. |
402 | ErrorResponse | Public API 접근에는 Business 이상 플랜이 필요합니다. |
403 | ErrorResponse | 키 또는 호출자에게 필요한 스코프나 권한이 없습니다. |
404 | ErrorResponse | 프로젝트가 존재하지 않거나 삭제되었거나 인증된 클라이언트가 접근할 수 없습니다. |
406 | ErrorResponse | Accept 헤더가 이 엔드포인트가 생성하는 모든 미디어 타입을 제외합니다. |
429 | ErrorResponse | 요청이 너무 많습니다. Retry-After가 있으면 해당 간격 뒤에 재시도합니다. |
503 | ErrorResponse | 서비스를 일시적으로 사용할 수 없거나 처리 기한이 만료되었습니다. 변이가 완료될 수 있으므로 재시도 전에 리소스 상태를 확인하세요. |
default | ErrorResponse | 오류입니다. 응답 본문은 표준 오류 envelope을 사용하며 status는 HTTP 상태 코드와 같고 type은 machine-readable 오류 코드입니다. |
응답 헤더
모든 응답에는 상황에 따라 다음 공통 헤더가 포함될 수 있습니다: Lovable-Version, Lovable-Beta, X-Request-Id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-Lovable-Unknown-Query-Params, X-Lovable-Unknown-Query-Params-Omitted. X-Lovable-Unknown-Query-Params는 이 작업이 선언하지 않은 query parameter가 있을 때 URL escape된 이름을 최대 20개까지 쉼표로 제공하며, 20개를 넘으면 X-Lovable-Unknown-Query-Params-Omitted가 누락된 개수(minimum: 1)를 제공합니다. 401 응답은 string인 WWW-Authenticate를, 429 응답은 integer인 Retry-After를 포함합니다. Retry-After는 minimum: 1입니다. X-RateLimit-Reset은 지연 시간이 아니라 Unix timestamp 초 단위입니다.
POST /v1/projects/{project_id}/publish의 202 응답은 추가로 string인 Location 헤더를 제공하며, 이 값은 반환된 deployment 상태를 poll할 GET /v1/projects/{project_id}/publish/{deployment_id} URL입니다.
스키마
PublishAudienceTarget
| 필드 | 타입 | 필수 | 제약 | 설명 |
|---|---|---|---|---|
type | string | 예 | enum: group | 대상 유형입니다. 현재 그룹만 설정할 수 있습니다. |
id | string | 예 | minLength: 1 | GET /v1/workspaces/{workspace_id}/groups가 반환한 그룹 ID입니다. |
Deployment 응답 스키마는 게시 상태 조회와 같습니다. id, status, url, error_message, error_class는 모두 필수 필드입니다. status는 running, completed, error, unknown 값을 사용할 수 있으며 클라이언트는 새 값을 허용해야 합니다. url, error_message, error_class는 값이 없으면 null입니다. error_class는 transient, code, configuration, data, integration, policy, internal, null 중 하나이며 새 값이 추가될 수 있습니다.
ErrorResponse
공통 오류 응답입니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
detail | `string \ | null` | 예 |
errors | `array \ | null` | 예 |
props | `object \ | null` | 예 |
request_id | string | 예 | X-Request-Id 응답 헤더에서 반복되는 이 요청의 식별자입니다. |
status | integer | 예 | 본문에 반복되는 HTTP 상태 코드입니다. |
title | string | 예 | 사람이 읽을 수 있는 오류 요약입니다. |
type | string | 예 | 안정적인 machine-readable 오류 유형입니다. |
원본에 포함된 이 작업의 OpenAPI 스냅샷은 YAML 스냅샷 (SHA-256: 2207bf766a00ae7f62efa6f199f565cd2d67ef91296d8ba7b91b26fe838c4685)로 보존했습니다. 최신 전체 OpenAPI 계약은 https://api.lovable.dev/v1/openapi.yaml에서 확인할 수 있습니다.