MCP API Reference FlowyTeam
Complete reference for every tool, action, parameter, and response in the FlowyTeam MCP Server.
https://flowyteam.com/api/v2/mcp/rpc| Code | Meaning |
|---|---|
200 | Success |
401 | Unauthenticated — missing or invalid Bearer token |
403 | Forbidden — authenticated but lacks permission |
404 | Resource not found |
422 | Validation error — check the errors object in the response |
429 | Too many requests — rate limit exceeded |
500 | Server error |
Manage tasks: list, create, update, delete, mark complete. Filter by status, priority, project, assignee, due date.
| Name | Type | Description |
|---|---|---|
id
|
string | Task ID — or use "heading"/"title" to look up by name |
heading
|
string | Task title (required for POST; also used to look up task by name for PUT/DELETE) |
title
|
string | Alias for heading |
description
|
string | — |
status
|
string | Filter (GET) or new status (PUT) |
priority
|
string | — |
project_id
|
string | Project ID to link or filter by |
assigned_to
|
string | User ID or name to assign to, or filter by (admin only for others) |
user_id
|
string | Alias for assigned_to |
due_date
|
string | Due date (Y-m-d) |
start_date
|
string | Start date (Y-m-d). Defaults to today. |
task_category_id
|
string | Task category ID |
search
|
string | Search in task heading |
{
"status": "incomplete",
"project_id": 12
}
{
"status": "success",
"data": [
{
"id": 101,
"heading": "Design landing page",
"status": "incomplete",
"priority": "high",
"due_date": "2026-05-01",
"assigned_to": 7
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
403 |
This action is unauthorized. |
{
"heading": "Write API docs",
"project_id": 12,
"due_date": "2026-05-10",
"priority": "medium",
"assigned_to": 7
}
{
"status": "success",
"message": "Task created successfully.",
"id": 102
}
| HTTP Code | Message |
|---|---|
422 |
The heading field is required. |
401 |
Unauthenticated. |
{
"id": 101,
"status": "complete",
"priority": "low"
}
{
"status": "success",
"message": "Task updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Task not found. |
422 |
The id field is required. |
{
"id": 101
}
{
"status": "success",
"message": "Task deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Task not found. |
Manage projects and their sub-resources (milestones, members, categories, files). Set resource=project (default), milestone, member, category, or file. All lookups are name-based — no IDs needed. Admins have full access. Members can view/update their own projects, and perform full CRUD on milestones, members, and files.
| Name | Type | Description |
|---|---|---|
action
|
string | Special action on the project resource. "duplicate" — clones an existing project (members + milestones + tasks all copied, tasks reset to incomplete). "stats" — returns project statistics: total count, by-status breakdown, overdue count, budget total. When action=duplicate: provide project_name to identify the project to clone. When action=stats: no extra params needed (use method=GET). |
resource
|
string | Sub-resource to manage. Defaults to "project". Use "milestone" for milestones, "member" to add/remove members, "category" to manage categories (admin only for create/update/delete), "file" to list or delete project files. |
project_name
|
string | Project name. Used as lookup key for GET (single), PUT, DELETE, and to scope milestones/members. Partial match. |
new_project_name
|
string | New project name — only used when renaming a project via PUT. |
search
|
string | Partial name search for list (GET) operations. |
status
|
string | Project status. Defaults to "not started" on create. |
start_date
|
string | Project start date (Y-m-d). Required for POST. |
deadline
|
string | Project deadline (Y-m-d). Required for POST unless without_deadline=true. |
without_deadline
|
boolean | Set true to create/update a project with no deadline. |
project_summary
|
string | Short project description / summary. |
notes
|
string | Internal project notes. |
feedback
|
string | Client feedback field. Used on update only. |
client_name
|
string | Client company or user name to assign to the project. Looked up by partial match. |
category_name
|
string | The CURRENT/EXISTING category name — used as a lookup key (partial match). When assigning a project to a category, provide the existing category name here. When resource=category: PUT (rename) → provide the CURRENT name here and the NEW name in new_category_name. POST (create) → provide the new category name here. DELETE → provide the name of the category to delete here. NEVER put the new/desired name in this field for rename operations. |
new_category_name
|
string | New category name — only used when renaming a category via PUT (resource=category). |
project_budget
|
number | Project budget amount. |
hours_allocated
|
number | Total hours budget allocated to this project. |
completion_percent
|
integer | Manual completion percentage (0–100). Update only. |
client_view_task
|
string | Allow client to view tasks. |
allow_client_notification
|
string | Send client notifications for task updates. Only effective when client_view_task=enable. |
manual_timelog
|
string | Allow manual time log entries on this project. |
milestone_title
|
string | Milestone title. Required for POST (resource=milestone). Used as lookup key for PUT/DELETE. |
new_milestone_title
|
string | New milestone title — only used when renaming a milestone via PUT. |
milestone_summary
|
string | Milestone description/summary. Required for POST (resource=milestone). |
milestone_status
|
string | Milestone completion status. Defaults to "incomplete" on create. |
milestone_cost
|
number | Milestone cost amount. Defaults to 0. |
member_name
|
string | Employee name to add or remove as a project member. Partial match. |
file_name
|
string | Filename (partial match) for file operations (resource=file). Used for DELETE. |
filter_status
|
string | Filter project list by status. |
filter_client
|
string | Filter project list by client name (partial match). |
filter_category
|
string | Filter project list by category name (partial match). |
{
"status": "not started",
"search": "website"
}
{
"status": "success",
"data": [
{
"id": 12,
"project_name": "Website Redesign",
"status": "not started",
"start_date": "2026-05-01",
"deadline": "2026-07-31",
"client_id": 3
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"project_name": "Mobile App v2",
"start_date": "2026-06-01",
"deadline": "2026-09-30",
"client_id": 3
}
{
"status": "success",
"message": "Project created successfully.",
"id": 13
}
| HTTP Code | Message |
|---|---|
422 |
The project name field is required. |
{
"id": 12,
"status": "in progress"
}
{
"status": "success",
"message": "Project updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Project not found. |
{
"id": 12
}
{
"status": "success",
"message": "Project deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Project not found. |
Manage task categories: list, create, update, delete. Lookup by ID or category name.
| Name | Type | Description |
|---|---|---|
id
|
string | Category ID. For PUT/DELETE you may also supply category_name instead of id for name-based lookup. |
category_name
|
string | Category name (required for POST; used as lookup key for PUT/DELETE when id is omitted). |
search
|
string | Partial name search for GET. |
{
"search": "bug"
}
{
"status": "success",
"data": [
{
"id": 1,
"category_name": "Bug Fix"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"category_name": "Feature Request"
}
{
"status": "success",
"message": "Category created successfully.",
"id": 2
}
| HTTP Code | Message |
|---|---|
422 |
The category name field is required. |
{
"id": 1,
"category_name": "Critical Bug Fix"
}
{
"status": "success",
"message": "Category updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Category not found. |
{
"id": 1
}
{
"status": "success",
"message": "Category deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Category not found. |
Manage employee leave requests: list, create, approve, reject, cancel. Filter by status, employee, date range.
| Name | Type | Description |
|---|---|---|
id
|
string | Leave ID — or use "name" + "leave_date" to look up by employee name and date instead |
name
|
string | Employee name — used together with "leave_date" to look up a leave request without an id |
leave_type_id
|
string | Leave type ID (use leave_type_name instead if you do not know the ID) |
leave_type_name
|
string | Leave type name (e.g. "Annual Leave", "Sick Leave") — resolved to leave_type_id automatically |
employee_name
|
string | Employee name — admin can set this to create a leave on behalf of that employee (resolved to user_id) |
user_id
|
string | Employee user ID (admin only; use employee_name if ID is unknown) |
userId
|
string | Filter by employee (GET) |
leave_date
|
string | Leave start date (Y-m-d, required for POST; also used as a lookup key with "name") |
duration
|
string | "full day", "half day", or "multiple" |
status
|
string | — |
reason
|
string | — |
multi_date
|
string | Comma-separated dates for multiple duration |
startDate
|
string | Filter from date (Y-m-d) |
endDate
|
string | Filter to date (Y-m-d) |
sort_direction
|
string | — |
per_page
|
integer | — |
{
"userId": 7,
"status": "pending"
}
{
"status": "success",
"data": [
{
"id": 88,
"user_id": 7,
"leave_type_id": 1,
"leave_date": "2026-05-15",
"duration": "full day",
"status": "pending",
"reason": "Family event"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"user_id": 7,
"leave_type_id": 1,
"leave_date": "2026-05-15",
"duration": "full day",
"reason": "Family event"
}
{
"status": "success",
"message": "Leave request submitted.",
"id": 89
}
| HTTP Code | Message |
|---|---|
422 |
The leave date field is required. |
{
"id": 88,
"status": "approved"
}
{
"status": "success",
"message": "Leave updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Leave record not found. |
{
"id": 88
}
{
"status": "success",
"message": "Leave deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Leave record not found. |
Manage leave types (annual, sick, etc.): list, create, update, delete. Admin-only for write operations.
| Name | Type | Description |
|---|---|---|
id
|
string | Leave type ID — or use type_name to look up by name |
type_name
|
string | Leave type name (e.g. Annual Leave, Sick Leave) — required for POST, or use to look up for PUT/DELETE |
color
|
string | Color code (e.g. #FF0000) |
no_of_leaves
|
number | Number of allowed leaves per year |
status
|
string | Status of the leave type |
search
|
string | Search by type name |
[]
{
"status": "success",
"data": [
{
"id": 1,
"type_name": "Annual Leave",
"days": 14,
"is_paid": true,
"color": "#4CAF50"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"type_name": "Maternity Leave",
"days": 90,
"is_paid": true
}
{
"status": "success",
"message": "Leave type 'Maternity Leave' created.",
"data": {
"id": 4,
"type_name": "Maternity Leave",
"days": 90
}
}
| HTTP Code | Message |
|---|---|
422 |
The type name field is required. |
{
"type_name": "Annual Leave",
"days": 16
}
{
"status": "success",
"message": "Leave type 'Annual Leave' updated."
}
| HTTP Code | Message |
|---|---|
404 |
Leave type not found. |
{
"id": "1"
}
{
"status": "success",
"message": "Leave type 'Annual Leave' deleted."
}
| HTTP Code | Message |
|---|---|
404 |
Leave type not found. |
Manage attendance: clock-in, clock-out, list records. Filter by employee, date, month, year.
| Name | Type | Description |
|---|---|---|
id
|
string | Attendance record ID — used on PUT to target a specific record directly (admin) |
employee_id
|
string | User ID to filter (GET) or clock in/out for (admin only) |
employee_name
|
string | Employee name to look up — admin only |
date
|
string | Specific date filter Y-m-d (GET) |
month
|
string | Month number 1-12 filter (GET) |
year
|
string | Year e.g. 2026 filter (GET) |
today
|
boolean | string | If true, return only today's records (GET) |
clock_in_datetime
|
string | Admin only: explicit clock-in datetime (Y-m-d H:i:s or H:i) |
clock_out_datetime
|
string | Admin only: explicit clock-out datetime (Y-m-d H:i:s or H:i) |
working_from
|
string | Where the employee is working from |
late
|
string | Admin only: override late flag |
half_day
|
string | Admin only: override half-day flag |
{
"today": true
}
{
"status": "success",
"data": [
{
"id": 300,
"employee_id": 7,
"date": "2026-05-07",
"clock_in_time": "08:55:00",
"clock_out_time": null,
"working_from": "office"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"employee_id": 7,
"working_from": "office"
}
{
"status": "success",
"message": "Clocked in successfully.",
"id": 300
}
| HTTP Code | Message |
|---|---|
422 |
Already clocked in today. |
{
"id": 300
}
{
"status": "success",
"message": "Clocked out successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Attendance record not found. |
Manage employees: list, show full profile, create, update (profile/department/designation/status/skills), deactivate/delete. Always resolve by name or email — never require an ID from the user.
| Name | Type | Description |
|---|---|---|
name
|
string | Employee full name (partial match). Used to look up for GET detail, PUT, DELETE. |
email
|
string | Employee email (exact). Alternative lookup for PUT/DELETE. |
search
|
string | Search employees by name or email (GET list). |
status
|
string | Filter/set employee status. Use "active" for active employees, "deactive" for inactive/deactivated employees. The tool also accepts "inactive" or "deactivated" and normalizes them automatically. |
department_name
|
string | Primary department name (partial match). Resolved to department_id. |
designation_name
|
string | Designation/position name (partial match). Resolved to designation_id. |
with_details
|
boolean | Include full profile details in GET. Default false (summary only). |
role
|
string | Filter list by role name (partial match, e.g. "ticket manager", "admin", "employee"). Leave blank to show all employees. |
new_name
|
string | Full name for new employee (POST) or rename existing (PUT). |
new_email
|
string | Email for new employee (POST) or change email (PUT). |
password
|
string | Password (POST/PUT). Default: Welcome@123. |
mobile
|
string | Mobile / phone number. |
gender
|
string | Gender. |
timezone
|
string | User timezone (e.g. Asia/Jakarta, UTC, America/New_York). Stored on the user account. |
login
|
string | Whether the employee can log in. Default enable. |
employee_id
|
string | Custom employee/staff ID (e.g. EMP-001). |
preferred_name
|
string | Preferred display name. |
joining_date
|
string | Joining date (Y-m-d or natural language like "today"). |
last_date
|
string | Last working date (Y-m-d). Set when offboarding. |
birthday
|
string | Date of birth (Y-m-d). |
address
|
string | Home address. |
hourly_rate
|
string | Hourly rate (numeric). |
slack_username
|
string | Slack username. |
manager
|
string | Whether this employee is a manager. |
marital_status
|
string | Marital status. |
nationality
|
string | Nationality (e.g. Indonesia, Malaysian, Filipino). |
location
|
string | Work location / branch. |
employment_type
|
string | Employment type (e.g. full-time, part-time, contract). |
attendance
|
string | Attendance tracking mode. "active" = tracking enabled, "deactive" = disabled. |
subsidiary
|
string | Subsidiary / branch name. |
highest_qualification
|
string | Highest educational qualification. |
show_organizational_chart
|
string | Show in org chart. |
nric
|
string | National ID / NRIC number. |
passport
|
string | Passport number. |
resident
|
string | Residency status. |
work_permit_no
|
string | Work permit number. |
work_permit_expiry_date
|
string | Work permit expiry date (Y-m-d). |
amount_of_children
|
string | Number of children. |
spouse_working
|
string | Whether spouse is working. |
disabled_person
|
string | Employee is a disabled person. |
disabled_spouse
|
string | Spouse is a disabled person. |
disabled_children
|
string | Has disabled children. |
next_of_kin_full_name
|
string | Next of kin full name. |
next_of_kin_phone_number
|
string | Next of kin phone number. |
next_of_kin_relationship
|
string | Relationship to next of kin (e.g. spouse, parent). |
salary
|
string | Salary amount (numeric). |
salary_type
|
string | Salary type. |
salary_currency
|
string | Currency code for salary (e.g. IDR, MYR, USD). |
payment_method
|
string | Payment method (e.g. bank transfer, cash). |
bank_name
|
string | Bank name. |
bank_account_no
|
string | Bank account number. |
bank_account_name
|
string | Bank account holder name. |
bank_account_type
|
string | Bank account type (e.g. savings, current). |
employee_type_name
|
string | Employee type name (partial match, e.g. Full Time, Part Time, Intern). Resolved to employee_type_id. |
reports_to_name
|
string | Manager/supervisor name (partial match). Resolved to reports_to field. |
skills
|
string | Comma-separated skill names to assign (replaces existing). |
reports_to_since
|
string | Date since employee reports to current manager (Y-m-d). |
employment_status_effective_from
|
string | Employment status effective from date (Y-m-d). |
employment_status_effective_to
|
string | Employment status effective to date (Y-m-d). |
{
"department_id": 4,
"status": "active"
}
{
"status": "success",
"data": [
{
"id": 7,
"name": "Sarah Lee",
"email": "[email protected]",
"department_id": 4,
"designation_id": 2,
"status": "active",
"joining_date": "2024-01-15"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"name": "John Doe",
"email": "[email protected]",
"password": "secret123",
"department_id": 4,
"designation_id": 2,
"joining_date": "2026-06-01"
}
{
"status": "success",
"message": "Employee created successfully.",
"id": 8
}
| HTTP Code | Message |
|---|---|
422 |
The email has already been taken. |
{
"id": 7,
"status": "inactive"
}
{
"status": "success",
"message": "Employee updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Employee not found. |
{
"id": 7
}
{
"status": "success",
"message": "Employee deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Employee not found. |
Manage departments/teams: list, show details with members, create, update, delete, add/remove members. Always resolve by name — never require an ID from the user.
| Name | Type | Description |
|---|---|---|
name
|
string | Department name (partial match for lookup on GET/PUT/DELETE). Never ask the user for an ID — use this. |
team_name
|
string | Alias for name. New name when creating/renaming. |
new_name
|
string | New department name when renaming an existing department (PUT). |
description
|
string | Department description. |
parent_name
|
string | Parent department name (partial match). Used for hierarchical setup. |
leader_name
|
string | Full name of the department leader/manager (partial match on employee name). |
action
|
string | Member action: "add_member", "remove_member", "add_associate", "remove_associate". Use with employee_name. |
employee_name
|
string | Employee full name (partial match) for member actions. |
search
|
string | Search departments by name (GET). |
with_members
|
boolean | Include members list in GET response. Default false. |
{
"search": "marketing"
}
{
"status": "success",
"data": [
{
"id": 4,
"team_name": "Digital Marketing",
"name": "Digital Marketing",
"description": "Handles all digital channels",
"parent_id": null
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"team_name": "Product Design",
"description": "UI\/UX and product design team"
}
{
"status": "success",
"message": "Department created successfully.",
"id": 5
}
| HTTP Code | Message |
|---|---|
422 |
The team name field is required. |
{
"id": 4,
"team_name": "Digital Marketing & SEO"
}
{
"status": "success",
"message": "Department updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Department not found. |
{
"id": 4
}
{
"status": "success",
"message": "Department deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Department not found. |
Manage job designations/positions: list (with member counts), create, update, delete. Always resolve by name — never require an ID from the user.
| Name | Type | Description |
|---|---|---|
name
|
string | Designation name for lookup (partial match). Used for GET detail, PUT, DELETE. Never ask the user for an ID. |
search
|
string | Partial name search for GET list. |
new_name
|
string | New designation name when renaming an existing one (PUT). Use `name` to identify which designation to rename. |
description
|
string | Optional description of the designation/position. |
with_members
|
boolean | Include list of members holding this designation in GET response. Default false. |
{
"search": "engineer"
}
{
"status": "success",
"data": [
{
"id": 2,
"name": "Senior Software Engineer"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"name": "DevOps Engineer"
}
{
"status": "success",
"message": "Designation created successfully.",
"id": 3
}
| HTTP Code | Message |
|---|---|
422 |
The name field is required. |
{
"id": 2,
"name": "Principal Software Engineer"
}
{
"status": "success",
"message": "Designation updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Designation not found. |
{
"id": 2
}
{
"status": "success",
"message": "Designation deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Designation not found. |
Manage clients: list, create, update, delete. Filter by name, company.
| Name | Type | Description |
|---|---|---|
id
|
string | Client user ID — or use "company_name" or "name" to look up by name instead |
search
|
string | Search by name or company |
company_name
|
string | Company name (also used to look up client for PUT/DELETE) |
name
|
string | Contact person name (also used to look up client for PUT/DELETE) |
email
|
string | — |
mobile
|
string | — |
website
|
string | — |
address
|
string | — |
note
|
string | — |
{
"search": "acme"
}
{
"status": "success",
"data": [
{
"id": 3,
"name": "Bob Smith",
"company_name": "Acme Corp",
"email": "[email protected]",
"mobile": "+1234567890",
"website": "https:\/\/acme.com"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"name": "Alice Johnson",
"email": "[email protected]",
"company_name": "New Client Ltd",
"mobile": "+0987654321",
"send_email": "yes"
}
{
"status": "success",
"message": "Client created successfully.",
"id": 4
}
| HTTP Code | Message |
|---|---|
422 |
The email has already been taken. |
{
"id": 3,
"website": "https:\/\/acme-new.com"
}
{
"status": "success",
"message": "Client updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Client not found. |
{
"id": 3
}
{
"status": "success",
"message": "Client deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Client not found. |
Manage support tickets and their conversation replies. Supports full CRUD (list, create, update, delete), reply/conversation management (resource=reply), ticket statistics (action=stats), and close/reopen actions. Name-based lookups for agent, requester, type, and channel. Admins and privileged members have full access. Regular members can manage their own tickets (create, view, reply, close, reopen).
| Name | Type | Description |
|---|---|---|
resource
|
string | Sub-resource to manage. Defaults to "ticket". Use "reply" to list (GET) or add (POST) replies to a ticket conversation. |
action
|
string | Special action on a ticket. "close" — set status to closed and add a system reply. Provide id or subject to identify the ticket. "reopen" — reopen a closed ticket (open if no agent, pending if agent assigned). "stats" — return ticket counts by status (open, pending, resolved, closed, total). No other params needed. |
id
|
string | Ticket ID (numeric). Preferred for PUT/DELETE/reply to pinpoint a specific ticket. |
subject
|
string | Ticket subject. Required for POST (create ticket). Also used as a partial-match fallback lookup when id is not provided (PUT/DELETE). |
search
|
string | Search/filter ticket list by subject substring (GET only). |
description
|
string | Ticket body — the initial message. Required for POST (create). Stored as the first reply in the conversation thread (not on the ticket record itself). |
message
|
string | Reply text to append to the ticket conversation. Use on PUT (update) to add a reply while also updating other fields. Use with resource=reply, method=POST to add a standalone reply. |
status
|
string | Ticket status. Defaults to "open" on create. Prefer action=close / action=reopen for status transitions. |
priority
|
string | Ticket priority. Defaults to "medium" on create. |
due_date
|
string | Expected resolution date (Y-m-d). Admin/privileged members only. |
tags
|
string | Comma-separated tags to attach to the ticket (e.g. "billing,urgent,vip"). Replaces existing tags. Admin/privileged members only. |
agent_name
|
string | Name of the support agent to assign (partial match). Resolved to agent_id automatically. When agent is reassigned, they are notified. Admin/privileged members only. |
requester_name
|
string | Name of the ticket requester/submitter (partial match). Resolved to user_id. Admin/privileged use only — creates ticket on behalf of that user. |
type_name
|
string | Ticket type name (partial match, e.g. "bug", "feature request"). Resolved to type_id automatically. |
channel_name
|
string | Ticket channel name (partial match, e.g. "email", "chat", "phone"). Resolved to channel_id automatically. |
filter_status
|
string | Filter ticket list by status (GET only). |
filter_priority
|
string | Filter ticket list by priority (GET only). |
filter_agent
|
string | Filter ticket list by agent name (partial match, GET only). |
filter_requester
|
string | Filter ticket list by requester/submitter name (partial match, GET only, admin only). |
{
"status": "open",
"priority": "high"
}
{
"status": "success",
"data": [
{
"id": 500,
"subject": "Login not working",
"status": "open",
"priority": "high",
"agent_id": 7,
"type_id": 1,
"channel_id": 2
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"subject": "Cannot export report",
"description": "Export button not responding",
"priority": "medium",
"type_id": 1,
"channel_id": 2,
"user_id": 7
}
{
"status": "success",
"message": "Ticket created successfully.",
"id": 501
}
| HTTP Code | Message |
|---|---|
422 |
The subject field is required. |
{
"id": 500,
"status": "resolved",
"agent_id": 8
}
{
"status": "success",
"message": "Ticket updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Ticket not found. |
{
"id": 500
}
{
"status": "success",
"message": "Ticket deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Ticket not found. |
Manage ticket types/classifications: list, create, update, delete. Lookup by name or ID.
| Name | Type | Description |
|---|---|---|
id
|
string | Ticket type ID. For PUT/DELETE you may also supply `type` or `name` to look up by name instead. |
type
|
string | Ticket type name (required for POST; used as name-based lookup key for PUT/DELETE when id is omitted). |
name
|
string | Alias for `type`. Used as name-based lookup key for PUT/DELETE when id is omitted. |
search
|
string | Search ticket types by name (GET). |
{
"search": "bug"
}
{
"status": "success",
"data": [
{
"id": 1,
"type": "Bug Report"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"type": "Feature Request"
}
{
"status": "success",
"message": "Ticket type created successfully.",
"id": 2
}
| HTTP Code | Message |
|---|---|
422 |
The type field is required. |
{
"id": 1,
"type": "Critical Bug"
}
{
"status": "success",
"message": "Ticket type updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Ticket type not found. |
{
"id": 1
}
{
"status": "success",
"message": "Ticket type deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Ticket type not found. |
Manage ticket channels (e.g. email, phone, chat): list, create, update, delete. Requires the tickets module.
| Name | Type | Description |
|---|---|---|
id
|
string | Channel ID. For PUT/DELETE you may supply id OR channel_name/name instead. |
channel_name
|
string | Channel name (required for POST; used as lookup key for PUT/DELETE when id is omitted). |
name
|
string | Alias for channel_name — can be used as a lookup key for PUT/DELETE. |
search
|
string | Search substring within channel_name. |
[]
{
"status": "success",
"data": [
{
"id": 1,
"channel_name": "Email"
},
{
"id": 2,
"channel_name": "Live Chat"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"channel_name": "WhatsApp"
}
{
"status": "success",
"message": "Channel created successfully.",
"id": 3
}
| HTTP Code | Message |
|---|---|
422 |
The channel name field is required. |
{
"id": 1,
"channel_name": "Email Support"
}
{
"status": "success",
"message": "Channel updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Channel not found. |
{
"id": 1
}
{
"status": "success",
"message": "Channel deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Channel not found. |
List ticket agents and their assigned groups.
[]
{
"status": "success",
"data": [
{
"id": 7,
"name": "Sarah Lee",
"email": "[email protected]",
"group": "Technical Support"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
Manage OKR objectives: list, create, update, delete. Filter by cycle, type (company/team/personal), status.
| Name | Type | Description |
|---|---|---|
id
|
string | Objective ID. For PUT/DELETE you may omit and supply title for name-based lookup. |
title
|
string | Objective title (required for POST; used as lookup key for PUT/DELETE when id omitted). |
description
|
string | — |
objective_type
|
string | "company", "team", or "personal". Defaults to "personal" for members, "company" for admins. |
cycle_id
|
string | Performance cycle ID. Uses active cycle if omitted. |
cycle_name
|
string | Filter by cycle name (partial match). Used when cycle_id is unknown. |
team_id
|
string | Team/department ID. Use to filter team objectives by exact ID. |
team_name
|
string | Team/department name (partial match). Used when team_id is unknown. |
employee_id
|
string | EmployeeDetails ID. Use to filter personal objectives by exact ID. |
employee_name
|
string | Employee full name (partial match). Used when employee_id is unknown. |
started_at
|
string | Start date (Y-m-d). Uses cycle start if omitted. |
finished_at
|
string | End date (Y-m-d). Uses cycle end if omitted. |
weight
|
string | Objective weight 1-100. Default 1. |
confidence
|
string | Confidence score 0-10. Default 0. |
search
|
string | Search in objective title. |
{
"cycle_id": 3,
"level": "company"
}
{
"status": "success",
"data": [
{
"id": 20,
"heading": "Grow ARR by 40%",
"level": "company",
"status": "on track",
"cycle_id": 3,
"description": "Increase annual recurring revenue"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"heading": "Improve NPS Score",
"level": "company",
"cycle_id": 3,
"type": "qualitative"
}
{
"status": "success",
"message": "Objective created successfully.",
"id": 21
}
| HTTP Code | Message |
|---|---|
422 |
The heading field is required. |
{
"id": 20,
"status": "at risk"
}
{
"status": "success",
"message": "Objective updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Objective not found. |
{
"id": 20
}
{
"status": "success",
"message": "Objective deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Objective not found. |
Manage OKR key results: list, create, update, delete, update progress. Link to objectives.
| Name | Type | Description |
|---|---|---|
id
|
string | Key result ID for PUT/DELETE. If omitted, lookup is attempted by title. |
objective_id
|
string | Parent objective ID. Use this when you know the exact ID, otherwise use objective_title + context filters. |
objective_title
|
string | Parent objective title (partial match). Combine with team_name or employee_name to narrow down. |
objective_type
|
string | Objective owner type: "company", "team", or "personal". Helps narrow lookup. |
team_name
|
string | Team name (partial match). Used to find the objective when objective_type=team. |
employee_name
|
string | Employee full name (partial match). Used to find the objective when objective_type=personal. |
cycle_name
|
string | Performance cycle name (partial match, e.g. "Q2 2026"). Used to narrow objective lookup. |
cycle_id
|
string | Performance cycle ID. Alternative to cycle_name. |
title
|
string | Key result title (required for POST, used as name-based lookup for PUT/DELETE) |
description
|
string | — |
initial_value
|
string | Start value. Default 0. |
target_value
|
string | Target value. Default 100. |
current_value
|
string | Current progress value. Default equals initial_value. |
weight
|
string | Weight 1–100. Default 100. |
unit_value
|
string | Unit label (e.g. %, $, units). Default: %. |
confidence
|
string | Confidence level 0–10. |
leader_id
|
string | EmployeeDetails ID of the key result owner. |
remarks
|
string | Check-in remarks / notes for this update. |
{
"objective_id": 20
}
{
"status": "success",
"data": [
{
"id": 30,
"krs_title": "Sign 50 new enterprise clients",
"krs_init": 0,
"krs_tar": 50,
"krs_now": 18,
"krs_weight": 100,
"krs_unit": "%",
"objective_id": 20
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"krs_owner": 20,
"krs_title": "Reduce churn to < 5%",
"krs_init": 8,
"krs_tar": 5,
"krs_now": 8,
"krs_weight": 100,
"krs_unit": "%"
}
{
"status": "success",
"message": "Key result created successfully.",
"id": 31
}
| HTTP Code | Message |
|---|---|
422 |
The krs owner field is required. |
{
"id": 30,
"krs_now": 24
}
{
"status": "success",
"message": "Key result updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Key result not found. |
{
"id": 30
}
{
"status": "success",
"message": "Key result deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Key result not found. |
Manage KPI indicators: list, create, update, delete. Filter by category, employee. Lookup by title or ID.
| Name | Type | Description |
|---|---|---|
id
|
string | Indicator ID. For PUT/DELETE, name-based lookup also supported via `title`. |
title
|
string | Indicator title (required for POST; used for name-based lookup on PUT/DELETE) |
category_id
|
string | Indicator type/category ID (use category_name if ID unknown) |
category_name
|
string | Indicator category name — resolved to category_id automatically |
employee_id
|
string | Employee user ID to filter or assign (use employee_name if ID unknown) |
employee_name
|
string | Employee name — resolved to employee_id automatically for filter or assign |
target_value
|
number | string | Target value for the indicator |
unit_value
|
string | Unit of measurement (e.g. %, $, units) |
occurance
|
string | "daily", "weekly", "monthly", "quarterly", or "yearly" |
description
|
string | Description or notes for the indicator |
search
|
string | Search indicators by title |
{
"employee_id": 7,
"frequency": "monthly"
}
{
"status": "success",
"data": [
{
"id": 40,
"name": "Monthly Sales Revenue",
"target": 100000,
"unit": "USD",
"frequency": "monthly",
"employee_id": 7,
"category_id": 2
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"name": "Customer Satisfaction Score",
"target": 90,
"unit": "%",
"frequency": "monthly",
"employee_id": 7,
"category_id": 2
}
{
"status": "success",
"message": "KPI created successfully.",
"id": 41
}
| HTTP Code | Message |
|---|---|
422 |
The name field is required. |
{
"id": 40,
"target": 120000
}
{
"status": "success",
"message": "KPI updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
KPI not found. |
{
"id": 40
}
{
"status": "success",
"message": "KPI deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
KPI not found. |
Manage KPI indicator categories/types: list, create, update, delete. Lookup by name or ID.
| Name | Type | Description |
|---|---|---|
id
|
string | Category ID for PUT/DELETE. If omitted, lookup falls back to indicator_type_name or name. |
indicator_type_name
|
string | Category name (required for POST; used as name-based lookup key for PUT/DELETE). |
name
|
string | Alias for indicator_type_name. Can be used for lookup in PUT/DELETE. |
search
|
string | Partial name search for GET. |
status
|
string | Optional status filter. |
{
"all": true
}
{
"status": "success",
"data": [
{
"id": 1,
"indicator_type_name": "Sales"
},
{
"id": 2,
"indicator_type_name": "Customer Success"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"indicator_type_name": "Engineering"
}
{
"status": "success",
"message": "Category created successfully.",
"id": 3
}
| HTTP Code | Message |
|---|---|
422 |
The indicator type name field is required. |
{
"id": 1,
"indicator_type_name": "Revenue & Sales"
}
{
"status": "success",
"message": "Category updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Category not found. |
{
"id": 1
}
{
"status": "success",
"message": "Category deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Category not found. |
Manage KPI indicator records (actual values per period): list, add, delete. Lookup by indicator_id + period_key.
| Name | Type | Description |
|---|---|---|
id
|
string | Record ID (for single GET or DELETE) |
indicator_id
|
string | KPI indicator ID (required for GET list and POST) |
period_key
|
string | Period date in Y-m-d format (required for POST; used with indicator_id as unique lookup key) |
current_value
|
number | string | Actual value for the period |
target_value
|
number | string | Target value for the period |
remark
|
string | Optional remark / notes for the record |
updated_by
|
string | User ID of who updated this record |
start_date
|
string | Filter records from this date (Y-m-d) |
end_date
|
string | Filter records to this date (Y-m-d) |
month
|
string | Filter by month number (1-12) |
year
|
string | Filter by 4-digit year |
{
"indicator_id": 40,
"month": 5,
"year": 2026
}
{
"status": "success",
"data": [
{
"id": 200,
"indicator_id": 40,
"period_key": "01-5-2026",
"current_value": 95000,
"target_value": 100000,
"score": 95,
"remark": "On track"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"indicator_id": 40,
"period_key": "01-6-2026",
"current_value": 112000,
"target_value": 100000,
"remark": "Exceeded target"
}
{
"status": "success",
"message": "Record updated successfully."
}
| HTTP Code | Message |
|---|---|
422 |
The indicator id field is required. |
{
"id": 200
}
{
"status": "success",
"message": "Record deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Record not found. |
Manage OKR performance cycles: list, create, update, delete. Lookup by name or ID.
| Name | Type | Description |
|---|---|---|
id
|
string | Cycle ID for PUT/DELETE. If omitted, lookup is attempted by name. |
name
|
string | Cycle name (required for POST; used as fallback lookup key for PUT/DELETE). |
cycle_type
|
string | Cycle type (e.g. quarterly, annual, monthly). |
started_at
|
string | Start date (Y-m-d). |
finished_at
|
string | End date (Y-m-d). |
search
|
string | Search cycles by name (GET). |
{
"per_page": 10,
"page": 1
}
{
"status": "success",
"data": [
{
"id": 3,
"name": "Q2 2026",
"cycle_type": "quarterly",
"started_at": "2026-04-01",
"finished_at": "2026-06-30"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"name": "Q3 2026",
"cycle_type": "quarterly",
"started_at": "2026-07-01",
"finished_at": "2026-09-30"
}
{
"status": "success",
"message": "Performance cycle created successfully.",
"id": 4
}
| HTTP Code | Message |
|---|---|
422 |
The name field is required. |
{
"id": 3,
"name": "Q2 2026 Updated"
}
{
"status": "success",
"message": "Cycle updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Cycle not found. |
{
"id": 3
}
{
"status": "success",
"message": "Cycle deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Cycle not found. |
Manage company holidays: list, create, update, delete. Filter by year, upcoming/past. Lookup by ID or holiday name.
| Name | Type | Description |
|---|---|---|
id
|
string | Holiday ID. For PUT/DELETE you may also use `occassion` or `name` for name-based lookup instead. |
occassion
|
string | Holiday occasion/name (required for POST; used as name-based lookup key for PUT/DELETE). |
name
|
string | Alias for `occassion`. Used for name-based lookup on PUT/DELETE. |
date
|
string | Holiday date in Y-m-d format (required for POST; optional for PUT). |
year
|
string | Filter list results by year (GET only). |
status
|
string | "upcoming" returns holidays on or after today; "past" returns holidays before today (GET only). |
search
|
string | Partial name search against the occasion field (GET only). |
{
"year": 2026,
"status": "upcoming"
}
{
"status": "success",
"data": [
{
"id": 10,
"occasion": "Independence Day",
"date": "17\/08\/2026"
},
{
"id": 11,
"occasion": "Christmas Day",
"date": "25\/12\/2026"
}
]
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"occasion": "New Year's Day",
"date": "01\/01\/2027"
}
{
"status": "success",
"message": "Holiday created successfully.",
"id": 12
}
| HTTP Code | Message |
|---|---|
422 |
The date field is required. |
{
"id": 10,
"occasion": "National Independence Day"
}
{
"status": "success",
"message": "Holiday updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Holiday not found. |
{
"id": 10
}
{
"status": "success",
"message": "Holiday deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Holiday not found. |
Manage sales leads: list, create, update, delete. Filter by status, agent, date range.
| Name | Type | Description |
|---|---|---|
id
|
string | Lead ID — or use "client_name" to look up by name instead |
client_name
|
string | Lead contact name (required for POST; also used to look up lead for PUT/DELETE) |
company_name
|
string | — |
email
|
string | — |
mobile
|
string | — |
website
|
string | — |
address
|
string | — |
note
|
string | — |
agent_id
|
string | Agent user ID (use agent_name if ID unknown) |
agent_name
|
string | Agent name — resolved to agent_id automatically |
status_id
|
string | Lead status ID (use status_name if ID unknown) |
status_name
|
string | Lead status name (e.g. "New", "In Progress") — resolved to status_id automatically |
source_id
|
string | Lead source ID (use source_name if ID unknown) |
source_name
|
string | Lead source name (e.g. "Website", "Referral") — resolved to source_id automatically |
next_follow_up
|
string | Whether a follow-up is scheduled (yes/no). Default: yes |
next_follow_up_date
|
string | Follow-up date (Y-m-d) — stored as a follow-up record, not on the lead directly |
startDate
|
string | Filter from date |
endDate
|
string | Filter to date |
search
|
string | — |
{
"client": "lead",
"per_page": 20,
"page": 1
}
{
"status": "success",
"data": [
{
"id": 55,
"client_name": "PT Maju Jaya",
"email": "[email protected]",
"mobile": "+6281234567890",
"status_id": 2,
"agent_id": 7
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"client_name": "PT Maju Jaya",
"email": "[email protected]",
"mobile": "+6281234567890",
"status_id": 1,
"agent_id": 7
}
{
"status": "success",
"message": "Lead created successfully.",
"id": 56
}
| HTTP Code | Message |
|---|---|
422 |
The client name field is required. |
{
"id": 55,
"status": 3,
"note": "Proposal sent"
}
{
"status": "success",
"message": "Lead updated successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Lead not found. |
{
"id": 55
}
{
"status": "success",
"message": "Lead deleted successfully."
}
| HTTP Code | Message |
|---|---|
404 |
Lead not found. |
Manage client invoices: list, create, update status, delete. Filter by client, status, date range.
| Name | Type | Description |
|---|---|---|
id
|
string | Invoice ID — or use invoice_number to look up |
invoice_number
|
string | Invoice number to look up (e.g. INV#0001) for PUT/DELETE |
client_name
|
string | Client company name or contact name to filter or use for create |
client_id
|
string | — |
project_id
|
string | — |
issue_date
|
string | Issue date (Y-m-d, defaults to today) |
due_date
|
string | Due date (Y-m-d) |
sub_total
|
number | Subtotal amount |
total
|
number | Total amount (required for POST) |
currency_id
|
string | — |
note
|
string | — |
status
|
string | Filter invoices by status (GET) or update status (PUT) |
search
|
string | Search in invoice number or client name |
startDate
|
string | — |
endDate
|
string | — |
{
"client_name": "Acme Corp"
}
{
"success": true,
"data": [
{
"id": 1,
"invoice_number": 1,
"client_id": 3,
"total": 5000,
"issue_date": "2026-05-01",
"due_date": "2026-05-31"
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"client_name": "Acme Corp",
"total": 5000,
"issue_date": "2026-05-01",
"due_date": "2026-05-31"
}
{
"success": true,
"message": "Invoice created for client #3 with total 5000."
}
| HTTP Code | Message |
|---|---|
422 |
"total" is required to create an invoice. |
{
"invoice_number": "INV#0001",
"due_date": "2026-06-15"
}
{
"success": true,
"message": "Invoice #1 updated."
}
| HTTP Code | Message |
|---|---|
404 |
Invoice not found. |
{
"invoice_number": "INV#0001"
}
{
"success": true,
"message": "Invoice #1 deleted."
}
| HTTP Code | Message |
|---|---|
404 |
Invoice not found. |
Manage client estimates/quotes: list, create, update, delete. Filter by client, status, date.
| Name | Type | Description |
|---|---|---|
id
|
string | Estimate ID — or use estimate_number to look up |
estimate_number
|
string | Estimate number for lookup (PUT/DELETE), e.g. EST#0001 |
client_name
|
string | Client company name or contact name for create/filter |
client_id
|
string | — |
valid_till
|
string | Expiry date (Y-m-d) |
sub_total
|
number | — |
total
|
number | Total amount (required for POST) |
discount
|
number | — |
discount_type
|
string | percent or fixed |
currency_id
|
string | — |
note
|
string | — |
status
|
string | draft/sent/declined/accepted — filter (GET) or update (PUT) |
search
|
string | — |
startDate
|
string | — |
endDate
|
string | — |
{
"status": "draft"
}
{
"success": true,
"data": [
{
"id": 1,
"estimate_number": 1,
"client_id": 3,
"total": 12000,
"valid_till": "2026-06-30",
"status": "draft"
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"client_name": "Acme Corp",
"total": 12000,
"valid_till": "2026-06-30",
"status": "draft"
}
{
"success": true,
"message": "Estimate created with total 12000 for client #3."
}
| HTTP Code | Message |
|---|---|
422 |
"total" is required to create an estimate. |
{
"estimate_number": "EST#0001",
"status": "sent"
}
{
"success": true,
"message": "Estimate #1 updated."
}
| HTTP Code | Message |
|---|---|
404 |
Estimate not found. |
{
"estimate_number": "EST#0001"
}
{
"success": true,
"message": "Estimate #1 deleted."
}
| HTTP Code | Message |
|---|---|
404 |
Estimate not found. |
Manage company events/calendar: list, create, update, delete. Filter by month, year, date range.
| Name | Type | Description |
|---|---|---|
id
|
string | Event ID — or use event_name to look up by name |
event_name
|
string | Event name (required for POST, or use to look up for PUT/DELETE) |
where
|
string | Event location |
description
|
string | — |
start_date_time
|
string | Start date/time (Y-m-d H:i or Y-m-d, required for POST) |
end_date_time
|
string | End date/time (Y-m-d H:i or Y-m-d, required for POST) |
repeat
|
string | Whether the event repeats. Default: no |
repeat_every
|
integer | Repeat interval (e.g. every 2 weeks) |
repeat_cycles
|
integer | Number of times the event repeats |
repeat_type
|
string | Repeat frequency unit |
label_color
|
string | Bootstrap color class or hex color (default: bg-info) |
month
|
string | Filter list by month number (1–12) |
year
|
string | Filter list by 4-digit year |
startDate
|
string | Filter events starting on or after this date (Y-m-d) |
endDate
|
string | Filter events starting on or before this date (Y-m-d) |
search
|
string | Partial name search against event_name |
{
"month": "6",
"year": "2026"
}
{
"success": true,
"data": [
{
"id": 15,
"event_name": "Q2 All-Hands Meeting",
"where": "Main Conference Room",
"start_date_time": "2026-06-15 09:00:00",
"end_date_time": "2026-06-15 11:00:00",
"repeat": "no"
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"event_name": "Q2 All-Hands Meeting",
"start_date_time": "2026-06-15 09:00",
"end_date_time": "2026-06-15 11:00",
"where": "Main Conference Room"
}
{
"success": true,
"message": "Event 'Q2 All-Hands Meeting' created on 2026-06-15."
}
| HTTP Code | Message |
|---|---|
422 |
"event_name" is required to create an event. |
{
"event_name": "Q2 All-Hands Meeting",
"where": "Zoom"
}
{
"success": true,
"message": "Event 'Q2 All-Hands Meeting' updated."
}
| HTTP Code | Message |
|---|---|
404 |
Event not found. |
{
"id": "15"
}
{
"success": true,
"message": "Event 'Q2 All-Hands Meeting' deleted."
}
| HTTP Code | Message |
|---|---|
404 |
Event not found. |
Manage expenses and claims: list, create, update status (approve/reject), delete. Filter by employee, category, status, date range.
| Name | Type | Description |
|---|---|---|
id
|
string | Expense ID — or use item_name to look up by name |
item_name
|
string | Expense item name (required for POST, or use to look up for PUT/DELETE) |
purchase_date
|
string | Purchase date (Y-m-d, required for POST) |
purchase_from
|
string | Where it was purchased from |
price
|
number | Expense amount (required for POST) |
currency_id
|
string | Currency ID (defaults to company currency if omitted) |
expense_category_id
|
string | Expense category ID (use expense_category_name if ID unknown) |
expense_category_name
|
string | Expense category name — resolved to expense_category_id automatically |
employee_name
|
string | Filter by employee name (GET) or look up user to assign (POST) |
user_id
|
string | Employee user ID (admin can specify; defaults to self) |
project_id
|
string | Link expense to a project (optional) |
description
|
string | Additional notes about the expense |
status
|
string | Filter (GET) or update status (PUT) |
can_claim
|
integer | boolean | 1 = claim reimbursement request, 0 = regular expense |
startDate
|
string | Filter expenses from this purchase date (Y-m-d) |
endDate
|
string | Filter expenses up to this purchase date (Y-m-d) |
{
"status": "pending"
}
{
"success": true,
"data": [
{
"id": 99,
"item_name": "Team Lunch",
"purchase_date": "2026-05-10",
"price": 250,
"status": "pending",
"can_claim": 1,
"user_id": 7
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"item_name": "Team Lunch",
"purchase_date": "2026-05-10",
"price": 250,
"can_claim": 1
}
{
"success": true,
"message": "Expense 'Team Lunch' created (ID #99)."
}
| HTTP Code | Message |
|---|---|
422 |
'item_name' is required. |
{
"id": "99",
"status": "approved"
}
{
"success": true,
"message": "Expense 'Team Lunch' updated."
}
| HTTP Code | Message |
|---|---|
404 |
Expense not found. |
{
"id": "99"
}
{
"success": true,
"message": "Expense 'Team Lunch' (ID #99) deleted."
}
| HTTP Code | Message |
|---|---|
403 |
Only admins can delete expenses. |
Manage expense categories: list, create, update, delete. Admin-only for write operations.
| Name | Type | Description |
|---|---|---|
id
|
string | Category ID — or use category_name to look up by name instead |
category_name
|
string | Category name (required for POST; also used to look up for PUT/DELETE) |
search
|
string | Partial name search against category_name (GET only) |
[]
{
"success": true,
"data": [
{
"id": 1,
"category_name": "Travel & Accommodation"
},
{
"id": 2,
"category_name": "Office Supplies"
}
],
"total": 2
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"category_name": "Marketing"
}
{
"success": true,
"message": "Expense category 'Marketing' created."
}
| HTTP Code | Message |
|---|---|
422 |
"category_name" is required. |
{
"category_name": "Travel & Accommodation"
}
{
"success": true,
"message": "Expense category 'Travel & Accommodation' updated."
}
| HTTP Code | Message |
|---|---|
404 |
Expense category not found. |
{
"id": "1"
}
{
"success": true,
"message": "Expense category 'Travel & Accommodation' deleted."
}
| HTTP Code | Message |
|---|---|
403 |
Only admins can delete expense categories. |
Manage notice board: list, create, update, delete. Filter by date range or audience (all/employee/client).
| Name | Type | Description |
|---|---|---|
id
|
string | Notice ID — or use heading to look up by title |
heading
|
string | Notice title (required for POST, or use to look up for PUT/DELETE) |
description
|
string | Notice content body (required for POST) |
to
|
string | Target audience (default: all) |
search
|
string | Search keyword matched against notice heading |
startDate
|
string | Filter notices created on or after this date (Y-m-d) |
endDate
|
string | Filter notices created on or before this date (Y-m-d) |
{
"to": "employee"
}
{
"success": true,
"data": [
{
"id": 12,
"heading": "Office Closed on Friday",
"description": "The office will be closed this Friday for maintenance.",
"to": "all",
"created_at": "2026-05-08T10:00:00Z"
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"heading": "Office Closed on Friday",
"description": "The office will be closed this Friday for maintenance.",
"to": "all"
}
{
"success": true,
"message": "Notice 'Office Closed on Friday' created (ID #12)."
}
| HTTP Code | Message |
|---|---|
422 |
'heading' is required. |
{
"heading": "Office Closed on Friday",
"description": "Updated: Office closed Friday AND Monday."
}
{
"success": true,
"message": "Notice 'Office Closed on Friday' updated."
}
| HTTP Code | Message |
|---|---|
404 |
Notice not found. |
{
"id": "12"
}
{
"success": true,
"message": "Notice 'Office Closed on Friday' (ID #12) deleted."
}
| HTTP Code | Message |
|---|---|
403 |
Only admins can delete notices. |
Manage client contracts: list, create, update, delete. Filter by client, status, date range.
| Name | Type | Description |
|---|---|---|
id
|
string | Contract ID — or use subject to look up by title |
subject
|
string | Contract title (required for POST, or use to look up for PUT/DELETE) |
client_name
|
string | Client company name to find client user ID (used for create or filter) |
client_id
|
string | Client user ID (alternative to client_name) |
contract_type_id
|
string | Contract type ID |
start_date
|
string | Contract start date (Y-m-d) |
end_date
|
string | Contract end date (Y-m-d) |
description
|
string | Contract description or notes |
amount
|
number | Contract monetary value |
currency_id
|
string | Currency ID for the contract amount |
search
|
string | Search keyword matched against contract subject |
startDate
|
string | Filter contracts with start_date on or after this date (Y-m-d) |
endDate
|
string | Filter contracts with end_date on or before this date (Y-m-d) |
{
"client_name": "Acme Corp"
}
{
"success": true,
"data": [
{
"id": 7,
"subject": "Annual Support Contract",
"client_id": 3,
"amount": 24000,
"start_date": "2026-01-01",
"end_date": "2026-12-31"
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"subject": "Annual Support Contract",
"client_name": "Acme Corp",
"start_date": "2026-01-01",
"end_date": "2026-12-31",
"amount": 24000
}
{
"success": true,
"message": "Contract 'Annual Support Contract' created (ID #7)."
}
| HTTP Code | Message |
|---|---|
422 |
'subject' is required. |
{
"subject": "Annual Support Contract",
"amount": 30000
}
{
"success": true,
"message": "Contract 'Annual Support Contract' updated."
}
| HTTP Code | Message |
|---|---|
404 |
Contract not found. |
{
"id": "7"
}
{
"success": true,
"message": "Contract 'Annual Support Contract' (ID #7) deleted."
}
| HTTP Code | Message |
|---|---|
404 |
Contract not found. |
Manage project/task time logs: list, create (start timer), update (stop timer/edit), delete. Filter by project, employee, date.
| Name | Type | Description |
|---|---|---|
id
|
string | Time log ID (required for DELETE; used for PUT when provided) |
project_name
|
string | Project name — resolved to project_id automatically |
project_id
|
string | Project ID (alternative to project_name) |
task_name
|
string | Task heading — resolved to task_id automatically |
task_id
|
string | Task ID (alternative to task_name) |
employee_name
|
string | Employee name — resolved to user_id for filtering or creating |
user_id
|
string | Employee user ID (admin can specify; defaults to self) |
start_time
|
string | Start datetime (Y-m-d H:i or Y-m-d H:i:s). Defaults to now() on POST. |
end_time
|
string | End datetime — provide on PUT to stop a running timer; omit to keep timer running |
memo
|
string | Optional note or description for the time log entry |
date
|
string | Filter by specific date (Y-m-d) |
month
|
string | Filter by month number (1–12) |
year
|
string | Filter by year (e.g. 2025) |
active_only
|
boolean | string | If true, return only running timers (no end_time) |
{
"month": "5",
"year": "2026"
}
{
"success": true,
"data": [
{
"id": 88,
"user_id": 7,
"project_id": 12,
"task_id": 101,
"start_time": "2026-05-10 09:00:00",
"end_time": "2026-05-10 17:30:00",
"total_hours": 8.5,
"total_minutes": 510,
"memo": "Working on hero section"
}
],
"total": 1
}
| HTTP Code | Message |
|---|---|
401 |
Unauthenticated. |
{
"project_name": "Mobile App v2",
"task_name": "Design landing page",
"memo": "Working on hero section"
}
{
"success": true,
"message": "Timer started for project ID #12, task ID #101 (log ID #88)."
}
| HTTP Code | Message |
|---|---|
422 |
Failed to start timer. |
{
"id": "88",
"end_time": "2026-05-10 17:30"
}
{
"success": true,
"message": "Time log #88 updated (timer stopped). Total logged: 8h 30m."
}
| HTTP Code | Message |
|---|---|
404 |
Time log not found or no active timer running. |
{
"id": "88"
}
{
"success": true,
"message": "Time log #88 deleted."
}
| HTTP Code | Message |
|---|---|
403 |
Only admins can delete time logs. |
Start building with FlowyTeam MCP
Create your free account and connect your AI agent to FlowyTeam in minutes.
Start for Free