openapi: 3.0.3
info:
title: 'Corcava Public API Documentation'
description: ''
version: 1.0.0
servers:
-
url: 'https://app.corcava.com'
tags:
-
name: 'Bill Rates'
description: "\nAPIs for managing user bill rates within projects.\n\nBill rates represent the hourly rate for a user on a specific project, effective from a given start date.\nEach user can have multiple bill rates over time, but only one active rate at any given time."
-
name: Boards
description: "\nAPIs for managing project boards.\n\nBoards group tasks inside a project. Use these endpoints to list, create, update, and delete project boards within your team."
-
name: 'CRM Emails'
description: "\nOne-to-one CRM email drafts and send for contacts (Gmail)."
-
name: 'CRM Inbox'
description: "\nRead synced Gmail inbox threads for reply drafting via MCP / Public API."
-
name: Clients
description: "\nAPIs for managing clients.\n\nClients represent organisations you collaborate with. These endpoints let you list, create, update, and delete clients that belong to your team."
-
name: 'Contact Notes'
description: "\nAPIs for managing notes attached to contacts.\n\nThese endpoints let you list, create, update, and delete notes for a specific contact."
-
name: 'Contact Tasks'
description: "\nAPIs for managing tasks related to a contact.\n\nThese endpoints allow you to list, create, update, and delete tasks\nthat are associated with a specific contact."
-
name: Contacts
description: "\nAPIs for managing contacts.\n\nContacts represent people related to your clients. Use these endpoints to list, create, update, and delete contacts within your team."
-
name: 'Custom Fields'
description: "\nAPIs for managing custom field definitions.\n\nCustom fields allow teams to define additional structured data\nthat can be attached to various entities across the system."
-
name: 'Deal Flow Columns'
description: "\nAPIs for managing deal pipeline columns/stages.\n\nDeal flow columns represent stages in a sales or deal pipeline. These endpoints let you list, create, update, reorder, and delete columns that belong to your team."
-
name: 'Deals Management'
description: "\nAPIs for managing deals\n\nThis controller provides endpoints to create, read, update, delete, and manage the order of deals within the system."
-
name: 'Email Campaigns'
description: "\nAPIs for managing email marketing campaigns.\n\nEmail campaigns allow you to create scheduled email messages,\nconfigure their content (template or text editor),\nand send them to selected recipients."
-
name: 'Email Templates'
description: "\nAPIs for managing email templates.\n\nEmail templates are reusable messages that belong to a team and can be used\nfor sending emails across the system."
-
name: Endpoints
description: ''
-
name: Expenses
description: "\nAPIs for managing business expenses.\n\nTrack business expenses with support for categorization, project assignment, and file attachments.\nAll expenses are scoped to the authenticated user's team."
-
name: 'HR Candidates'
description: "\nPublic API for managing HR candidates.\n\nCandidates belong to HR vacancies and are always scoped to the authenticated user's team."
-
name: 'HR Interviews'
description: "\nAPIs for managing HR interviews.\n\nHR interviews represent scheduled or conducted interviews within your team."
-
name: 'HR Vacancies'
description: "\nAPIs for managing HR vacancies.\n\nVacancies represent open job positions within a team.\nThese endpoints allow authenticated users to list, view,\ncreate, update, and delete vacancies belonging to their team."
-
name: Healthcheck
description: 'Checking API availability'
-
name: Meetings
description: "\nAPIs for managing calendar meetings.\n\nMeetings represent scheduled events within a team. These endpoints allow you to list, create,\nupdate, and delete meetings associated with your team."
-
name: Outreach
description: "\nAPIs for managing outreach activities.\n\nOutreach activities represent sales outreach efforts like calls, emails, and social media interactions.\nThese endpoints let you list, create, update, and delete outreach activities for your team."
-
name: 'Pay Rates'
description: "\nAPIs for managing user pay rates over time.\n\nPay rates represent hourly rates assigned to users with specific start dates.\nUsers can have multiple pay rates over time, but only one rate per date."
-
name: 'Project Rates'
description: "\nAPIs for managing project rates.\n\nProject rates define billing rates for projects. These endpoints let you list, create, update, and delete rates for specific projects."
-
name: Projects
description: "\nAPIs for managing projects.\n\nProjects represent client initiatives. These endpoints let you list, create, update, and delete projects that belong to your team."
-
name: Reports
description: "\nAPIs for querying time tracking reports.\n\nThese endpoints let you query aggregated time tracking data with various filters and grouping options.\nEvery request must be authenticated via an active Public API key or Bearer token."
-
name: Screenshots
description: "\nAPIs for managing time tracking screenshots.\n\nThese endpoints let you list screenshots captured during time tracking sessions. Screenshots are organized by user, project, and date."
-
name: Tags
description: "\nTeam-scoped tags that can be attached to contacts, projects, tasks, and other resources."
-
name: 'Task Comments'
description: "\nAPIs for managing comments on tasks.\n\nComments are stored as TaskEvent records with type='comment'.\nThese endpoints let you list, add, update, and delete comments on tasks.\nEvery request must be authenticated via an active Public API key."
-
name: 'Task Events'
description: "\nAPIs for managing task events (comments, system events).\n\nTask events represent activity history of a task, such as user comments\nor system-generated changes."
-
name: 'Task Labels'
description: "\nAPIs for managing task labels.\n\nTask labels allow you to categorize and organize tasks within a project board. These endpoints let you list board labels and attach/detach labels to specific tasks."
-
name: Tasks
description: "\nAPIs for managing project tasks.\n\nThese endpoints let you list, create, update, and delete tasks that belong to your team.\nEvery request must be authenticated via an active Public API key."
-
name: 'Team Invoices'
description: "\nAPIs for managing team invoices.\n\nInvoices represent bills issued to clients. These endpoints let you list, view, close, and reopen invoices that belong to your team."
-
name: 'Team Members'
description: "\nAPIs for listing team members (users).\n\nTeam members are users who belong to your team. Use these endpoints to search and list members.\nThis endpoint supports fuzzy search - typos, partial names, and accents are handled automatically."
-
name: Tickets
description: "\nAPIs for managing user tickets\n\nThese endpoints allow a user to list, create, update, and delete their own tickets.\nAccess is restricted by API key and user ownership. Use `auth:api` middleware."
-
name: 'Time Intervals'
description: "\nAPIs for managing time intervals.\n\nTime intervals represent periods of tracked work. These endpoints let you list, create, update, delete, and move time intervals."
-
name: 'Time Tracking'
description: "\nAPIs for managing time tracking via external sources (Telegram bot, Slack bot, Web Agent, etc.).\nThese endpoints allow starting and stopping time intervals manually.\n\nOnly users with manual time tracking enabled can use these endpoints."
-
name: Workflows
description: "\nNatural-language automation workflows (compiled SQL + tool actions)."
components:
securitySchemes:
default:
type: apiKey
name: X-API-Key
in: header
description: 'You can retrieve your token by visiting your dashboard and clicking Generate API token.'
security:
-
default: []
paths:
'/api/v1/projects/{project_id}/users/{user_id}/bill-rates':
get:
summary: 'Display a paginated list of bill rates for a user in a project.'
operationId: displayAPaginatedListOfBillRatesForAUserInAProject
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting.'
example: started_at
required: false
schema:
type: string
description: 'Column used for sorting.'
example: started_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
project_id: 1
user_id: 42
rate: 85.5
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2023-12-15T10:30:00.000000Z'
updated_at: '2023-12-15T10:30:00.000000Z'
status: current
-
id: 2
project_id: 1
user_id: 42
rate: 75.0
started_at: '2023-07-01T00:00:00.000000Z'
created_at: '2023-06-20T14:15:00.000000Z'
updated_at: '2023-06-20T14:15:00.000000Z'
status: past
links:
first: 'https://example.com/api/v1/projects/1/users/42/bill-rates?page=1'
last: 'https://example.com/api/v1/projects/1/users/42/bill-rates?page=2'
prev: null
next: 'https://example.com/api/v1/projects/1/users/42/bill-rates?page=2'
meta:
current_page: 1
from: 1
last_page: 2
path: 'https://example.com/api/v1/projects/1/users/42/bill-rates'
per_page: 30
to: 30
total: 45
properties:
data:
type: array
example:
-
id: 1
project_id: 1
user_id: 42
rate: 85.5
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2023-12-15T10:30:00.000000Z'
updated_at: '2023-12-15T10:30:00.000000Z'
status: current
-
id: 2
project_id: 1
user_id: 42
rate: 75
started_at: '2023-07-01T00:00:00.000000Z'
created_at: '2023-06-20T14:15:00.000000Z'
updated_at: '2023-06-20T14:15:00.000000Z'
status: past
items:
type: object
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 1
user_id:
type: integer
example: 42
rate:
type: number
example: 85.5
started_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
created_at:
type: string
example: '2023-12-15T10:30:00.000000Z'
updated_at:
type: string
example: '2023-12-15T10:30:00.000000Z'
status:
type: string
example: current
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/projects/1/users/42/bill-rates?page=1'
last:
type: string
example: 'https://example.com/api/v1/projects/1/users/42/bill-rates?page=2'
prev:
type: string
example: null
next:
type: string
example: 'https://example.com/api/v1/projects/1/users/42/bill-rates?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 2
path:
type: string
example: 'https://example.com/api/v1/projects/1/users/42/bill-rates'
per_page:
type: integer
example: 30
to:
type: integer
example: 30
total:
type: integer
example: 45
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
tags:
- 'Bill Rates'
post:
summary: 'Create a new bill rate for a user in a project.'
operationId: createANewBillRateForAUserInAProject
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
project_id: 1
user_id: 42
rate: 85.5
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2023-12-20T09:45:00.000000Z'
updated_at: '2023-12-20T09:45:00.000000Z'
status: future
properties:
id:
type: integer
example: 3
project_id:
type: integer
example: 1
user_id:
type: integer
example: 42
rate:
type: number
example: 85.5
started_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
created_at:
type: string
example: '2023-12-20T09:45:00.000000Z'
updated_at:
type: string
example: '2023-12-20T09:45:00.000000Z'
status:
type: string
example: future
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
422:
description: duplicate_date
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
started_at:
- 'The start date already exists for this user.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
started_at:
type: array
example:
- 'The start date already exists for this user.'
items:
type: string
tags:
- 'Bill Rates'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
started_at:
type: date
description: 'The start date when this rate becomes effective (YYYY-MM-DD).'
example: '2024-01-01'
nullable: false
rate:
type: numeric
description: 'The hourly rate.'
example: '85.50'
nullable: false
required:
- started_at
- rate
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 1
required: true
schema:
type: integer
-
in: path
name: user_id
description: 'The ID of the user.'
example: 1
required: true
schema:
type: integer
-
in: path
name: project
description: 'The ID of the project.'
example: 1
required: true
schema:
type: integer
-
in: path
name: user
description: 'The ID of the user.'
example: 42
required: true
schema:
type: integer
'/api/v1/projects/{project_id}/users/{user_id}/bill-rates/{billRate_id}':
put:
summary: 'Update a bill rate.'
operationId: updateABillRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
project_id: 1
user_id: 42
rate: 90.0
started_at: '2024-02-01T00:00:00.000000Z'
created_at: '2023-12-20T09:45:00.000000Z'
updated_at: '2023-12-25T11:20:00.000000Z'
status: future
properties:
id:
type: integer
example: 3
project_id:
type: integer
example: 1
user_id:
type: integer
example: 42
rate:
type: number
example: 90.0
started_at:
type: string
example: '2024-02-01T00:00:00.000000Z'
created_at:
type: string
example: '2023-12-20T09:45:00.000000Z'
updated_at:
type: string
example: '2023-12-25T11:20:00.000000Z'
status:
type: string
example: future
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Bill rate not found for this user'
properties:
message:
type: string
example: 'Bill rate not found for this user'
422:
description: duplicate_date
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
started_at:
- 'The start date already exists for this user.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
started_at:
type: array
example:
- 'The start date already exists for this user.'
items:
type: string
tags:
- 'Bill Rates'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
started_at:
type: date
description: 'The start date when this rate becomes effective (YYYY-MM-DD).'
example: '2024-02-01'
nullable: false
rate:
type: numeric
description: 'The hourly rate.'
example: '90.00'
nullable: false
delete:
summary: 'Delete a bill rate.'
operationId: deleteABillRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Bill rate not found for this user'
properties:
message:
type: string
example: 'Bill rate not found for this user'
422:
description: cannot_delete
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
error:
- 'Current and past bill rate cannot be deleted'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
error:
type: array
example:
- 'Current and past bill rate cannot be deleted'
items:
type: string
tags:
- 'Bill Rates'
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 1
required: true
schema:
type: integer
-
in: path
name: user_id
description: 'The ID of the user.'
example: 1
required: true
schema:
type: integer
-
in: path
name: billRate_id
description: 'The ID of the billRate.'
example: 1
required: true
schema:
type: integer
-
in: path
name: project
description: 'The ID of the project.'
example: 1
required: true
schema:
type: integer
-
in: path
name: user
description: 'The ID of the user.'
example: 42
required: true
schema:
type: integer
-
in: path
name: billRate
description: 'The ID of the bill rate.'
example: 3
required: true
schema:
type: integer
/api/v1/boards:
get:
summary: 'Display a paginated list of project boards.'
operationId: displayAPaginatedListOfProjectBoards
description: ''
parameters:
-
in: query
name: search
description: 'Filter boards by partial match in the board title.'
example: Marketing
required: false
schema:
type: string
description: 'Filter boards by partial match in the board title.'
example: Marketing
nullable: false
-
in: query
name: project_id
description: 'Filter boards that belong to the given project id.'
example: 5
required: false
schema:
type: integer
description: 'Filter boards that belong to the given project id.'
example: 5
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, title, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, title, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 10
title: 'Marketing pipeline'
description: 'High level marketing workflow.'
project_id: 3
user_id: 14
team_id: 8
created_at: '2025-01-10T12:30:00.000000Z'
updated_at: '2025-01-10T12:30:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/boards?page=1'
last: 'https://example.com/api/v1/boards?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/boards'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 10
title: 'Marketing pipeline'
description: 'High level marketing workflow.'
project_id: 3
user_id: 14
team_id: 8
created_at: '2025-01-10T12:30:00.000000Z'
updated_at: '2025-01-10T12:30:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Marketing pipeline'
description:
type: string
example: 'High level marketing workflow.'
project_id:
type: integer
example: 3
user_id:
type: integer
example: 14
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T12:30:00.000000Z'
updated_at:
type: string
example: '2025-01-10T12:30:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/boards?page=1'
last:
type: string
example: 'https://example.com/api/v1/boards?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/boards'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Boards
post:
summary: 'Create a new project board.'
operationId: createANewProjectBoard
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 10
title: 'Marketing pipeline'
description: 'High level marketing workflow.'
project_id: 3
user_id: 14
team_id: 8
created_at: '2025-01-10T12:30:00.000000Z'
updated_at: '2025-01-10T12:30:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Marketing pipeline'
description:
type: string
example: 'High level marketing workflow.'
project_id:
type: integer
example: 3
user_id:
type: integer
example: 14
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T12:30:00.000000Z'
updated_at:
type: string
example: '2025-01-10T12:30:00.000000Z'
deleted_at:
type: string
example: null
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Project not found'
properties:
message:
type: string
example: 'Project not found'
tags:
- Boards
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'Board title.'
example: 'Marketing pipeline'
nullable: false
description:
type: string
description: 'Board description.'
example: 'High level marketing workflow.'
nullable: true
project_id:
type: integer
description: 'Project id the board belongs to.'
example: 3
nullable: true
user_id:
type: string
description: ''
example: null
nullable: false
team_id:
type: string
description: ''
example: null
nullable: false
required:
- title
'/api/v1/boards/{id}':
get:
summary: 'Display a single board.'
operationId: displayASingleBoard
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 10
title: 'Marketing pipeline'
description: 'High level marketing workflow.'
project_id: 3
user_id: 14
team_id: 8
created_at: '2025-01-10T12:30:00.000000Z'
updated_at: '2025-01-10T12:30:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Marketing pipeline'
description:
type: string
example: 'High level marketing workflow.'
project_id:
type: integer
example: 3
user_id:
type: integer
example: 14
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T12:30:00.000000Z'
updated_at:
type: string
example: '2025-01-10T12:30:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Boards
put:
summary: 'Update a board.'
operationId: updateABoard
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 10
title: 'Marketing pipeline'
description: 'High level marketing workflow.'
project_id: 3
user_id: 14
team_id: 8
created_at: '2025-01-10T12:30:00.000000Z'
updated_at: '2025-01-10T16:45:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Marketing pipeline'
description:
type: string
example: 'High level marketing workflow.'
project_id:
type: integer
example: 3
user_id:
type: integer
example: 14
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T12:30:00.000000Z'
updated_at:
type: string
example: '2025-01-10T16:45:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Boards
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'Board title.'
example: 'Marketing pipeline'
nullable: false
description:
type: string
description: 'Board description.'
example: 'High level marketing workflow.'
nullable: true
project_id:
type: integer
description: 'Project id the board belongs to.'
example: 3
nullable: true
user_id:
type: string
description: ''
example: null
nullable: false
team_id:
type: string
description: ''
example: null
nullable: false
delete:
summary: 'Delete a board.'
operationId: deleteABoard
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Boards
parameters:
-
in: path
name: id
description: 'Board id.'
example: 10
required: true
schema:
type: integer
'/api/v1/boards/{id}/export-activity':
get:
summary: 'Export board activity with time tracking data.'
operationId: exportBoardActivityWithTimeTrackingData
description: ''
parameters:
-
in: query
name: start_date
description: 'Start date for the export range (YYYY-MM-DD).'
example: '2025-01-01'
required: true
schema:
type: string
description: 'Start date for the export range (YYYY-MM-DD).'
example: '2025-01-01'
nullable: false
-
in: query
name: end_date
description: 'End date for the export range (YYYY-MM-DD).'
example: '2025-01-31'
required: true
schema:
type: string
description: 'End date for the export range (YYYY-MM-DD).'
example: '2025-01-31'
nullable: false
-
in: query
name: group_by
description: "Grouping option: 'member' or 'task'."
example: member
required: true
schema:
type: string
description: "Grouping option: 'member' or 'task'."
example: member
nullable: false
-
in: query
name: time_format
description: "Time format: 'seconds' (integer) or 'hms' (HH:MM:SS string). Defaults to 'seconds'."
example: hms
required: false
schema:
type: string
description: "Time format: 'seconds' (integer) or 'hms' (HH:MM:SS string). Defaults to 'seconds'."
example: hms
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: grouped_by_member_seconds
type: object
example:
'john doe':
-
task: 'Marketing campaign'
time: 7200
-
task: 'Website redesign'
time: 3600
'jane smith':
-
task: 'Marketing campaign'
time: 5400
properties:
'john doe':
type: array
example:
-
task: 'Marketing campaign'
time: 7200
-
task: 'Website redesign'
time: 3600
items:
type: object
properties:
task:
type: string
example: 'Marketing campaign'
time:
type: integer
example: 7200
'jane smith':
type: array
example:
-
task: 'Marketing campaign'
time: 5400
items:
type: object
properties:
task:
type: string
example: 'Marketing campaign'
time:
type: integer
example: 5400
-
description: grouped_by_task_hms
type: object
example:
'Marketing campaign':
-
member: 'john doe'
time: '02:00:00'
-
member: 'jane smith'
time: '01:30:00'
'Website redesign':
-
member: 'john doe'
time: '01:00:00'
properties:
'Marketing campaign':
type: array
example:
-
member: 'john doe'
time: '02:00:00'
-
member: 'jane smith'
time: '01:30:00'
items:
type: object
properties:
member:
type: string
example: 'john doe'
time:
type: string
example: '02:00:00'
'Website redesign':
type: array
example:
-
member: 'john doe'
time: '01:00:00'
items:
type: object
properties:
member:
type: string
example: 'john doe'
time:
type: string
example: '01:00:00'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Invalid parameters'
properties:
message:
type: string
example: 'Invalid parameters'
tags:
- Boards
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
start_date:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
nullable: false
end_date:
type: string
description: 'Must be a valid date. Must be a date after or equal to start_date.'
example: '2052-10-08'
nullable: false
group_by:
type: string
description: ''
example: task
nullable: false
enum:
- member
- task
time_format:
type: string
description: ''
example: seconds
nullable: true
enum:
- seconds
- hms
required:
- start_date
- end_date
- group_by
parameters:
-
in: path
name: id
description: 'Board id.'
example: 10
required: true
schema:
type: integer
'/api/v1/boards/{board_id}/columns':
get:
summary: 'List columns for a board.'
operationId: listColumnsForABoard
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'To Do'
is_todo: true
is_done: false
project_board_id: 10
team_id: 1
order: 0
-
id: 2
name: 'In Progress'
is_todo: false
is_done: false
project_board_id: 10
team_id: 1
order: 1
properties:
data:
type: array
example:
-
id: 1
name: 'To Do'
is_todo: true
is_done: false
project_board_id: 10
team_id: 1
order: 0
-
id: 2
name: 'In Progress'
is_todo: false
is_done: false
project_board_id: 10
team_id: 1
order: 1
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'To Do'
is_todo:
type: boolean
example: true
is_done:
type: boolean
example: false
project_board_id:
type: integer
example: 10
team_id:
type: integer
example: 1
order:
type: integer
example: 0
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Board not found'
properties:
message:
type: string
example: 'Board not found'
tags:
- Boards
post:
summary: 'Create a new column in a board.'
operationId: createANewColumnInABoard
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 5
name: 'To Do'
is_todo: true
is_done: false
project_board_id: 10
team_id: 1
order: 0
properties:
data:
type: object
properties:
id:
type: integer
example: 5
name:
type: string
example: 'To Do'
is_todo:
type: boolean
example: true
is_done:
type: boolean
example: false
project_board_id:
type: integer
example: 10
team_id:
type: integer
example: 1
order:
type: integer
example: 0
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Board not found'
properties:
message:
type: string
example: 'Board not found'
tags:
- Boards
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Column name.'
example: 'To Do'
nullable: false
is_todo:
type: boolean
description: 'Whether this is the initial/todo column.'
example: true
nullable: false
is_done:
type: boolean
description: 'Whether this is the done/completed column.'
example: false
nullable: false
order:
type: integer
description: 'Column position (0-based).'
example: 0
nullable: false
required:
- name
parameters:
-
in: path
name: board_id
description: 'Board id.'
example: 10
required: true
schema:
type: integer
'/api/v1/boards/{board_id}/columns/{column_id}':
put:
summary: 'Update a column.'
operationId: updateAColumn
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 5
name: 'In Progress'
is_todo: false
is_done: false
project_board_id: 10
team_id: 1
order: 1
properties:
data:
type: object
properties:
id:
type: integer
example: 5
name:
type: string
example: 'In Progress'
is_todo:
type: boolean
example: false
is_done:
type: boolean
example: false
project_board_id:
type: integer
example: 10
team_id:
type: integer
example: 1
order:
type: integer
example: 1
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Column not found'
properties:
message:
type: string
example: 'Column not found'
tags:
- Boards
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Column name.'
example: 'In Progress'
nullable: true
is_todo:
type: boolean
description: 'Whether this is the initial/todo column.'
example: false
nullable: false
is_done:
type: boolean
description: 'Whether this is the done/completed column.'
example: false
nullable: false
order:
type: integer
description: 'Column position (0-based).'
example: 1
nullable: false
delete:
summary: 'Delete a column.'
operationId: deleteAColumn
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Column not found'
properties:
message:
type: string
example: 'Column not found'
422:
description: has_tasks
content:
application/json:
schema:
type: object
example:
message: 'Cannot delete column with tasks. Move or delete tasks first.'
properties:
message:
type: string
example: 'Cannot delete column with tasks. Move or delete tasks first.'
tags:
- Boards
parameters:
-
in: path
name: board_id
description: 'Board id.'
example: 10
required: true
schema:
type: integer
-
in: path
name: column_id
description: 'Column id.'
example: 5
required: true
schema:
type: integer
/api/v1/emails:
get:
summary: 'List CRM emails (drafts or sent).'
operationId: listCRMEmailsdraftsOrSent
description: ''
parameters:
-
in: query
name: status
description: 'Filter by status: draft, sent, failed, queued.'
example: draft
required: false
schema:
type: string
description: 'Filter by status: draft, sent, failed, queued.'
example: draft
nullable: false
-
in: query
name: contact_id
description: 'Filter by contact id.'
example: 15
required: false
schema:
type: integer
description: 'Filter by contact id.'
example: 15
nullable: false
-
in: query
name: per_page
description: 'Results per page (max 50).'
example: 20
required: false
schema:
type: integer
description: 'Results per page (max 50).'
example: 20
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invalid API Key'
properties:
message:
type: string
example: 'Invalid API Key'
tags:
- 'CRM Emails'
'/api/v1/emails/{id}':
get:
summary: 'Show a CRM email.'
operationId: showACRMEmail
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invalid API Key'
properties:
message:
type: string
example: 'Invalid API Key'
tags:
- 'CRM Emails'
put:
summary: 'Update a draft email.'
operationId: updateADraftEmail
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'CRM Emails'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
to:
type: string
description: 'Must be a valid email address. Must not be greater than 255 characters.'
example: b
nullable: false
subject:
type: string
description: 'Must not be greater than 500 characters.'
example: 'n'
nullable: true
body:
type: string
description: 'Must not be greater than 50000 characters.'
example: g
nullable: false
scheduled_at:
type: string
description: 'Must not be greater than 64 characters.'
example: z
nullable: true
cc:
type: array
description: 'Must be a valid email address. Must not be greater than 255 characters.'
example:
- m
items:
type: string
bcc:
type: array
description: 'Must be a valid email address. Must not be greater than 255 characters.'
example:
- i
items:
type: string
attachments:
type: array
description: 'Must be a file. Must not be greater than 25600 kilobytes.'
items:
type: string
format: binary
remove_attachment_ids:
type: array
description: ''
example:
- 16
items:
type: integer
required:
- cc
- bcc
delete:
summary: 'Cancel (discard) a draft email.'
operationId: canceldiscardADraftEmail
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'CRM Emails'
parameters:
-
in: path
name: id
description: 'The ID of the email.'
example: 1
required: true
schema:
type: integer
/api/v1/emails/draft:
post:
summary: 'Create a draft email for a contact.'
operationId: createADraftEmailForAContact
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'CRM Emails'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
contact_id:
type: integer
description: 'Contact to associate the draft with. This field is required when none of reply_to_incoming_email_id and contact_ref are present. The id of an existing record in the contacts table.'
example: 15
nullable: true
contact_ref:
type: object
description: ''
example: null
nullable: true
properties:
id:
type: integer
description: ''
example: 16
nullable: true
email:
type: string
description: 'Must be a valid email address. Must not be greater than 255 characters.'
example: zbailey@example.net
nullable: true
to:
type: string
description: 'Recipient email. Defaults to the contact email when omitted. Must be a valid email address. Must not be greater than 255 characters.'
example: alex@example.com
nullable: true
subject:
type: string
description: 'Email subject line. Must not be greater than 500 characters.'
example: 'Following up'
nullable: true
body:
type: string
description: 'HTML message body. Use separate
tags per paragraph; use
. Corcava renders HTML as received. Must not be greater than 50000 characters.' example: '
Hi Alex,
Thanks for your note.
' nullable: false mailbox_id: type: integer description: 'Mailbox id to send from. Uses the default mailbox when omitted.' example: 3 nullable: true from_mailbox: type: string description: 'Send-from mailbox email address (alternative to mailbox_id). Must be a valid email address. Must not be greater than 255 characters.' example: sales@company.com nullable: true from: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: i nullable: true scheduled_at: type: string description: 'Optional ISO 8601 datetime to schedule the send. Must not be greater than 64 characters.' example: '2026-07-29T09:00:00+00:00' nullable: true cc: type: array description: 'Must be a valid email address. Must not be greater than 255 characters.' example: - 'y' items: type: string bcc: type: array description: 'Must be a valid email address. Must not be greater than 255 characters.' example: - v items: type: string reply_to_incoming_email_id: type: integer description: 'Link draft as a reply to this incoming CRM email id. Theid of an existing record in the incoming_emails table.'
example: 45678
nullable: true
reply_to_outgoing_email_id:
type: integer
description: 'Link draft as a reply to this sent CRM email id. The id of an existing record in the outgoing_emails table.'
example: 12345
nullable: true
attachments:
type: array
description: 'Must be a file. Must not be greater than 25600 kilobytes.'
items:
type: string
format: binary
remove_attachment_ids:
type: array
description: ''
example:
- 16
items:
type: integer
required:
- body
- cc
- bcc
/api/v1/emails/generate-draft:
post:
summary: 'AI-generate a reply or new email draft (subject + body). Does not save — use POST /emails/draft to persist.'
operationId: aIGenerateAReplyOrNewEmailDraftsubject+BodyDoesNotSaveUsePOSTemailsdraftToPersist
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'CRM Emails'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
contact_id:
type: integer
description: 'Contact the generated draft is for. This field is required when reply_to_incoming_email_id is not present. The id of an existing record in the contacts table.'
example: 15
nullable: true
instruction:
type: string
description: 'Optional guidance for the AI draft (tone, points to cover, etc.). Must not be greater than 2000 characters.'
example: 'Reply warmly and propose a call next week.'
nullable: true
thread_key:
type: string
description: 'Inbox thread key from GET /api/v1/inbox when replying in-thread. Must not be greater than 500 characters.'
example: 'thread:abc123'
nullable: true
sender_email:
type: string
description: 'Sender email scope from the inbox list (with thread_key). Must not be greater than 255 characters.'
example: alex@example.com
nullable: true
reply_to_incoming_email_id:
type: integer
description: 'Generate as a reply linked to this incoming email id. The id of an existing record in the incoming_emails table.'
example: 45678
nullable: true
reply_to_outgoing_email_id:
type: integer
description: 'Generate as a reply linked to this sent email id. The id of an existing record in the outgoing_emails table.'
example: 12345
nullable: true
'/api/v1/emails/{email_id}/schedule':
post:
summary: 'Schedule a draft email for future send (RFC 3339 with offset required).'
operationId: scheduleADraftEmailForFutureSendRFC3339WithOffsetRequired
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'CRM Emails'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
scheduled_at:
type: string
description: 'Must match the regex /[Zz]|[+-]\d{2}:?\d{2}$/. Must not be greater than 64 characters.'
example: b
nullable: false
required:
- scheduled_at
parameters:
-
in: path
name: email_id
description: 'The ID of the email.'
example: 1
required: true
schema:
type: integer
'/api/v1/emails/{email_id}/unschedule':
post:
summary: 'Clear schedule on a draft/scheduled email (returns to normal draft).'
operationId: clearScheduleOnADraftscheduledEmailreturnsToNormalDraft
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'CRM Emails'
parameters:
-
in: path
name: email_id
description: 'The ID of the email.'
example: 1
required: true
schema:
type: integer
'/api/v1/emails/{email_id}/send':
post:
summary: 'Send a draft email via the connected Gmail mailbox.'
operationId: sendADraftEmailViaTheConnectedGmailMailbox
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'CRM Emails'
parameters:
-
in: path
name: email_id
description: 'The ID of the email.'
example: 1
required: true
schema:
type: integer
/api/v1/inbox:
get:
summary: 'List inbox contact/sender groups with thread previews.'
operationId: listInboxContactsenderGroupsWithThreadPreviews
description: ''
parameters:
-
in: query
name: search
description: 'Filter by sender name, email, subject, or body preview.'
example: acme
required: false
schema:
type: string
description: 'Filter by sender name, email, subject, or body preview.'
example: acme
nullable: false
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
nullable: false
-
in: query
name: per_page
description: 'Results per page (max 50).'
example: 20
required: false
schema:
type: integer
description: 'Results per page (max 50).'
example: 20
nullable: false
-
in: query
name: view
description: 'Inbox or archived.'
example: inbox
required: false
schema:
type: string
description: 'Inbox or archived.'
example: inbox
nullable: false
-
in: query
name: inbox_filter
description: 'Inbox filter: all, unread, or unanswered.'
example: unanswered
required: false
schema:
type: string
description: 'Inbox filter: all, unread, or unanswered.'
example: unanswered
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invalid API Key'
properties:
message:
type: string
example: 'Invalid API Key'
tags:
- 'CRM Inbox'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
inbox_filter:
type: string
description: ''
example: unanswered
nullable: false
enum:
- all
- unread
- unanswered
mailbox_ids:
type: array
description: 'Must be at least 1.'
example:
- 16
items:
type: integer
required:
- inbox_filter
/api/v1/inbox/reply:
get:
summary: 'Resolve inbox reply context from an incoming message id (human URL: /crm-emails/inbox/reply?incoming=…).'
operationId: resolveInboxReplyContextFromAnIncomingMessageIdhumanURLcrmEmailsinboxreplyincoming
description: ''
parameters:
-
in: query
name: incoming
description: 'Incoming email id.'
example: 45678
required: true
schema:
type: integer
description: 'Incoming email id.'
example: 45678
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invalid API Key'
properties:
message:
type: string
example: 'Invalid API Key'
tags:
- 'CRM Inbox'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
incoming:
type: integer
description: 'Must be at least 1.'
example: 16
nullable: false
required:
- incoming
/api/v1/inbox/threads:
get:
summary: 'Get full thread detail (incoming + sent messages in thread).'
operationId: getFullThreadDetailincoming+SentMessagesInThread
description: ''
parameters:
-
in: query
name: thread_key
description: 'Thread key from list inbox.'
example: 'thread:abc123'
required: true
schema:
type: string
description: 'Thread key from list inbox.'
example: 'thread:abc123'
nullable: false
-
in: query
name: from
description: 'Sender email (preferred).'
example: alex@example.com
required: false
schema:
type: string
description: 'Sender email (preferred).'
example: alex@example.com
nullable: false
-
in: query
name: sender_scope
description: 'Legacy sender scope from list inbox.'
example: 's:alex@example.com'
required: false
schema:
type: string
description: 'Legacy sender scope from list inbox.'
example: 's:alex@example.com'
nullable: false
-
in: query
name: view
description: 'Inbox or archived.'
example: inbox
required: false
schema:
type: string
description: 'Inbox or archived.'
example: inbox
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invalid API Key'
properties:
message:
type: string
example: 'Invalid API Key'
tags:
- 'CRM Inbox'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
thread_key:
type: string
description: 'Must not be greater than 500 characters.'
example: b
nullable: false
sender_scope:
type: string
description: 'Must not be greater than 500 characters.'
example: 'n'
nullable: true
view:
type: string
description: ''
example: inbox
nullable: true
enum:
- inbox
- archived
required:
- thread_key
/api/v1/clients:
get:
summary: 'Display a paginated list of clients.'
operationId: displayAPaginatedListOfClients
description: ''
parameters:
-
in: query
name: search
description: 'Filter clients by company, contact name, email, or phone.'
example: ACME
required: false
schema:
type: string
description: 'Filter clients by company, contact name, email, or phone.'
example: ACME
nullable: false
-
in: query
name: user_id
description: 'Filter clients by owner id.'
example: 12
required: false
schema:
type: integer
description: 'Filter clients by owner id.'
example: 12
nullable: false
-
in: query
name: is_stripe
description: 'Filter by Stripe integration flag.'
example: true
required: false
schema:
type: boolean
description: 'Filter by Stripe integration flag.'
example: true
nullable: false
-
in: query
name: is_crypto_payments
description: 'Filter by crypto payments flag.'
example: false
required: false
schema:
type: boolean
description: 'Filter by crypto payments flag.'
example: false
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, company_name, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, company_name, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 4
company_name: 'ACME Inc.'
contact_name: 'Alex Johnson'
display_name: 'ACME Inc.'
currency_id: 1
phone: '+1 202 555 0147'
email: billing@acme.inc
address_1: '123 Main St'
address_2: null
zip: '10001'
country: USA
city: 'New York'
stripe_id: null
is_crypto_payments: false
is_stripe: false
notes: 'Key enterprise account.'
user_id: 12
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/clients?page=1'
last: 'https://example.com/api/v1/clients?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/clients'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 4
company_name: 'ACME Inc.'
contact_name: 'Alex Johnson'
display_name: 'ACME Inc.'
currency_id: 1
phone: '+1 202 555 0147'
email: billing@acme.inc
address_1: '123 Main St'
address_2: null
zip: '10001'
country: USA
city: 'New York'
stripe_id: null
is_crypto_payments: false
is_stripe: false
notes: 'Key enterprise account.'
user_id: 12
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 4
company_name:
type: string
example: 'ACME Inc.'
contact_name:
type: string
example: 'Alex Johnson'
display_name:
type: string
example: 'ACME Inc.'
currency_id:
type: integer
example: 1
phone:
type: string
example: '+1 202 555 0147'
email:
type: string
example: billing@acme.inc
address_1:
type: string
example: '123 Main St'
address_2:
type: string
example: null
zip:
type: string
example: '10001'
country:
type: string
example: USA
city:
type: string
example: 'New York'
stripe_id:
type: string
example: null
is_crypto_payments:
type: boolean
example: false
is_stripe:
type: boolean
example: false
notes:
type: string
example: 'Key enterprise account.'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/clients?page=1'
last:
type: string
example: 'https://example.com/api/v1/clients?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/clients'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Clients
post:
summary: 'Create a new client.'
operationId: createANewClient
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 4
company_name: 'ACME Inc.'
contact_name: 'Alex Johnson'
display_name: 'ACME Inc.'
currency_id: 1
phone: '+1 202 555 0147'
email: billing@acme.inc
address_1: '123 Main St'
address_2: null
zip: '10001'
country: USA
city: 'New York'
stripe_id: null
is_crypto_payments: false
is_stripe: false
notes: 'Key enterprise account.'
user_id: 12
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 4
company_name:
type: string
example: 'ACME Inc.'
contact_name:
type: string
example: 'Alex Johnson'
display_name:
type: string
example: 'ACME Inc.'
currency_id:
type: integer
example: 1
phone:
type: string
example: '+1 202 555 0147'
email:
type: string
example: billing@acme.inc
address_1:
type: string
example: '123 Main St'
address_2:
type: string
example: null
zip:
type: string
example: '10001'
country:
type: string
example: USA
city:
type: string
example: 'New York'
stripe_id:
type: string
example: null
is_crypto_payments:
type: boolean
example: false
is_stripe:
type: boolean
example: false
notes:
type: string
example: 'Key enterprise account.'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
tags:
- Clients
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
company_name:
type: string
description: 'Company name.'
example: 'ACME Inc.'
nullable: false
contact_name:
type: string
description: 'Primary contact name.'
example: 'Alex Johnson'
nullable: true
currency_id:
type: integer
description: "Currency id. Defaults to your team's base currency."
example: 1
nullable: true
phone:
type: string
description: 'Phone number.'
example: '+1 202 555 0147'
nullable: true
email:
type: string
description: 'Email address.'
example: billing@acme.inc
nullable: true
address_1:
type: string
description: 'Address line 1.'
example: '123 Main St'
nullable: true
address_2:
type: string
description: 'Address line 2.'
example: 'Suite 502'
nullable: true
zip:
type: string
description: 'ZIP or postal code.'
example: '10001'
nullable: true
country:
type: string
description: Country.
example: USA
nullable: true
city:
type: string
description: City.
example: 'New York'
nullable: true
stripe_id:
type: string
description: 'Stripe customer id.'
example: cus_abc123
nullable: true
is_crypto_payments:
type: boolean
description: 'Enable crypto payments for the client.'
example: false
nullable: true
is_stripe:
type: boolean
description: 'Enable Stripe billing for the client.'
example: true
nullable: true
notes:
type: string
description: 'Internal notes.'
example: 'Key enterprise account.'
nullable: true
user_id:
type: integer
description: 'Owner id for the client. Defaults to the authenticated user.'
example: 12
nullable: true
team_id:
type: string
description: ''
example: null
nullable: false
tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- 'n'
items:
type: string
add_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
remove_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
create_missing_tags:
type: boolean
description: ''
example: false
nullable: true
required:
- company_name
'/api/v1/clients/{id}':
get:
summary: 'Display a single client.'
operationId: displayASingleClient
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 4
company_name: 'ACME Inc.'
contact_name: 'Alex Johnson'
display_name: 'ACME Inc.'
currency_id: 1
phone: '+1 202 555 0147'
email: billing@acme.inc
address_1: '123 Main St'
address_2: null
zip: '10001'
country: USA
city: 'New York'
stripe_id: null
is_crypto_payments: false
is_stripe: false
notes: 'Key enterprise account.'
user_id: 12
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 4
company_name:
type: string
example: 'ACME Inc.'
contact_name:
type: string
example: 'Alex Johnson'
display_name:
type: string
example: 'ACME Inc.'
currency_id:
type: integer
example: 1
phone:
type: string
example: '+1 202 555 0147'
email:
type: string
example: billing@acme.inc
address_1:
type: string
example: '123 Main St'
address_2:
type: string
example: null
zip:
type: string
example: '10001'
country:
type: string
example: USA
city:
type: string
example: 'New York'
stripe_id:
type: string
example: null
is_crypto_payments:
type: boolean
example: false
is_stripe:
type: boolean
example: false
notes:
type: string
example: 'Key enterprise account.'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Clients
put:
summary: 'Update a client.'
operationId: updateAClient
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 4
company_name: 'ACME Inc.'
contact_name: 'Alex Johnson'
display_name: 'ACME Inc.'
currency_id: 1
phone: '+1 202 555 0147'
email: billing@acme.inc
address_1: '123 Main St'
address_2: null
zip: '10001'
country: USA
city: 'New York'
stripe_id: null
is_crypto_payments: false
is_stripe: false
notes: 'Key enterprise account.'
user_id: 12
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T11:30:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 4
company_name:
type: string
example: 'ACME Inc.'
contact_name:
type: string
example: 'Alex Johnson'
display_name:
type: string
example: 'ACME Inc.'
currency_id:
type: integer
example: 1
phone:
type: string
example: '+1 202 555 0147'
email:
type: string
example: billing@acme.inc
address_1:
type: string
example: '123 Main St'
address_2:
type: string
example: null
zip:
type: string
example: '10001'
country:
type: string
example: USA
city:
type: string
example: 'New York'
stripe_id:
type: string
example: null
is_crypto_payments:
type: boolean
example: false
is_stripe:
type: boolean
example: false
notes:
type: string
example: 'Key enterprise account.'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T11:30:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Clients
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
company_name:
type: string
description: 'Company name.'
example: 'ACME Inc.'
nullable: false
contact_name:
type: string
description: 'Primary contact name.'
example: 'Alex Johnson'
nullable: true
currency_id:
type: integer
description: 'Currency id.'
example: 1
nullable: true
phone:
type: string
description: 'Phone number.'
example: '+1 202 555 0147'
nullable: true
email:
type: string
description: 'Email address.'
example: billing@acme.inc
nullable: true
address_1:
type: string
description: 'Address line 1.'
example: '123 Main St'
nullable: true
address_2:
type: string
description: 'Address line 2.'
example: 'Suite 502'
nullable: true
zip:
type: string
description: 'ZIP or postal code.'
example: '10001'
nullable: true
country:
type: string
description: Country.
example: USA
nullable: true
city:
type: string
description: City.
example: 'New York'
nullable: true
stripe_id:
type: string
description: 'Stripe customer id.'
example: cus_abc123
nullable: true
is_crypto_payments:
type: boolean
description: 'Enable crypto payments for the client.'
example: false
nullable: true
is_stripe:
type: boolean
description: 'Enable Stripe billing for the client.'
example: true
nullable: true
notes:
type: string
description: 'Internal notes.'
example: 'Key enterprise account.'
nullable: true
user_id:
type: integer
description: 'Owner id for the client.'
example: 12
nullable: true
team_id:
type: string
description: ''
example: null
nullable: false
tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- 'n'
items:
type: string
add_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
remove_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
create_missing_tags:
type: boolean
description: ''
example: true
nullable: true
delete:
summary: 'Delete a client.'
operationId: deleteAClient
description: "Soft-deletes the client. Linked contacts are detached (client_id set to null),\nnot deleted."
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Clients
parameters:
-
in: path
name: id
description: 'Client id.'
example: 4
required: true
schema:
type: integer
'/api/v1/contacts/{contact_id}/notes':
get:
summary: 'Display a paginated list of notes for a contact.'
operationId: displayAPaginatedListOfNotesForAContact
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100. Default: 30.'
example: 20
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100. Default: 30.'
example: 20
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 7
contact_id: 15
user_id: 12
text: 'Meeting scheduled for next Tuesday to discuss project requirements.'
created_at: '2025-01-15T10:30:00.000000Z'
updated_at: '2025-01-15T10:30:00.000000Z'
-
id: 6
contact_id: 15
user_id: 8
text: 'Client requested a callback regarding pricing.'
created_at: '2025-01-14T14:20:00.000000Z'
updated_at: '2025-01-14T14:20:00.000000Z'
links:
first: 'https://example.com/api/v1/contacts/15/notes?page=1'
last: 'https://example.com/api/v1/contacts/15/notes?page=2'
prev: null
next: 'https://example.com/api/v1/contacts/15/notes?page=2'
meta:
current_page: 1
from: 1
last_page: 2
path: 'https://example.com/api/v1/contacts/15/notes'
per_page: 20
to: 20
total: 35
properties:
data:
type: array
example:
-
id: 7
contact_id: 15
user_id: 12
text: 'Meeting scheduled for next Tuesday to discuss project requirements.'
created_at: '2025-01-15T10:30:00.000000Z'
updated_at: '2025-01-15T10:30:00.000000Z'
-
id: 6
contact_id: 15
user_id: 8
text: 'Client requested a callback regarding pricing.'
created_at: '2025-01-14T14:20:00.000000Z'
updated_at: '2025-01-14T14:20:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 7
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 12
text:
type: string
example: 'Meeting scheduled for next Tuesday to discuss project requirements.'
created_at:
type: string
example: '2025-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2025-01-15T10:30:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/contacts/15/notes?page=1'
last:
type: string
example: 'https://example.com/api/v1/contacts/15/notes?page=2'
prev:
type: string
example: null
next:
type: string
example: 'https://example.com/api/v1/contacts/15/notes?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 2
path:
type: string
example: 'https://example.com/api/v1/contacts/15/notes'
per_page:
type: integer
example: 20
to:
type: integer
example: 20
total:
type: integer
example: 35
tags:
- 'Contact Notes'
post:
summary: 'Create a new note for a contact.'
operationId: createANewNoteForAContact
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 7
contact_id: 15
user_id: 12
text: 'Meeting scheduled for next Tuesday to discuss project requirements.'
created_at: '2025-01-15T10:30:00.000000Z'
updated_at: '2025-01-15T10:30:00.000000Z'
properties:
id:
type: integer
example: 7
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 12
text:
type: string
example: 'Meeting scheduled for next Tuesday to discuss project requirements.'
created_at:
type: string
example: '2025-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2025-01-15T10:30:00.000000Z'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
text:
- 'The text field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
text:
type: array
example:
- 'The text field is required.'
items:
type: string
tags:
- 'Contact Notes'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
text:
type: string
description: 'Note content. Maximum 1000 characters.'
example: 'Meeting scheduled for next Tuesday to discuss project requirements.'
nullable: false
required:
- text
parameters:
-
in: path
name: contact_id
description: 'The ID of the contact.'
example: 1
required: true
schema:
type: integer
-
in: path
name: contact
description: 'Contact ID.'
example: 15
required: true
schema:
type: integer
'/api/v1/contacts/{contact_id}/notes/{note_id}':
put:
summary: 'Update a contact note.'
operationId: updateAContactNote
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 7
contact_id: 15
user_id: 12
text: 'Meeting rescheduled to Wednesday due to client availability.'
created_at: '2025-01-15T10:30:00.000000Z'
updated_at: '2025-01-16T09:15:00.000000Z'
properties:
id:
type: integer
example: 7
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 12
text:
type: string
example: 'Meeting rescheduled to Wednesday due to client availability.'
created_at:
type: string
example: '2025-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2025-01-16T09:15:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
text:
- 'The text field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
text:
type: array
example:
- 'The text field is required.'
items:
type: string
tags:
- 'Contact Notes'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
text:
type: string
description: 'Updated note content. Maximum 1000 characters.'
example: 'Meeting rescheduled to Wednesday due to client availability.'
nullable: false
required:
- text
delete:
summary: 'Delete contact note.'
operationId: deleteContactNote
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Contact Notes'
parameters:
-
in: path
name: contact_id
description: 'The ID of the contact.'
example: 1
required: true
schema:
type: integer
-
in: path
name: note_id
description: 'The ID of the note.'
example: 1
required: true
schema:
type: integer
-
in: path
name: contact
description: 'Contact ID.'
example: 15
required: true
schema:
type: integer
-
in: path
name: note
description: 'Note ID.'
example: 7
required: true
schema:
type: integer
'/api/v1/contacts/{contact_id}/tasks':
get:
summary: 'Display a paginated list of contact tasks.'
operationId: displayAPaginatedListOfContactTasks
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 30
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 30
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 3
contact_id: 15
user_id: 7
due_at: '2025-02-01T12:00:00.000000Z'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
links:
first: 'https://example.com/api/v1/contacts/15/tasks?page=1'
last: 'https://example.com/api/v1/contacts/15/tasks?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/contacts/15/tasks'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 3
contact_id: 15
user_id: 7
due_at: '2025-02-01T12:00:00.000000Z'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 3
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 7
due_at:
type: string
example: '2025-02-01T12:00:00.000000Z'
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/contacts/15/tasks?page=1'
last:
type: string
example: 'https://example.com/api/v1/contacts/15/tasks?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/contacts/15/tasks'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Contact Tasks'
post:
summary: 'Create a new task for a contact.'
operationId: createANewTaskForAContact
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
contact_id: 15
user_id: 7
due_at: '2025-02-01T12:00:00.000000Z'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
properties:
id:
type: integer
example: 3
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 7
due_at:
type: string
example: '2025-02-01T12:00:00.000000Z'
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
tags:
- 'Contact Tasks'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
nullable: false
description:
type: string
description: ''
example: 'Eius et animi quos velit et.'
nullable: true
status:
type: string
description: 'Must not be greater than 50 characters.'
example: v
nullable: false
due_at:
type: string
description: 'Due date and time (ISO 8601).'
example: '2025-02-01T12:00:00Z'
nullable: false
required:
- name
- status
- due_at
parameters:
-
in: path
name: contact_id
description: 'The ID of the contact.'
example: 1
required: true
schema:
type: integer
-
in: path
name: contact
description: 'Contact id.'
example: 15
required: true
schema:
type: integer
'/api/v1/contacts/{contact_id}/tasks/{task_id}':
put:
summary: 'Update a contact task.'
operationId: updateAContactTask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
contact_id: 15
user_id: 7
due_at: '2025-02-05T09:00:00.000000Z'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-11T10:30:00.000000Z'
properties:
id:
type: integer
example: 3
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 7
due_at:
type: string
example: '2025-02-05T09:00:00.000000Z'
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:30:00.000000Z'
tags:
- 'Contact Tasks'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
nullable: false
description:
type: string
description: ''
example: 'Eius et animi quos velit et.'
nullable: true
status:
type: string
description: 'Must not be greater than 50 characters.'
example: v
nullable: false
due_at:
type: string
description: 'New due date and time (ISO 8601).'
example: '2025-02-05T09:00:00Z'
nullable: false
required:
- name
- status
- due_at
delete:
summary: 'Delete a contact task.'
operationId: deleteAContactTask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
tags:
- 'Contact Tasks'
parameters:
-
in: path
name: contact_id
description: 'The ID of the contact.'
example: 1
required: true
schema:
type: integer
-
in: path
name: task_id
description: 'The ID of the task.'
example: 8
required: true
schema:
type: integer
-
in: path
name: contact
description: 'Contact id.'
example: 15
required: true
schema:
type: integer
-
in: path
name: task
description: 'Task id.'
example: 3
required: true
schema:
type: integer
/api/v1/contacts:
get:
summary: 'Display a paginated list of contacts.'
operationId: displayAPaginatedListOfContacts
description: ''
parameters:
-
in: query
name: search
description: 'Filter contacts by name (including full name), email, phone, or company.'
example: 'John Doe'
required: false
schema:
type: string
description: 'Filter contacts by name (including full name), email, phone, or company.'
example: 'John Doe'
nullable: false
-
in: query
name: client_id
description: 'Filter contacts by client id.'
example: 4
required: false
schema:
type: integer
description: 'Filter contacts by client id.'
example: 4
nullable: false
-
in: query
name: user_id
description: 'Filter contacts by owner id.'
example: 12
required: false
schema:
type: integer
description: 'Filter contacts by owner id.'
example: 12
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, first_name, last_name, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, first_name, last_name, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 21
client_id: 4
first_name: Alex
last_name: Johnson
display_name: 'Alex Johnson'
company_name: 'ACME Inc.'
website: 'https://acme.inc'
email: alex@acme.inc
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
skype: null
telegram: '@alex'
linkedin: 'https://linkedin.com/in/alex'
birth_date: '1992-09-15'
last_contacted_at: '2025-01-10T15:00:00.000000Z'
address_line_1: '123 Main St'
city: 'New York'
zip: '10001'
country: USA
description: 'Primary decision maker'
goal: 'Close enterprise deal by Q3'
outreach_id: null
company_id: null
custom_fields:
'extra emails': 'a@x.com, b@y.com'
foo-bar: c@z.com
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T15:00:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/contacts?page=1'
last: 'https://example.com/api/v1/contacts?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/contacts'
per_page: 50
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 21
client_id: 4
first_name: Alex
last_name: Johnson
display_name: 'Alex Johnson'
company_name: 'ACME Inc.'
website: 'https://acme.inc'
email: alex@acme.inc
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
skype: null
telegram: '@alex'
linkedin: 'https://linkedin.com/in/alex'
birth_date: '1992-09-15'
last_contacted_at: '2025-01-10T15:00:00.000000Z'
address_line_1: '123 Main St'
city: 'New York'
zip: '10001'
country: USA
description: 'Primary decision maker'
goal: 'Close enterprise deal by Q3'
outreach_id: null
company_id: null
custom_fields:
'extra emails': 'a@x.com, b@y.com'
foo-bar: c@z.com
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T15:00:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 21
client_id:
type: integer
example: 4
first_name:
type: string
example: Alex
last_name:
type: string
example: Johnson
display_name:
type: string
example: 'Alex Johnson'
company_name:
type: string
example: 'ACME Inc.'
website:
type: string
example: 'https://acme.inc'
email:
type: string
example: alex@acme.inc
phone:
type: string
example: '+1 202 555 0147'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
skype:
type: string
example: null
telegram:
type: string
example: '@alex'
linkedin:
type: string
example: 'https://linkedin.com/in/alex'
birth_date:
type: string
example: '1992-09-15'
last_contacted_at:
type: string
example: '2025-01-10T15:00:00.000000Z'
address_line_1:
type: string
example: '123 Main St'
city:
type: string
example: 'New York'
zip:
type: string
example: '10001'
country:
type: string
example: USA
description:
type: string
example: 'Primary decision maker'
goal:
type: string
example: 'Close enterprise deal by Q3'
outreach_id:
type: string
example: null
company_id:
type: string
example: null
custom_fields:
type: object
properties:
'extra emails':
type: string
example: 'a@x.com, b@y.com'
foo-bar:
type: string
example: c@z.com
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T15:00:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/contacts?page=1'
last:
type: string
example: 'https://example.com/api/v1/contacts?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/contacts'
per_page:
type: integer
example: 50
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Contacts
post:
summary: 'Create a new contact.'
operationId: createANewContact
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 21
client_id: 4
first_name: Alex
last_name: Johnson
display_name: 'Alex Johnson'
company_name: 'ACME Inc.'
website: 'https://acme.inc'
email: alex@acme.inc
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
skype: null
telegram: '@alex'
linkedin: 'https://linkedin.com/in/alex'
birth_date: '1992-09-15'
last_contacted_at: null
address_line_1: '123 Main St'
city: 'New York'
zip: '10001'
country: USA
description: 'Primary decision maker'
goal: 'Close enterprise deal by Q3'
outreach_id: null
company_id: null
custom_fields:
'extra emails': 'a@x.com, b@y.com'
foo-bar: c@z.com
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 21
client_id:
type: integer
example: 4
first_name:
type: string
example: Alex
last_name:
type: string
example: Johnson
display_name:
type: string
example: 'Alex Johnson'
company_name:
type: string
example: 'ACME Inc.'
website:
type: string
example: 'https://acme.inc'
email:
type: string
example: alex@acme.inc
phone:
type: string
example: '+1 202 555 0147'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
skype:
type: string
example: null
telegram:
type: string
example: '@alex'
linkedin:
type: string
example: 'https://linkedin.com/in/alex'
birth_date:
type: string
example: '1992-09-15'
last_contacted_at:
type: string
example: null
address_line_1:
type: string
example: '123 Main St'
city:
type: string
example: 'New York'
zip:
type: string
example: '10001'
country:
type: string
example: USA
description:
type: string
example: 'Primary decision maker'
goal:
type: string
example: 'Close enterprise deal by Q3'
outreach_id:
type: string
example: null
company_id:
type: string
example: null
custom_fields:
type: object
properties:
'extra emails':
type: string
example: 'a@x.com, b@y.com'
foo-bar:
type: string
example: c@z.com
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Client not found'
properties:
message:
type: string
example: 'Client not found'
tags:
- Contacts
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
first_name:
type: string
description: 'Contact first name.'
example: Alex
nullable: false
last_name:
type: string
description: 'Contact last name.'
example: Johnson
nullable: true
company_name:
type: string
description: 'Company name.'
example: 'ACME Inc.'
nullable: true
website:
type: string
description: 'Company website.'
example: 'https://acme.inc'
nullable: true
client_id:
type: integer
description: 'Client id the contact belongs to.'
example: 4
nullable: true
email:
type: string
description: 'Contact email address.'
example: alex@acme.inc
nullable: true
phone:
type: string
description: 'Contact phone number.'
example: '+1 202 555 0147'
nullable: true
user_id:
type: integer
description: 'Owner id for the contact. Defaults to the authenticated user.'
example: 12
nullable: true
team_id:
type: string
description: ''
example: null
nullable: false
skype:
type: string
description: 'Must not be greater than 255 characters.'
example: j
nullable: true
telegram:
type: string
description: 'Telegram handle.'
example: '@alex'
nullable: true
linkedin:
type: string
description: 'LinkedIn profile URL.'
example: 'https://linkedin.com/in/alex'
nullable: true
birth_date:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
nullable: true
last_contacted_at:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
nullable: true
address_line_1:
type: string
description: 'Must not be greater than 255 characters.'
example: k
nullable: true
city:
type: string
description: 'Must not be greater than 255 characters.'
example: h
nullable: true
zip:
type: string
description: 'Must not be greater than 255 characters.'
example: w
nullable: true
country:
type: string
description: 'Must not be greater than 255 characters.'
example: a
nullable: true
description:
type: string
description: 'Internal contact description.'
example: 'Primary decision maker'
nullable: true
goal:
type: string
description: 'Optional outreach goal for this contact (max 5000 characters). Used by AI when drafting emails.'
example: 'Close enterprise deal by Q3'
nullable: true
outreach_id:
type: integer
description: ''
example: 16
nullable: true
company_id:
type: integer
description: ''
example: 16
nullable: true
custom_fields:
type: object
description: 'Map of Contact custom field name to string value. Names must match team definitions (case-insensitive).'
example:
'extra emails': 'a@x.com, b@y.com'
foo-bar: c@z.com
nullable: true
properties: { }
client_ref:
type: object
description: ''
example: null
nullable: true
properties:
id:
type: integer
description: ''
example: 16
nullable: true
name:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
nullable: true
tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
add_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
remove_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- m
items:
type: string
create_missing_tags:
type: boolean
description: ''
example: true
nullable: true
required:
- first_name
'/api/v1/contacts/{id}':
get:
summary: 'Display a single contact.'
operationId: displayASingleContact
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 21
client_id: 4
first_name: Alex
last_name: Johnson
display_name: 'Alex Johnson'
company_name: 'ACME Inc.'
website: 'https://acme.inc'
email: alex@acme.inc
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
skype: null
telegram: '@alex'
linkedin: 'https://linkedin.com/in/alex'
birth_date: '1992-09-15'
last_contacted_at: '2025-01-10T15:00:00.000000Z'
address_line_1: '123 Main St'
city: 'New York'
zip: '10001'
country: USA
description: 'Primary decision maker'
goal: 'Close enterprise deal by Q3'
outreach_id: null
company_id: null
custom_fields:
'extra emails': 'a@x.com, b@y.com'
foo-bar: c@z.com
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T15:00:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 21
client_id:
type: integer
example: 4
first_name:
type: string
example: Alex
last_name:
type: string
example: Johnson
display_name:
type: string
example: 'Alex Johnson'
company_name:
type: string
example: 'ACME Inc.'
website:
type: string
example: 'https://acme.inc'
email:
type: string
example: alex@acme.inc
phone:
type: string
example: '+1 202 555 0147'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
skype:
type: string
example: null
telegram:
type: string
example: '@alex'
linkedin:
type: string
example: 'https://linkedin.com/in/alex'
birth_date:
type: string
example: '1992-09-15'
last_contacted_at:
type: string
example: '2025-01-10T15:00:00.000000Z'
address_line_1:
type: string
example: '123 Main St'
city:
type: string
example: 'New York'
zip:
type: string
example: '10001'
country:
type: string
example: USA
description:
type: string
example: 'Primary decision maker'
goal:
type: string
example: 'Close enterprise deal by Q3'
outreach_id:
type: string
example: null
company_id:
type: string
example: null
custom_fields:
type: object
properties:
'extra emails':
type: string
example: 'a@x.com, b@y.com'
foo-bar:
type: string
example: c@z.com
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T15:00:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Contacts
put:
summary: 'Update a contact.'
operationId: updateAContact
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 21
client_id: 4
first_name: Alex
last_name: Johnson
display_name: 'Alex Johnson'
company_name: 'ACME Inc.'
website: 'https://acme.inc'
email: alex@acme.inc
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
skype: null
telegram: '@alex'
linkedin: 'https://linkedin.com/in/alex'
birth_date: '1992-09-15'
last_contacted_at: '2025-01-10T15:00:00.000000Z'
address_line_1: '123 Main St'
city: 'New York'
zip: '10001'
country: USA
description: 'Primary decision maker'
goal: 'Close enterprise deal by Q3'
outreach_id: null
company_id: null
custom_fields:
'extra emails': 'a@x.com, b@y.com'
foo-bar: c@z.com
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T18:30:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 21
client_id:
type: integer
example: 4
first_name:
type: string
example: Alex
last_name:
type: string
example: Johnson
display_name:
type: string
example: 'Alex Johnson'
company_name:
type: string
example: 'ACME Inc.'
website:
type: string
example: 'https://acme.inc'
email:
type: string
example: alex@acme.inc
phone:
type: string
example: '+1 202 555 0147'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
skype:
type: string
example: null
telegram:
type: string
example: '@alex'
linkedin:
type: string
example: 'https://linkedin.com/in/alex'
birth_date:
type: string
example: '1992-09-15'
last_contacted_at:
type: string
example: '2025-01-10T15:00:00.000000Z'
address_line_1:
type: string
example: '123 Main St'
city:
type: string
example: 'New York'
zip:
type: string
example: '10001'
country:
type: string
example: USA
description:
type: string
example: 'Primary decision maker'
goal:
type: string
example: 'Close enterprise deal by Q3'
outreach_id:
type: string
example: null
company_id:
type: string
example: null
custom_fields:
type: object
properties:
'extra emails':
type: string
example: 'a@x.com, b@y.com'
foo-bar:
type: string
example: c@z.com
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T18:30:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Contacts
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
first_name:
type: string
description: 'Contact first name.'
example: Alex
nullable: false
last_name:
type: string
description: 'Contact last name.'
example: Johnson
nullable: true
company_name:
type: string
description: 'Must not be greater than 255 characters.'
example: g
nullable: true
website:
type: string
description: 'Must be a valid URL. Must not be greater than 255 characters.'
example: z
nullable: true
client_id:
type: integer
description: 'Client id the contact belongs to.'
example: 4
nullable: true
email:
type: string
description: 'Contact email address.'
example: alex@acme.inc
nullable: true
phone:
type: string
description: 'Contact phone number.'
example: '+1 202 555 0147'
nullable: true
user_id:
type: integer
description: 'Owner id for the contact.'
example: 12
nullable: true
team_id:
type: string
description: ''
example: null
nullable: false
skype:
type: string
description: 'Must not be greater than 255 characters.'
example: j
nullable: true
telegram:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
nullable: true
linkedin:
type: string
description: 'Must not be greater than 255 characters.'
example: i
nullable: true
birth_date:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
nullable: true
last_contacted_at:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
nullable: true
address_line_1:
type: string
description: 'Must not be greater than 255 characters.'
example: k
nullable: true
city:
type: string
description: 'Must not be greater than 255 characters.'
example: h
nullable: true
zip:
type: string
description: 'Must not be greater than 255 characters.'
example: w
nullable: true
country:
type: string
description: 'Must not be greater than 255 characters.'
example: a
nullable: true
description:
type: string
description: 'Internal contact description.'
example: 'Primary decision maker'
nullable: true
goal:
type: string
description: 'Optional outreach goal for this contact (max 5000 characters). Used by AI when drafting emails.'
example: 'Close enterprise deal by Q3'
nullable: true
outreach_id:
type: integer
description: ''
example: 16
nullable: true
company_id:
type: integer
description: ''
example: 16
nullable: true
custom_fields:
type: object
description: 'Map of Contact custom field name to string value. Names must match team definitions (case-insensitive).'
example:
'extra emails': 'a@x.com, b@y.com'
nullable: true
properties: { }
client_ref:
type: object
description: ''
example: null
nullable: true
properties:
id:
type: integer
description: ''
example: 16
nullable: true
name:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
nullable: true
tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
add_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
remove_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- m
items:
type: string
create_missing_tags:
type: boolean
description: ''
example: true
nullable: true
delete:
summary: 'Delete a contact.'
operationId: deleteAContact
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Contacts
parameters:
-
in: path
name: id
description: 'Contact id.'
example: 21
required: true
schema:
type: integer
/api/v1/custom-fields:
get:
summary: 'Display a paginated list of custom fields.'
operationId: displayAPaginatedListOfCustomFields
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: priority
label: Priority
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
links:
first: 'https://example.com/api/v1/custom-fields?page=1'
last: 'https://example.com/api/v1/custom-fields?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/custom-fields'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 1
name: priority
label: Priority
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: priority
label:
type: string
example: Priority
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/custom-fields?page=1'
last:
type: string
example: 'https://example.com/api/v1/custom-fields?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/custom-fields'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Custom Fields'
post:
summary: 'Create a new custom field.'
operationId: createANewCustomField
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
name: priority
label: Priority
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
properties:
id:
type: integer
example: 1
name:
type: string
example: priority
label:
type: string
example: Priority
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
tags:
- 'Custom Fields'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Internal field name.'
example: priority
nullable: false
type:
type: string
description: 'Field type.'
example: string
nullable: false
required:
- name
- type
'/api/v1/custom-fields/{field_id}':
put:
summary: 'Update a custom field.'
operationId: updateACustomField
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
name: priority
label: Priority
team_id: 8
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-11T10:30:00.000000Z'
properties:
id:
type: integer
example: 1
name:
type: string
example: priority
label:
type: string
example: Priority
team_id:
type: integer
example: 8
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:30:00.000000Z'
tags:
- 'Custom Fields'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Internal field name.'
example: priority
nullable: false
type:
type: string
description: 'Field type.'
example: string
nullable: false
parameters:
-
in: path
name: field_id
description: 'The ID of the field.'
example: 3
required: true
schema:
type: integer
-
in: path
name: field
description: 'Custom field id.'
example: 1
required: true
schema:
type: integer
'/api/v1/custom-fields/{customField_id}':
delete:
summary: 'Delete a custom field.'
operationId: deleteACustomField
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
tags:
- 'Custom Fields'
parameters:
-
in: path
name: customField_id
description: 'The ID of the customField.'
example: 3
required: true
schema:
type: integer
-
in: path
name: customField
description: 'Custom field id.'
example: 1
required: true
schema:
type: integer
/api/v1/deal-columns:
get:
summary: 'Display a paginated list of deal flow columns.'
operationId: displayAPaginatedListOfDealFlowColumns
description: ''
parameters:
-
in: query
name: name
description: 'Filter columns by name.'
example: Proposal
required: false
schema:
type: string
description: 'Filter columns by name.'
example: Proposal
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, name, order, created_at, updated_at.'
example: order
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, name, order, created_at, updated_at.'
example: order
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: asc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: asc
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Qualified Lead'
board_id: 5
team_id: 8
deal_probability: 30%
order: 0
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
-
id: 2
name: 'Proposal Made'
board_id: 5
team_id: 8
deal_probability: 50%
order: 1
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/deal-columns?page=1'
last: 'https://example.com/api/v1/deal-columns?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/deal-columns'
per_page: 30
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 1
name: 'Qualified Lead'
board_id: 5
team_id: 8
deal_probability: 30%
order: 0
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
-
id: 2
name: 'Proposal Made'
board_id: 5
team_id: 8
deal_probability: 50%
order: 1
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Qualified Lead'
board_id:
type: integer
example: 5
team_id:
type: integer
example: 8
deal_probability:
type: string
example: 30%
order:
type: integer
example: 0
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/deal-columns?page=1'
last:
type: string
example: 'https://example.com/api/v1/deal-columns?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/deal-columns'
per_page:
type: integer
example: 30
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Deal Flow Columns'
post:
summary: 'Create a new deal flow column.'
operationId: createANewDealFlowColumn
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 3
name: 'Proposal Made'
board_id: 5
team_id: 8
deal_probability: 50%
order: 2
created_at: '2025-01-10T10:00:00.000000Z'
updated_at: '2025-01-10T10:00:00.000000Z'
deleted_at: null
message: 'Column created successfully'
properties:
data:
type: object
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Proposal Made'
board_id:
type: integer
example: 5
team_id:
type: integer
example: 8
deal_probability:
type: string
example: 50%
order:
type: integer
example: 2
created_at:
type: string
example: '2025-01-10T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T10:00:00.000000Z'
deleted_at:
type: string
example: null
message:
type: string
example: 'Column created successfully'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
name:
- 'The name field is required.'
board_id:
- 'The selected board id is invalid.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
name:
type: array
example:
- 'The name field is required.'
items:
type: string
board_id:
type: array
example:
- 'The selected board id is invalid.'
items:
type: string
tags:
- 'Deal Flow Columns'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Column name.'
example: 'Proposal Made'
nullable: false
board_id:
type: integer
description: 'ID of the board this column belongs to.'
example: 5
nullable: false
deal_probability:
type: string
description: 'Probability percentage for deals in this stage.'
example: 50%
nullable: false
order:
type: integer
description: 'Position in the pipeline (0-based). If not provided, will be added to the end.'
example: 2
nullable: false
required:
- name
'/api/v1/deal-columns/{id}':
put:
summary: 'Update a deal flow column.'
operationId: updateADealFlowColumn
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 3
name: 'Proposal Submitted'
board_id: 5
team_id: 8
deal_probability: 60%
order: 3
created_at: '2025-01-10T10:00:00.000000Z'
updated_at: '2025-01-10T11:30:00.000000Z'
deleted_at: null
message: 'Column updated successfully'
properties:
data:
type: object
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Proposal Submitted'
board_id:
type: integer
example: 5
team_id:
type: integer
example: 8
deal_probability:
type: string
example: 60%
order:
type: integer
example: 3
created_at:
type: string
example: '2025-01-10T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T11:30:00.000000Z'
deleted_at:
type: string
example: null
message:
type: string
example: 'Column updated successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Column not found'
properties:
message:
type: string
example: 'Column not found'
tags:
- 'Deal Flow Columns'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Column name.'
example: 'Proposal Submitted'
nullable: false
board_id:
type: integer
description: 'ID of the board this column belongs to.'
example: 5
nullable: false
deal_probability:
type: string
description: 'Probability percentage for deals in this stage.'
example: 60%
nullable: false
delete:
summary: 'Delete a deal flow column.'
operationId: deleteADealFlowColumn
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Column deleted successfully'
properties:
message:
type: string
example: 'Column deleted successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Column not found'
properties:
message:
type: string
example: 'Column not found'
tags:
- 'Deal Flow Columns'
parameters:
-
in: path
name: id
description: 'Column ID.'
example: 3
required: true
schema:
type: integer
'/api/v1/deal-columns/{id}/order':
put:
summary: 'Reorder a deal flow column.'
operationId: reorderADealFlowColumn
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 3
name: 'Proposal Made'
board_id: 5
team_id: 8
deal_probability: 50%
order: 1
created_at: '2025-01-10T10:00:00.000000Z'
updated_at: '2025-01-10T12:00:00.000000Z'
deleted_at: null
message: 'Column order updated successfully'
properties:
data:
type: object
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Proposal Made'
board_id:
type: integer
example: 5
team_id:
type: integer
example: 8
deal_probability:
type: string
example: 50%
order:
type: integer
example: 1
created_at:
type: string
example: '2025-01-10T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T12:00:00.000000Z'
deleted_at:
type: string
example: null
message:
type: string
example: 'Column order updated successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Column not found'
properties:
message:
type: string
example: 'Column not found'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
order:
- 'The order field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
order:
type: array
example:
- 'The order field is required.'
items:
type: string
tags:
- 'Deal Flow Columns'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
order:
type: integer
description: 'New position in the pipeline (0-based).'
example: 1
nullable: false
required:
- order
parameters:
-
in: path
name: id
description: 'Column ID.'
example: 3
required: true
schema:
type: integer
/api/v1/deals:
get:
summary: 'Display a paginated listing of deals.'
operationId: displayAPaginatedListingOfDeals
description: ''
parameters:
-
in: query
name: search
description: 'Must not be greater than 500 characters.'
example: b
required: false
schema:
type: string
description: 'Must not be greater than 500 characters.'
example: b
nullable: true
-
in: query
name: user_id
description: ''
example: 16
required: false
schema:
type: integer
description: ''
example: 16
nullable: true
-
in: query
name: column_id
description: ''
example: 16
required: false
schema:
type: integer
description: ''
example: 16
nullable: true
-
in: query
name: contact_id
description: ''
example: 16
required: false
schema:
type: integer
description: ''
example: 16
nullable: true
-
in: query
name: date_from
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
required: false
schema:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
nullable: true
-
in: query
name: date_to
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
required: false
schema:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:22'
nullable: true
-
in: query
name: sort
description: ''
example: name
required: false
schema:
type: string
description: ''
example: name
nullable: true
enum:
- id
- name
- amount
- created_at
- updated_at
-
in: query
name: direction
description: ''
example: desc
required: false
schema:
type: string
description: ''
example: desc
nullable: true
enum:
- asc
- desc
-
in: query
name: per_page
description: 'Must be at least 1. Must not be greater than 100.'
example: 22
required: false
schema:
type: integer
description: 'Must be at least 1. Must not be greater than 100.'
example: 22
nullable: true
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Big Deal'
slug: big-deal
outreach_id: 3
company_id: 7
contact_id: 15
user_id: 5
team_id: 2
description: 'This is a very important deal.'
column_id: 4
closed_at: '2024-05-01T00:00:00.000000Z'
amount: '10000.00'
order: 1
created_at: '2024-04-01T12:00:00.000000Z'
updated_at: '2024-04-15T15:30:00.000000Z'
deleted_at: null
meta:
current_page: 1
from: 1
last_page: 3
per_page: 30
to: 30
total: 75
properties:
data:
type: array
example:
-
id: 1
name: 'Big Deal'
slug: big-deal
outreach_id: 3
company_id: 7
contact_id: 15
user_id: 5
team_id: 2
description: 'This is a very important deal.'
column_id: 4
closed_at: '2024-05-01T00:00:00.000000Z'
amount: '10000.00'
order: 1
created_at: '2024-04-01T12:00:00.000000Z'
updated_at: '2024-04-15T15:30:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Big Deal'
slug:
type: string
example: big-deal
outreach_id:
type: integer
example: 3
company_id:
type: integer
example: 7
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 5
team_id:
type: integer
example: 2
description:
type: string
example: 'This is a very important deal.'
column_id:
type: integer
example: 4
closed_at:
type: string
example: '2024-05-01T00:00:00.000000Z'
amount:
type: string
example: '10000.00'
order:
type: integer
example: 1
created_at:
type: string
example: '2024-04-01T12:00:00.000000Z'
updated_at:
type: string
example: '2024-04-15T15:30:00.000000Z'
deleted_at:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 3
per_page:
type: integer
example: 30
to:
type: integer
example: 30
total:
type: integer
example: 75
401:
description: unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
tags:
- 'Deals Management'
post:
summary: 'Store a newly created deal in storage.'
operationId: storeANewlyCreatedDealInStorage
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: created
content:
application/json:
schema:
type: object
example:
id: 2
name: 'New Deal'
slug: new-deal
outreach_id: 3
company_id: 7
contact_id: 15
user_id: 5
team_id: 2
description: 'This deal is very promising.'
column_id: 4
closed_at: '2024-06-30T00:00:00.000000Z'
amount: '5000.00'
order: 2
created_at: '2024-05-01T10:00:00.000000Z'
updated_at: '2024-05-01T10:00:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 2
name:
type: string
example: 'New Deal'
slug:
type: string
example: new-deal
outreach_id:
type: integer
example: 3
company_id:
type: integer
example: 7
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 5
team_id:
type: integer
example: 2
description:
type: string
example: 'This deal is very promising.'
column_id:
type: integer
example: 4
closed_at:
type: string
example: '2024-06-30T00:00:00.000000Z'
amount:
type: string
example: '5000.00'
order:
type: integer
example: 2
created_at:
type: string
example: '2024-05-01T10:00:00.000000Z'
updated_at:
type: string
example: '2024-05-01T10:00:00.000000Z'
deleted_at:
type: string
example: null
400:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
name:
- 'The name field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
name:
type: array
example:
- 'The name field is required.'
items:
type: string
401:
description: unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
tags:
- 'Deals Management'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The name of the deal.'
example: '"New Deal"'
nullable: false
description:
type: string
description: 'The description of the deal.'
example: '"This deal is very promising."'
nullable: false
closed_at:
type: date
description: 'The closing date of the deal. Format: YYYY-MM-DD.'
example: '"2024-06-30"'
nullable: false
outreach_id:
type: integer
description: 'The ID of the associated outreach.'
example: 3
nullable: false
contact_id:
type: integer
description: 'The ID of the associated contact.'
example: 15
nullable: false
company_id:
type: integer
description: 'The ID of the associated company.'
example: 7
nullable: false
amount:
type: decimal
description: 'The monetary amount of the deal.'
example: '"5000.00"'
nullable: false
column_id:
type: integer
description: 'The ID of the deal flow column.'
example: 4
nullable: false
user_id:
type: integer
description: 'The ID of the user assigned to the deal.'
example: 5
nullable: false
attachments:
type: array
description: 'An array of files to attach to the deal.'
example:
- architecto
items:
type: string
required:
- name
- column_id
'/api/v1/deals/{id}':
get:
summary: 'Display the specified deal.'
operationId: displayTheSpecifiedDeal
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
name: 'Big Deal'
slug: big-deal
outreach_id: 3
company_id: 7
contact_id: 15
user_id: 5
team_id: 2
description: 'This is a very important deal.'
column_id: 4
closed_at: '2024-05-01T00:00:00.000000Z'
amount: '10000.00'
order: 1
created_at: '2024-04-01T12:00:00.000000Z'
updated_at: '2024-04-15T15:30:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Big Deal'
slug:
type: string
example: big-deal
outreach_id:
type: integer
example: 3
company_id:
type: integer
example: 7
contact_id:
type: integer
example: 15
user_id:
type: integer
example: 5
team_id:
type: integer
example: 2
description:
type: string
example: 'This is a very important deal.'
column_id:
type: integer
example: 4
closed_at:
type: string
example: '2024-05-01T00:00:00.000000Z'
amount:
type: string
example: '10000.00'
order:
type: integer
example: 1
created_at:
type: string
example: '2024-04-01T12:00:00.000000Z'
updated_at:
type: string
example: '2024-04-15T15:30:00.000000Z'
deleted_at:
type: string
example: null
401:
description: unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
403:
description: forbidden
content:
text/plain:
schema:
type: string
example: '{"message": "This action is unauthorized'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Deal not found.'
properties:
message:
type: string
example: 'Deal not found.'
tags:
- 'Deals Management'
put:
summary: 'Update the specified deal in storage.'
operationId: updateTheSpecifiedDealInStorage
description: 'To change column or position, use PUT deals/{id}/order (column_id is not accepted here).'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
name: 'Updated Deal Name'
slug: updated-deal-name
outreach_id: 4
company_id: 8
contact_id: 16
user_id: 6
team_id: 2
description: 'Updated description.'
column_id: 5
closed_at: '2024-07-15T00:00:00.000000Z'
amount: '7500.00'
order: 1
created_at: '2024-04-01T12:00:00.000000Z'
updated_at: '2024-05-10T14:20:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Updated Deal Name'
slug:
type: string
example: updated-deal-name
outreach_id:
type: integer
example: 4
company_id:
type: integer
example: 8
contact_id:
type: integer
example: 16
user_id:
type: integer
example: 6
team_id:
type: integer
example: 2
description:
type: string
example: 'Updated description.'
column_id:
type: integer
example: 5
closed_at:
type: string
example: '2024-07-15T00:00:00.000000Z'
amount:
type: string
example: '7500.00'
order:
type: integer
example: 1
created_at:
type: string
example: '2024-04-01T12:00:00.000000Z'
updated_at:
type: string
example: '2024-05-10T14:20:00.000000Z'
deleted_at:
type: string
example: null
400:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
name:
- 'The name field must not be greater than 255 characters.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
name:
type: array
example:
- 'The name field must not be greater than 255 characters.'
items:
type: string
401:
description: unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Deal not found.'
properties:
message:
type: string
example: 'Deal not found.'
tags:
- 'Deals Management'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The name of the deal.'
example: '"Updated Deal Name"'
nullable: false
description:
type: string
description: 'The description of the deal.'
example: '"Updated description."'
nullable: false
closed_at:
type: date
description: 'The closing date of the deal. Format: YYYY-MM-DD.'
example: '"2024-07-15"'
nullable: false
outreach_id:
type: integer
description: 'The ID of the associated outreach.'
example: 4
nullable: false
contact_id:
type: integer
description: 'The ID of the associated contact.'
example: 16
nullable: false
company_id:
type: integer
description: 'The ID of the associated company.'
example: 8
nullable: false
amount:
type: decimal
description: 'The monetary amount of the deal.'
example: '"7500.00"'
nullable: false
user_id:
type: integer
description: 'The ID of the user assigned to the deal.'
example: 6
nullable: false
attachments:
type: array
description: 'An array of files to attach to the deal.'
example:
- architecto
items:
type: string
delete:
summary: 'Remove the specified deal from storage.'
operationId: removeTheSpecifiedDealFromStorage
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Deal deleted successfully.'
properties:
message:
type: string
example: 'Deal deleted successfully.'
401:
description: unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Deal not found.'
properties:
message:
type: string
example: 'Deal not found.'
tags:
- 'Deals Management'
parameters:
-
in: path
name: id
description: 'The ID of the deal.'
example: 1
required: true
schema:
type: integer
/api/v1/deals/order:
put:
summary: 'Update the order of the specified deal.'
operationId: updateTheOrderOfTheSpecifiedDeal
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
text/plain:
schema:
type: string
example: '{"data": { ...deal data... }, "message": "Deal order updated successfully."}'
400:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
order:
- 'The order field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
order:
type: array
example:
- 'The order field is required.'
items:
type: string
401:
description: unauthenticated
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Deal not found.'
properties:
message:
type: string
example: 'Deal not found.'
tags:
- 'Deals Management'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
order:
type: integer
description: 'The new order position of the deal.'
example: 3
nullable: false
column_id:
type: integer
description: 'The ID of the deal flow column.'
example: 2
nullable: false
required:
- order
- column_id
parameters:
-
in: path
name: id
description: 'The ID of the deal.'
example: 1
required: true
schema:
type: integer
'/api/v1/deals/{id}/order':
put:
summary: ''
operationId: putApiV1DealsIdOrder
description: ''
parameters: []
responses: { }
tags:
- 'Deals Management'
security: []
parameters:
-
in: path
name: id
description: 'The ID of the deal.'
example: 2070
required: true
schema:
type: integer
/api/v1/email-campaigns:
get:
summary: 'Display a paginated list of email campaigns.'
operationId: displayAPaginatedListOfEmailCampaigns
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 20
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 20
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 12
user_id: 5
team_id: 3
email_template_id: 7
name: 'January Newsletter'
scheduled_at: '2025-02-01T10:00:00.000000Z'
email_type: template
text_editor: null
created_at: '2025-01-20T08:30:00.000000Z'
updated_at: '2025-01-20T08:30:00.000000Z'
links:
first: 'https://example.com/api/v1/email-campaigns?page=1'
last: 'https://example.com/api/v1/email-campaigns?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/email-campaigns'
per_page: 10
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 12
user_id: 5
team_id: 3
email_template_id: 7
name: 'January Newsletter'
scheduled_at: '2025-02-01T10:00:00.000000Z'
email_type: template
text_editor: null
created_at: '2025-01-20T08:30:00.000000Z'
updated_at: '2025-01-20T08:30:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 12
user_id:
type: integer
example: 5
team_id:
type: integer
example: 3
email_template_id:
type: integer
example: 7
name:
type: string
example: 'January Newsletter'
scheduled_at:
type: string
example: '2025-02-01T10:00:00.000000Z'
email_type:
type: string
example: template
text_editor:
type: string
example: null
created_at:
type: string
example: '2025-01-20T08:30:00.000000Z'
updated_at:
type: string
example: '2025-01-20T08:30:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/email-campaigns?page=1'
last:
type: string
example: 'https://example.com/api/v1/email-campaigns?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/email-campaigns'
per_page:
type: integer
example: 10
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Email Campaigns'
post:
summary: 'Create a new email campaign.'
operationId: createANewEmailCampaign
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 12
user_id: 5
team_id: 3
email_template_id: 7
name: 'January Newsletter'
scheduled_at: '2025-02-01T10:00:00.000000Z'
email_type: template
text_editor: null
created_at: '2025-01-20T08:30:00.000000Z'
updated_at: '2025-01-20T08:30:00.000000Z'
properties:
id:
type: integer
example: 12
user_id:
type: integer
example: 5
team_id:
type: integer
example: 3
email_template_id:
type: integer
example: 7
name:
type: string
example: 'January Newsletter'
scheduled_at:
type: string
example: '2025-02-01T10:00:00.000000Z'
email_type:
type: string
example: template
text_editor:
type: string
example: null
created_at:
type: string
example: '2025-01-20T08:30:00.000000Z'
updated_at:
type: string
example: '2025-01-20T08:30:00.000000Z'
tags:
- 'Email Campaigns'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Campaign name.'
example: 'January Newsletter'
nullable: false
scheduled_at:
type: string
description: 'ISO 8601 datetime when the campaign should be sent.'
example: '2025-02-01T10:00:00Z'
nullable: false
email_type:
type: string
description: 'Email type. Allowed: template, text_editor.'
example: template
nullable: false
email_template_id:
type: integer
description: 'required_if:email_type,template Template id.'
example: 7
nullable: false
text_editor:
type: string
description: 'required_if:email_type,text_editor Raw email content.'
example: 'Hello, this is our newsletter.'
nullable: false
required:
- name
- scheduled_at
- email_type
'/api/v1/email-campaigns/{id}':
get:
summary: 'Display a single email campaign.'
operationId: displayASingleEmailCampaign
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 12
user_id: 5
team_id: 3
email_template_id: 7
name: 'January Newsletter'
scheduled_at: '2025-02-01T10:00:00.000000Z'
email_type: template
text_editor: null
created_at: '2025-01-20T08:30:00.000000Z'
updated_at: '2025-01-20T08:30:00.000000Z'
properties:
id:
type: integer
example: 12
user_id:
type: integer
example: 5
team_id:
type: integer
example: 3
email_template_id:
type: integer
example: 7
name:
type: string
example: 'January Newsletter'
scheduled_at:
type: string
example: '2025-02-01T10:00:00.000000Z'
email_type:
type: string
example: template
text_editor:
type: string
example: null
created_at:
type: string
example: '2025-01-20T08:30:00.000000Z'
updated_at:
type: string
example: '2025-01-20T08:30:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Email Campaigns'
put:
summary: 'Update an existing email campaign.'
operationId: updateAnExistingEmailCampaign
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 12
name: 'February Newsletter'
email_type: text_editor
scheduled_at: '2025-02-15T10:00:00.000000Z'
updated_at: '2025-01-25T09:00:00.000000Z'
properties:
id:
type: integer
example: 12
name:
type: string
example: 'February Newsletter'
email_type:
type: string
example: text_editor
scheduled_at:
type: string
example: '2025-02-15T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-25T09:00:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Email Campaigns'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Campaign name.'
example: 'February Newsletter'
nullable: false
scheduled_at:
type: string
description: 'ISO 8601 datetime.'
example: '2025-02-15T10:00:00Z'
nullable: false
email_type:
type: string
description: 'Allowed: template, text_editor.'
example: text_editor
nullable: false
email_template_id:
type: integer
description: 'Template id.'
example: 7
nullable: false
text_editor:
type: string
description: 'Raw email content.'
example: architecto
nullable: false
delete:
summary: 'Delete an email campaign.'
operationId: deleteAnEmailCampaign
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Email Campaigns'
parameters:
-
in: path
name: id
description: 'Email campaign id.'
example: 12
required: true
schema:
type: integer
'/api/v1/email-campaigns/{id}/send':
post:
summary: 'Send an email campaign.'
operationId: sendAnEmailCampaign
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Email campaign sent successfully'
properties:
message:
type: string
example: 'Email campaign sent successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Email Campaigns'
parameters:
-
in: path
name: id
description: 'Email campaign id.'
example: 12
required: true
schema:
type: integer
/api/v1/email-templates:
get:
summary: 'Display a paginated list of email templates.'
operationId: displayAPaginatedListOfEmailTemplates
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 10
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 10
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 5
template_name: 'Invoice Reminder'
template_html: '...'
design_object: '{}'
created_at: '2025-01-15T10:00:00.000000Z'
updated_at: '2025-01-15T10:00:00.000000Z'
links:
first: 'https://example.com/api/v1/email-templates?page=1'
last: 'https://example.com/api/v1/email-templates?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/email-templates'
per_page: 10
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 5
template_name: 'Invoice Reminder'
template_html: '...'
design_object: '{}'
created_at: '2025-01-15T10:00:00.000000Z'
updated_at: '2025-01-15T10:00:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 5
template_name:
type: string
example: 'Invoice Reminder'
template_html:
type: string
example: '...'
design_object:
type: string
example: '{}'
created_at:
type: string
example: '2025-01-15T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-15T10:00:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/email-templates?page=1'
last:
type: string
example: 'https://example.com/api/v1/email-templates?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/email-templates'
per_page:
type: integer
example: 10
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Email Templates'
post:
summary: 'Create a new email template.'
operationId: createANewEmailTemplate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 5
template_name: 'Invoice Reminder'
template_html: '...'
design_object: '{}'
created_at: '2025-01-15T10:00:00.000000Z'
updated_at: '2025-01-15T10:00:00.000000Z'
properties:
id:
type: integer
example: 5
template_name:
type: string
example: 'Invoice Reminder'
template_html:
type: string
example: '...'
design_object:
type: string
example: '{}'
created_at:
type: string
example: '2025-01-15T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-15T10:00:00.000000Z'
tags:
- 'Email Templates'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
template_name:
type: string
description: 'Template name.'
example: 'Invoice Reminder'
nullable: false
template_html:
type: string
description: 'HTML content of the template.'
example: '...'
nullable: false
design_object:
type: string
description: 'Serialized design configuration.'
example: '{}'
nullable: false
required:
- template_name
- template_html
- design_object
'/api/v1/email-templates/{id}':
get:
summary: 'Display a single email template.'
operationId: displayASingleEmailTemplate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 5
template_name: 'Invoice Reminder'
template_html: '...'
design_object: '{}'
created_at: '2025-01-15T10:00:00.000000Z'
updated_at: '2025-01-15T10:00:00.000000Z'
properties:
id:
type: integer
example: 5
template_name:
type: string
example: 'Invoice Reminder'
template_html:
type: string
example: '...'
design_object:
type: string
example: '{}'
created_at:
type: string
example: '2025-01-15T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-15T10:00:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Email Templates'
put:
summary: 'Update an existing email template.'
operationId: updateAnExistingEmailTemplate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 5
template_name: 'Updated Invoice Reminder'
template_html: 'updated'
design_object: '{}'
created_at: '2025-01-15T10:00:00.000000Z'
updated_at: '2025-01-15T11:30:00.000000Z'
properties:
id:
type: integer
example: 5
template_name:
type: string
example: 'Updated Invoice Reminder'
template_html:
type: string
example: 'updated'
design_object:
type: string
example: '{}'
created_at:
type: string
example: '2025-01-15T10:00:00.000000Z'
updated_at:
type: string
example: '2025-01-15T11:30:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Email Templates'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
template_name:
type: string
description: 'Template name.'
example: 'Updated Invoice Reminder'
nullable: false
template_html:
type: string
description: 'HTML content of the template.'
example: 'updated'
nullable: false
design_object:
type: string
description: 'Serialized design configuration.'
example: '{}'
nullable: false
delete:
summary: 'Delete an email template.'
operationId: deleteAnEmailTemplate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Email Templates'
parameters:
-
in: path
name: id
description: 'Email template id.'
example: 5
required: true
schema:
type: integer
/api/v1/invoices:
get:
summary: 'Display a paginated list of invoices.'
operationId: displayAPaginatedListOfInvoices
description: ''
parameters:
-
in: query
name: search
description: 'Filter invoices by invoice number or client name.'
example: INV-001
required: false
schema:
type: string
description: 'Filter invoices by invoice number or client name.'
example: INV-001
nullable: false
-
in: query
name: client_id
description: 'Filter invoices by client ID.'
example: 1
required: false
schema:
type: integer
description: 'Filter invoices by client ID.'
example: 1
nullable: false
-
in: query
name: status
description: 'Filter by status (0=draft, 1=sent, 2=closed, 3=cancelled, 4=open).'
example: 1
required: false
schema:
type: integer
description: 'Filter by status (0=draft, 1=sent, 2=closed, 3=cancelled, 4=open).'
example: 1
nullable: false
-
in: query
name: date_from
description: 'date Filter by creation date (from). Format: YYYY-MM-DD.'
example: '2024-01-01'
required: false
schema:
type: string
description: 'date Filter by creation date (from). Format: YYYY-MM-DD.'
example: '2024-01-01'
nullable: false
-
in: query
name: date_to
description: 'date Filter by creation date (to). Format: YYYY-MM-DD.'
example: '2024-12-31'
required: false
schema:
type: string
description: 'date Filter by creation date (to). Format: YYYY-MM-DD.'
example: '2024-12-31'
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, number, amount, created_at, updated_at, issue_date, due_date.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, number, amount, created_at, updated_at, issue_date, due_date.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100. Default: 50.'
example: 25
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100. Default: 50.'
example: 25
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
hash: abc123def456
currency_id: 1
random_number: 123456
status: 1
exchange_coefficient: 1.0
amount: 1000.5
amount_base_currency: 1000.5
paid_amount: 500.0
paid_amount_base_currency: 500.0
outstanding_amount: 500.5
outstanding_amount_base_currency: 500.5
client_id: 1
user_id: 12
team_id: 8
from_company_id: null
discount: 0
tax1: 0
tax2: 0
issue_date: '2024-01-15'
due_date: '2024-02-15'
notes: 'Invoice for development services'
number: INV-001
interval_date: null
email: client@example.com
stripe_external_id: null
stripe_invoice_url: null
passim_invoice_url: null
invoiced_at: '2024-01-15T10:30:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
deleted_at: null
payment_amount_paid: 500.5
-
id: 2
hash: def456ghi789
currency_id: 1
random_number: 789012
status: 0
exchange_coefficient: 1.0
amount: 1500.0
amount_base_currency: 1500.0
paid_amount: 0.0
paid_amount_base_currency: 0.0
outstanding_amount: 1500.0
outstanding_amount_base_currency: 1500.0
client_id: 2
user_id: 12
team_id: 8
from_company_id: null
discount: 10
tax1: 20
tax2: 5
issue_date: '2024-01-20'
due_date: '2024-02-20'
notes: 'Monthly retainer invoice'
number: INV-002
interval_date: null
email: client2@example.com
stripe_external_id: null
stripe_invoice_url: null
passim_invoice_url: null
invoiced_at: '2024-01-20T14:45:00.000000Z'
created_at: '2024-01-20T14:45:00.000000Z'
updated_at: '2024-01-20T14:45:00.000000Z'
deleted_at: null
payment_amount_paid: 0.0
links:
first: 'https://example.com/api/v1/invoices?page=1'
last: 'https://example.com/api/v1/invoices?page=3'
prev: null
next: 'https://example.com/api/v1/invoices?page=2'
meta:
current_page: 1
from: 1
last_page: 3
path: 'https://example.com/api/v1/invoices'
per_page: 50
to: 50
total: 125
properties:
data:
type: array
example:
-
id: 1
hash: abc123def456
currency_id: 1
random_number: 123456
status: 1
exchange_coefficient: 1
amount: 1000.5
amount_base_currency: 1000.5
paid_amount: 500
paid_amount_base_currency: 500
outstanding_amount: 500.5
outstanding_amount_base_currency: 500.5
client_id: 1
user_id: 12
team_id: 8
from_company_id: null
discount: 0
tax1: 0
tax2: 0
issue_date: '2024-01-15'
due_date: '2024-02-15'
notes: 'Invoice for development services'
number: INV-001
interval_date: null
email: client@example.com
stripe_external_id: null
stripe_invoice_url: null
passim_invoice_url: null
invoiced_at: '2024-01-15T10:30:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
deleted_at: null
payment_amount_paid: 500.5
-
id: 2
hash: def456ghi789
currency_id: 1
random_number: 789012
status: 0
exchange_coefficient: 1
amount: 1500
amount_base_currency: 1500
paid_amount: 0
paid_amount_base_currency: 0
outstanding_amount: 1500
outstanding_amount_base_currency: 1500
client_id: 2
user_id: 12
team_id: 8
from_company_id: null
discount: 10
tax1: 20
tax2: 5
issue_date: '2024-01-20'
due_date: '2024-02-20'
notes: 'Monthly retainer invoice'
number: INV-002
interval_date: null
email: client2@example.com
stripe_external_id: null
stripe_invoice_url: null
passim_invoice_url: null
invoiced_at: '2024-01-20T14:45:00.000000Z'
created_at: '2024-01-20T14:45:00.000000Z'
updated_at: '2024-01-20T14:45:00.000000Z'
deleted_at: null
payment_amount_paid: 0
items:
type: object
properties:
id:
type: integer
example: 1
hash:
type: string
example: abc123def456
currency_id:
type: integer
example: 1
random_number:
type: integer
example: 123456
status:
type: integer
example: 1
exchange_coefficient:
type: number
example: 1.0
amount:
type: number
example: 1000.5
amount_base_currency:
type: number
example: 1000.5
paid_amount:
type: number
example: 500.0
paid_amount_base_currency:
type: number
example: 500.0
outstanding_amount:
type: number
example: 500.5
outstanding_amount_base_currency:
type: number
example: 500.5
client_id:
type: integer
example: 1
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
from_company_id:
type: string
example: null
discount:
type: integer
example: 0
tax1:
type: integer
example: 0
tax2:
type: integer
example: 0
issue_date:
type: string
example: '2024-01-15'
due_date:
type: string
example: '2024-02-15'
notes:
type: string
example: 'Invoice for development services'
number:
type: string
example: INV-001
interval_date:
type: string
example: null
email:
type: string
example: client@example.com
stripe_external_id:
type: string
example: null
stripe_invoice_url:
type: string
example: null
passim_invoice_url:
type: string
example: null
invoiced_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
created_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
deleted_at:
type: string
example: null
payment_amount_paid:
type: number
example: 500.5
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/invoices?page=1'
last:
type: string
example: 'https://example.com/api/v1/invoices?page=3'
prev:
type: string
example: null
next:
type: string
example: 'https://example.com/api/v1/invoices?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 3
path:
type: string
example: 'https://example.com/api/v1/invoices'
per_page:
type: integer
example: 50
to:
type: integer
example: 50
total:
type: integer
example: 125
tags:
- Endpoints
post:
summary: 'Create a new invoice.'
operationId: createANewInvoice
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 3
hash: ghi789jkl012
currency_id: 1
random_number: 345678
status: 0
exchange_coefficient: 1.0
amount: 1000.5
amount_base_currency: 1000.5
paid_amount: 0.0
paid_amount_base_currency: 0.0
outstanding_amount: 1000.5
outstanding_amount_base_currency: 1000.5
client_id: 1
user_id: 12
team_id: 8
from_company_id: null
discount: 10
tax1: 20
tax2: 5
issue_date: '2024-01-15'
due_date: '2024-02-15'
notes: 'Invoice for development services'
number: INV-003
interval_date: null
email: client@example.com
stripe_external_id: null
stripe_invoice_url: null
passim_invoice_url: null
invoiced_at: '2024-01-15T10:30:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
deleted_at: null
payment_amount_paid: 0.0
items:
-
id: 3
name: 'Feature development'
price: 100.0
quantity: 10
amount: 1000.0
invoice_id: 3
-
id: 4
name: 'API Integration'
price: 0.5
quantity: 1
amount: 0.5
invoice_id: 3
properties:
data:
type: object
properties:
id:
type: integer
example: 3
hash:
type: string
example: ghi789jkl012
currency_id:
type: integer
example: 1
random_number:
type: integer
example: 345678
status:
type: integer
example: 0
exchange_coefficient:
type: number
example: 1.0
amount:
type: number
example: 1000.5
amount_base_currency:
type: number
example: 1000.5
paid_amount:
type: number
example: 0.0
paid_amount_base_currency:
type: number
example: 0.0
outstanding_amount:
type: number
example: 1000.5
outstanding_amount_base_currency:
type: number
example: 1000.5
client_id:
type: integer
example: 1
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
from_company_id:
type: string
example: null
discount:
type: integer
example: 10
tax1:
type: integer
example: 20
tax2:
type: integer
example: 5
issue_date:
type: string
example: '2024-01-15'
due_date:
type: string
example: '2024-02-15'
notes:
type: string
example: 'Invoice for development services'
number:
type: string
example: INV-003
interval_date:
type: string
example: null
email:
type: string
example: client@example.com
stripe_external_id:
type: string
example: null
stripe_invoice_url:
type: string
example: null
passim_invoice_url:
type: string
example: null
invoiced_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
created_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
deleted_at:
type: string
example: null
payment_amount_paid:
type: number
example: 0.0
items:
type: array
example:
-
id: 3
name: 'Feature development'
price: 100
quantity: 10
amount: 1000
invoice_id: 3
-
id: 4
name: 'API Integration'
price: 0.5
quantity: 1
amount: 0.5
invoice_id: 3
items:
type: object
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Feature development'
price:
type: number
example: 100.0
quantity:
type: integer
example: 10
amount:
type: number
example: 1000.0
invoice_id:
type: integer
example: 3
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
client_id:
- 'The client id field is required.'
amount:
- 'The amount field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
client_id:
type: array
example:
- 'The client id field is required.'
items:
type: string
amount:
type: array
example:
- 'The amount field is required.'
items:
type: string
tags:
- Endpoints
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
client_id:
type: integer
description: 'Client ID.'
example: 1
nullable: false
currency_id:
type: integer
description: "Currency ID. Defaults to client's currency."
example: 1
nullable: false
status:
type: integer
description: 'Invoice status (0=draft, 1=sent, 2=closed, 3=cancelled, 4=open). Default: 0.'
example: 0
nullable: false
amount:
type: numeric
description: 'Invoice total amount.'
example: '1000.50'
nullable: false
issue_date:
type: date
description: 'Issue date. Format: YYYY-MM-DD.'
example: '2024-01-15'
nullable: false
due_date:
type: date
description: 'Due date. Format: YYYY-MM-DD.'
example: '2024-02-15'
nullable: false
notes:
type: string
description: 'Internal notes.'
example: '"Invoice for development services"'
nullable: false
number:
type: string
description: 'Invoice number. Auto-generated if not provided.'
example: '"INV-001"'
nullable: false
discount:
type: integer
description: 'Discount percentage.'
example: 10
nullable: false
tax1:
type: integer
description: 'First tax percentage.'
example: 20
nullable: false
tax2:
type: integer
description: 'Second tax percentage.'
example: 5
nullable: false
email:
type: string
description: 'Client email for sending invoice.'
example: '"client@example.com"'
nullable: false
items:
type: array
description: 'Invoice line items.'
example:
- architecto
items:
type: string
required:
- client_id
- amount
- issue_date
- due_date
'/api/v1/invoices/{id}':
get:
summary: 'Display a single invoice with items.'
operationId: displayASingleInvoiceWithItems
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 1
hash: abc123def456
currency_id: 1
random_number: 123456
status: 1
exchange_coefficient: 1.0
amount: 1000.5
amount_base_currency: 1000.5
paid_amount: 500.0
paid_amount_base_currency: 500.0
outstanding_amount: 500.5
outstanding_amount_base_currency: 500.5
client_id: 1
user_id: 12
team_id: 8
from_company_id: null
discount: 0
tax1: 0
tax2: 0
issue_date: '2024-01-15'
due_date: '2024-02-15'
notes: 'Invoice for development services'
number: INV-001
interval_date: null
email: client@example.com
stripe_external_id: null
stripe_invoice_url: null
passim_invoice_url: null
invoiced_at: '2024-01-15T10:30:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
deleted_at: null
payment_amount_paid: 500.5
items:
-
id: 1
name: 'Feature development'
price: 100.0
quantity: 10
amount: 1000.0
invoice_id: 1
-
id: 2
name: 'API Integration'
price: 0.5
quantity: 1
amount: 0.5
invoice_id: 1
properties:
data:
type: object
properties:
id:
type: integer
example: 1
hash:
type: string
example: abc123def456
currency_id:
type: integer
example: 1
random_number:
type: integer
example: 123456
status:
type: integer
example: 1
exchange_coefficient:
type: number
example: 1.0
amount:
type: number
example: 1000.5
amount_base_currency:
type: number
example: 1000.5
paid_amount:
type: number
example: 500.0
paid_amount_base_currency:
type: number
example: 500.0
outstanding_amount:
type: number
example: 500.5
outstanding_amount_base_currency:
type: number
example: 500.5
client_id:
type: integer
example: 1
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
from_company_id:
type: string
example: null
discount:
type: integer
example: 0
tax1:
type: integer
example: 0
tax2:
type: integer
example: 0
issue_date:
type: string
example: '2024-01-15'
due_date:
type: string
example: '2024-02-15'
notes:
type: string
example: 'Invoice for development services'
number:
type: string
example: INV-001
interval_date:
type: string
example: null
email:
type: string
example: client@example.com
stripe_external_id:
type: string
example: null
stripe_invoice_url:
type: string
example: null
passim_invoice_url:
type: string
example: null
invoiced_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
created_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
deleted_at:
type: string
example: null
payment_amount_paid:
type: number
example: 500.5
items:
type: array
example:
-
id: 1
name: 'Feature development'
price: 100
quantity: 10
amount: 1000
invoice_id: 1
-
id: 2
name: 'API Integration'
price: 0.5
quantity: 1
amount: 0.5
invoice_id: 1
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Feature development'
price:
type: number
example: 100.0
quantity:
type: integer
example: 10
amount:
type: number
example: 1000.0
invoice_id:
type: integer
example: 1
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Invoice not found'
properties:
message:
type: string
example: 'Invoice not found'
tags:
- Endpoints
put:
summary: 'Update an existing invoice.'
operationId: updateAnExistingInvoice
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 1
hash: abc123def456
currency_id: 2
random_number: 123456
status: 1
exchange_coefficient: 1.0
amount: 1200.0
amount_base_currency: 1200.0
paid_amount: 500.0
paid_amount_base_currency: 500.0
outstanding_amount: 700.0
outstanding_amount_base_currency: 700.0
client_id: 2
user_id: 12
team_id: 8
from_company_id: null
discount: 15
tax1: 18
tax2: 3
issue_date: '2024-01-16'
due_date: '2024-02-16'
notes: 'Updated invoice'
number: INV-001-REV
interval_date: null
email: updated@example.com
stripe_external_id: null
stripe_invoice_url: null
passim_invoice_url: null
invoiced_at: '2024-01-15T10:30:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-16T14:20:00.000000Z'
deleted_at: null
payment_amount_paid: 500.5
items:
-
id: 5
name: 'Updated development'
price: 120.0
quantity: 10
amount: 1200.0
invoice_id: 1
properties:
data:
type: object
properties:
id:
type: integer
example: 1
hash:
type: string
example: abc123def456
currency_id:
type: integer
example: 2
random_number:
type: integer
example: 123456
status:
type: integer
example: 1
exchange_coefficient:
type: number
example: 1.0
amount:
type: number
example: 1200.0
amount_base_currency:
type: number
example: 1200.0
paid_amount:
type: number
example: 500.0
paid_amount_base_currency:
type: number
example: 500.0
outstanding_amount:
type: number
example: 700.0
outstanding_amount_base_currency:
type: number
example: 700.0
client_id:
type: integer
example: 2
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
from_company_id:
type: string
example: null
discount:
type: integer
example: 15
tax1:
type: integer
example: 18
tax2:
type: integer
example: 3
issue_date:
type: string
example: '2024-01-16'
due_date:
type: string
example: '2024-02-16'
notes:
type: string
example: 'Updated invoice'
number:
type: string
example: INV-001-REV
interval_date:
type: string
example: null
email:
type: string
example: updated@example.com
stripe_external_id:
type: string
example: null
stripe_invoice_url:
type: string
example: null
passim_invoice_url:
type: string
example: null
invoiced_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
created_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2024-01-16T14:20:00.000000Z'
deleted_at:
type: string
example: null
payment_amount_paid:
type: number
example: 500.5
items:
type: array
example:
-
id: 5
name: 'Updated development'
price: 120
quantity: 10
amount: 1200
invoice_id: 1
items:
type: object
properties:
id:
type: integer
example: 5
name:
type: string
example: 'Updated development'
price:
type: number
example: 120.0
quantity:
type: integer
example: 10
amount:
type: number
example: 1200.0
invoice_id:
type: integer
example: 1
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Invoice not found'
properties:
message:
type: string
example: 'Invoice not found'
tags:
- Endpoints
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
client_id:
type: integer
description: 'Client ID.'
example: 2
nullable: false
currency_id:
type: integer
description: 'Currency ID.'
example: 2
nullable: false
status:
type: integer
description: 'Invoice status (0-4).'
example: 1
nullable: false
amount:
type: numeric
description: 'Invoice total amount.'
example: '1200.00'
nullable: false
issue_date:
type: date
description: 'Issue date. Format: YYYY-MM-DD.'
example: '2024-01-16'
nullable: false
due_date:
type: date
description: 'Due date. Format: YYYY-MM-DD.'
example: '2024-02-16'
nullable: false
notes:
type: string
description: 'Internal notes.'
example: '"Updated invoice"'
nullable: false
number:
type: string
description: 'Invoice number.'
example: '"INV-001-REV"'
nullable: false
discount:
type: integer
description: 'Discount percentage.'
example: 15
nullable: false
tax1:
type: integer
description: 'First tax percentage.'
example: 18
nullable: false
tax2:
type: integer
description: 'Second tax percentage.'
example: 3
nullable: false
email:
type: string
description: 'Client email.'
example: '"updated@example.com"'
nullable: false
items:
type: array
description: 'Invoice line items (replaces all existing items).'
example:
- architecto
items:
type: string
delete:
summary: 'Delete an invoice (soft delete).'
operationId: deleteAnInvoicesoftDelete
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Invoice deleted successfully'
properties:
message:
type: string
example: 'Invoice deleted successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Invoice not found'
properties:
message:
type: string
example: 'Invoice not found'
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'Invoice ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/invoices/{id}/status':
put:
summary: 'Update invoice status.'
operationId: updateInvoiceStatus
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 1
hash: abc123def456
number: INV-001
status: 1
amount: 1000.5
client_id: 1
issue_date: '2024-01-15'
due_date: '2024-02-15'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-16T16:45:00.000000Z'
message: 'Invoice status updated successfully'
properties:
data:
type: object
properties:
id:
type: integer
example: 1
hash:
type: string
example: abc123def456
number:
type: string
example: INV-001
status:
type: integer
example: 1
amount:
type: number
example: 1000.5
client_id:
type: integer
example: 1
issue_date:
type: string
example: '2024-01-15'
due_date:
type: string
example: '2024-02-15'
created_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2024-01-16T16:45:00.000000Z'
message:
type: string
example: 'Invoice status updated successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Invoice not found'
properties:
message:
type: string
example: 'Invoice not found'
422:
description: invalid_transition
content:
application/json:
schema:
type: object
example:
message: 'Cannot change status from closed to draft'
properties:
message:
type: string
example: 'Cannot change status from closed to draft'
tags:
- Endpoints
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: integer
description: 'New invoice status (0=draft, 1=sent, 2=closed, 3=cancelled, 4=open).'
example: 1
nullable: false
required:
- status
parameters:
-
in: path
name: id
description: 'Invoice ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/invoices/{id}/send':
post:
summary: 'Send an invoice to client.'
operationId: sendAnInvoiceToClient
description: 'Updates invoice status to "sent" (1)'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Invoice sent successfully'
properties:
message:
type: string
example: 'Invoice sent successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Invoice not found'
properties:
message:
type: string
example: 'Invoice not found'
422:
description: no_recipient
content:
application/json:
schema:
type: object
example:
message: 'No valid recipient email for this invoice; set invoice email or client email.'
properties:
message:
type: string
example: 'No valid recipient email for this invoice; set invoice email or client email.'
500:
description: mail_failed
content:
application/json:
schema:
type: object
example:
message: 'Unable to send invoice email'
properties:
message:
type: string
example: 'Unable to send invoice email'
tags:
- Endpoints
parameters:
-
in: path
name: id
description: 'Invoice ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/invoices/{id}/followup-draft':
post:
summary: 'Create a CRM email draft to follow up on an invoice (does not send).'
operationId: createACRMEmailDraftToFollowUpOnAnInvoicedoesNotSend
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- Endpoints
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
subject:
type: string
description: 'Must not be greater than 500 characters.'
example: b
nullable: true
message:
type: string
description: 'Must not be greater than 50000 characters.'
example: 'n'
nullable: true
parameters:
-
in: path
name: id
description: 'The ID of the invoice.'
example: MBJkCmaYOiAmXn9
required: true
schema:
type: string
'/api/v1/invoices/{id}/payment':
post:
summary: 'Record a payment for an invoice.'
operationId: recordAPaymentForAnInvoice
description: "Creates a payment record and updates invoice paid/outstanding amounts.\nIf invoice becomes fully paid, status is automatically updated to \"closed\" (2)."
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Payment recorded successfully'
payment:
id: 1
invoice_id: 1
currency_id: 1
exchange_coefficient: 1.0
amount_paid: 500.0
amount_paid_base_currency: 500.0
payment_date: '2024-01-20'
notes: 'Bank transfer - Reference: INV001'
created_at: '2024-01-20T10:15:00.000000Z'
updated_at: '2024-01-20T10:15:00.000000Z'
properties:
message:
type: string
example: 'Payment recorded successfully'
payment:
type: object
properties:
id:
type: integer
example: 1
invoice_id:
type: integer
example: 1
currency_id:
type: integer
example: 1
exchange_coefficient:
type: number
example: 1.0
amount_paid:
type: number
example: 500.0
amount_paid_base_currency:
type: number
example: 500.0
payment_date:
type: string
example: '2024-01-20'
notes:
type: string
example: 'Bank transfer - Reference: INV001'
created_at:
type: string
example: '2024-01-20T10:15:00.000000Z'
updated_at:
type: string
example: '2024-01-20T10:15:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Invoice not found'
properties:
message:
type: string
example: 'Invoice not found'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
amount_paid:
- 'The amount paid must be greater than 0.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
amount_paid:
type: array
example:
- 'The amount paid must be greater than 0.'
items:
type: string
tags:
- Endpoints
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
amount_paid:
type: numeric
description: 'Payment amount.'
example: '500.00'
nullable: false
payment_date:
type: date
description: 'Payment date. Format: YYYY-MM-DD.'
example: '2024-01-20'
nullable: false
notes:
type: string
description: 'optional Payment notes.'
example: '"Bank transfer - Reference: INV001"'
nullable: true
required:
- amount_paid
- payment_date
parameters:
-
in: path
name: id
description: 'Invoice ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/spreadsheet-import/previews/{publicId}/apply':
post:
summary: ''
operationId: postApiV1SpreadsheetImportPreviewsPublicIdApply
description: ''
parameters: []
responses: { }
tags:
- Endpoints
security: []
parameters:
-
in: path
name: publicId
description: ''
example: BcECdBDA-CdED-bFEA-CbCE-BcCdeBfbbebc
required: true
schema:
type: string
/api/v1/expenses:
get:
summary: 'List expenses'
operationId: listExpenses
description: 'Display a paginated list of expenses with optional filtering and sorting.'
parameters:
-
in: query
name: user_id
description: 'Filter expenses by user id.'
example: 12
required: false
schema:
type: integer
description: 'Filter expenses by user id.'
example: 12
nullable: false
-
in: query
name: project_id
description: 'Filter expenses by project id.'
example: 5
required: false
schema:
type: integer
description: 'Filter expenses by project id.'
example: 5
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Minimum: 1, Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Minimum: 1, Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, user_id, project_id, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, user_id, project_id, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 15
description: 'Office supplies'
date: '2024-01-15'
user_id: 12
team_id: 8
category: 'Office Expenses'
amount: 145.5
notes: 'Purchased notebooks and pens'
billable: true
file_url: 'https://example.com/receipts/receipt-15.pdf'
project_id: 5
created_at: '2024-01-15T14:30:00.000000Z'
updated_at: '2024-01-15T14:30:00.000000Z'
deleted_at: null
-
id: 16
description: 'Business lunch'
date: '2024-01-14'
user_id: 12
team_id: 8
category: 'Meals & Entertainment'
amount: 89.75
notes: 'Client meeting at restaurant'
billable: true
file_url: null
project_id: null
created_at: '2024-01-14T19:45:00.000000Z'
updated_at: '2024-01-14T19:45:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/expenses?page=1'
last: 'https://example.com/api/v1/expenses?page=3'
prev: null
next: 'https://example.com/api/v1/expenses?page=2'
meta:
current_page: 1
from: 1
last_page: 3
path: 'https://example.com/api/v1/expenses'
per_page: 30
to: 30
total: 75
properties:
data:
type: array
example:
-
id: 15
description: 'Office supplies'
date: '2024-01-15'
user_id: 12
team_id: 8
category: 'Office Expenses'
amount: 145.5
notes: 'Purchased notebooks and pens'
billable: true
file_url: 'https://example.com/receipts/receipt-15.pdf'
project_id: 5
created_at: '2024-01-15T14:30:00.000000Z'
updated_at: '2024-01-15T14:30:00.000000Z'
deleted_at: null
-
id: 16
description: 'Business lunch'
date: '2024-01-14'
user_id: 12
team_id: 8
category: 'Meals & Entertainment'
amount: 89.75
notes: 'Client meeting at restaurant'
billable: true
file_url: null
project_id: null
created_at: '2024-01-14T19:45:00.000000Z'
updated_at: '2024-01-14T19:45:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 15
description:
type: string
example: 'Office supplies'
date:
type: string
example: '2024-01-15'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
category:
type: string
example: 'Office Expenses'
amount:
type: number
example: 145.5
notes:
type: string
example: 'Purchased notebooks and pens'
billable:
type: boolean
example: true
file_url:
type: string
example: 'https://example.com/receipts/receipt-15.pdf'
project_id:
type: integer
example: 5
created_at:
type: string
example: '2024-01-15T14:30:00.000000Z'
updated_at:
type: string
example: '2024-01-15T14:30:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/expenses?page=1'
last:
type: string
example: 'https://example.com/api/v1/expenses?page=3'
prev:
type: string
example: null
next:
type: string
example: 'https://example.com/api/v1/expenses?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 3
path:
type: string
example: 'https://example.com/api/v1/expenses'
per_page:
type: integer
example: 30
to:
type: integer
example: 30
total:
type: integer
example: 75
tags:
- Expenses
post:
summary: 'Create expense'
operationId: createExpense
description: 'Create a new business expense record.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 15
description: 'Office supplies'
date: '2024-01-15'
user_id: 12
team_id: 8
category: 'Office Expenses'
amount: 145.5
notes: 'Purchased notebooks and pens'
billable: true
file_url: 'https://example.com/receipts/receipt-15.pdf'
project_id: 5
created_at: '2024-01-15T14:30:00.000000Z'
updated_at: '2024-01-15T14:30:00.000000Z'
deleted_at: null
message: 'Expense created successfully'
properties:
data:
type: object
properties:
id:
type: integer
example: 15
description:
type: string
example: 'Office supplies'
date:
type: string
example: '2024-01-15'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
category:
type: string
example: 'Office Expenses'
amount:
type: number
example: 145.5
notes:
type: string
example: 'Purchased notebooks and pens'
billable:
type: boolean
example: true
file_url:
type: string
example: 'https://example.com/receipts/receipt-15.pdf'
project_id:
type: integer
example: 5
created_at:
type: string
example: '2024-01-15T14:30:00.000000Z'
updated_at:
type: string
example: '2024-01-15T14:30:00.000000Z'
deleted_at:
type: string
example: null
message:
type: string
example: 'Expense created successfully'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
date:
- 'The date field is required.'
amount:
- 'The amount field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
date:
type: array
example:
- 'The date field is required.'
items:
type: string
amount:
type: array
example:
- 'The amount field is required.'
items:
type: string
tags:
- Expenses
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
description:
type: string
description: 'Expense description.'
example: 'Office supplies'
nullable: false
date:
type: date
description: 'Expense date (YYYY-MM-DD).'
example: '2024-01-15'
nullable: false
user_id:
type: integer
description: 'User id for the expense. Defaults to the authenticated user.'
example: 12
nullable: false
category:
type: string
description: 'Expense category.'
example: 'Office Expenses'
nullable: false
amount:
type: numeric
description: 'Expense amount. Must be positive.'
example: '145.50'
nullable: false
notes:
type: string
description: 'Additional notes.'
example: 'Purchased notebooks and pens'
nullable: false
billable:
type: boolean
description: 'Indicates if the expense is billable to a client.'
example: true
nullable: false
file_url:
type: string
description: 'URL to attached receipt or document.'
example: 'https://example.com/receipts/receipt-15.pdf'
nullable: false
project_id:
type: integer
description: 'Project id to associate with the expense.'
example: 5
nullable: false
team_id:
type: string
description: "Prohibited. Automatically set to the user's team."
example: architecto
nullable: false
required:
- date
- category
- amount
'/api/v1/expenses/{id}':
put:
summary: 'Update expense'
operationId: updateExpense
description: 'Update an existing expense record. Expenses linked to an invoice cannot be edited.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
id: 15
description: 'Updated office supplies'
date: '2024-01-16'
user_id: 12
team_id: 8
category: 'Updated Office Expenses'
amount: 150.0
notes: 'Added printer paper'
billable: false
file_url: 'https://example.com/receipts/receipt-15-updated.pdf'
project_id: 6
created_at: '2024-01-15T14:30:00.000000Z'
updated_at: '2024-01-16T10:15:00.000000Z'
deleted_at: null
message: 'Expense updated successfully'
properties:
data:
type: object
properties:
id:
type: integer
example: 15
description:
type: string
example: 'Updated office supplies'
date:
type: string
example: '2024-01-16'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
category:
type: string
example: 'Updated Office Expenses'
amount:
type: number
example: 150.0
notes:
type: string
example: 'Added printer paper'
billable:
type: boolean
example: false
file_url:
type: string
example: 'https://example.com/receipts/receipt-15-updated.pdf'
project_id:
type: integer
example: 6
created_at:
type: string
example: '2024-01-15T14:30:00.000000Z'
updated_at:
type: string
example: '2024-01-16T10:15:00.000000Z'
deleted_at:
type: string
example: null
message:
type: string
example: 'Expense updated successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Expense not found'
properties:
message:
type: string
example: 'Expense not found'
422:
description: invoice_linked
content:
application/json:
schema:
type: object
example:
message: 'Expenses with an invoice cannot be edited'
properties:
message:
type: string
example: 'Expenses with an invoice cannot be edited'
tags:
- Expenses
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
description:
type: string
description: 'Expense description.'
example: 'Updated office supplies'
nullable: false
date:
type: date
description: 'Expense date (YYYY-MM-DD).'
example: '2024-01-16'
nullable: false
user_id:
type: integer
description: 'User id for the expense.'
example: 13
nullable: false
category:
type: string
description: 'Expense category.'
example: 'Updated Office Expenses'
nullable: false
amount:
type: numeric
description: 'Expense amount. Must be positive.'
example: '150.00'
nullable: false
notes:
type: string
description: 'Additional notes.'
example: 'Added printer paper'
nullable: false
billable:
type: boolean
description: 'Indicates if the expense is billable to a client.'
example: false
nullable: false
file_url:
type: string
description: 'URL to attached receipt or document.'
example: 'https://example.com/receipts/receipt-15-updated.pdf'
nullable: false
project_id:
type: integer
description: 'Project id to associate with the expense.'
example: 6
nullable: false
team_id:
type: string
description: "Prohibited. Automatically set to the user's team."
example: architecto
nullable: false
delete:
summary: 'Delete expense'
operationId: deleteExpense
description: 'Delete an expense record.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Expense deleted successfully'
properties:
message:
type: string
example: 'Expense deleted successfully'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Expense not found'
properties:
message:
type: string
example: 'Expense not found'
tags:
- Expenses
parameters:
-
in: path
name: id
description: 'Expense id.'
example: 15
required: true
schema:
type: integer
'/api/v1/hr/vacancies/{vacancy}/candidates':
get:
summary: 'List candidates for a vacancy.'
operationId: listCandidatesForAVacancy
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of items per page (max 100).'
example: 30
required: false
schema:
type: integer
description: 'Number of items per page (max 100).'
example: 30
nullable: false
-
in: query
name: sort
description: 'Sort column. Allowed: id, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Sort column. Allowed: id, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'John Doe'
slug: john-doe
profile_url: 'https://linkedin.com/in/johndoe'
hr_vacancy_id: 5
hr_vacancy_column_id: 2
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
meta:
current_page: 1
per_page: 30
total: 1
properties:
data:
type: array
example:
-
id: 1
name: 'John Doe'
slug: john-doe
profile_url: 'https://linkedin.com/in/johndoe'
hr_vacancy_id: 5
hr_vacancy_column_id: 2
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'John Doe'
slug:
type: string
example: john-doe
profile_url:
type: string
example: 'https://linkedin.com/in/johndoe'
hr_vacancy_id:
type: integer
example: 5
hr_vacancy_column_id:
type: integer
example: 2
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
meta:
type: object
properties:
current_page:
type: integer
example: 1
per_page:
type: integer
example: 30
total:
type: integer
example: 1
tags:
- 'HR Candidates'
parameters:
-
in: path
name: vacancy
description: 'HR vacancy ID.'
example: 5
required: true
schema:
type: integer
'/api/v1/hr/candidates/{id}':
get:
summary: 'Show a candidate.'
operationId: showACandidate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
name: 'John Doe'
slug: john-doe
profile_url: 'https://linkedin.com/in/johndoe'
hr_vacancy_id: 5
hr_vacancy_column_id: 2
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
properties:
id:
type: integer
example: 1
name:
type: string
example: 'John Doe'
slug:
type: string
example: john-doe
profile_url:
type: string
example: 'https://linkedin.com/in/johndoe'
hr_vacancy_id:
type: integer
example: 5
hr_vacancy_column_id:
type: integer
example: 2
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'HR Candidates'
put:
summary: 'Update a candidate.'
operationId: updateACandidate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
name: 'John Doe'
slug: john-doe
profile_url: 'https://linkedin.com/in/johndoe'
hr_vacancy_id: 5
hr_vacancy_column_id: 2
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-11T10:30:00.000000Z'
properties:
id:
type: integer
example: 1
name:
type: string
example: 'John Doe'
slug:
type: string
example: john-doe
profile_url:
type: string
example: 'https://linkedin.com/in/johndoe'
hr_vacancy_id:
type: integer
example: 5
hr_vacancy_column_id:
type: integer
example: 2
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:30:00.000000Z'
tags:
- 'HR Candidates'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Candidate name.'
example: 'John Doe'
nullable: false
profile_url:
type: string
description: 'Candidate profile URL.'
example: 'https://linkedin.com/in/johndoe'
nullable: false
hr_vacancy_id:
type: integer
description: 'HR vacancy ID.'
example: 5
nullable: false
hr_vacancy_column_id:
type: integer
description: 'HR vacancy column ID.'
example: 2
nullable: false
delete:
summary: 'Delete a candidate.'
operationId: deleteACandidate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: ''
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'HR Candidates'
parameters:
-
in: path
name: id
description: 'Candidate ID.'
example: 1
required: true
schema:
type: integer
/api/v1/hr/candidates:
post:
summary: 'Create a candidate.'
operationId: createACandidate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
name: 'John Doe'
slug: john-doe
profile_url: 'https://linkedin.com/in/johndoe'
hr_vacancy_id: 5
hr_vacancy_column_id: 2
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
properties:
id:
type: integer
example: 1
name:
type: string
example: 'John Doe'
slug:
type: string
example: john-doe
profile_url:
type: string
example: 'https://linkedin.com/in/johndoe'
hr_vacancy_id:
type: integer
example: 5
hr_vacancy_column_id:
type: integer
example: 2
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
tags:
- 'HR Candidates'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Candidate name.'
example: 'John Doe'
nullable: false
profile_url:
type: string
description: 'Candidate profile URL.'
example: 'https://linkedin.com/in/johndoe'
nullable: false
hr_vacancy_id:
type: integer
description: 'HR vacancy ID.'
example: 5
nullable: false
hr_vacancy_column_id:
type: integer
description: 'HR vacancy column ID.'
example: 2
nullable: false
required:
- name
- profile_url
- hr_vacancy_id
'/api/v1/hr/candidates/{id}/comments':
post:
summary: 'Add a comment to a candidate.'
operationId: addACommentToACandidate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Comment added successfully'
properties:
message:
type: string
example: 'Comment added successfully'
tags:
- 'HR Candidates'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
comment:
type: string
description: 'Comment text.'
example: 'Had a great interview.'
nullable: false
required:
- comment
parameters:
-
in: path
name: id
description: 'Candidate ID.'
example: 1
required: true
schema:
type: integer
/api/v1/hr/interviews:
post:
summary: 'Store a newly created HrInterview in storage.'
operationId: storeANewlyCreatedHrInterviewInStorage
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: Success
content:
application/json:
schema:
type: object
example:
id: 1
user_id: 3
team_id: 1
interviewer_user_id: 2
from: '2024-07-01T10:00:00Z'
to: '2024-07-01T11:00:00Z'
created_at: '2024-06-15T12:00:00Z'
updated_at: '2024-06-15T12:00:00Z'
properties:
id:
type: integer
example: 1
description: 'The ID of the created HR interview.'
enum: []
user_id:
type: integer
example: 3
description: 'The ID of the user who created the interview.'
enum: []
team_id:
type: integer
example: 1
description: 'The ID of the team associated with the interview.'
enum: []
interviewer_user_id:
type: integer
example: 2
from:
type: string
example: '2024-07-01T10:00:00Z'
to:
type: string
example: '2024-07-01T11:00:00Z'
created_at:
type: string
example: '2024-06-15T12:00:00Z'
updated_at:
type: string
example: '2024-06-15T12:00:00Z'
tags:
- 'HR Interviews'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
hr_candidate_id:
type: integer
description: 'The ID of the HR candidate.'
example: 1
nullable: false
interviewer_user_id:
type: integer
description: 'The ID of the interviewer user.'
example: 2
nullable: false
from:
type: string
description: 'The start date and time of the interview.'
example: architecto
nullable: false
to:
type: string
description: 'The end date and time of the interview.'
example: architecto
nullable: false
required:
- hr_candidate_id
- interviewer_user_id
- from
- to
/api/v1/hr/vacancies:
get:
summary: 'Display a paginated list of vacancies.'
operationId: displayAPaginatedListOfVacancies
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 30
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 30
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 10
title: 'Senior PHP Developer'
slug: senior-php-developer
description: 'We are looking for an experienced PHP developer.'
requirements: '5+ years of PHP, Laravel experience'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
links:
first: 'https://example.com/api/v1/hr/vacancies?page=1'
last: 'https://example.com/api/v1/hr/vacancies?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/hr/vacancies'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 10
title: 'Senior PHP Developer'
slug: senior-php-developer
description: 'We are looking for an experienced PHP developer.'
requirements: '5+ years of PHP, Laravel experience'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Senior PHP Developer'
slug:
type: string
example: senior-php-developer
description:
type: string
example: 'We are looking for an experienced PHP developer.'
requirements:
type: string
example: '5+ years of PHP, Laravel experience'
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/hr/vacancies?page=1'
last:
type: string
example: 'https://example.com/api/v1/hr/vacancies?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/hr/vacancies'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'HR Vacancies'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
per_page:
type: integer
description: 'Must be at least 1. Must not be greater than 100.'
example: 1
nullable: true
sort:
type: string
description: ''
example: id
nullable: true
enum:
- id
- created_at
- updated_at
direction:
type: string
description: ''
example: asc
nullable: true
enum:
- asc
- desc
post:
summary: 'Create a new vacancy.'
operationId: createANewVacancy
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 10
title: 'Senior PHP Developer'
slug: senior-php-developer
description: 'We are looking for an experienced PHP developer.'
requirements: '5+ years of PHP, Laravel experience'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Senior PHP Developer'
slug:
type: string
example: senior-php-developer
description:
type: string
example: 'We are looking for an experienced PHP developer.'
requirements:
type: string
example: '5+ years of PHP, Laravel experience'
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
tags:
- 'HR Vacancies'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'Vacancy title.'
example: 'Senior PHP Developer'
nullable: false
team_id:
type: string
description: ''
example: null
nullable: false
requirements:
type: string
description: 'Job requirements.'
example: '5+ years of PHP, Laravel experience'
nullable: true
description:
type: string
description: 'Vacancy description.'
example: 'We are looking for an experienced PHP developer.'
nullable: true
required:
- title
'/api/v1/hr/vacancies/{id}':
get:
summary: 'Display a single vacancy.'
operationId: displayASingleVacancy
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 10
title: 'Senior PHP Developer'
slug: senior-php-developer
description: 'We are looking for an experienced PHP developer.'
requirements: '5+ years of PHP, Laravel experience'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Senior PHP Developer'
slug:
type: string
example: senior-php-developer
description:
type: string
example: 'We are looking for an experienced PHP developer.'
requirements:
type: string
example: '5+ years of PHP, Laravel experience'
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'HR Vacancies'
put:
summary: 'Update an existing vacancy.'
operationId: updateAnExistingVacancy
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 10
title: 'Senior PHP Developer'
slug: senior-php-developer
description: 'Updated description.'
requirements: 'Strong Laravel and REST API knowledge'
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T12:00:00.000000Z'
properties:
id:
type: integer
example: 10
title:
type: string
example: 'Senior PHP Developer'
slug:
type: string
example: senior-php-developer
description:
type: string
example: 'Updated description.'
requirements:
type: string
example: 'Strong Laravel and REST API knowledge'
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T12:00:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'HR Vacancies'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'Vacancy title.'
example: 'Senior PHP Developer'
nullable: false
team_id:
type: string
description: ''
example: null
nullable: false
requirements:
type: string
description: 'Job requirements.'
example: 'Strong Laravel and REST API knowledge'
nullable: true
description:
type: string
description: 'Vacancy description.'
example: 'Updated description.'
nullable: true
delete:
summary: 'Delete a vacancy.'
operationId: deleteAVacancy
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'HR Vacancies'
parameters:
-
in: path
name: id
description: 'Vacancy id.'
example: 10
required: true
schema:
type: integer
/api/v1/ping:
get:
summary: 'Ping API'
operationId: pingAPI
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n 'message' => 'pong'\n}"
tags:
- Healthcheck
/api/v1/meetings:
get:
summary: 'Display a paginated list of meetings.'
operationId: displayAPaginatedListOfMeetings
description: ''
parameters:
-
in: query
name: user_id
description: 'Filter meetings by owner id.'
example: 12
required: false
schema:
type: integer
description: 'Filter meetings by owner id.'
example: 12
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 20
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 20
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, name, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, name, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 5
name: 'Project kickoff'
from: '2025-02-01T09:00:00.000000Z'
to: '2025-02-01T10:00:00.000000Z'
user_id: 12
team_id: 8
location: Zoom
meeting_url: 'https://zoom.us/j/123456789'
description: 'Initial project discussion'
created_at: '2025-01-20T08:00:00.000000Z'
updated_at: '2025-01-20T08:00:00.000000Z'
links:
first: 'https://example.com/api/v1/meetings?page=1'
last: 'https://example.com/api/v1/meetings?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/meetings'
per_page: 10
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 5
name: 'Project kickoff'
from: '2025-02-01T09:00:00.000000Z'
to: '2025-02-01T10:00:00.000000Z'
user_id: 12
team_id: 8
location: Zoom
meeting_url: 'https://zoom.us/j/123456789'
description: 'Initial project discussion'
created_at: '2025-01-20T08:00:00.000000Z'
updated_at: '2025-01-20T08:00:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 5
name:
type: string
example: 'Project kickoff'
from:
type: string
example: '2025-02-01T09:00:00.000000Z'
to:
type: string
example: '2025-02-01T10:00:00.000000Z'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
location:
type: string
example: Zoom
meeting_url:
type: string
example: 'https://zoom.us/j/123456789'
description:
type: string
example: 'Initial project discussion'
created_at:
type: string
example: '2025-01-20T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-20T08:00:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/meetings?page=1'
last:
type: string
example: 'https://example.com/api/v1/meetings?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/meetings'
per_page:
type: integer
example: 10
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Meetings
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
user_id:
type: integer
description: 'The id of an existing record in the users table.'
example: 16
nullable: true
per_page:
type: integer
description: 'Must be at least 1. Must not be greater than 100.'
example: 22
nullable: true
sort:
type: string
description: ''
example: created_at
nullable: true
enum:
- id
- name
- created_at
- updated_at
direction:
type: string
description: ''
example: desc
nullable: true
enum:
- asc
- desc
post:
summary: 'Create a new meeting.'
operationId: createANewMeeting
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 5
name: 'Sprint planning'
from: '2025-02-01T09:00:00.000000Z'
to: '2025-02-01T10:00:00.000000Z'
user_id: 12
team_id: 8
location: 'Office room 3'
meeting_url: null
description: 'Discuss sprint scope'
created_at: '2025-01-20T08:00:00.000000Z'
updated_at: '2025-01-20T08:00:00.000000Z'
properties:
id:
type: integer
example: 5
name:
type: string
example: 'Sprint planning'
from:
type: string
example: '2025-02-01T09:00:00.000000Z'
to:
type: string
example: '2025-02-01T10:00:00.000000Z'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
location:
type: string
example: 'Office room 3'
meeting_url:
type: string
example: null
description:
type: string
example: 'Discuss sprint scope'
created_at:
type: string
example: '2025-01-20T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-20T08:00:00.000000Z'
tags:
- Meetings
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Meeting title.'
example: 'Sprint planning'
nullable: false
user_id:
type: string
description: ''
example: null
nullable: false
team_id:
type: string
description: ''
example: null
nullable: false
guest_email:
type: string
description: 'Guest email address.'
example: guest@example.com
nullable: true
guest_timezone:
type: string
description: 'Guest timezone.'
example: Europe/Berlin
nullable: true
location:
type: string
description: 'Meeting location.'
example: 'Office room 3'
nullable: true
meeting_url:
type: string
description: 'Online meeting URL.'
example: 'https://meet.google.com/abc-defg-hij'
nullable: true
description:
type: string
description: 'Meeting description.'
example: 'Discuss sprint scope'
nullable: true
from:
type: string
description: 'Start datetime (ISO 8601).'
example: '2025-02-01T09:00:00Z'
nullable: false
to:
type: string
description: 'End datetime (ISO 8601).'
example: '2025-02-01T10:00:00Z'
nullable: false
add_to_calendar:
type: boolean
description: ''
example: false
nullable: false
client_timezone:
type: string
description: 'Must be a valid time zone, such as Africa/Accra.'
example: Asia/Ulaanbaatar
nullable: false
required:
- name
- from
- to
- client_timezone
'/api/v1/meetings/{meeting_id}':
put:
summary: 'Update an existing meeting.'
operationId: updateAnExistingMeeting
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 5
name: 'Updated meeting title'
from: '2025-02-01T10:00:00.000000Z'
to: '2025-02-01T11:00:00.000000Z'
user_id: 12
team_id: 8
location: Zoom
meeting_url: 'https://zoom.us/j/123456789'
description: 'Updated agenda'
created_at: '2025-01-20T08:00:00.000000Z'
updated_at: '2025-01-21T09:30:00.000000Z'
properties:
id:
type: integer
example: 5
name:
type: string
example: 'Updated meeting title'
from:
type: string
example: '2025-02-01T10:00:00.000000Z'
to:
type: string
example: '2025-02-01T11:00:00.000000Z'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
location:
type: string
example: Zoom
meeting_url:
type: string
example: 'https://zoom.us/j/123456789'
description:
type: string
example: 'Updated agenda'
created_at:
type: string
example: '2025-01-20T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-21T09:30:00.000000Z'
tags:
- Meetings
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Meeting title.'
example: 'Updated meeting title'
nullable: false
user_id:
type: string
description: ''
example: null
nullable: false
team_id:
type: string
description: ''
example: null
nullable: false
guest_email:
type: string
description: 'Must be a valid email address. Must not be greater than 255 characters.'
example: zbailey@example.net
nullable: true
guest_timezone:
type: string
description: 'Must be a valid time zone, such as Africa/Accra.'
example: America/Moncton
nullable: true
location:
type: string
description: 'Meeting location.'
example: Zoom
nullable: true
meeting_url:
type: string
description: 'Online meeting URL.'
example: 'https://zoom.us/j/123456789'
nullable: true
description:
type: string
description: 'Meeting description.'
example: 'Updated agenda'
nullable: true
from:
type: string
description: 'Start datetime (ISO 8601).'
example: '2025-02-01T10:00:00Z'
nullable: false
to:
type: string
description: 'End datetime (ISO 8601).'
example: '2025-02-01T11:00:00Z'
nullable: false
add_to_calendar:
type: boolean
description: ''
example: false
nullable: false
client_timezone:
type: string
description: 'Must be a valid time zone, such as Africa/Accra.'
example: Asia/Ulaanbaatar
nullable: false
required:
- client_timezone
delete:
summary: 'Delete a meeting.'
operationId: deleteAMeeting
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
tags:
- Meetings
parameters:
-
in: path
name: meeting_id
description: 'The ID of the meeting.'
example: 1
required: true
schema:
type: integer
-
in: path
name: meeting
description: 'Meeting id.'
example: 5
required: true
schema:
type: integer
/api/v1/outreach:
get:
summary: 'Display a paginated list of outreach activities.'
operationId: displayAPaginatedListOfOutreachActivities
description: ''
parameters:
-
in: query
name: type
description: 'Filter by outreach type.'
example: 1
required: false
schema:
type: integer
description: 'Filter by outreach type.'
example: 1
nullable: false
-
in: query
name: user_id
description: 'Filter by user id.'
example: 12
required: false
schema:
type: integer
description: 'Filter by user id.'
example: 12
nullable: false
-
in: query
name: search
description: 'Filter by value, description, email, or phone.'
example: prospect
required: false
schema:
type: string
description: 'Filter by value, description, email, or phone.'
example: prospect
nullable: false
-
in: query
name: date_from
description: 'date Filter by start date (YYYY-MM-DD).'
example: '2024-01-01'
required: false
schema:
type: string
description: 'date Filter by start date (YYYY-MM-DD).'
example: '2024-01-01'
nullable: false
-
in: query
name: date_to
description: 'date Filter by end date (YYYY-MM-DD).'
example: '2024-12-31'
required: false
schema:
type: string
description: 'date Filter by end date (YYYY-MM-DD).'
example: '2024-12-31'
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, type, value, datetime, created_at, updated_at.'
example: datetime
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, type, value, datetime, created_at, updated_at.'
example: datetime
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 4
type: 1
value: 'Initial contact'
email: john@example.com
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
description: 'Initial outreach via email'
datetime: '2024-01-10T08:00:00.000000Z'
created_at: '2024-01-10T08:00:00.000000Z'
updated_at: '2024-01-10T08:00:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/outreach?page=1'
last: 'https://example.com/api/v1/outreach?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/outreach'
per_page: 10
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 4
type: 1
value: 'Initial contact'
email: john@example.com
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
description: 'Initial outreach via email'
datetime: '2024-01-10T08:00:00.000000Z'
created_at: '2024-01-10T08:00:00.000000Z'
updated_at: '2024-01-10T08:00:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 4
type:
type: integer
example: 1
value:
type: string
example: 'Initial contact'
email:
type: string
example: john@example.com
phone:
type: string
example: '+1 202 555 0147'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
description:
type: string
example: 'Initial outreach via email'
datetime:
type: string
example: '2024-01-10T08:00:00.000000Z'
created_at:
type: string
example: '2024-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2024-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/outreach?page=1'
last:
type: string
example: 'https://example.com/api/v1/outreach?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/outreach'
per_page:
type: integer
example: 10
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Outreach
post:
summary: 'Create a new outreach activity.'
operationId: createANewOutreachActivity
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Outreach activity created successfully.'
data:
id: 4
type: 1
value: 'Initial contact'
email: john@example.com
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
description: 'Initial outreach via email'
datetime: '2024-01-10T08:00:00.000000Z'
created_at: '2024-01-10T08:00:00.000000Z'
updated_at: '2024-01-10T08:00:00.000000Z'
deleted_at: null
properties:
message:
type: string
example: 'Outreach activity created successfully.'
data:
type: object
properties:
id:
type: integer
example: 4
type:
type: integer
example: 1
value:
type: string
example: 'Initial contact'
email:
type: string
example: john@example.com
phone:
type: string
example: '+1 202 555 0147'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
description:
type: string
example: 'Initial outreach via email'
datetime:
type: string
example: '2024-01-10T08:00:00.000000Z'
created_at:
type: string
example: '2024-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2024-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
type:
- 'The type field is required.'
value:
- 'The value field is required.'
datetime:
- 'The datetime field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
type:
type: array
example:
- 'The type field is required.'
items:
type: string
value:
type: array
example:
- 'The value field is required.'
items:
type: string
datetime:
type: array
example:
- 'The datetime field is required.'
items:
type: string
tags:
- Outreach
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
type:
type: integer
description: 'Outreach type. Allowed: 1,2,3,4,5.'
example: 1
nullable: false
value:
type: string
description: 'Outreach value/description.'
example: 'Initial contact'
nullable: false
email:
type: string
description: 'Email address.'
example: john@example.com
nullable: false
phone:
type: string
description: 'Phone number.'
example: '+1 202 555 0147'
nullable: false
user_id:
type: integer
description: 'Owner id for the outreach. Defaults to the authenticated user.'
example: 12
nullable: false
description:
type: string
description: 'Additional description.'
example: 'Initial outreach via email'
nullable: false
datetime:
type: string
description: 'Outreach date and time (ISO 8601).'
example: '2024-01-10T08:00:00Z'
nullable: false
required:
- type
- value
- datetime
'/api/v1/outreach/{id}':
put:
summary: 'Update an outreach activity.'
operationId: updateAnOutreachActivity
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Outreach activity updated successfully.'
data:
id: 4
type: 2
value: 'Follow-up call'
email: john@example.com
phone: '+1 202 555 0147'
user_id: 12
team_id: 8
description: 'Follow-up call made'
datetime: '2024-01-11T10:00:00.000000Z'
created_at: '2024-01-10T08:00:00.000000Z'
updated_at: '2024-01-11T10:00:00.000000Z'
deleted_at: null
properties:
message:
type: string
example: 'Outreach activity updated successfully.'
data:
type: object
properties:
id:
type: integer
example: 4
type:
type: integer
example: 2
value:
type: string
example: 'Follow-up call'
email:
type: string
example: john@example.com
phone:
type: string
example: '+1 202 555 0147'
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
description:
type: string
example: 'Follow-up call made'
datetime:
type: string
example: '2024-01-11T10:00:00.000000Z'
created_at:
type: string
example: '2024-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2024-01-11T10:00:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
type:
- 'The selected type is invalid.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
type:
type: array
example:
- 'The selected type is invalid.'
items:
type: string
tags:
- Outreach
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
type:
type: integer
description: 'Outreach type. Allowed: 1,2,3,4,5.'
example: 2
nullable: false
value:
type: string
description: 'Outreach value/description.'
example: 'Follow-up call'
nullable: false
email:
type: string
description: 'Email address.'
example: john@example.com
nullable: false
phone:
type: string
description: 'Phone number.'
example: '+1 202 555 0147'
nullable: false
user_id:
type: integer
description: 'Owner id for the outreach.'
example: 12
nullable: false
description:
type: string
description: 'Additional description.'
example: 'Follow-up call made'
nullable: false
datetime:
type: string
description: 'Outreach date and time (ISO 8601).'
example: '2024-01-11T10:00:00Z'
nullable: false
delete:
summary: 'Delete an outreach activity.'
operationId: deleteAnOutreachActivity
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Outreach
parameters:
-
in: path
name: id
description: 'Outreach id.'
example: 4
required: true
schema:
type: integer
'/api/v1/users/{user_id}/pay-rates':
get:
summary: 'Display a paginated list of pay rates for a user.'
operationId: displayAPaginatedListOfPayRatesForAUser
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, rate, started_at, created_at, updated_at.'
example: started_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, rate, started_at, created_at, updated_at.'
example: started_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
rate: 50.0
user_id: 1
status: current
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2024-01-01T00:00:00.000000Z'
updated_at: '2024-01-01T00:00:00.000000Z'
-
id: 2
rate: 55.0
user_id: 1
status: future
started_at: '2024-02-01T00:00:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
links:
first: 'https://example.com/api/v1/users/1/pay-rates?page=1'
last: 'https://example.com/api/v1/users/1/pay-rates?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/users/1/pay-rates'
per_page: 30
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 1
rate: 50
user_id: 1
status: current
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2024-01-01T00:00:00.000000Z'
updated_at: '2024-01-01T00:00:00.000000Z'
-
id: 2
rate: 55
user_id: 1
status: future
started_at: '2024-02-01T00:00:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
rate:
type: number
example: 50.0
user_id:
type: integer
example: 1
status:
type: string
example: current
started_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
created_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
updated_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/users/1/pay-rates?page=1'
last:
type: string
example: 'https://example.com/api/v1/users/1/pay-rates?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/users/1/pay-rates'
per_page:
type: integer
example: 30
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Pay Rates'
post:
summary: 'Create a new pay rate.'
operationId: createANewPayRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
rate: 50.0
user_id: 1
status: past
started_at: '2023-12-01T00:00:00.000000Z'
created_at: '2024-01-15T10:30:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
properties:
id:
type: integer
example: 3
rate:
type: number
example: 50.0
user_id:
type: integer
example: 1
status:
type: string
example: past
started_at:
type: string
example: '2023-12-01T00:00:00.000000Z'
created_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
updated_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
started_at:
- 'The start date already exists for this user.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
started_at:
type: array
example:
- 'The start date already exists for this user.'
items:
type: string
tags:
- 'Pay Rates'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
rate:
type: numeric
description: 'Hourly rate.'
example: '50.00'
nullable: true
started_at:
type: date
description: 'Start date of the pay rate.'
example: '2024-01-01'
nullable: false
required:
- rate
- started_at
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
example: 1
required: true
schema:
type: integer
-
in: path
name: user
description: 'User ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/users/{user_id}/pay-rates/{payRate_id}':
put:
summary: 'Update a pay rate.'
operationId: updateAPayRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
rate: 55.0
user_id: 1
status: current
started_at: '2024-01-15T00:00:00.000000Z'
created_at: '2024-01-01T00:00:00.000000Z'
updated_at: '2024-01-15T11:45:00.000000Z'
properties:
id:
type: integer
example: 1
rate:
type: number
example: 55.0
user_id:
type: integer
example: 1
status:
type: string
example: current
started_at:
type: string
example: '2024-01-15T00:00:00.000000Z'
created_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
updated_at:
type: string
example: '2024-01-15T11:45:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Pay rate not found for this user'
properties:
message:
type: string
example: 'Pay rate not found for this user'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
started_at:
- 'The start date already exists for this user.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
started_at:
type: array
example:
- 'The start date already exists for this user.'
items:
type: string
tags:
- 'Pay Rates'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
rate:
type: numeric
description: 'Hourly rate.'
example: '55.00'
nullable: true
started_at:
type: date
description: 'Start date of the pay rate.'
example: '2024-02-01'
nullable: false
delete:
summary: 'Delete a pay rate.'
operationId: deleteAPayRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Pay rate not found for this user'
properties:
message:
type: string
example: 'Pay rate not found for this user'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
error:
- 'Current and past pay rates cannot be deleted.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
error:
type: array
example:
- 'Current and past pay rates cannot be deleted.'
items:
type: string
tags:
- 'Pay Rates'
parameters:
-
in: path
name: user_id
description: 'The ID of the user.'
example: 1
required: true
schema:
type: integer
-
in: path
name: payRate_id
description: 'The ID of the payRate.'
example: 1
required: true
schema:
type: integer
-
in: path
name: user
description: 'User ID.'
example: 1
required: true
schema:
type: integer
-
in: path
name: id
description: 'Pay Rate ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/projects/{project_id}/rates':
get:
summary: 'Display a paginated list of project rates.'
operationId: displayAPaginatedListOfProjectRates
description: ''
parameters:
-
in: query
name: user_id
description: 'Filter rates by user id.'
example: 5
required: false
schema:
type: integer
description: 'Filter rates by user id.'
example: 5
nullable: false
-
in: query
name: currency_id
description: 'Filter rates by currency id.'
example: 1
required: false
schema:
type: integer
description: 'Filter rates by currency id.'
example: 1
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, rate, user_id, currency_id, started_at, created_at, updated_at.'
example: started_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, rate, user_id, currency_id, started_at, created_at, updated_at.'
example: started_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
project_id: 1
user_id: 5
rate: 100.0
currency_id: 1
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2024-01-01T00:00:00.000000Z'
updated_at: '2024-01-01T00:00:00.000000Z'
links:
first: 'https://example.com/api/v1/projects/1/rates?page=1'
last: 'https://example.com/api/v1/projects/1/rates?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/projects/1/rates'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 1
project_id: 1
user_id: 5
rate: 100
currency_id: 1
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2024-01-01T00:00:00.000000Z'
updated_at: '2024-01-01T00:00:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 1
user_id:
type: integer
example: 5
rate:
type: number
example: 100.0
currency_id:
type: integer
example: 1
started_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
created_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
updated_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/projects/1/rates?page=1'
last:
type: string
example: 'https://example.com/api/v1/projects/1/rates?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/projects/1/rates'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Project Rates'
post:
summary: 'Create a new project rate.'
operationId: createANewProjectRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
project_id: 1
user_id: 5
rate: 100.0
currency_id: 1
started_at: '2024-01-01T00:00:00.000000Z'
created_at: '2024-01-01T00:00:00.000000Z'
updated_at: '2024-01-01T00:00:00.000000Z'
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 1
user_id:
type: integer
example: 5
rate:
type: number
example: 100.0
currency_id:
type: integer
example: 1
started_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
created_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
updated_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The Start date already exists'
properties:
message:
type: string
example: 'The Start date already exists'
tags:
- 'Project Rates'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
rate:
type: numeric
description: 'Hourly rate.'
example: '100.00'
nullable: true
started_at:
type: string
description: 'Start date for the rate (YYYY-MM-DD).'
example: '2024-01-01'
nullable: false
user_id:
type: integer
description: 'User id for the rate (nullable).'
example: 5
nullable: true
currency_id:
type: integer
description: 'Currency id for the rate.'
example: 1
nullable: true
required:
- rate
- started_at
- currency_id
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 1
required: true
schema:
type: integer
-
in: path
name: project
description: 'Project id.'
example: 1
required: true
schema:
type: integer
'/api/v1/projects/{project_id}/rates/{projectRate_id}':
put:
summary: 'Update a project rate.'
operationId: updateAProjectRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 1
project_id: 1
user_id: 5
rate: 120.0
currency_id: 1
started_at: '2024-02-01T00:00:00.000000Z'
created_at: '2024-01-01T00:00:00.000000Z'
updated_at: '2024-01-15T10:30:00.000000Z'
properties:
id:
type: integer
example: 1
project_id:
type: integer
example: 1
user_id:
type: integer
example: 5
rate:
type: number
example: 120.0
currency_id:
type: integer
example: 1
started_at:
type: string
example: '2024-02-01T00:00:00.000000Z'
created_at:
type: string
example: '2024-01-01T00:00:00.000000Z'
updated_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Project rate not found for this project'
properties:
message:
type: string
example: 'Project rate not found for this project'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The Start date already exists'
properties:
message:
type: string
example: 'The Start date already exists'
tags:
- 'Project Rates'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
rate:
type: numeric
description: 'Hourly rate.'
example: '120.00'
nullable: true
started_at:
type: string
description: 'Start date for the rate (YYYY-MM-DD).'
example: '2024-02-01'
nullable: false
user_id:
type: integer
description: 'User id for the rate (nullable).'
example: 5
nullable: true
currency_id:
type: integer
description: 'Currency id for the rate.'
example: 1
nullable: true
delete:
summary: 'Delete a project rate.'
operationId: deleteAProjectRate
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Project rate not found for this project'
properties:
message:
type: string
example: 'Project rate not found for this project'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Current and past project rate cannot be deleted'
properties:
message:
type: string
example: 'Current and past project rate cannot be deleted'
tags:
- 'Project Rates'
parameters:
-
in: path
name: project_id
description: 'The ID of the project.'
example: 1
required: true
schema:
type: integer
-
in: path
name: projectRate_id
description: 'The ID of the projectRate.'
example: 119
required: true
schema:
type: integer
-
in: path
name: project
description: 'Project id.'
example: 1
required: true
schema:
type: integer
-
in: path
name: projectRate
description: 'Project rate id.'
example: 1
required: true
schema:
type: integer
/api/v1/projects:
get:
summary: 'Display a paginated list of projects.'
operationId: displayAPaginatedListOfProjects
description: ''
parameters:
-
in: query
name: search
description: 'Filter projects by partial match in the project name.'
example: onboarding
required: false
schema:
type: string
description: 'Filter projects by partial match in the project name.'
example: onboarding
nullable: false
-
in: query
name: client_id
description: 'Filter projects by client id.'
example: 4
required: false
schema:
type: integer
description: 'Filter projects by client id.'
example: 4
nullable: false
-
in: query
name: user_id
description: 'Filter projects by owner id.'
example: 12
required: false
schema:
type: integer
description: 'Filter projects by owner id.'
example: 12
nullable: false
-
in: query
name: billable
description: 'Filter by billable flag.'
example: true
required: false
schema:
type: boolean
description: 'Filter by billable flag.'
example: true
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, name, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, name, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 3
name: 'Client onboarding'
description: 'Kick-off project for ACME Inc.'
client_id: 4
user_id: 12
team_id: 8
billable: true
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/projects?page=1'
last: 'https://example.com/api/v1/projects?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/projects'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 3
name: 'Client onboarding'
description: 'Kick-off project for ACME Inc.'
client_id: 4
user_id: 12
team_id: 8
billable: true
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Client onboarding'
description:
type: string
example: 'Kick-off project for ACME Inc.'
client_id:
type: integer
example: 4
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
billable:
type: boolean
example: true
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/projects?page=1'
last:
type: string
example: 'https://example.com/api/v1/projects?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/projects'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Projects
post:
summary: 'Create a new project.'
operationId: createANewProject
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
name: 'Client onboarding'
description: 'Kick-off project for ACME Inc.'
client_id: 4
user_id: 12
team_id: 8
billable: true
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Client onboarding'
description:
type: string
example: 'Kick-off project for ACME Inc.'
client_id:
type: integer
example: 4
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
billable:
type: boolean
example: true
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Client not found'
properties:
message:
type: string
example: 'Client not found'
tags:
- Projects
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Project name.'
example: 'Client onboarding'
nullable: false
description:
type: string
description: 'Project description.'
example: 'Kick-off project for ACME Inc.'
nullable: true
client_id:
type: integer
description: 'Client id that owns the project.'
example: 4
nullable: false
billable:
type: boolean
description: 'Whether time tracked on the project is billable.'
example: true
nullable: true
user_id:
type: integer
description: 'Owner id for the project. Defaults to the authenticated user.'
example: 12
nullable: true
team_id:
type: string
description: ''
example: null
nullable: false
required:
- name
- client_id
'/api/v1/projects/{id}':
get:
summary: 'Display a single project.'
operationId: displayASingleProject
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
name: 'Client onboarding'
description: 'Kick-off project for ACME Inc.'
client_id: 4
user_id: 12
team_id: 8
billable: true
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Client onboarding'
description:
type: string
example: 'Kick-off project for ACME Inc.'
client_id:
type: integer
example: 4
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
billable:
type: boolean
example: true
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Projects
put:
summary: 'Update a project.'
operationId: updateAProject
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 3
name: 'Client onboarding'
description: 'Kick-off project for ACME Inc.'
client_id: 4
user_id: 12
team_id: 8
billable: true
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T10:30:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 3
name:
type: string
example: 'Client onboarding'
description:
type: string
example: 'Kick-off project for ACME Inc.'
client_id:
type: integer
example: 4
user_id:
type: integer
example: 12
team_id:
type: integer
example: 8
billable:
type: boolean
example: true
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T10:30:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Projects
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Project name.'
example: 'Client onboarding'
nullable: false
description:
type: string
description: 'Project description.'
example: 'Kick-off project for ACME Inc.'
nullable: true
client_id:
type: integer
description: 'Client id that owns the project.'
example: 4
nullable: false
billable:
type: boolean
description: 'Whether time tracked on the project is billable.'
example: true
nullable: true
user_id:
type: integer
description: 'Owner id for the project.'
example: 12
nullable: true
team_id:
type: string
description: ''
example: null
nullable: false
delete:
summary: 'Delete a project.'
operationId: deleteAProject
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Projects
parameters:
-
in: path
name: id
description: 'Project id.'
example: 3
required: true
schema:
type: integer
/api/v1/reports:
get:
summary: 'Query time tracking reports.'
operationId: queryTimeTrackingReports
description: "Returns time tracking data grouped by member, project, client, date, or task.\nSupports filtering by date range, members, projects, and clients."
parameters:
-
in: query
name: start
description: 'date Start date for the report period. Defaults to start of current week.'
example: '2025-01-01'
required: false
schema:
type: string
description: 'date Start date for the report period. Defaults to start of current week.'
example: '2025-01-01'
nullable: false
-
in: query
name: end
description: 'date End date for the report period. Defaults to end of current week.'
example: '2025-01-31'
required: false
schema:
type: string
description: 'date End date for the report period. Defaults to end of current week.'
example: '2025-01-31'
nullable: false
-
in: query
name: groupBy
description: 'How to group results. Allowed: member, project, date, client, task.'
example: project
required: false
schema:
type: string
description: 'How to group results. Allowed: member, project, date, client, task.'
example: project
nullable: false
-
in: query
name: members
description: 'Filter by member IDs.'
example:
- 1
- 2
- 3
required: false
schema:
type: array
description: 'Filter by member IDs.'
example:
- 1
- 2
- 3
items:
type: string
-
in: query
name: projects
description: 'Filter by project IDs.'
example:
- 10
- 20
required: false
schema:
type: array
description: 'Filter by project IDs.'
example:
- 10
- 20
items:
type: string
-
in: query
name: clients
description: 'Filter by client IDs.'
example:
- 5
- 6
required: false
schema:
type: array
description: 'Filter by client IDs.'
example:
- 5
- 6
items:
type: string
-
in: query
name: summary_only
description: 'If true, return only aggregated totals per group (faster for profitability queries).'
example: true
required: false
schema:
type: boolean
description: 'If true, return only aggregated totals per group (faster for profitability queries).'
example: true
nullable: false
-
in: query
name: fields
description: 'Comma-separated list of fields to return.'
example: 'user_name,project_name,billed,spent'
required: false
schema:
type: string
description: 'Comma-separated list of fields to return.'
example: 'user_name,project_name,billed,spent'
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
status: success
totals:
total_time: '45h 30m'
total_spent: 2500.0
total_billed: 4500.0
currencyGroups: { }
baseCurrencySums: { }
filters:
teamId: 1
startedDate: '2025-01-01 00:00:00'
endDate: '2025-01-31 23:59:59'
projects: null
members: null
clients: null
groupBy: project
summary:
'1':
group_id: 1
group_name: 'Project Alpha'
total_spent: 1200.0
total_billed: 2400.0
profit: 1200.0
profit_margin: 50.0
total_time: '24h 00m'
total_seconds: 86400
properties:
status:
type: string
example: success
totals:
type: object
properties:
total_time:
type: string
example: '45h 30m'
total_spent:
type: number
example: 2500.0
total_billed:
type: number
example: 4500.0
currencyGroups:
type: object
properties: { }
baseCurrencySums:
type: object
properties: { }
filters:
type: object
properties:
teamId:
type: integer
example: 1
startedDate:
type: string
example: '2025-01-01 00:00:00'
endDate:
type: string
example: '2025-01-31 23:59:59'
projects:
type: string
example: null
members:
type: string
example: null
clients:
type: string
example: null
groupBy:
type: string
example: project
summary:
type: object
properties:
1:
type: object
properties:
group_id:
type: integer
example: 1
group_name:
type: string
example: 'Project Alpha'
total_spent:
type: number
example: 1200.0
total_billed:
type: number
example: 2400.0
profit:
type: number
example: 1200.0
profit_margin:
type: number
example: 50.0
total_time:
type: string
example: '24h 00m'
total_seconds:
type: integer
example: 86400
401:
description: unauthenticated
content:
application/json:
schema:
type: object
example:
message: 'Authorization required'
properties:
message:
type: string
example: 'Authorization required'
tags:
- Reports
/api/v1/screenshots:
get:
summary: 'Display a paginated list of screenshots.'
operationId: displayAPaginatedListOfScreenshots
description: ''
parameters:
-
in: query
name: project_id
description: 'Filter screenshots by project ID.'
example: 5
required: false
schema:
type: integer
description: 'Filter screenshots by project ID.'
example: 5
nullable: false
-
in: query
name: user_id
description: "Filter screenshots by user ID. Only superadmins and organization managers can view other users' screenshots. Defaults to authenticated user's ID."
example: 12
required: false
schema:
type: integer
description: "Filter screenshots by user ID. Only superadmins and organization managers can view other users' screenshots. Defaults to authenticated user's ID."
example: 12
nullable: false
-
in: query
name: date
description: 'Filter screenshots by specific date (YYYY-MM-DD format).'
example: '2024-01-15'
required: false
schema:
type: string
description: 'Filter screenshots by specific date (YYYY-MM-DD format).'
example: '2024-01-15'
nullable: false
-
in: query
name: date_from
description: 'Filter screenshots by date range start (YYYY-MM-DD format).'
example: '2024-01-01'
required: false
schema:
type: string
description: 'Filter screenshots by date range start (YYYY-MM-DD format).'
example: '2024-01-01'
nullable: false
-
in: query
name: date_to
description: 'Filter screenshots by date range end (YYYY-MM-DD format). Requires date_from parameter.'
example: '2024-01-31'
required: false
schema:
type: string
description: 'Filter screenshots by date range end (YYYY-MM-DD format). Requires date_from parameter.'
example: '2024-01-31'
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, started_at, user_id, project_id.'
example: started_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, started_at, user_id, project_id.'
example: started_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 123
project_id: 5
user_id: 12
path: screenshots/2024/01/15/abc123.jpg
signed_url: 'https://storage.example.com/screenshots/2024/01/15/abc123.jpg?signature=abc123'
taken_at: '2024-01-15T10:30:00.000000Z'
links:
first: 'https://example.com/api/v1/screenshots?page=1'
last: 'https://example.com/api/v1/screenshots?page=3'
prev: null
next: 'https://example.com/api/v1/screenshots?page=2'
meta:
current_page: 1
from: 1
last_page: 3
path: 'https://example.com/api/v1/screenshots'
per_page: 30
to: 30
total: 85
properties:
data:
type: array
example:
-
id: 123
project_id: 5
user_id: 12
path: screenshots/2024/01/15/abc123.jpg
signed_url: 'https://storage.example.com/screenshots/2024/01/15/abc123.jpg?signature=abc123'
taken_at: '2024-01-15T10:30:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 123
project_id:
type: integer
example: 5
user_id:
type: integer
example: 12
path:
type: string
example: screenshots/2024/01/15/abc123.jpg
signed_url:
type: string
example: 'https://storage.example.com/screenshots/2024/01/15/abc123.jpg?signature=abc123'
taken_at:
type: string
example: '2024-01-15T10:30:00.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/screenshots?page=1'
last:
type: string
example: 'https://example.com/api/v1/screenshots?page=3'
prev:
type: string
example: null
next:
type: string
example: 'https://example.com/api/v1/screenshots?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 3
path:
type: string
example: 'https://example.com/api/v1/screenshots'
per_page:
type: integer
example: 30
to:
type: integer
example: 30
total:
type: integer
example: 85
tags:
- Screenshots
/api/v1/tags:
get:
summary: ''
operationId: getApiV1Tags
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Authorization required'
properties:
message:
type: string
example: 'Authorization required'
tags:
- Tags
security: []
post:
summary: ''
operationId: postApiV1Tags
description: ''
parameters: []
responses: { }
tags:
- Tags
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 100 characters.'
example: b
nullable: false
color:
type: string
description: 'Must not be greater than 20 characters.'
example: ngzmiyvdljnikhwa
nullable: true
required:
- name
security: []
'/api/v1/tags/{tag_id}':
get:
summary: ''
operationId: getApiV1TagsTag_id
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Authorization required'
properties:
message:
type: string
example: 'Authorization required'
tags:
- Tags
security: []
put:
summary: ''
operationId: putApiV1TagsTag_id
description: ''
parameters: []
responses: { }
tags:
- Tags
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 100 characters.'
example: b
nullable: false
color:
type: string
description: 'Must not be greater than 20 characters.'
example: ngzmiyvdljnikhwa
nullable: true
required:
- name
security: []
delete:
summary: ''
operationId: deleteApiV1TagsTag_id
description: ''
parameters: []
responses: { }
tags:
- Tags
security: []
parameters:
-
in: path
name: tag_id
description: 'The ID of the tag.'
example: 1
required: true
schema:
type: integer
'/api/v1/taggables/{type}/{id}/tags':
put:
summary: ''
operationId: putApiV1TaggablesTypeIdTags
description: ''
parameters: []
responses: { }
tags:
- Tags
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
tag_ids:
type: array
description: 'Must be at least 1.'
example:
- 16
items:
type: integer
tag_names:
type: array
description: 'Must not be greater than 100 characters.'
example:
- 'n'
items:
type: string
security: []
parameters:
-
in: path
name: type
description: ''
example: architecto
required: true
schema:
type: string
-
in: path
name: id
description: 'The ID of the {type}.'
example: architecto
required: true
schema:
type: string
'/api/v1/tasks/{task}/comments':
get:
summary: 'List comments on a task.'
operationId: listCommentsOnATask
description: ''
parameters:
-
in: query
name: per_page
description: 'The number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'The number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
task_id: 42
user_id: 5
user_name: 'John Doe'
text: 'Blocked waiting on design review'
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
meta:
current_page: 1
total: 1
properties:
data:
type: array
example:
-
id: 1
task_id: 42
user_id: 5
user_name: 'John Doe'
text: 'Blocked waiting on design review'
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
items:
type: object
properties:
id:
type: integer
example: 1
task_id:
type: integer
example: 42
user_id:
type: integer
example: 5
user_name:
type: string
example: 'John Doe'
text:
type: string
example: 'Blocked waiting on design review'
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
meta:
type: object
properties:
current_page:
type: integer
example: 1
total:
type: integer
example: 1
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Task not found'
properties:
message:
type: string
example: 'Task not found'
tags:
- 'Task Comments'
post:
summary: 'Add a comment to a task.'
operationId: addACommentToATask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 15
task_id: 42
user_id: 5
user_name: 'John Doe'
text: 'Blocked waiting on design review'
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
properties:
id:
type: integer
example: 15
task_id:
type: integer
example: 42
user_id:
type: integer
example: 5
user_name:
type: string
example: 'John Doe'
text:
type: string
example: 'Blocked waiting on design review'
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Task not found'
properties:
message:
type: string
example: 'Task not found'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The text field is required.'
properties:
message:
type: string
example: 'The text field is required.'
tags:
- 'Task Comments'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
text:
type: string
description: 'The comment text.'
example: 'Blocked waiting on design review'
nullable: false
required:
- text
parameters:
-
in: path
name: task
description: 'Task ID.'
example: 42
required: true
schema:
type: integer
'/api/v1/tasks/{task}/comments/{comment}':
get:
summary: 'Get a single comment.'
operationId: getASingleComment
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 15
task_id: 42
user_id: 5
user_name: 'John Doe'
text: 'Blocked waiting on design review'
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
properties:
id:
type: integer
example: 15
task_id:
type: integer
example: 42
user_id:
type: integer
example: 5
user_name:
type: string
example: 'John Doe'
text:
type: string
example: 'Blocked waiting on design review'
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Comment not found'
properties:
message:
type: string
example: 'Comment not found'
tags:
- 'Task Comments'
put:
summary: 'Update a comment.'
operationId: updateAComment
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 15
task_id: 42
user_id: 5
user_name: 'John Doe'
text: 'Updated: Ready for QA'
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T16:30:00.000000Z'
properties:
id:
type: integer
example: 15
task_id:
type: integer
example: 42
user_id:
type: integer
example: 5
user_name:
type: string
example: 'John Doe'
text:
type: string
example: 'Updated: Ready for QA'
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T16:30:00.000000Z'
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'You can only edit your own comments'
properties:
message:
type: string
example: 'You can only edit your own comments'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Comment not found'
properties:
message:
type: string
example: 'Comment not found'
tags:
- 'Task Comments'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
text:
type: string
description: 'The updated comment text.'
example: 'Updated: Ready for QA'
nullable: false
required:
- text
delete:
summary: 'Delete a comment.'
operationId: deleteAComment
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'You can only delete your own comments'
properties:
message:
type: string
example: 'You can only delete your own comments'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Comment not found'
properties:
message:
type: string
example: 'Comment not found'
tags:
- 'Task Comments'
parameters:
-
in: path
name: task
description: 'Task ID.'
example: 42
required: true
schema:
type: integer
-
in: path
name: comment
description: 'Comment ID.'
example: 15
required: true
schema:
type: integer
'/api/v1/tasks/{task_id}/events':
get:
summary: 'Display a paginated list of task events.'
operationId: displayAPaginatedListOfTaskEvents
description: ''
parameters:
-
in: query
name: type
description: 'Filter events by type.'
example: comment
required: false
schema:
type: string
description: 'Filter events by type.'
example: comment
nullable: false
-
in: query
name: user_id
description: 'Filter events by author id.'
example: 12
required: false
schema:
type: integer
description: 'Filter events by author id.'
example: 12
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 30
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 30
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 101
task_id: 15
user_id: 12
type: comment
text: 'Looks good to me'
created_at: '2025-01-15T10:30:00.000000Z'
user:
id: 12
name: 'Alex Johnson'
links:
first: 'https://example.com/api/v1/tasks/15/events?page=1'
last: 'https://example.com/api/v1/tasks/15/events?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/tasks/15/events'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 101
task_id: 15
user_id: 12
type: comment
text: 'Looks good to me'
created_at: '2025-01-15T10:30:00.000000Z'
user:
id: 12
name: 'Alex Johnson'
items:
type: object
properties:
id:
type: integer
example: 101
task_id:
type: integer
example: 15
user_id:
type: integer
example: 12
type:
type: string
example: comment
text:
type: string
example: 'Looks good to me'
created_at:
type: string
example: '2025-01-15T10:30:00.000000Z'
user:
type: object
properties:
id:
type: integer
example: 12
name:
type: string
example: 'Alex Johnson'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/tasks/15/events?page=1'
last:
type: string
example: 'https://example.com/api/v1/tasks/15/events?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/tasks/15/events'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Task Events'
post:
summary: 'Create a new task event (comment).'
operationId: createANewTaskEventcomment
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 102
task_id: 15
user_id: 12
type: comment
text: 'Please fix the validation logic.'
created_at: '2025-01-15T11:00:00.000000Z'
user:
id: 12
name: 'Alex Johnson'
properties:
id:
type: integer
example: 102
task_id:
type: integer
example: 15
user_id:
type: integer
example: 12
type:
type: string
example: comment
text:
type: string
example: 'Please fix the validation logic.'
created_at:
type: string
example: '2025-01-15T11:00:00.000000Z'
user:
type: object
properties:
id:
type: integer
example: 12
name:
type: string
example: 'Alex Johnson'
tags:
- 'Task Events'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
text:
type: string
description: 'Comment text.'
example: 'Please fix the validation logic.'
nullable: false
required:
- text
parameters:
-
in: path
name: task_id
description: 'The ID of the task.'
example: 8
required: true
schema:
type: integer
-
in: path
name: task
description: 'Task id.'
example: 15
required: true
schema:
type: integer
'/api/v1/task-events/{taskEvent_id}':
delete:
summary: 'Delete a task event.'
operationId: deleteATaskEvent
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Task Events'
parameters:
-
in: path
name: taskEvent_id
description: 'The ID of the taskEvent.'
example: 1
required: true
schema:
type: integer
-
in: path
name: taskEvent
description: 'Task event id.'
example: 102
required: true
schema:
type: integer
'/api/v1/boards/{board_id}/labels':
get:
summary: 'Display a paginated list of board labels.'
operationId: displayAPaginatedListOfBoardLabels
description: ''
parameters:
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 30
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 30
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
title: Bug
color: '#FF0000'
board_id: 5
-
id: 2
title: Feature
color: '#00FF00'
board_id: 5
links:
first: 'https://example.com/api/v1/boards/5/labels?page=1'
last: 'https://example.com/api/v1/boards/5/labels?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/boards/5/labels'
per_page: 30
to: 2
total: 2
properties:
data:
type: array
example:
-
id: 1
title: Bug
color: '#FF0000'
board_id: 5
-
id: 2
title: Feature
color: '#00FF00'
board_id: 5
items:
type: object
properties:
id:
type: integer
example: 1
title:
type: string
example: Bug
color:
type: string
example: '#FF0000'
board_id:
type: integer
example: 5
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/boards/5/labels?page=1'
last:
type: string
example: 'https://example.com/api/v1/boards/5/labels?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/boards/5/labels'
per_page:
type: integer
example: 30
to:
type: integer
example: 2
total:
type: integer
example: 2
tags:
- 'Task Labels'
parameters:
-
in: path
name: board_id
description: 'The ID of the board.'
example: 1
required: true
schema:
type: integer
-
in: path
name: board
description: 'Board ID.'
example: 5
required: true
schema:
type: integer
'/api/v1/tasks/{task_id}/labels':
post:
summary: 'Attach a label to a task.'
operationId: attachALabelToATask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 123
task_id: 42
label_id: 1
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:00:00.000000Z'
properties:
id:
type: integer
example: 123
task_id:
type: integer
example: 42
label_id:
type: integer
example: 1
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The label id field is required.'
errors:
label_id:
- 'The label id field is required.'
properties:
message:
type: string
example: 'The label id field is required.'
errors:
type: object
properties:
label_id:
type: array
example:
- 'The label id field is required.'
items:
type: string
tags:
- 'Task Labels'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
label_id:
type: integer
description: 'Label ID to attach to the task.'
example: 1
nullable: false
required:
- label_id
parameters:
-
in: path
name: task_id
description: 'The ID of the task.'
example: 8
required: true
schema:
type: integer
-
in: path
name: task
description: 'Task ID.'
example: 42
required: true
schema:
type: integer
'/api/v1/tasks/{task_id}/labels/{label}':
put:
summary: 'Update a task label.'
operationId: updateATaskLabel
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 123
task_id: 42
label_id: 2
created_at: '2025-01-10T08:00:00.000000Z'
updated_at: '2025-01-10T08:30:00.000000Z'
properties:
id:
type: integer
example: 123
task_id:
type: integer
example: 42
label_id:
type: integer
example: 2
created_at:
type: string
example: '2025-01-10T08:00:00.000000Z'
updated_at:
type: string
example: '2025-01-10T08:30:00.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Label not found on task'
properties:
message:
type: string
example: 'Label not found on task'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'The label id field is required.'
errors:
label_id:
- 'The label id field is required.'
properties:
message:
type: string
example: 'The label id field is required.'
errors:
type: object
properties:
label_id:
type: array
example:
- 'The label id field is required.'
items:
type: string
tags:
- 'Task Labels'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
label_id:
type: integer
description: 'New label ID to replace the current one.'
example: 2
nullable: false
required:
- label_id
delete:
summary: 'Detach a label from a task.'
operationId: detachALabelFromATask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Label not found on task'
properties:
message:
type: string
example: 'Label not found on task'
tags:
- 'Task Labels'
parameters:
-
in: path
name: task_id
description: 'The ID of the task.'
example: 8
required: true
schema:
type: integer
-
in: path
name: label
description: 'Current label ID attached to the task.'
example: 1
required: true
schema:
type: integer
-
in: path
name: task
description: 'Task ID.'
example: 42
required: true
schema:
type: integer
/api/v1/tasks:
get:
summary: 'Display a paginated list of tasks for the authenticated team.'
operationId: displayAPaginatedListOfTasksForTheAuthenticatedTeam
description: ''
parameters:
-
in: query
name: search
description: 'Filter tasks by partial match in the task name.'
example: onboarding
required: false
schema:
type: string
description: 'Filter tasks by partial match in the task name.'
example: onboarding
nullable: false
-
in: query
name: project_id
description: 'Filter tasks by related project id.'
example: 12
required: false
schema:
type: integer
description: 'Filter tasks by related project id.'
example: 12
nullable: false
-
in: query
name: board_id
description: 'Filter tasks by project board id.'
example: 7
required: false
schema:
type: integer
description: 'Filter tasks by project board id.'
example: 7
nullable: false
-
in: query
name: column_id
description: 'Filter tasks by column id.'
example: 20
required: false
schema:
type: integer
description: 'Filter tasks by column id.'
example: 20
nullable: false
-
in: query
name: assigned_to_me
description: 'When true (e.g. 1 or "true"), return only tasks assigned to the authenticated user (via task_users). When omitted or false, no assignment filter is applied. Requires authentication.'
example: true
required: false
schema:
type: boolean
description: 'When true (e.g. 1 or "true"), return only tasks assigned to the authenticated user (via task_users). When omitted or false, no assignment filter is applied. Requires authentication.'
example: true
nullable: false
-
in: query
name: per_page
description: 'The number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'The number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, name, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, name, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 1
name: 'Follow up call'
description: 'Call the client back with the pricing update.'
slug: follow-up-call
team_id: 8
project_id: 3
project_board_id: 5
column_id: 9
contact_id: 21
company_id: null
outreach_id: null
estimate_time: null
date_from: '2025-01-10'
date_to: null
closed_at: null
amount: '0.00'
order: 2
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
deleted_at: null
links:
first: 'https://example.com/api/v1/tasks?page=1'
last: 'https://example.com/api/v1/tasks?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/tasks'
per_page: 30
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 1
name: 'Follow up call'
description: 'Call the client back with the pricing update.'
slug: follow-up-call
team_id: 8
project_id: 3
project_board_id: 5
column_id: 9
contact_id: 21
company_id: null
outreach_id: null
estimate_time: null
date_from: '2025-01-10'
date_to: null
closed_at: null
amount: '0.00'
order: 2
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
deleted_at: null
items:
type: object
properties:
id:
type: integer
example: 1
name:
type: string
example: 'Follow up call'
description:
type: string
example: 'Call the client back with the pricing update.'
slug:
type: string
example: follow-up-call
team_id:
type: integer
example: 8
project_id:
type: integer
example: 3
project_board_id:
type: integer
example: 5
column_id:
type: integer
example: 9
contact_id:
type: integer
example: 21
company_id:
type: string
example: null
outreach_id:
type: string
example: null
estimate_time:
type: string
example: null
date_from:
type: string
example: '2025-01-10'
date_to:
type: string
example: null
closed_at:
type: string
example: null
amount:
type: string
example: '0.00'
order:
type: integer
example: 2
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
deleted_at:
type: string
example: null
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/tasks?page=1'
last:
type: string
example: 'https://example.com/api/v1/tasks?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/tasks'
per_page:
type: integer
example: 30
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Tasks
post:
summary: 'Create a new task.'
operationId: createANewTask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 42
name: 'Follow up call'
description: 'Call the client back with the pricing update.'
slug: follow-up-call
team_id: 8
project_id: 3
project_board_id: 5
column_id: 9
contact_id: 21
company_id: null
outreach_id: null
estimate_time: null
date_from: '2025-01-10'
date_to: null
closed_at: null
amount: '0.00'
order: 2
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 42
name:
type: string
example: 'Follow up call'
description:
type: string
example: 'Call the client back with the pricing update.'
slug:
type: string
example: follow-up-call
team_id:
type: integer
example: 8
project_id:
type: integer
example: 3
project_board_id:
type: integer
example: 5
column_id:
type: integer
example: 9
contact_id:
type: integer
example: 21
company_id:
type: string
example: null
outreach_id:
type: string
example: null
estimate_time:
type: string
example: null
date_from:
type: string
example: '2025-01-10'
date_to:
type: string
example: null
closed_at:
type: string
example: null
amount:
type: string
example: '0.00'
order:
type: integer
example: 2
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
deleted_at:
type: string
example: null
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Column not found'
properties:
message:
type: string
example: 'Column not found'
tags:
- Tasks
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Task title.'
example: 'Follow up call'
nullable: false
description:
type: string
description: 'Task description.'
example: 'Call the client back with the pricing update.'
nullable: true
estimate_time:
type: number
description: 'Estimated effort in hours.'
example: 3.5
nullable: true
date_from:
type: date
description: 'Start date of the task.'
example: '2025-01-10'
nullable: true
date_to:
type: date
description: 'Due date of the task.'
example: '2025-01-12'
nullable: true
closed_at:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:21'
nullable: true
outreach_id:
type: integer
description: ''
example: 16
nullable: true
company_id:
type: integer
description: ''
example: 16
nullable: true
project_id:
type: integer
description: 'The related project id. Must belong to your team.'
example: 3
nullable: true
project_board_id:
type: string
description: ''
example: null
nullable: false
contact_id:
type: integer
description: 'The related contact id. Must belong to your team.'
example: 21
nullable: true
column_id:
type: integer
description: 'Column id where the task should be created.'
example: 9
nullable: false
order:
type: integer
description: 'Custom position inside the column.'
example: 5
nullable: true
amount:
type: number
description: 'Monetary amount associated with the task.'
example: 2500.0
nullable: true
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: m
nullable: true
user_ids:
type: array
description: 'Array of user IDs to assign to this task.'
example:
- 1
- 2
- 3
items:
type: integer
project_ref:
type: object
description: ''
example: null
nullable: true
properties:
id:
type: integer
description: ''
example: 16
nullable: true
name:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
nullable: true
tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
add_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
remove_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- m
items:
type: string
create_missing_tags:
type: boolean
description: ''
example: true
nullable: true
required:
- name
- column_id
'/api/v1/tasks/{id}':
get:
summary: 'Display a single task.'
operationId: displayASingleTask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 42
name: 'Follow up call'
description: 'Call the client back with the pricing update.'
slug: follow-up-call
team_id: 8
project_id: 3
project_board_id: 5
column_id: 9
contact_id: 21
company_id: null
outreach_id: null
estimate_time: null
date_from: '2025-01-10'
date_to: null
closed_at: null
amount: '0.00'
order: 2
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T10:15:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 42
name:
type: string
example: 'Follow up call'
description:
type: string
example: 'Call the client back with the pricing update.'
slug:
type: string
example: follow-up-call
team_id:
type: integer
example: 8
project_id:
type: integer
example: 3
project_board_id:
type: integer
example: 5
column_id:
type: integer
example: 9
contact_id:
type: integer
example: 21
company_id:
type: string
example: null
outreach_id:
type: string
example: null
estimate_time:
type: string
example: null
date_from:
type: string
example: '2025-01-10'
date_to:
type: string
example: null
closed_at:
type: string
example: null
amount:
type: string
example: '0.00'
order:
type: integer
example: 2
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Tasks
put:
summary: 'Update a task.'
operationId: updateATask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 42
name: 'Follow up call'
description: 'Call the client with the new quote.'
slug: follow-up-call
team_id: 8
project_id: 3
project_board_id: 5
column_id: 9
contact_id: 21
company_id: null
outreach_id: null
estimate_time: null
date_from: '2025-01-10'
date_to: null
closed_at: null
amount: '0.00'
order: 4
created_at: '2025-01-11T10:15:00.000000Z'
updated_at: '2025-01-11T16:20:00.000000Z'
deleted_at: null
properties:
id:
type: integer
example: 42
name:
type: string
example: 'Follow up call'
description:
type: string
example: 'Call the client with the new quote.'
slug:
type: string
example: follow-up-call
team_id:
type: integer
example: 8
project_id:
type: integer
example: 3
project_board_id:
type: integer
example: 5
column_id:
type: integer
example: 9
contact_id:
type: integer
example: 21
company_id:
type: string
example: null
outreach_id:
type: string
example: null
estimate_time:
type: string
example: null
date_from:
type: string
example: '2025-01-10'
date_to:
type: string
example: null
closed_at:
type: string
example: null
amount:
type: string
example: '0.00'
order:
type: integer
example: 4
created_at:
type: string
example: '2025-01-11T10:15:00.000000Z'
updated_at:
type: string
example: '2025-01-11T16:20:00.000000Z'
deleted_at:
type: string
example: null
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Tasks
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Task title.'
example: 'Follow up call'
nullable: false
description:
type: string
description: 'Task description.'
example: 'Call the client with the new quote.'
nullable: true
estimate_time:
type: number
description: 'Estimated effort in hours.'
example: 4.0
nullable: true
date_from:
type: date
description: 'Start date.'
example: '2025-01-10'
nullable: true
date_to:
type: date
description: 'Due date.'
example: '2025-01-12'
nullable: true
closed_at:
type: string
description: 'Must be a valid date.'
example: '2026-09-15T03:18:21'
nullable: true
outreach_id:
type: integer
description: ''
example: 16
nullable: true
company_id:
type: integer
description: ''
example: 16
nullable: true
project_id:
type: integer
description: 'The related project id. Must belong to your team.'
example: 3
nullable: true
project_board_id:
type: string
description: ''
example: null
nullable: false
contact_id:
type: integer
description: 'The related contact id.'
example: 21
nullable: true
column_id:
type: integer
description: 'Column id where the task should live.'
example: 9
nullable: false
order:
type: integer
description: 'Custom position inside the column.'
example: 5
nullable: true
amount:
type: number
description: 'Monetary amount.'
example: 2500.0
nullable: true
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: m
nullable: true
user_ids:
type: array
description: 'Array of user IDs to assign to this task. Replaces existing assignments.'
example:
- 1
- 2
- 3
items:
type: integer
project_ref:
type: string
description: ''
example: null
nullable: false
tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
add_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
remove_tag_names:
type: array
description: 'Must not be greater than 255 characters.'
example:
- m
items:
type: string
create_missing_tags:
type: boolean
description: ''
example: true
nullable: true
delete:
summary: 'Delete a task.'
operationId: deleteATask
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Tasks
parameters:
-
in: path
name: id
description: 'Task id.'
example: 42
required: true
schema:
type: integer
/api/v1/team-invoices:
get:
summary: 'Display a paginated list of team invoices.'
operationId: displayAPaginatedListOfTeamInvoices
description: ''
parameters:
-
in: query
name: search
description: 'Filter invoices by invoice number.'
example: INV-2023-001
required: false
schema:
type: string
description: 'Filter invoices by invoice number.'
example: INV-2023-001
nullable: false
-
in: query
name: user_id
description: 'Filter invoices by user (creator) id.'
example: 12
required: false
schema:
type: integer
description: 'Filter invoices by user (creator) id.'
example: 12
nullable: false
-
in: query
name: status
description: 'Filter by invoice status.'
example: sent
required: false
schema:
type: string
description: 'Filter by invoice status.'
example: sent
nullable: false
-
in: query
name: date_from
description: 'date Filter invoices created from this date (YYYY-MM-DD).'
example: '2023-01-01'
required: false
schema:
type: string
description: 'date Filter invoices created from this date (YYYY-MM-DD).'
example: '2023-01-01'
nullable: false
-
in: query
name: date_to
description: 'date Filter invoices created until this date (YYYY-MM-DD).'
example: '2023-12-31'
required: false
schema:
type: string
description: 'date Filter invoices created until this date (YYYY-MM-DD).'
example: '2023-12-31'
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: query
name: sort
description: 'Column used for sorting. Allowed: id, number, amount, status, issue_date, due_date, created_at, updated_at.'
example: created_at
required: false
schema:
type: string
description: 'Column used for sorting. Allowed: id, number, amount, status, issue_date, due_date, created_at, updated_at.'
example: created_at
nullable: false
-
in: query
name: direction
description: 'Sort direction. Allowed: asc, desc.'
example: desc
required: false
schema:
type: string
description: 'Sort direction. Allowed: asc, desc.'
example: desc
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 45
number: INV-2023-001
hash: abc123def456
status: sent
amount: 1500.0
currency_id: 1
issue_date: '2023-01-15'
due_date: '2023-02-15'
client_id: 8
user_id: 12
team_id: 5
created_at: '2023-01-15T10:00:00.000000Z'
updated_at: '2023-01-15T10:00:00.000000Z'
currency:
id: 1
code: USD
name: 'US Dollar'
user:
id: 12
name: 'John Doe'
email: john@example.com
items:
-
id: 1
description: 'Website Development'
quantity: 10
unit_price: 150.0
total: 1500.0
links:
first: 'https://example.com/api/v1/team-invoices?page=1'
last: 'https://example.com/api/v1/team-invoices?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
path: 'https://example.com/api/v1/team-invoices'
per_page: 50
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 45
number: INV-2023-001
hash: abc123def456
status: sent
amount: 1500
currency_id: 1
issue_date: '2023-01-15'
due_date: '2023-02-15'
client_id: 8
user_id: 12
team_id: 5
created_at: '2023-01-15T10:00:00.000000Z'
updated_at: '2023-01-15T10:00:00.000000Z'
currency:
id: 1
code: USD
name: 'US Dollar'
user:
id: 12
name: 'John Doe'
email: john@example.com
items:
-
id: 1
description: 'Website Development'
quantity: 10
unit_price: 150
total: 1500
items:
type: object
properties:
id:
type: integer
example: 45
number:
type: string
example: INV-2023-001
hash:
type: string
example: abc123def456
status:
type: string
example: sent
amount:
type: number
example: 1500.0
currency_id:
type: integer
example: 1
issue_date:
type: string
example: '2023-01-15'
due_date:
type: string
example: '2023-02-15'
client_id:
type: integer
example: 8
user_id:
type: integer
example: 12
team_id:
type: integer
example: 5
created_at:
type: string
example: '2023-01-15T10:00:00.000000Z'
updated_at:
type: string
example: '2023-01-15T10:00:00.000000Z'
currency:
type: object
properties:
id:
type: integer
example: 1
code:
type: string
example: USD
name:
type: string
example: 'US Dollar'
user:
type: object
properties:
id:
type: integer
example: 12
name:
type: string
example: 'John Doe'
email:
type: string
example: john@example.com
items:
type: array
example:
-
id: 1
description: 'Website Development'
quantity: 10
unit_price: 150
total: 1500
items:
type: object
properties:
id:
type: integer
example: 1
description:
type: string
example: 'Website Development'
quantity:
type: integer
example: 10
unit_price:
type: number
example: 150.0
total:
type: number
example: 1500.0
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/team-invoices?page=1'
last:
type: string
example: 'https://example.com/api/v1/team-invoices?page=1'
prev:
type: string
example: null
next:
type: string
example: null
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
path:
type: string
example: 'https://example.com/api/v1/team-invoices'
per_page:
type: integer
example: 50
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Team Invoices'
'/api/v1/team-invoices/{hash}':
get:
summary: 'Display a single team invoice.'
operationId: displayASingleTeamInvoice
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 45
number: INV-2023-001
hash: abc123def456
status: sent
amount: 1500.0
currency_id: 1
issue_date: '2023-01-15'
due_date: '2023-02-15'
client_id: 8
user_id: 12
team_id: 5
created_at: '2023-01-15T10:00:00.000000Z'
updated_at: '2023-01-15T10:00:00.000000Z'
total_paid: 750.0
balance_due: 750.0
currency:
id: 1
code: USD
name: 'US Dollar'
user:
id: 12
name: 'John Doe'
email: john@example.com
items:
-
id: 1
description: 'Website Development'
quantity: 10
unit_price: 150.0
total: 1500.0
invoice_payments:
-
id: 3
amount_paid: 750.0
payment_date: '2023-01-20'
payment_method: credit_card
properties:
id:
type: integer
example: 45
number:
type: string
example: INV-2023-001
hash:
type: string
example: abc123def456
status:
type: string
example: sent
amount:
type: number
example: 1500.0
currency_id:
type: integer
example: 1
issue_date:
type: string
example: '2023-01-15'
due_date:
type: string
example: '2023-02-15'
client_id:
type: integer
example: 8
user_id:
type: integer
example: 12
team_id:
type: integer
example: 5
created_at:
type: string
example: '2023-01-15T10:00:00.000000Z'
updated_at:
type: string
example: '2023-01-15T10:00:00.000000Z'
total_paid:
type: number
example: 750.0
balance_due:
type: number
example: 750.0
currency:
type: object
properties:
id:
type: integer
example: 1
code:
type: string
example: USD
name:
type: string
example: 'US Dollar'
user:
type: object
properties:
id:
type: integer
example: 12
name:
type: string
example: 'John Doe'
email:
type: string
example: john@example.com
items:
type: array
example:
-
id: 1
description: 'Website Development'
quantity: 10
unit_price: 150
total: 1500
items:
type: object
properties:
id:
type: integer
example: 1
description:
type: string
example: 'Website Development'
quantity:
type: integer
example: 10
unit_price:
type: number
example: 150.0
total:
type: number
example: 1500.0
invoice_payments:
type: array
example:
-
id: 3
amount_paid: 750
payment_date: '2023-01-20'
payment_method: credit_card
items:
type: object
properties:
id:
type: integer
example: 3
amount_paid:
type: number
example: 750.0
payment_date:
type: string
example: '2023-01-20'
payment_method:
type: string
example: credit_card
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Team invoice not found'
properties:
message:
type: string
example: 'Team invoice not found'
tags:
- 'Team Invoices'
parameters:
-
in: path
name: hash
description: 'Invoice hash identifier.'
example: abc123def456
required: true
schema:
type: string
'/api/v1/team-invoices/{hash}/close':
put:
summary: 'Close an invoice.'
operationId: closeAnInvoice
description: 'Marks a sent invoice as closed. Only invoices with "sent" status can be closed.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Team invoice closed successfully'
properties:
message:
type: string
example: 'Team invoice closed successfully'
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Team invoice not found'
properties:
message:
type: string
example: 'Team invoice not found'
422:
description: invalid_status
content:
application/json:
schema:
type: object
example:
message: 'Only sent invoices can be closed.'
properties:
message:
type: string
example: 'Only sent invoices can be closed.'
tags:
- 'Team Invoices'
parameters:
-
in: path
name: hash
description: 'Invoice hash identifier.'
example: abc123def456
required: true
schema:
type: string
'/api/v1/team-invoices/{hash}/reopen':
put:
summary: 'Reopen an invoice.'
operationId: reopenAnInvoice
description: 'Reopens a closed invoice, changing its status back to sent. Only invoices with "closed" status can be reopened.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Team invoice reopened successfully'
properties:
message:
type: string
example: 'Team invoice reopened successfully'
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Team invoice not found'
properties:
message:
type: string
example: 'Team invoice not found'
422:
description: invalid_status
content:
application/json:
schema:
type: object
example:
message: 'Only closed invoices can be reopened.'
properties:
message:
type: string
example: 'Only closed invoices can be reopened.'
tags:
- 'Team Invoices'
parameters:
-
in: path
name: hash
description: 'Invoice hash identifier.'
example: abc123def456
required: true
schema:
type: string
/api/v1/users:
get:
summary: 'List team members with optional fuzzy search.'
operationId: listTeamMembersWithOptionalFuzzySearch
description: "Returns team members matching the search query. Supports fuzzy matching:\n- \"Alex\" finds \"Alexander\"\n- \"romanko\" finds \"Romankó\"\n- Typo-tolerant search"
parameters:
-
in: query
name: search
description: 'Search by name or email (fuzzy matching).'
example: alex
required: false
schema:
type: string
description: 'Search by name or email (fuzzy matching).'
example: alex
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 12
name: 'Alexander Romankó'
email: alex@example.com
profile_photo_url: 'https://example.com/photos/12.jpg'
meta:
current_page: 1
total: 1
properties:
data:
type: array
example:
-
id: 12
name: 'Alexander Romankó'
email: alex@example.com
profile_photo_url: 'https://example.com/photos/12.jpg'
items:
type: object
properties:
id:
type: integer
example: 12
name:
type: string
example: 'Alexander Romankó'
email:
type: string
example: alex@example.com
profile_photo_url:
type: string
example: 'https://example.com/photos/12.jpg'
meta:
type: object
properties:
current_page:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- 'Team Members'
'/api/v1/users/{id}':
get:
summary: 'Get a single team member by ID.'
operationId: getASingleTeamMemberByID
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 12
name: 'Alexander Romankó'
email: alex@example.com
profile_photo_url: 'https://example.com/photos/12.jpg'
properties:
id:
type: integer
example: 12
name:
type: string
example: 'Alexander Romankó'
email:
type: string
example: alex@example.com
profile_photo_url:
type: string
example: 'https://example.com/photos/12.jpg'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Team Members'
put:
summary: 'Update a team member (admin only).'
operationId: updateATeamMemberadminOnly
description: "Only admins (SuperAdmin, OrganizationManager) can update team members.\nFields that can be updated (defined in User::API_UPDATABLE_FIELDS):\n- is_active: Enable/disable user\n- can_add_manual_time: Allow manual time entry\n- can_move_time: Allow moving time between projects\n- target_hours: Weekly target hours goal"
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 12
name: 'Alexander Romankó'
email: alex@example.com
is_active: true
can_add_manual_time: true
can_move_time: false
target_hours: 40
properties:
id:
type: integer
example: 12
name:
type: string
example: 'Alexander Romankó'
email:
type: string
example: alex@example.com
is_active:
type: boolean
example: true
can_add_manual_time:
type: boolean
example: true
can_move_time:
type: boolean
example: false
target_hours:
type: integer
example: 40
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'Only admins can update team members'
properties:
message:
type: string
example: 'Only admins can update team members'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Team Members'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
is_active:
type: boolean
description: 'Enable/disable user.'
example: true
nullable: false
can_add_manual_time:
type: boolean
description: 'Allow manual time entry.'
example: true
nullable: false
can_move_time:
type: boolean
description: 'Allow moving time.'
example: false
nullable: false
target_hours:
type: number
description: 'Weekly target hours.'
example: 40.0
nullable: true
parameters:
-
in: path
name: id
description: 'User ID.'
example: 12
required: true
schema:
type: integer
/api/v1/users/invite:
post:
summary: 'Invite a new team member.'
operationId: inviteANewTeamMember
description: 'Send an invitation email to a new team member. Only admins (SuperAdmin, OrganizationManager) can invite.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
message: 'Invitation sent successfully'
data:
email: john@example.com
role: user
pay_rate: 25.0
projects:
- 1
- 2
- 3
properties:
message:
type: string
example: 'Invitation sent successfully'
data:
type: object
properties:
email:
type: string
example: john@example.com
role:
type: string
example: user
pay_rate:
type: number
example: 25.0
projects:
type: array
example:
- 1
- 2
- 3
items:
type: integer
403:
description: forbidden
content:
application/json:
schema:
type: object
example:
message: 'This action is unauthorized.'
properties:
message:
type: string
example: 'This action is unauthorized.'
422:
description: ''
content:
application/json:
schema:
oneOf:
-
description: already_member
type: object
example:
message: 'This user already belongs to the team.'
properties:
message:
type: string
example: 'This user already belongs to the team.'
-
description: has_team
type: object
example:
message: 'User already has a team.'
properties:
message:
type: string
example: 'User already has a team.'
tags:
- 'Team Members'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'Email address of the person to invite.'
example: john@example.com
nullable: false
role:
type: string
description: 'Role to assign.'
example: user
nullable: false
pay_rate:
type: number
description: 'Hourly pay rate.'
example: 25.0
nullable: true
projects:
type: array
description: 'Array of project IDs to assign.'
example:
- 1
- 2
- 3
items:
type: string
is_manager:
type: boolean
description: ''
example: false
nullable: true
required:
- email
- role
/api/v1/tickets:
get:
summary: "Display a list of the authenticated user's tickets."
operationId: displayAListOfTheAuthenticatedUsersTickets
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: array
items:
type: object
example:
-
id: 39
name: 'Login issue'
description: 'Cannot log in.'
status: new
priority: high
source: email
owner_id: 1251
client_id: null
team_id: 514
adds_client_activity: 1
created_at: '2025-10-23T00:00:00.000000Z'
updated_at: '2025-10-23T14:37:12.000000Z'
tags:
- Tickets
post:
summary: 'Store a newly created ticket.'
operationId: storeANewlyCreatedTicket
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 39
name: 'Login issue'
description: 'Cannot log in.'
status: new
priority: high
source: email
owner_id: 1251
client_id: null
team_id: 514
adds_client_activity: 1
created_at: '2025-10-23T00:00:00.000000Z'
updated_at: '2025-10-23T14:37:12.000000Z'
properties:
id:
type: integer
example: 39
name:
type: string
example: 'Login issue'
description:
type: string
example: 'Cannot log in.'
status:
type: string
example: new
priority:
type: string
example: high
source:
type: string
example: email
owner_id:
type: integer
example: 1251
client_id:
type: string
example: null
team_id:
type: integer
example: 514
adds_client_activity:
type: integer
example: 1
created_at:
type: string
example: '2025-10-23T00:00:00.000000Z'
updated_at:
type: string
example: '2025-10-23T14:37:12.000000Z'
tags:
- Tickets
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The name of the ticket.'
example: '"Login issue"'
nullable: false
description:
type: string
description: 'The description of the ticket.'
example: '"Cannot log in."'
nullable: false
status:
type: string
description: 'The status of the ticket. TicketStatusEnum value as string.'
example: new
nullable: false
enum:
- new
- waiting_on_contact
- waiting_on_us
- closed
priority:
type: string
description: 'The priority of the ticket. TicketPriorityEnum value as string.'
example: low
nullable: false
enum:
- low
- medium
- high
source:
type: string
description: 'The source of the ticket. TicketSourceEnum value as string.'
example: email
nullable: false
enum:
- chat
- email
- form
- phone
- other
client_id:
type: integer
description: 'The client ID associated with this ticket. Optional.'
example: 16
nullable: true
contact_id:
type: integer
description: 'The contact ID associated with this ticket. Optional.'
example: 16
nullable: true
required:
- name
- description
- status
- priority
- source
'/api/v1/tickets/{id}':
get:
summary: 'Display the specified ticket (only if it belongs to the user).'
operationId: displayTheSpecifiedTicketonlyIfItBelongsToTheUser
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 39
name: 'Login issue'
description: 'Cannot log in.'
status: new
priority: high
source: email
owner_id: 1251
client_id: null
team_id: 514
adds_client_activity: 1
created_at: '2025-10-23T00:00:00.000000Z'
updated_at: '2025-10-23T14:37:12.000000Z'
properties:
id:
type: integer
example: 39
name:
type: string
example: 'Login issue'
description:
type: string
example: 'Cannot log in.'
status:
type: string
example: new
priority:
type: string
example: high
source:
type: string
example: email
owner_id:
type: integer
example: 1251
client_id:
type: string
example: null
team_id:
type: integer
example: 514
adds_client_activity:
type: integer
example: 1
created_at:
type: string
example: '2025-10-23T00:00:00.000000Z'
updated_at:
type: string
example: '2025-10-23T14:37:12.000000Z'
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: Forbidden
properties:
message:
type: string
example: Forbidden
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Tickets
put:
summary: 'Update the specified ticket.'
operationId: updateTheSpecifiedTicket
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 39
name: 'Login issue'
description: 'Cannot log in.'
status: new
priority: high
source: email
owner_id: 1251
client_id: null
team_id: 514
adds_client_activity: 1
created_at: '2025-10-23T00:00:00.000000Z'
updated_at: '2025-10-23T14:37:12.000000Z'
properties:
id:
type: integer
example: 39
name:
type: string
example: 'Login issue'
description:
type: string
example: 'Cannot log in.'
status:
type: string
example: new
priority:
type: string
example: high
source:
type: string
example: email
owner_id:
type: integer
example: 1251
client_id:
type: string
example: null
team_id:
type: integer
example: 514
adds_client_activity:
type: integer
example: 1
created_at:
type: string
example: '2025-10-23T00:00:00.000000Z'
updated_at:
type: string
example: '2025-10-23T14:37:12.000000Z'
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: Forbidden
properties:
message:
type: string
example: Forbidden
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Tickets
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The name of the ticket.'
example: '"Login issue"'
nullable: false
description:
type: string
description: 'The description of the ticket.'
example: '"Cannot log in."'
nullable: false
status:
type: string
description: 'The status of the ticket. TicketStatusEnum value as string.'
example: new
nullable: false
enum:
- new
- waiting_on_contact
- waiting_on_us
- closed
priority:
type: string
description: 'The priority of the ticket. TicketPriorityEnum value as string.'
example: low
nullable: false
enum:
- low
- medium
- high
source:
type: string
description: 'The source of the ticket. TicketSourceEnum value as string.'
example: email
nullable: false
enum:
- chat
- email
- form
- phone
- other
client_id:
type: integer
description: 'The client ID associated with this ticket. Optional.'
example: 16
nullable: true
contact_id:
type: integer
description: 'The contact ID associated with this ticket. Optional.'
example: 16
nullable: true
required:
- name
- description
- status
- priority
- source
delete:
summary: 'Remove the specified ticket.'
operationId: removeTheSpecifiedTicket
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
403:
description: unauthorized
content:
application/json:
schema:
type: object
example:
message: Forbidden
properties:
message:
type: string
example: Forbidden
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- Tickets
parameters:
-
in: path
name: id
description: 'ticket ID.'
example: 39
required: true
schema:
type: integer
/api/v1/time-intervals:
get:
summary: 'Display a paginated list of time intervals.'
operationId: displayAPaginatedListOfTimeIntervals
description: ''
parameters:
-
in: query
name: project_id
description: 'Filter intervals by project ID.'
example: 15
required: false
schema:
type: integer
description: 'Filter intervals by project ID.'
example: 15
nullable: false
-
in: query
name: user_id
description: 'Filter intervals by user ID.'
example: 42
required: false
schema:
type: integer
description: 'Filter intervals by user ID.'
example: 42
nullable: false
-
in: query
name: date_from
description: 'date Filter intervals starting from this date (YYYY-MM-DD).'
example: '2024-01-01'
required: false
schema:
type: string
description: 'date Filter intervals starting from this date (YYYY-MM-DD).'
example: '2024-01-01'
nullable: false
-
in: query
name: date_to
description: 'date Filter intervals ending before this date (YYYY-MM-DD).'
example: '2024-12-31'
required: false
schema:
type: string
description: 'date Filter intervals ending before this date (YYYY-MM-DD).'
example: '2024-12-31'
nullable: false
-
in: query
name: is_invoiced
description: 'Filter by invoiced status.'
example: true
required: false
schema:
type: boolean
description: 'Filter by invoiced status.'
example: true
nullable: false
-
in: query
name: per_page
description: 'Number of results per page. Maximum: 100.'
example: 50
required: false
schema:
type: integer
description: 'Number of results per page. Maximum: 100.'
example: 50
nullable: false
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
data:
-
id: 123
project_id: 15
user_id: 42
started_at: '2024-03-15T09:00:00.000000Z'
finished_at: '2024-03-15T10:30:00.000000Z'
manual_time: true
source: api
is_invoiced: false
created_at: '2024-03-15T10:30:05.000000Z'
updated_at: '2024-03-15T10:30:05.000000Z'
links:
first: 'https://example.com/api/v1/time-intervals?page=1'
last: 'https://example.com/api/v1/time-intervals?page=3'
prev: null
next: 'https://example.com/api/v1/time-intervals?page=2'
meta:
current_page: 1
from: 1
last_page: 3
path: 'https://example.com/api/v1/time-intervals'
per_page: 50
to: 50
total: 125
properties:
data:
type: array
example:
-
id: 123
project_id: 15
user_id: 42
started_at: '2024-03-15T09:00:00.000000Z'
finished_at: '2024-03-15T10:30:00.000000Z'
manual_time: true
source: api
is_invoiced: false
created_at: '2024-03-15T10:30:05.000000Z'
updated_at: '2024-03-15T10:30:05.000000Z'
items:
type: object
properties:
id:
type: integer
example: 123
project_id:
type: integer
example: 15
user_id:
type: integer
example: 42
started_at:
type: string
example: '2024-03-15T09:00:00.000000Z'
finished_at:
type: string
example: '2024-03-15T10:30:00.000000Z'
manual_time:
type: boolean
example: true
source:
type: string
example: api
is_invoiced:
type: boolean
example: false
created_at:
type: string
example: '2024-03-15T10:30:05.000000Z'
updated_at:
type: string
example: '2024-03-15T10:30:05.000000Z'
links:
type: object
properties:
first:
type: string
example: 'https://example.com/api/v1/time-intervals?page=1'
last:
type: string
example: 'https://example.com/api/v1/time-intervals?page=3'
prev:
type: string
example: null
next:
type: string
example: 'https://example.com/api/v1/time-intervals?page=2'
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 3
path:
type: string
example: 'https://example.com/api/v1/time-intervals'
per_page:
type: integer
example: 50
to:
type: integer
example: 50
total:
type: integer
example: 125
tags:
- 'Time Intervals'
post:
summary: 'Create a new time interval.'
operationId: createANewTimeInterval
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
201:
description: success
content:
application/json:
schema:
type: object
example:
id: 123
project_id: 15
user_id: 42
started_at: '2024-03-15T09:00:00.000000Z'
finished_at: '2024-03-15T10:30:00.000000Z'
manual_time: true
source: api
is_invoiced: false
created_at: '2024-03-15T10:30:05.000000Z'
updated_at: '2024-03-15T10:30:05.000000Z'
properties:
id:
type: integer
example: 123
project_id:
type: integer
example: 15
user_id:
type: integer
example: 42
started_at:
type: string
example: '2024-03-15T09:00:00.000000Z'
finished_at:
type: string
example: '2024-03-15T10:30:00.000000Z'
manual_time:
type: boolean
example: true
source:
type: string
example: api
is_invoiced:
type: boolean
example: false
created_at:
type: string
example: '2024-03-15T10:30:05.000000Z'
updated_at:
type: string
example: '2024-03-15T10:30:05.000000Z'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Project not found'
properties:
message:
type: string
example: 'Project not found'
tags:
- 'Time Intervals'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: integer
description: 'Project ID.'
example: 15
nullable: false
started_at:
type: datetime
description: 'Start time (ISO 8601).'
example: '2024-03-15T09:00:00Z'
nullable: false
finished_at:
type: datetime
description: 'End time (ISO 8601).'
example: '2024-03-15T10:30:00Z'
nullable: true
user_id:
type: integer
description: 'User ID (defaults to authenticated user).'
example: 42
nullable: true
required:
- project_id
- started_at
'/api/v1/time-intervals/{id}':
get:
summary: 'Display a single time interval.'
operationId: displayASingleTimeInterval
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 123
project_id: 15
user_id: 42
started_at: '2024-03-15T09:00:00.000000Z'
finished_at: '2024-03-15T10:30:00.000000Z'
manual_time: true
source: api
is_invoiced: false
created_at: '2024-03-15T10:30:05.000000Z'
updated_at: '2024-03-15T10:30:05.000000Z'
properties:
id:
type: integer
example: 123
project_id:
type: integer
example: 15
user_id:
type: integer
example: 42
started_at:
type: string
example: '2024-03-15T09:00:00.000000Z'
finished_at:
type: string
example: '2024-03-15T10:30:00.000000Z'
manual_time:
type: boolean
example: true
source:
type: string
example: api
is_invoiced:
type: boolean
example: false
created_at:
type: string
example: '2024-03-15T10:30:05.000000Z'
updated_at:
type: string
example: '2024-03-15T10:30:05.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Time Intervals'
put:
summary: 'Update a time interval.'
operationId: updateATimeInterval
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
id: 123
project_id: 15
user_id: 42
started_at: '2024-03-15T09:00:00.000000Z'
finished_at: '2024-03-15T11:00:00.000000Z'
manual_time: true
source: api
is_invoiced: false
created_at: '2024-03-15T10:30:05.000000Z'
updated_at: '2024-03-15T11:05:12.000000Z'
properties:
id:
type: integer
example: 123
project_id:
type: integer
example: 15
user_id:
type: integer
example: 42
started_at:
type: string
example: '2024-03-15T09:00:00.000000Z'
finished_at:
type: string
example: '2024-03-15T11:00:00.000000Z'
manual_time:
type: boolean
example: true
source:
type: string
example: api
is_invoiced:
type: boolean
example: false
created_at:
type: string
example: '2024-03-15T10:30:05.000000Z'
updated_at:
type: string
example: '2024-03-15T11:05:12.000000Z'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Time Intervals'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
started_at:
type: datetime
description: 'Start time (ISO 8601).'
example: '2024-03-15T09:00:00Z'
nullable: false
finished_at:
type: datetime
description: 'End time (ISO 8601).'
example: '2024-03-15T10:30:00Z'
nullable: true
project_id:
type: integer
description: 'Project ID.'
example: 15
nullable: false
user_id:
type: integer
description: 'User ID.'
example: 42
nullable: false
delete:
summary: 'Delete a time interval.'
operationId: deleteATimeInterval
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
204:
description: success
content:
text/plain:
schema:
type: string
example: 'null'
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
tags:
- 'Time Intervals'
parameters:
-
in: path
name: id
description: 'Time interval ID.'
example: 123
required: true
schema:
type: integer
'/api/v1/time-intervals/{id}/move':
post:
summary: 'Move a time interval to another project.'
operationId: moveATimeIntervalToAnotherProject
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
success: true
properties:
success:
type: boolean
example: true
404:
description: not_found
content:
application/json:
schema:
type: object
example:
message: 'Not found'
properties:
message:
type: string
example: 'Not found'
422:
description: validation_error
content:
application/json:
schema:
type: object
example:
message: 'Project not found'
properties:
message:
type: string
example: 'Project not found'
tags:
- 'Time Intervals'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
new_project_id:
type: integer
description: 'New project ID.'
example: 18
nullable: false
reason:
type: string
description: 'optional Reason for moving.'
example: 'Wrong project assignment'
nullable: true
required:
- new_project_id
parameters:
-
in: path
name: id
description: 'Time interval ID.'
example: 123
required: true
schema:
type: integer
/api/v1/time-tracking/start:
post:
summary: 'Start Time Tracking'
operationId: startTimeTracking
description: "Start tracking time on a project. Creates a new open time interval.\nOnly available for users with manual time tracking enabled.\n\nRequires either project_id or project_name. Use GET /api/v1/projects to list available projects."
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
status: started
interval_id: 456
project:
id: 5
name: 'Website Redesign'
started_at: '2025-12-26T10:30:00.000000Z'
message: 'Time tracking started on Website Redesign'
properties:
status:
type: string
example: started
interval_id:
type: integer
example: 456
project:
type: object
properties:
id:
type: integer
example: 5
name:
type: string
example: 'Website Redesign'
started_at:
type: string
example: '2025-12-26T10:30:00.000000Z'
message:
type: string
example: 'Time tracking started on Website Redesign'
403:
description: manual_time_disabled
content:
application/json:
schema:
type: object
example:
error: 'Manual time tracking is not enabled for your account.'
properties:
error:
type: string
example: 'Manual time tracking is not enabled for your account.'
404:
description: project_not_found
content:
application/json:
schema:
type: object
example:
error: 'Project not found or you do not have access to it.'
properties:
error:
type: string
example: 'Project not found or you do not have access to it.'
409:
description: already_tracking
content:
application/json:
schema:
type: object
example:
error: 'You already have an active time tracking session.'
active_interval:
id: 123
project_name: 'Other Project'
started_at: '2025-12-26T08:00:00.000000Z'
duration_hours: 2.5
properties:
error:
type: string
example: 'You already have an active time tracking session.'
active_interval:
type: object
properties:
id:
type: integer
example: 123
project_name:
type: string
example: 'Other Project'
started_at:
type: string
example: '2025-12-26T08:00:00.000000Z'
duration_hours:
type: number
example: 2.5
tags:
- 'Time Tracking'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
project_id:
type: integer
description: 'The project ID to track time on.'
example: 5
nullable: false
task_id:
type: integer
description: 'Optional task ID to associate with tracking.'
example: 123
nullable: true
note:
type: string
description: 'Optional note for the time entry.'
example: 'Working on homepage'
nullable: true
required:
- project_id
/api/v1/time-tracking/stop:
post:
summary: 'Stop Time Tracking'
operationId: stopTimeTracking
description: 'Stop the current active time tracking session.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: success
content:
application/json:
schema:
type: object
example:
status: stopped
interval_id: 456
project:
id: 5
name: 'Website Redesign'
started_at: '2025-12-26T10:30:00.000000Z'
finished_at: '2025-12-26T12:45:00.000000Z'
duration: '2h 15m'
message: 'Tracked 2h 15m on Website Redesign'
properties:
status:
type: string
example: stopped
interval_id:
type: integer
example: 456
project:
type: object
properties:
id:
type: integer
example: 5
name:
type: string
example: 'Website Redesign'
started_at:
type: string
example: '2025-12-26T10:30:00.000000Z'
finished_at:
type: string
example: '2025-12-26T12:45:00.000000Z'
duration:
type: string
example: '2h 15m'
message:
type: string
example: 'Tracked 2h 15m on Website Redesign'
404:
description: no_active_tracking
content:
application/json:
schema:
type: object
example:
error: 'No active time tracking session found.'
properties:
error:
type: string
example: 'No active time tracking session found.'
tags:
- 'Time Tracking'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
note:
type: string
description: 'Optional note to add to the time entry.'
example: 'Completed homepage design'
nullable: true
/api/v1/time-tracking/status:
get:
summary: 'Get Tracking Status'
operationId: getTrackingStatus
description: 'Get the current time tracking status for the authenticated user.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: tracking_active
type: object
example:
status: tracking
interval:
id: 456
project_id: 5
project_name: 'Website Redesign'
task_id: null
started_at: '2025-12-26T10:30:00.000000Z'
duration_hours: 1.5
duration_formatted: '1h 30m'
properties:
status:
type: string
example: tracking
interval:
type: object
properties:
id:
type: integer
example: 456
project_id:
type: integer
example: 5
project_name:
type: string
example: 'Website Redesign'
task_id:
type: string
example: null
started_at:
type: string
example: '2025-12-26T10:30:00.000000Z'
duration_hours:
type: number
example: 1.5
duration_formatted:
type: string
example: '1h 30m'
-
description: not_tracking
type: object
example:
status: not_tracking
message: 'You are not currently tracking time.'
properties:
status:
type: string
example: not_tracking
message:
type: string
example: 'You are not currently tracking time.'
tags:
- 'Time Tracking'
/api/v1/time-tracking/heartbeat:
post:
summary: 'Heartbeat - update last activity timestamp for web tracker.'
operationId: heartbeatUpdateLastActivityTimestampForWebTracker
description: 'Only applies to SOURCE_WEB intervals. Idempotent.'
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'Time Tracking'
/api/v1/time-tracking/reconcile:
post:
summary: 'Reconcile - handle away time (stop at last active, keep running, or split).'
operationId: reconcileHandleAwayTimestopAtLastActiveKeepRunningOrSplit
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'Time Tracking'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
action:
type: string
description: stop_at_last_active|keep_running|split_idle
example: architecto
nullable: false
required:
- action
'/api/v1/time-tracking/interval/{timeInterval_id}/note':
post:
summary: 'Add a note to the current web tracking interval.'
operationId: addANoteToTheCurrentWebTrackingInterval
description: ''
parameters:
-
in: header
name: X-API-Key
description: ''
example: '{YOUR_AUTH_KEY}'
schema:
type: string
responses: { }
tags:
- 'Time Tracking'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
content:
type: string
description: 'Note content.'
example: 'Quick break'
nullable: false
required:
- content
parameters:
-
in: path
name: timeInterval_id
description: 'The ID of the timeInterval.'
example: 12
required: true
schema:
type: integer
/api/v1/workflows:
get:
summary: ''
operationId: getApiV1Workflows
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Authorization required'
properties:
message:
type: string
example: 'Authorization required'
tags:
- Workflows
security: []
post:
summary: ''
operationId: postApiV1Workflows
description: ''
parameters: []
responses: { }
tags:
- Workflows
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
nullable: false
source_text:
type: string
description: 'Must not be greater than 10000 characters.'
example: 'n'
nullable: false
anchor_type:
type: string
description: ''
example: contact
nullable: false
enum:
- contact
required:
- name
- source_text
security: []
'/api/v1/workflows/{id}':
put:
summary: ''
operationId: putApiV1WorkflowsId
description: ''
parameters: []
responses: { }
tags:
- Workflows
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
nullable: false
source_text:
type: string
description: 'Must not be greater than 10000 characters.'
example: 'n'
nullable: false
anchor_type:
type: string
description: ''
example: contact
nullable: false
enum:
- contact
required:
- name
- source_text
security: []
delete:
summary: ''
operationId: deleteApiV1WorkflowsId
description: ''
parameters: []
responses: { }
tags:
- Workflows
security: []
parameters:
-
in: path
name: id
description: 'The ID of the workflow.'
example: architecto
required: true
schema:
type: string