> ## Documentation Index
> Fetch the complete documentation index at: https://www.octoparse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Data App 게시

> api 형 App 원샷 게시 설탕. 계약 가져오기 동선이 후속.

<Warning>
  **비권장.** 제출은 포털 계약 가져오기 마법사(assemble-contract 엔드포인트 기반)로. 신규는 그쪽.
</Warning>

**`POST`** `https://api-datahub.octoparse.com/v1/data-apps`

인증: API 키 필요(`Authorization: Bearer <API Key>`).

api 형(선언적) App용 원샷 게시 설탕: 내부는 식별자 생성 → 워크스페이스 저장 → Build 생성 → Release 생성 원자 체인.

**버전은 게시 액션이 결정**: 기본은 현재 최대 버전 patch +1(처음은 `0.1.0`). 제출물에 버전 번호 불필요·불가(템플릿·수동 stale 값 방지).

네임스페이스는 인증에서 추론: 매니페스트 `identity.app_name`은 App 이름만. App은 게시자 본인 (user, app name) 아래에 둠. `app_id`는 한 번 발급되며 사용자명·App 이름 변경 후에도 유지.

## 요청

### 요청 body

<ParamField body="manifest" type="string" required>
  원시 매니페스트 텍스트.
</ParamField>

<ParamField body="files" type="object">
  첨부 파일.
</ParamField>

<ParamField body="secrets" type="object">
  시크릿 이름→평문 맵.
</ParamField>

### 요청 예시

```bash theme={null}
curl -X POST \
  -H "Authorization: Bearer $OCTOPARSE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"manifest": "spec_version: \"0.2\"\n…", "secrets": {"EXAMPLE_API_KEY": "sk-example"}}' \
  "https://api-datahub.octoparse.com/v1/data-apps"
```

## 응답

### 200 성공

```json theme={null}
{
  "data": {
    "app_id": "app_6dfe4e839ccf",
    "namespace": "carol",
    "app_name": "reviews-query",
    "version": "0.1.0",
    "build_id": "bld_a583f440a0ab",
    "published_at": "2026-09-15T08:00:00+00:00"
  }
}
```

페이로드는 `data`로 감쌉니다. 필드:

<ResponseField name="app_name" type="string" required>
  App 이름.
</ResponseField>

<ResponseField name="namespace" type="string">
  게시자 사용자 이름.
</ResponseField>

<ResponseField name="version" type="string">
  게시 버전 번호.
</ResponseField>

<ResponseField name="status" type="string">
  —
</ResponseField>

<ResponseField name="card" type="object" required>
  —
</ResponseField>

<ResponseField name="missing_secrets" type="string[]">
  —
</ResponseField>

<ResponseField name="name_reused_from" type="string">
  —
</ResponseField>

### 오류

| HTTP | `code`              | `category`      | 설명                                                  |
| ---- | ------------------- | --------------- | --------------------------------------------------- |
| 401  | `unauthorized`      | `forbidden`     | API 키 누락 또는 무효.                                     |
| 422  | `invalid-manifest`  | `invalid_input` | 매니페스트 검증 실패. `issues[]`에 문제 목록.                     |
| 400  | `username-required` | `invalid_input` | 계정에 아직 사용자 이름이 없어 `<username>/<app_name>`을 만들 수 없음. |
| 409  | `app-name-reserved` | `forbidden`     | 타인 이력 바인딩이 이름을 보유(사용자 이름 이전 후 30일 동결).              |
| 400  | `invalid-app-name`  | `invalid_input` | 이름이 명명 규칙을 충족하지 않거나 예약어입니다.                         |

오류 응답은 `{"error": {code, category, message, retryable}}`입니다. <a href="/docs/ko/datahub/api/reference/introduction#errors">오류</a> 참고.

## 클라이언트 라이브러리

Python / JavaScript SDK는 아직 이 엔드포인트를 감싸지 않습니다. REST를 직접 호출하세요.
