openapi: 3.1.0 info: title: COR Attachments Users API description: The COR API lets you integrate with projectcor.com applications using simple HTTP methods, in either XML or JSON formats, making this an ideal API for developing integrations with other softwares, external clients or mobile applications version: 1.0.0 servers: - url: https://api.projectcor.com/v1 description: Production server security: - bearerAuth: [] tags: - name: Users paths: /users: get: tags: - Users summary: Get Users description: 'Retrieves a paginated list of users with optional filtering. By default, responses are paginated with 20 items per page. **Filter options:** - `withHiddenUsers` (boolean): Include hidden users in the response - `withPosition` (boolean): Include user positions in the response - `createdAt` (string): Filter users created on or after this date (YYYY-MM-DD) - `updatedAt` (string): Filter users updated on or after this date (YYYY-MM-DD)' parameters: - name: page in: query schema: type: - integer - boolean default: 1 description: 'Page number (default: 1). Set to `false` to disable pagination.' - name: perPage in: query schema: type: integer default: 20 description: 'Number of items per page (default: 20).' - name: filters in: query schema: type: string description: 'URL-encoded JSON filters object. Available fields: `withHiddenUsers`, `withPosition`, `createdAt`, `updatedAt`.' example: '{"withHiddenUsers":true, "withPosition":true, "createdAt": "2024-01-01", "updatedAt": "2024-01-31"}' responses: '200': description: Paginated list of users content: application/json: schema: $ref: '#/components/schemas/UserListResponse' example: total: '100' perPage: 20 page: 1 lastPage: 20 data: - id: 123 first_name: Jane picture: https://user-images.staging.projectcor.com/local/Upload/ProfilePictures/50x50/user.png last_name: Doe email: jane.doe@example.com cuil: '' remaining_hours: 100 user_position_id: 3 role_id: 2 daily_hours: 0 labels: [] plan_id: 5 plan_name: Capacity Planning hidden: false position_name: null category_id: null category_name: null gmt: -03:00 leaves: [] - id: 456 first_name: John picture: https://user-images.staging.projectcor.com/local/Upload/ProfilePictures/50x50/user.png last_name: Smith email: john.smith@example.com cuil: '' remaining_hours: 80 user_position_id: 2 role_id: 4 daily_hours: 8 labels: - id: 210595 lang: es name: Desarrollo web plan_id: 5 plan_name: Capacity Planning hidden: false position_name: null category_id: null category_name: null gmt: -03:00 leaves: [] post: tags: - Users summary: Create a user description: "Creates a user using a POST http method. The user will receive an invitation email.\n\n**Required properties:**\n- `first_name` — User given name\n- `last_name` — User family name\n- `email` — User email\n- `role_id` — ID of the user's role:\n - **1**: C-Level\n - **2**: Director\n - **3**: Project Manager\n - **4**: Collaborator\n - **5**: Freelancer\n - **6**: Client" requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserCreateInput' example: first_name: John last_name: Doe email: john.doe@example.com role_id: 1 user_position_id: 2 phone: 123-456-7890 description: Senior Developer birthday: '1990-01-01' work_in: Engineering hourly_rate: 50.0 monthly_hours: 160 daily_hours: 8 salary: 4500 responses: '200': description: User created successfully content: application/json: schema: $ref: '#/components/schemas/User' /users/{user_id}: put: tags: - Users summary: Update a user description: 'Updates a user using a PUT http method. ⚠️ **Important:** Use caution when using this endpoint. The system will replace the existing user with the values passed in the request body. **Available properties:** - `first_name` — User given name - `last_name` — User family name - `email` — User email - `role_id` — ID of the user''s role (1-6) - `user_position_id` — ID of the user''s position - `phone`, `description`, `birthday`, `work_in` - `hourly_rate`, `monthly_hours`, `daily_hours` - `plan_id` — 4: Project Management, 5: Capacity Planning - `hidden`, `charge_hours` — Boolean values - `salary` — New monthly salary amount - `salary_from` — Month from which salary should apply (MM-YYYY). Defaults to the current month if `salary` is provided.' parameters: - name: user_id in: path required: true schema: type: integer description: User ID example: 123 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserUpdateInput' example: first_name: John last_name: Doe email: john.doe@example.com role_id: 3 salary: 5200 salary_from: 01-2026 responses: '200': description: User updated successfully content: application/json: schema: $ref: '#/components/schemas/User' delete: tags: - Users summary: Delete a user description: Deletes a user from the system. parameters: - name: user_id in: path required: true schema: type: integer description: User ID to delete example: 123 responses: '200': description: User deleted successfully content: application/json: schema: type: boolean example: true /users/{user_id}/labels: put: tags: - Users summary: Assign or unassign user label description: 'Updates a label for a specified user by their user ID. It assigns a new label to the user or unassigns the existing label with the specified `labelId`. **To assign a label:** Omit the `unassign` property or set it to `false`. **To remove a label:** Set `unassign` to `true`.' parameters: - name: user_id in: path required: true schema: type: integer description: User ID example: 123 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserLabelInput' examples: assign_label: summary: Assign a label to user value: labelId: 3003 unassign_label: summary: Remove a label from user value: labelId: 3003 unassign: true responses: '200': description: Label updated successfully /users/search-by-name/{name}: get: tags: - Users summary: Get users by Name parameters: - name: name in: path required: true schema: type: string - name: page in: query schema: type: - integer - boolean default: 1 description: 'Page number (default: 1). Set to `false` to disable pagination.' - name: perPage in: query schema: type: integer default: 20 description: 'Number of items per page (default: 20).' responses: '200': description: Paginated list of users content: application/json: schema: $ref: '#/components/schemas/UserListResponse' example: total: '1' perPage: 20 page: 1 lastPage: 1 data: - id: 123 first_name: Jane picture: https://user-images.staging.projectcor.com/local/Upload/ProfilePictures/50x50/user.png last_name: Doe email: jane.doe@example.com cuil: '' remaining_hours: 100 user_position_id: 3 role_id: 2 daily_hours: 0 labels: - id: 210595 lang: es name: Desarrollo web plan_id: 5 plan_name: Capacity Planning hidden: false position_name: null category_id: null category_name: null gmt: -03:00 leaves: [] components: schemas: UserListItem: description: User object returned by list endpoints (GET /users, GET /users/search-by-name). allOf: - $ref: '#/components/schemas/UserBase' - type: object properties: labels: type: array description: Labels assigned to the user. items: $ref: '#/components/schemas/UserAssignedLabel' UserListResponse: type: object properties: total: type: string perPage: type: integer page: type: integer lastPage: type: integer data: type: array items: $ref: '#/components/schemas/UserListItem' LeaveType: type: object properties: id: type: integer name: type: string type_code: type: string company_id: type: integer nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time deleted_at: type: string format: date-time nullable: true icon_name: type: string UserLabelInput: type: object required: - labelId properties: labelId: type: integer description: Label ID to assign or unassign unassign: type: boolean description: Set to true to remove label from the user. Omit or set to false to assign the label. default: false UserUpdateInput: type: object properties: first_name: type: string description: User given name last_name: type: string description: User family name email: type: string format: email description: User email role_id: type: integer enum: - 1 - 2 - 3 - 4 - 5 - 6 description: 'User Role: 1=C-Level, 2=Director, 3=Project Manager, 4=Collaborator, 5=Freelancer, 6=Client' user_position_id: type: integer description: ID of the user's position phone: type: string description: User phone number description: type: string description: User description birthday: type: string format: date description: User birthday (YYYY-MM-DD) work_in: type: string description: Department or area hourly_rate: type: number description: Hourly rate monthly_hours: type: integer description: Monthly hours daily_hours: type: integer description: Daily hours plan_id: type: integer enum: - 4 - 5 description: 'Plan ID: 4=Project Management, 5=Capacity Planning' hidden: type: boolean description: Whether user is hidden charge_hours: type: boolean description: Whether to charge hours salary: type: integer description: Monthly salary amount salary_from: type: string description: Month from which salary should apply (MM-YYYY). Defaults to the current month if salary is provided. UserAssignedLabel: type: object description: Label assigned to a user, as returned in user list endpoints. properties: id: type: integer lang: type: string name: type: string Label: type: object properties: id: type: integer hex: type: string description: Hex color code hsl: type: string nullable: true rgb: type: string nullable: true lang: type: string name: type: string color_id: type: integer Leave: type: object properties: id: type: integer user_id: type: integer company_id: type: integer leave_type_id: type: integer start: type: string format: date-time end: type: string format: date-time created_at: type: string format: date-time updated_at: type: string format: date-time deleted_at: type: string format: date-time nullable: true all_day: type: boolean leaveType: $ref: '#/components/schemas/LeaveType' UserBase: type: object properties: id: type: integer first_name: type: string last_name: type: string picture: type: string description: URL to user's profile picture email: type: string format: email cuil: type: string remaining_hours: type: number user_position_id: type: integer role_id: type: integer description: 1=C-Level, 2=Director, 3=Project Manager, 4=Collaborator, 5=Freelancer, 6=Client daily_hours: type: number plan_id: type: integer description: 4=Project Management, 5=Capacity Planning plan_name: type: string hidden: type: boolean position_name: type: string nullable: true category_id: type: integer nullable: true category_name: type: string nullable: true gmt: type: string description: UTC offset from the user's last login location. Indicates the timezone configured at their last login. example: -03:00 leaves: type: array items: $ref: '#/components/schemas/Leave' User: allOf: - $ref: '#/components/schemas/UserBase' - type: object properties: labels: type: array items: $ref: '#/components/schemas/Label' nullable: true UserCreateInput: type: object required: - first_name - last_name - email - role_id properties: first_name: type: string description: User given name last_name: type: string description: User family name email: type: string format: email description: User email role_id: type: integer enum: - 1 - 2 - 3 - 4 - 5 - 6 description: 'User Role: 1=C-Level, 2=Director, 3=Project Manager, 4=Collaborator, 5=Freelancer, 6=Client' user_position_id: type: integer description: ID of the user's position phone: type: string description: User phone number description: type: string description: User description birthday: type: string format: date description: User birthday (YYYY-MM-DD) work_in: type: string description: Department or area hourly_rate: type: number description: Hourly rate monthly_hours: type: integer description: Monthly hours daily_hours: type: integer description: Daily hours plan_id: type: integer enum: - 4 - 5 description: 'Plan ID: 4=Project Management, 5=Capacity Planning' hidden: type: boolean description: Whether user is hidden charge_hours: type: boolean description: Whether to charge hours salary: type: integer description: Monthly salary amount securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT basicAuth: type: http scheme: basic