---
title: "Update Upskill Plan Template by External Id"
method: PATCH
path: "/api/v2/careerhub/upskill-plan-templates/ext/{externalId}"
tags: ["Upskill Plan Template"]
---

# Update Upskill Plan Template by External Id

`PATCH /api/v2/careerhub/upskill-plan-templates/ext/{externalId}`

## Request

- Base URL: `https://apiv2.eightfold.ai`
- URL: `https://apiv2.eightfold.ai/api/v2/careerhub/upskill-plan-templates/ext/{externalId}`
- Auth: none declared. Required headers: `Authorization`
- TypeScript: <https://skmtc.dev/eightfold/apis/api-server-v2-service-service/docs/api/v2/careerhub/upskill-plan-templates/ext/:externalId/patch.ts> (a function with typed inputs; its response is checked against the schema)

Update the template of the tenant that has the externalId. Fields in the body replace the stored ones; absent fields are left unchanged. `sections` is optional. When it is omitted, the plan's sections are unchanged. When it is sent, it replaces all of the plan's sections: afterwards the plan has exactly the sections, courses and tasks in the body. Send `[]` to remove every section.

## Path parameters

- `externalId` string, required

## Headers

- `Authorization` string, required

## Request body

- UpskillingPlanTemplatePatchSchema
  - `status` string, nullable: Template status: draft | published
  - `planSubtype` string, nullable: Plan subtype, one of the subtypes configured for your account. Defaults to general.
  - `sections` UpskillingPlanSectionSchema[]: `sections` is optional. When it is omitted, the plan's sections are unchanged. When it is sent, it replaces all of the plan's sections: afterwards the plan has exactly the sections, courses and tasks in the body. Send `[]` to remove every section.
    - `sectionName` string, nullable, required: Section heading
    - `entities` UpskillingPlanEntitySchema[], required: Ordered entities in this section
      - `entityType` string, nullable, required: Entity type: task | course
      - `progress` string, nullable: Entity progress: not_started | in_progress | completed. Assigned plans only; rejected on templates.
      - `courseId` string, nullable: EF course id, as returned in courseId by GET /api/v2/core/courses. Required for course, omit for task.
      - `skills` string[]: Skill names the task covers. Each must be one of the plan's skills, matched ignoring case. Omit for course.
      - `description` string, nullable: Task description. Omit for course.
      - `title` string, nullable: Task title. Required for task, omit for course. Identifies the task across updates.
  - `name` string, nullable, required: Plan title
  - `planDurationDays` integer, nullable: Plan duration in days. Rounded down to whole weeks, at most 693; values under 7 leave it unset.
  - `skills` string[]: Skill names the plan develops. A task's skills must come from this list.
  - `description` string, nullable: Plan description
  - `associatedRoleIds` string[]: Role ids, as returned by GET /api/v2/JIE/roles.

## Response `200`

OK

- UpskillingPlanTemplateSchema
  - `status` string, nullable: Template status: draft | published
  - `id` integer, nullable: Template plan id
  - `createdAt` integer, nullable: Created timestamp (epoch seconds)
  - `planSubtype` string, nullable: Plan subtype
  - `sections` UpskillingPlanSectionSchema[], nullable: Ordered sections with their entities; progress is not set on templates
    - `sectionName` string, nullable, required: Section heading
    - `entities` UpskillingPlanEntitySchema[], required: Ordered entities in this section
      - `entityType` string, nullable, required: Entity type: task | course
      - `progress` string, nullable: Entity progress: not_started | in_progress | completed. Assigned plans only; rejected on templates.
      - `courseId` string, nullable: EF course id, as returned in courseId by GET /api/v2/core/courses. Required for course, omit for task.
      - `skills` string[]: Skill names the task covers. Each must be one of the plan's skills, matched ignoring case. Omit for course.
      - `description` string, nullable: Task description. Omit for course.
      - `title` string, nullable: Task title. Required for task, omit for course. Identifies the task across updates.
  - `name` string, nullable: Plan title
  - `externalId` string, nullable: Your external record id, unique in the tenant. Addresses the plan in the /ext/<externalId> paths.
  - `userId` string, nullable: Plan creator user id
  - `planDurationDays` integer, nullable: Plan duration in days
  - `publishedAt` integer, nullable: Publish timestamp (epoch seconds)
  - `skills` string[], nullable: Skill names
  - `groupId` string, nullable: Tenant group id
  - `updatedAt` integer, nullable: Updated timestamp (epoch seconds)
  - `description` string, nullable: Plan description
  - `associatedRoleIds` string[], nullable: Role ids, as returned by GET /api/v2/JIE/roles

## Changes

- **2026-11-03** `9a8b3a927e93`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/eightfold/apis/api-server-v2-service-service/changes/api/v2/careerhub/upskill-plan-templates/ext/:externalId/patch.md)

---

[API](https://skmtc.dev/eightfold/apis/api-server-v2-service-service.md) - [All operations](https://skmtc.dev/eightfold/apis/api-server-v2-service-service/llms.txt) - [OpenAPI document](https://skmtc.dev/eightfold/apis/api-server-v2-service-service/revisions/9a8b3a927e93?raw)
