> ## 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.

# Crea release

> Promuovi un build ready a versione formale. Il numero di versione è fissato in questo momento.

**`POST`** `https://api-datahub.octoparse.com/v1/data-apps/{app_id}/releases`

Autenticazione: API key obbligatoria (`Authorization: Bearer <API Key>`). Solo autore dell’app; gli altri ricevono `404`.

Promuove una build specifica in stato ready a versione ufficiale. **Il numero di versione viene fissato qui**: per impostazione predefinita il segmento patch della versione massima attuale aumenta di uno (la prima release è `0.1.0`). Una versione esplicita deve avere tre segmenti numerici ed essere strettamente maggiore della massima attuale: usala per gli incrementi major o minor.

Precondizioni: il build esiste ed è ready; lo snapshot ripassa la pipeline di validazione (le spec possono essere evolute mentre il build esisteva); se è impostato `expected_revision`, il workspace non deve avere edit concorrenti. I publish concorrenti sono arbitrati dal vincolo unique su (publisher, nome app, versione); su conflitti di auto-version il motore ricalcola e ritenta una volta. Dopo il publish il workspace resta — può già essere avanti rispetto allo snapshot rilasciato.

## Richiesta

### Parametri di percorso

<ParamField path="app_id" type="string" required>
  Riferimento app.
</ParamField>

### Body della richiesta

<ParamField body="build_id" type="string" required>
  ID build da pubblicare. Deve essere ready.
</ParamField>

<ParamField body="version" type="string">
  Versione esplicita a tre segmenti. Omettila per incrementare il segmento patch.
</ParamField>

<ParamField body="expected_revision" type="integer">
  Expected current draft revision. Mismatch restituisce `409`.
</ParamField>

### Esempio di richiesta

```bash theme={null}
curl -X POST \
  -H "Authorization: Bearer $OCTOPARSE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"build_id": "bld_a583f440a0ab", "version": "1.2.0"}' \
  "https://api-datahub.octoparse.com/v1/data-apps/carol/reviews-query/releases"
```

## Risposta

### 200 successo

```json theme={null}
{
  "data": {
    "version": "1.2.0",
    "build_id": "bld_a583f440a0ab",
    "published_at": "2026-09-15T08:00:00+00:00",
    "latest": true
  }
}
```

Il payload è wrappato in `data`. Campi:

<ResponseField name="app_name" type="string" required>
  —
</ResponseField>

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

<ResponseField name="version" type="string" required>
  Numero di versione pubblicata.
</ResponseField>

<ResponseField name="build_id" type="string" required>
  Build corrispondente.
</ResponseField>

<ResponseField name="published_at" type="string">
  Ora di pubblicazione.
</ResponseField>

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

### Errori

| HTTP | `code`              | `category`      | Descrizione                                                                                 |
| ---- | ------------------- | --------------- | ------------------------------------------------------------------------------------------- |
| 401  | `unauthorized`      | `forbidden`     | API key mancante o non valida.                                                              |
| 404  | `build-not-found`   | `not_found`     | Build snapshot non esiste.                                                                  |
| 409  | `build-not-ready`   | `invalid_input` | Il build non è ancora ready (building o failed) e non può essere pubblicato.                |
| 422  | `invalid-manifest`  | `invalid_input` | Il manifest non ha superato la validazione; `issues[]` elenca i problemi.                   |
| 409  | `revision-conflict` | `invalid_input` | `expected_revision` non corrisponde alla revisione attuale del draft: modifica concorrente. |

Le risposte di errore usano `{"error": {code, category, message, retryable}}`. Vedi <a href="/docs/it/datahub/api/reference/introduction#errors">Errori</a>.

## Librerie client

Gli SDK Python e JavaScript non wrappano ancora questo endpoint. Chiama REST direttamente.
