openapi: 3.0.3
info:
title: Lattice Talent API
description: >
REST API for Lattice's Talent product suite covering users, departments,
goals, OKRs, performance review cycles, reviewees, reviews, continuous
feedback, competencies, and tags. Uses cursor-based pagination and Bearer
token authentication.
version: v1
contact:
name: Lattice Developer Support
email: [email protected]
url: https://developers.lattice.com
termsOfService: https://lattice.com/legal/terms-of-service
license:
name: Proprietary
url: https://lattice.com/legal/terms-of-service
servers:
- url: https://api.latticehq.com/v1
description: Lattice Talent API v1 production server
security:
- BearerAuth: []
tags:
- name: Users
description: Manage and retrieve user records
- name: Departments
description: Manage and retrieve department records
- name: Goals
description: Create, read, and update goals and OKRs
- name: Goal Updates
description: Create and retrieve goal progress updates
- name: Feedbacks
description: Retrieve continuous feedback
- name: Review Cycles
description: Manage performance review cycles
- name: Reviewees
description: Manage reviewees within a review cycle
- name: Reviews
description: Submit and update performance reviews
- name: Tags
description: Retrieve tags used across goals and feedback
- name: Competencies
description: Retrieve competencies
- name: Me
description: Retrieve information about the authenticated user
paths:
/me:
get:
summary: Get authenticated user
operationId: getMe
tags: [Me]
description: Returns information about the current user associated with the provided API token.
responses:
"200":
description: Authenticated user object
content:
application/json:
schema:
$ref: "#/components/schemas/User"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/users:
get:
summary: List users
operationId: listUsers
tags: [Users]
description: >
Returns a paginated list of users in Lattice. By default, returns
active users. A status parameter of NULL will retrieve all users
regardless of status.
parameters:
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
- name: status
in: query
required: false
schema:
type: string
enum: [ACTIVE, INVITED, CREATED, DEACTIVATED, NULL]
description: Filter by user status; NULL returns all users.
responses:
"200":
description: Paginated list of users
content:
application/json:
schema:
$ref: "#/components/schemas/UserList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/user/{id}:
get:
summary: Get user by ID
operationId: getUser
tags: [Users]
description: Returns a user with the given id. If cannot find user, returns a 404.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The user identifier
responses:
"200":
description: User object
content:
application/json:
schema:
$ref: "#/components/schemas/User"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/departments:
get:
summary: List departments
operationId: listDepartments
tags: [Departments]
description: Returns a paginated list of all departments in Lattice.
parameters:
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of departments
content:
application/json:
schema:
$ref: "#/components/schemas/DepartmentList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/department/{id}:
get:
summary: Get department by ID
operationId: getDepartment
tags: [Departments]
description: Returns a department with the given id. If cannot find department, returns a 404.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The department identifier
responses:
"200":
description: Department object
content:
application/json:
schema:
$ref: "#/components/schemas/Department"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/goals:
get:
summary: List goals
operationId: listGoals
tags: [Goals]
description: Returns a paginated list of goals in Lattice.
parameters:
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
- name: state
in: query
required: false
schema:
$ref: "#/components/schemas/GoalStateEnum"
description: Filter by goal state
responses:
"200":
description: Paginated list of goals
content:
application/json:
schema:
$ref: "#/components/schemas/GoalList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
post:
summary: Create goal
operationId: createGoal
tags: [Goals]
description: Creates a new goal in Lattice.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/GoalCreate"
responses:
"200":
description: Created goal object
content:
application/json:
schema:
$ref: "#/components/schemas/Goal"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/goal/{id}:
get:
summary: Get goal by ID
operationId: getGoal
tags: [Goals]
description: Returns a goal with the given id. If cannot find goal, returns a 404.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The goal identifier
responses:
"200":
description: Goal object
content:
application/json:
schema:
$ref: "#/components/schemas/Goal"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/goals/{id}:
put:
summary: Update goal
operationId: updateGoal
tags: [Goals]
description: Updates an existing goal with the provided information.
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: The unique identifier of the goal to update
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/GoalUpdate"
responses:
"200":
description: Updated goal object
content:
application/json:
schema:
$ref: "#/components/schemas/Goal"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/goal/{id}/updates:
get:
summary: List goal updates for a goal
operationId: getGoalUpdates
tags: [Goal Updates]
description: Returns paginated progress updates for a specific goal.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The goal identifier
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of goal updates
content:
application/json:
schema:
$ref: "#/components/schemas/GoalUpdateList"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
post:
summary: Create goal update
operationId: createGoalUpdate
tags: [Goal Updates]
description: Creates a progress update for a specific goal.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The goal identifier
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/GoalUpdateCreate"
responses:
"200":
description: Created goal update object
content:
application/json:
schema:
$ref: "#/components/schemas/GoalUpdateItem"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/goalUpdates:
get:
summary: List all goal updates
operationId: getAllGoalUpdates
tags: [Goal Updates]
description: Returns a paginated list of all goal updates across all goals.
parameters:
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of all goal updates
content:
application/json:
schema:
$ref: "#/components/schemas/GoalUpdateList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/feedbacks:
get:
summary: List feedbacks
operationId: listFeedbacks
tags: [Feedbacks]
description: Returns a paginated list of all continuous feedback in Lattice. Newest feedback will be returned first.
parameters:
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
- name: onlyPublic
in: query
required: false
schema:
type: boolean
description: Filter to public feedback only
responses:
"200":
description: Paginated list of feedback
content:
application/json:
schema:
$ref: "#/components/schemas/FeedbackList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/feedback/{id}:
get:
summary: Get feedback by ID
operationId: getFeedback
tags: [Feedbacks]
description: Returns a feedback with the given id. If cannot find feedback, returns a 404.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The feedback identifier
responses:
"200":
description: Feedback object
content:
application/json:
schema:
$ref: "#/components/schemas/Feedback"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/reviewCycles:
get:
summary: List review cycles
operationId: listReviewCycles
tags: [Review Cycles]
description: Returns a paginated list of all review cycles in Lattice.
parameters:
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of review cycles
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewCycleList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/reviewCycle/{id}:
get:
summary: Get review cycle by ID
operationId: getReviewCycle
tags: [Review Cycles]
description: Returns a review cycle with the given id. If cannot find review cycle, returns a 404.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The review cycle identifier
responses:
"200":
description: Review cycle object
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewCycle"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/reviewCycle/{id}/reviewees:
get:
summary: List reviewees in a review cycle
operationId: listReviewCycleReviewees
tags: [Reviewees]
description: Returns a paginated list of all reviewees in a review cycle.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The review cycle identifier
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of reviewees
content:
application/json:
schema:
$ref: "#/components/schemas/RevieweeList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/reviewCycle/{id}/reviews:
get:
summary: List reviews in a review cycle
operationId: listReviewCycleReviews
tags: [Reviews]
description: Returns a paginated list of all reviews in a review cycle.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The review cycle identifier
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of reviews
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/reviewee/{id}/reviews:
get:
summary: List reviews for a reviewee
operationId: listRevieweeReviews
tags: [Reviews]
description: Returns a paginated list of all reviews for a specific reviewee.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The reviewee identifier
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of reviews
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/tags:
get:
summary: List tags
operationId: listTags
tags: [Tags]
description: Returns a paginated list of all tags in Lattice.
parameters:
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of tags
content:
application/json:
schema:
$ref: "#/components/schemas/TagList"
"400":
$ref: "#/components/responses/BadRequest"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/tag/{id}:
get:
summary: Get tag by ID
operationId: getTag
tags: [Tags]
description: Returns a tag with the given id.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The tag identifier
responses:
"200":
description: Tag object
content:
application/json:
schema:
$ref: "#/components/schemas/Tag"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/competency/{id}:
get:
summary: Get competency by ID
operationId: getCompetency
tags: [Competencies]
description: Returns a competency with the given id. If cannot find competency, returns a 404.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The competency identifier
responses:
"200":
description: Competency object
content:
application/json:
schema:
$ref: "#/components/schemas/Competency"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/user/{id}/goals:
get:
summary: List goals for a user
operationId: listUserGoals
tags: [Goals]
description: Returns a paginated list of goals for a specific user.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The user identifier
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of goals
content:
application/json:
schema:
$ref: "#/components/schemas/GoalList"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/user/{id}/directReports:
get:
summary: List direct reports for a user
operationId: listUserDirectReports
tags: [Users]
description: Returns a paginated list of direct reports for a specific user.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The user identifier
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of users
content:
application/json:
schema:
$ref: "#/components/schemas/UserList"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/user/{id}/tasks:
get:
summary: List tasks for a user
operationId: listUserTasks
tags: [Users]
description: Returns a paginated list of tasks for a specific user.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The user identifier
- $ref: "#/components/parameters/limit"
- $ref: "#/components/parameters/startingAfter"
responses:
"200":
description: Paginated list of tasks
content:
application/json:
schema:
$ref: "#/components/schemas/TaskList"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
/user/{id}/customAttributes:
get:
summary: List custom attributes for a user
operationId: listUserCustomAttributes
tags: [Users]
description: Returns custom attribute values for a specific user.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The user identifier
responses:
"200":
description: List of custom attribute values
content:
application/json:
schema:
$ref: "#/components/schemas/CustomAttributeValueList"
"400":
$ref: "#/components/responses/BadRequest"
"404":
$ref: "#/components/responses/NotFound"
"422":
$ref: "#/components/responses/UnprocessableEntity"
"500":
$ref: "#/components/responses/ServerError"
components:
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: >
API key passed as a Bearer token in the Authorization header.
Example: Authorization: Bearer <your-api-key>
parameters:
limit:
name: limit
in: query
required: false
schema:
type: integer
format: int32
description: Maximum number of items to return per page
startingAfter:
name: startingAfter
in: query
required: false
schema:
type: string
description: Cursor for fetching the next page of results
responses:
BadRequest:
description: Invalid request parameters
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
NotFound:
description: Could not find the requested resource
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
UnprocessableEntity:
description: Unprocessable - request is syntactically valid but cannot be processed
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
ServerError:
description: Server error while processing request
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
schemas:
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error message
required: [error]
ObjectReference:
type: object
description: A lightweight reference to another Lattice object
properties:
id:
type: string
object:
type: string
url:
type: string
required: [id, object, url]
ListReference:
type: object
description: A reference to a paginated list of related objects
properties:
object:
type: string
enum: [list]
url:
type: string
required: [object, url]
PaginatedList:
type: object
properties:
object:
type: string
enum: [list]
hasMore:
type: boolean
description: Whether or not there are more elements available after this set
endingCursor:
type: string
nullable: true
description: The cursor to use to get the next set of items in the list
required: [object, hasMore]
User:
type: object
properties:
id:
type: string
object:
type: string
url:
type: string
name:
type: string
nullable: true
preferredName:
type: string
nullable: true
email:
type: string
format: email
title:
type: string
nullable: true
status:
type: string
enum: [ACTIVE, INVITED, CREATED, DEACTIVATED]
isAdmin:
type: boolean
externalUserId:
type: string
nullable: true
manager:
$ref: "#/components/schemas/ObjectReference"
nullable: true
department:
$ref: "#/components/schemas/ObjectReference"
nullable: true
directReports:
$ref: "#/components/schemas/ListReference"
tasks:
$ref: "#/components/schemas/ListReference"
customAttributes:
$ref: "#/components/schemas/ListReference"
timezone:
type: string
nullable: true
startDate:
type: string
format: date
nullable: true
birthDate:
type: string
format: date
nullable: true
gender:
type: string
nullable: true
jobFunction:
type: string
nullable: true
jobLevel:
type: string
nullable: true
jobType:
type: string
nullable: true
createdAt:
type: integer
description: Unix timestamp
updatedAt:
type: integer
description: Unix timestamp
required: [id, object, url, email, status, isAdmin, directReports, tasks, customAttributes]
UserList:
allOf:
- $ref: "#/components/schemas/PaginatedList"
- type: object
properties:
data:
type: array
items:
$ref: "#/components/schemas/User"
required: [data]
Department:
type: object
properties:
id:
type: string
object:
type: string
url:
type: string
name:
type: string
description:
type: string
nullable: true
description: Markdown-formatted description
createdAt:
type: integer
description: Unix timestamp
required: [id, object, url, name, createdAt]
DepartmentList:
allOf:
- $ref: "#/components/schemas/PaginatedList"
- type: object
properties:
data:
type: array
items:
$ref: "#/components/schemas/Department"
required: [data]
GoalStateEnum:
type: string
enum: [Draft, Active, Ended, Archived]
GoalStatusEnum:
type: string
enum: [NotUpdated, OnTrack, Progressing, OffTrack]
GoalTypeEnum:
type: string
enum: [Company, Department, Group, Individual]
OkrTypeEnum:
type: string
enum: [objective, key_result]
AmountTypeEnum:
type: string
enum: [Percent, Dollar, Digit, Binary]
Goal:
type: object
properties:
id:
type: string
object:
type: string
url:
type: string
name:
type: string
description:
type: string
nullable: true
description: Markdown-formatted description
state:
$ref: "#/components/schemas/GoalStateEnum"
status:
$ref: "#/components/schemas/GoalStatusEnum"
goalType:
$ref: "#/components/schemas/GoalTypeEnum"
okrType:
$ref: "#/components/schemas/OkrTypeEnum"
isPrivate:
type: boolean
priority:
type: integer
nullable: true
amountType:
$ref: "#/components/schemas/AmountTypeEnum"
nullable: true
startingAmount:
type: number
format: float
nullable: true
endingAmount:
type: number
format: float
nullable: true
currentAmount:
type: number
format: float
nullable: true
startDate:
type: string
format: date
nullable: true
dueDate:
type: string
format: date
nullable: true
createdAt:
type: integer
description: Unix timestamp
updatedAt:
type: integer
description: Unix timestamp
publishedAt:
type: integer
nullable: true
description: Unix timestamp
completedAt:
type: integer
nullable: true
description: Unix timestamp
archivedAt:
type: integer
nullable: true
description: Unix timestamp
owners:
$ref: "#/components/schemas/ListReference"
department:
$ref: "#/components/schemas/ObjectReference"
nullable: true
parentGoal:
$ref: "#/components/schemas/ObjectReference"
nullable: true
childGoals:
$ref: "#/components/schemas/ListReference"
tags:
$ref: "#/components/schemas/ListReference"
required: [id, object, url, name, state, status, goalType, okrType, isPrivate, owners, childGoals, tags, createdAt, updatedAt]
GoalList:
allOf:
- $ref: "#/components/schemas/PaginatedList"
- type: object
properties:
data:
type: array
items:
$ref: "#/components/schemas/Goal"
required: [data]
GoalCreate:
type: object
properties:
name:
type: string
startDate:
type: string
format: date
dueDate:
type: string
format: date
ownerIds:
type: array
it
# --- truncated at 32 KB (45 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lattice/refs/heads/main/openapi/lattice-talent-openapi.yml