# How to manage Apps (https://developer.godaddy.com/en/docs/api-users/hosting/manage-apps)

---
title: How to manage Apps
description: 'List, update, and delete hosting apps using the REST API.'
keywords: >-
  GET /v1/hosting/apps, PATCH /apps/{appId}, DELETE /apps/{appId}, list apps,
  update app metadata, delete app, hosting.application:update,
  hosting.application:delete
agentNotes:
  scopes:
    - 'hosting.application:read'
    - 'hosting.application:update'
    - 'hosting.application:delete'
  destructive: true
  failureRecovery: >-
    List and read operations are safe to retry. Deletes are irreversible —
    confirm the app id before submitting.
related:
  tutorials:
    - title: Deploy your Node.js app
      href: /docs/api-users/hosting/workflows/deploy-nodejs-app
  guides:
    - title: Manage secrets
      href: /docs/api-users/hosting/manage-secrets
  concepts:
    - title: Hosting concepts
      href: /docs/api-users/hosting/concepts
  apis:
    - title: Apps reference
      href: /docs/references/rest/hosting/apps
---

## Overview

This page covers managing your deployed apps: listing all apps, reading a single app, updating its metadata, and deleting it. These operations use the `hosting.application:read`, `hosting.application:update`, and `hosting.application:delete` scopes.

Go to [Deploy your Node.js app](https://developer.godaddy.com/docs/api-users/hosting/workflows/deploy-nodejs-app) for the initial create-and-deploy flow. Go to [Hosting core concepts](https://developer.godaddy.com/docs/api-users/hosting/concepts#scopes-reference) for the scopes you need.

## Prerequisites

The following prerequisites are required before you can manage your apps:

* a [Personal Access Token](https://developer.godaddy.com/personal-access-token) with the `hosting.application:read` scope (all operations), plus `hosting.application:update` or `hosting.application:delete` as needed

## List apps

`GET /apps?appType=NODEJS` returns all Node.js apps for your account.

The following procedure lists all apps.

* List all Node.js apps:

  ```bash tab="curl"
  curl -s "$BASE_URL/v1/hosting/apps?appType=NODEJS" \
    -H "Authorization: Bearer $GODADDY_PAT" | jq .
  ```

  ```js tab="Node"
  const res = await fetch(`${process.env.BASE_URL}/v1/hosting/apps?appType=NODEJS`, {
    headers: { Authorization: `Bearer ${process.env.GODADDY_PAT}` },
  });
  const apps = await res.json();
  ```

  ```python tab="Python"
  import requests, os

  resp = requests.get(
      f"{os.environ['BASE_URL']}/v1/hosting/apps",
      params={"appType": "NODEJS"},
      headers={"Authorization": f"Bearer {os.environ['GODADDY_PAT']}"},
  )
  apps = resp.json()
  ```

  ```go tab="Go"
  req, _ := http.NewRequest("GET", os.Getenv("BASE_URL")+"/v1/hosting/apps?appType=NODEJS", nil)
  req.Header.Set("Authorization", "Bearer "+os.Getenv("GODADDY_PAT"))
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  ```

The response is an array of app objects. Each includes the app id, name, creation status, and variant details.

## Read an app

`GET /apps/{appId}` returns the full record for a single app.

The following procedure reads a specific app.

* Read the app:

  ```bash tab="curl"
  curl -s "$BASE_URL/v1/hosting/apps/$APP_ID" \
    -H "Authorization: Bearer $GODADDY_PAT" | jq .
  ```

  ```js tab="Node"
  const res = await fetch(`${process.env.BASE_URL}/v1/hosting/apps/${appId}`, {
    headers: { Authorization: `Bearer ${process.env.GODADDY_PAT}` },
  });
  const app = await res.json();
  ```

  ```python tab="Python"
  resp = requests.get(
      f"{os.environ['BASE_URL']}/v1/hosting/apps/{app_id}",
      headers={"Authorization": f"Bearer {os.environ['GODADDY_PAT']}"},
  )
  app = resp.json()
  ```

  ```go tab="Go"
  req, _ := http.NewRequest("GET", os.Getenv("BASE_URL")+"/v1/hosting/apps/"+appID, nil)
  req.Header.Set("Authorization", "Bearer "+os.Getenv("GODADDY_PAT"))
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  ```

## Update app metadata

`PATCH /apps/{appId}` updates the app's name or root path. The operation is synchronous and returns `200` with the updated app object.

The following procedure updates the app name.

* Update the app name:

  ```bash tab="curl"
  curl -s -X PATCH "$BASE_URL/v1/hosting/apps/$APP_ID" \
    -H "Authorization: Bearer $GODADDY_PAT" \
    -H "Content-Type: application/json-patch+json" \
    -d '[{"op":"replace","path":"/name","value":"my-renamed-app"}]' | jq .
  ```

  ```js tab="Node"
  const res = await fetch(`${process.env.BASE_URL}/v1/hosting/apps/${appId}`, {
    method: 'PATCH',
    headers: {
      Authorization: `Bearer ${process.env.GODADDY_PAT}`,
      'Content-Type': 'application/json-patch+json',
    },
    body: JSON.stringify([{ op: 'replace', path: '/name', value: 'my-renamed-app' }]),
  });
  const updated = await res.json();
  ```

  ```python tab="Python"
  resp = requests.patch(
      f"{os.environ['BASE_URL']}/v1/hosting/apps/{app_id}",
      headers={
          "Authorization": f"Bearer {os.environ['GODADDY_PAT']}",
          "Content-Type": "application/json-patch+json",
      },
      data='[{"op":"replace","path":"/name","value":"my-renamed-app"}]',
  )
  updated = resp.json()
  ```

  ```go tab="Go"
  body := strings.NewReader(`[{"op":"replace","path":"/name","value":"my-renamed-app"}]`)
  req, _ := http.NewRequest("PATCH", os.Getenv("BASE_URL")+"/v1/hosting/apps/"+appID, body)
  req.Header.Set("Authorization", "Bearer "+os.Getenv("GODADDY_PAT"))
  req.Header.Set("Content-Type", "application/json-patch+json")
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  ```

## Delete an app

Deleting an app removes both variants and all associated deployments, secrets, and logs. This can't be undone.

`DELETE /apps/{appId}` removes the app. The response is `204 No Content` on success.

The following procedure deletes an app.

* Delete the app:

  ```bash tab="curl"
  curl -s -X DELETE "$BASE_URL/v1/hosting/apps/$APP_ID" \
    -H "Authorization: Bearer $GODADDY_PAT"
  ```

  ```js tab="Node"
  await fetch(`${process.env.BASE_URL}/v1/hosting/apps/${appId}`, {
    method: 'DELETE',
    headers: { Authorization: `Bearer ${process.env.GODADDY_PAT}` },
  });
  ```

  ```python tab="Python"
  requests.delete(
      f"{os.environ['BASE_URL']}/v1/hosting/apps/{app_id}",
      headers={"Authorization": f"Bearer {os.environ['GODADDY_PAT']}"},
  )
  ```

  ```go tab="Go"
  req, _ := http.NewRequest("DELETE", os.Getenv("BASE_URL")+"/v1/hosting/apps/"+appID, nil)
  req.Header.Set("Authorization", "Bearer "+os.Getenv("GODADDY_PAT"))
  http.DefaultClient.Do(req)
  ```

## Common errors

The following table lists common errors and recommended actions:

| Status | Cause                                    | Action                                                                                                      |
| ------ | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `401`  | Expired or revoked PAT, or missing scope | Go to [Hosting core concepts](https://developer.godaddy.com/docs/api-users/hosting/concepts#scopes-reference) for the scopes you need    |
| `403`  | Insufficient scope                       | Verify the token includes `hosting.application:update` or `hosting.application:delete` for write operations |
| `404`  | App id not found                         | Confirm the id from `GET /apps`                                                                             |
| `429`  | Rate limit exceeded                      | Back off and retry. Go to [Rate limits](https://developer.godaddy.com/docs/api-users/rate-limits) for handling guidance                  |
