---
title: "Update an app"
method: PATCH
path: "/apps/{id}"
tags: ["Apps"]
---

# Update an app

`PATCH /apps/{id}`

## Request

- Base URL: `https://api.warplink.app/v1`
- URL: `https://api.warplink.app/v1/apps/{id}`
- Auth: HTTP bearer

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `name` string
  - `ios_bundle_id` string, nullable
  - `ios_team_id` string, nullable
  - `ios_app_store_id` string, nullable
  - `ios_app_store_url` string, uri, nullable
  - `ios_universal_link_paths` string[], nullable
  - `android_package_name` string, nullable
  - `android_sha256_fingerprints` string[], nullable
  - `android_play_store_url` string, uri, nullable
  - `android_app_links_paths` string[], nullable
  - `probabilistic_matching` boolean: Set false to turn on routing-only mode for this app, true to turn probabilistic matching back on. The change applies to the match endpoint at once. Links already shared keep working either way.
  - `link_handle` string: The subdomain label for this app: 3 to 30 characters, lowercase letters, numbers and hyphens, not starting or ending with a hyphen. Reserved names such as www, api, app, docs and test are refused. Uppercase letters are accepted and stored in lowercase. It needs an API key that has a creator, and expected_link_handle. Sending the current label confirms it. An unused subdomain (no link and no redirect uses it) changes on any plan at once, with no confirmation and no rename period, and the old name is held for 7 days: only this app can take it back before then. Once links or redirects use it, one more rename is allowed on every plan, needs confirm: true and keeps the old subdomain opening the app (rename_period_ends_at is not a deadline); if its links move to the new subdomain, their old URLs redirect. Rejected with 409 RENAME_PERIOD_OPEN while an earlier rename period is open. Checked for uniqueness against every app subdomain.
  - `expected_link_handle` string: The link_handle the app has now, as you last read it. Required whenever link_handle is sent. A different current handle returns 409 APP_LINK_STATE_CHANGED and writes nothing.
  - `confirm` boolean: Set to true to rename while links still use the old host. Without it the request returns 409 CONFIRMATION_REQUIRED with details.links_on_old_host. Not needed for an unused subdomain.

## Response `200`

Updated app

- App
  - `id` string, uuid
  - `org_id` string, uuid
  - `name` string
  - `ios_bundle_id` string, nullable
  - `ios_team_id` string, nullable
  - `ios_app_store_id` string, nullable
  - `ios_app_store_url` string, uri, nullable
  - `ios_universal_link_paths` string[], nullable
  - `android_package_name` string, nullable
  - `android_sha256_fingerprints` string[], nullable
  - `android_play_store_url` string, uri, nullable
  - `android_app_links_paths` string[], nullable
  - `icon_url` string, uri, nullable
  - `icon_source` 'auto' | 'manual'
  - `probabilistic_matching` boolean: False means routing-only mode: the server no longer matches installs by probabilistic match or raw device signals for this app. Deep links keep working, and deferred links and attribution use only deterministic signals (the Android Play Install Referrer click id, and a device that already has an install). Defaults to true.
  - `link_handle` string: The lowercase subdomain label for this app's links, for example acme in acme.aplnk.to. Every app has one.
  - `link_domain` string: The full host derived from link_handle, for example acme.aplnk.to.
  - `legacy_apex_enabled` boolean: True for an app that existed when app subdomains launched. Its links on aplnk.to keep working and aplnk.to keeps listing the app for good.
  - `default_link_domain` string: The domain a new link gets when a create request names none: the saved default, or link_domain when none is saved. Change it with PUT /v1/apps/{id}/link-domain. It never changes a link that already exists.
  - `default_link_domain_available` boolean: False when the saved default is a custom domain that is no longer live. A link created with no domain then gets 409 DEFAULT_DOMAIN_UNAVAILABLE until you choose a domain or a new default.
  - `allowed_link_domains` string[]: The hostnames a new link for this app may use: the default first when it is available, then aplnk.to (legacy apps only), link_domain and the org's live custom domains.
  - `previous_link_handle` string, nullable: The app's old subdomain label while a rename period is open. null otherwise.
  - `previous_link_domain` string, nullable: The full old host while a rename period is open, for example oldname.aplnk.to. It keeps opening the app.
  - `rename_period_ends_at` string, date-time, nullable: The date shown for the open rename period. It is not a deadline and not a promise to move links that day. If links on the old subdomain later move to the new one, their old URLs redirect. null when no period is open.
  - `rename_period_extensions` integer: How many times the open rename period was extended by 1 month. At most 2.
  - `created_at` string, date-time
  - `updated_at` string, date-time

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden. ATTRIBUTED_KEY_REQUIRED when the API key has no creator and link_handle is sent. FORBIDDEN when the key lacks apps:write, or its creator is no longer in the organization.
- `404`: Not found
- `409`: DUPLICATE_APP for a bundle ID or package name collision. APP_HANDLE_TAKEN when link_handle is already taken. APP_HANDLE_HELD when link_handle was just released and is held for 7 days (details.available_at). RENAME_PERIOD_OPEN while an earlier rename period is open (details.previous_link_handle and details.rename_period_ends_at). CONFIRMATION_REQUIRED when links use the old host and confirm is not true; details.links_on_old_host is the link count. APP_LINK_STATE_CHANGED when expected_link_handle is not the current handle, or when a link started to use the subdomain before an unused-subdomain change was written.

---

[API](https://skmtc.dev/warplink/apis/warplink-api.md) · [All operations](https://skmtc.dev/warplink/apis/warplink-api/llms.txt) · [OpenAPI document](https://skmtc.dev/warplink/apis/warplink-api/revisions/2a90ae8c44e8?raw)
