---
title: "Upgrade a legacy Consent runtime to v2 storage"
method: POST
path: "/v1/projects/{projectId}/consent/lifecycle/upgrade"
tags: ["Consent"]
---

# Upgrade a legacy Consent runtime to v2 storage

`POST /v1/projects/{projectId}/consent/lifecycle/upgrade`

## Request

- Base URL: `https://api.inth.com`
- URL: `https://api.inth.com/v1/projects/{projectId}/consent/lifecycle/upgrade`
- Auth: HTTP bearer

Migrates eligible legacy runtime configuration to shared v2 storage and schedules the existing historical backfill. Shared entitlement and storage checks remain authoritative. completed means the lifecycle command completed, not that the historical backfill finished. Supply the runtime ID and version from lifecycle metadata; stale values return CONFLICT. Requires consent.lifecycle.write, projects.read and projects.write, with an admin or owner role for update/upgrade, or an owner role for delete. Subject to rollout-agent-access-writes and allow-public-agent-writes. Organization API keys cannot call this operation.

## Path parameters

- `projectId` string, required

## Request body

- ProjectConsentLifecycleMutation
  - `expectedInstanceId` string, required
  - `expectedBackendVersion` string, required

## Response `200`

Success

- object
  - `success` unknown, required
  - `data` ProjectConsentLifecycleMutationResult, required
    - `action` 'update' | 'upgrade' | 'delete', required
    - `completed` true, required
    - `organizationId` string, required
    - `projectSlug` string, required
    - `snapshot` object, required
      - `collection` 'consent-lifecycle', required
      - `item` object, nullable, required
        - `backendVersion` string, required
        - `canDelete` boolean, required
        - `canUpdate` boolean, required
        - `canUpgrade` boolean, required
        - `id` string, required
        - `instanceName` string, required
        - `instanceSlug` string, required
        - `isV2` boolean, required
        - `latestVersion` string, required
        - `needsUpdate` boolean, required
        - `organizationId` string, required
        - `organizationSlug` string, required
        - `projectId` string, required
        - `projectSlug` string, required
        - `updateBlocked` 'enable-billing', nullable, required
      - `organizationId` string, required
      - `projectSlug` string, required
      - `projectionVersion` 1, required
    - `projectId` string, required

## Other responses

- `400`: The request payload or parameters are invalid.
- `401`: Authentication is missing, invalid, or expired.
- `403`: The credential is valid but may not perform the operation. `INSUFFICIENT_SCOPE`: the credential was never granted the capability the operation needs. `details.requiredScope` names it, and the `WWW-Authenticate` header carries `Bearer error="insufficient_scope"`. An OAuth client fixes this by requesting the scope; an organization API key cannot gain it. `FORBIDDEN`: the capability is present but the membership behind the credential lacks the role, or the resource belongs to another organization.
- `404`: The requested resource was not found.
- `409`: The request conflicts with the current resource state.
- `503`: The capability is temporarily paused by an operator. Retry later.

## Changes

- **2026-10-31** `a3f4100e14c9`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/inth/apis/inth-api/changes/v1/projects/:projectId/consent/lifecycle/upgrade/post.md)

---

[API](https://skmtc.dev/inth/apis/inth-api.md) - [All operations](https://skmtc.dev/inth/apis/inth-api/llms.txt) - [OpenAPI document](https://skmtc.dev/inth/apis/inth-api/revisions/8741280c3463?raw)
