---
title: "Create Upskill Plan Template"
method: POST
path: "/api/v2/careerhub/upskill-plan-templates"
tags: ["Upskill Plan Template"]
---

# Create Upskill Plan Template

`POST /api/v2/careerhub/upskill-plan-templates`

## Request

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

Create an upskilling plan template from an external system. Published unless status says otherwise. 409 with the existing planId if externalId already exists in the tenant. `sections` is optional. When it is omitted, the plan is created with one empty section.

## Headers

- `Authorization` string, required

## Request body

- UpskillingPlanTemplateCreateSchema
  - `status` string, nullable: Template status: draft | published. Defaults to published.
  - `externalId` string, nullable: Your external record id, unique in the tenant. Addresses the plan in the /ext/<externalId> paths.
  - `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 is created with one empty 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.
  - `creatorProfileId` string, nullable: Encoded profile id of the plan creator, from GET /api/v2/core/employees. Must be a user who can sign in; the creator can edit the plan. Required for API-key callers. A signed-in caller is the creator: omit it, or send your own id.
  - `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/post.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)
