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

# Rename data app

> Change the app name (routing alias) without releasing a version or affecting in-flight runs.

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

Authentication: API key required (`Authorization: Bearer <API Key>`). App author only; others get `404`.

Rename is fully open — not limited to zero-release apps. The app name is a routing alias: rename does not publish a version, does not invalidate old versions, and does not affect in-flight runs (all durable references pin `app_id`).

Broken caller references are the developer's responsibility: old `owner/old-name` references (MCP pins, SDKs, REST, detail URLs) return a clean `404` after rename with no redirect. Historical runs and billing show the new name. The old name is not claimable by others in your namespace, but you can reuse it later for a new app — residual external references would then point at the new app. Consumers should integrate by `app_id`.

Validation matches create-identity: naming rules → reserved words → new name ≠ current name. Conflict with someone else's historical binding is `409 app-name-reserved`; conflict with another of your apps is `409 app-name-taken`.

## Request

### Path parameters

<ParamField path="app_id" type="string" required>
  App reference.
</ParamField>

### Request body

<ParamField body="new_app_name" type="string" required>
  —
</ParamField>

### Example request

```bash theme={null}
curl -X POST \
  -H "Authorization: Bearer $OCTOPARSE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"app_name": "review-lookup"}' \
  "https://api-datahub.octoparse.com/v1/data-apps/carol/reviews-query/rename"
```

## Response

### 200 success

```json theme={null}
{
  "data": {
    "app_id": "app_6dfe4e839ccf",
    "namespace": "carol",
    "app_name": "review-lookup",
    "previous_app_name": "reviews-query"
  }
}
```

The payload is wrapped in `data`. Fields:

<ResponseField name="app_id" type="string" required>
  Stable app id — unchanged.
</ResponseField>

<ResponseField name="app_name" type="string" required>
  New name.
</ResponseField>

<ResponseField name="namespace" type="string">
  Publisher username.
</ResponseField>

### Errors

| HTTP | `code`              | `category`      | Description                                                                                  |
| ---- | ------------------- | --------------- | -------------------------------------------------------------------------------------------- |
| 401  | `unauthorized`      | `forbidden`     | Missing or invalid API key.                                                                  |
| 400  | `invalid-app-name`  | `invalid_input` | Name fails naming rules or is a reserved word.                                               |
| 409  | `app-name-reserved` | `forbidden`     | Name is held by someone else's historical binding (30-day freeze after a username transfer). |
| 409  | `app-name-taken`    | `invalid_input` | You already have an app with this name.                                                      |

Error responses use `{"error": {code, category, message, retryable}}`. See <a href="/docs/en/datahub/api/reference/introduction#errors">Errors</a>.

## Client libraries

The Python and JavaScript SDKs do not wrap this endpoint yet. Call REST directly.
