BasicOps
  • API Reference
  • API Reference

    Overview

    The BasicOps data model is built around a hierarchy of objects. Projects are the top-level organizational unit; they contain Sections (time-boxed sprints or phases) and Tasks (the individual units of work). Tasks and Projects can have Notes attached to them. Communication happens through Messages, which can be sent in the context of a task, a project, a direct chat, a group chat, or a channel. Messages support threaded Replies and emoji Reactions.

    Files can be uploaded and attached to tasks, messages, or replies. Dependencies link tasks together (e.g. finish-to-start). Webhooks let you subscribe to events in real time. Time Entries track time spent on tasks.

    ID Types

    Most record identifiers in the API are integers (e.g. project IDs, task IDs, section IDs, user IDs, note IDs, channel IDs, chat IDs, time entry IDs).

    The following identifiers are strings:

    • Message IDs
    • Reply IDs
    • Dependency IDs
    • Webhook EIDs

    When building integrations, make sure to store and compare these as strings rather than numbers to avoid precision issues.

    Common Response Fields

    Create and update endpoints return a data object that always includes the id of the created or updated record, and typically also includes:

    • viewUrl - A deep-link URL that opens the record directly in the BasicOps web application. You can use this to build "Open in BasicOps" links in your integration.
    • bounceUrl - A URL that redirects to the appropriate page in BasicOps. Useful when the destination page may vary depending on context (for example, opening a task from a notification).

    Project

    Projects is the top organization structure. In projects you may find sections and tasks.

    Data

    Field IDType
    idProject identifier
    isTemplateIndicates whether this is a project or template:
    null or false: project
    true: template
    titleProject title (String, required)
    descriptionProject description (String)
    ownerIdenfifier of the user who is the project owner (defaults to the current user)
    teamList of identifiers of the users who are on the project team
    dueDateProject due date (date)
    startDateProject start date (date)
    statusProject status, must have one of the followng values (defaults to "On Track"):
    "On Track"
    "At Risk"
    "In Trouble"
    "On Hold"
    "Complete"
    folderProject group in which the project is located, will be null if the project is not in a project group
    createdThe date and time of the project creation (date)
    updatedThe date and time of the last update of the project (date)

    Project filters

    You can filter on the following project fields: isTemplate, owner, dueDate, startDate, created and updated.

    Please refer to Filters for information about adding filters.

    Retrieve a Project

    GET https://api.basicops.com/v1/project/<project-id>

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/project/<project-id>

    Returns:

    {
    "success": true,
    "data": {
    "id": 6,
    "title": "Corporate website",
    "description": "Define our presence, define values we want to promote.",
    "status": "On Track",
    "dueDate": "2018-08-01T07:00:00.000Z",
    "startDate": "2018-01-01T07:00:00.000Z",
    "owner": 38,
    "team": [38, 25],
    "created": "2018-01-01T08:00:00.000Z",
    "updated": "2018-07-01T08:00:00.000Z"
    }

    Retrieve a List of Projects

    GET https://api.basicops.com/v1/project

    Optional parameters:

      ?istemplate=true/false
    ?archived=true

    By default, only active (non-archived) projects are returned. Pass ?archived=true to retrieve archived projects instead.

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/project

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 6,
    "title": "Corporate website",
    "description": "Define our presence, define values we want to promote.",
    "status": "On Track",
    "dueDate": "2018-08-01T07:00:00.000Z",
    "startDate": "2018-01-01T07:00:00.000Z",
    "owner": 38,
    "team": [38, 25],
    "created": "2018-01-01T08:00:00.000Z",
    "updated": "2018-07-01T08:00:00.000Z"
    },
    ...
    ]
    }

    Create a Project

    POST https://api.basicops.com/v1/project
    {
    "owner": 38,
    "description": "Define our presence",
    "dueDate": "2018-08-01T07:00:00.000Z",
    "title": "Corporate website",
    "status": "On Track"
    }

    Optional field:

      "template": ID of project template

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/project \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "owner": 38,
    "description": "Define our presence",
    "dueDate": "2018-08-01T07:00:00.000Z",
    "title": "Corporate website",
    "status": "On Track"
    }'

    Returns:

    {
    "success" : true,
    "data" : {
    "id" : 146
    "viewUrl" : "...",
    "bounceUrl" : "..."
    }
    }

    Update a Project

    PATCH https://api.basicops.com/v1/project/<project-id>
    {
    "owner": 38,
    "description": "Define our presence",
    "dueDate": "2018-08-01T07:00:00.000Z",
    "title": "Corporate website",
    "status": "On Track"
    }

    Using CURL:

    curl -X PATCH \
    https://api.basicops.com/v1/project/123 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "owner": 38,
    "description": "Define our presence",
    "dueDate": "2018-08-01T07:00:00.000Z",
    "title": "Corporate website",
    "status": "On Track"
    }'

    Returns:

    {
    "success" : true
    }

    Delete a Project

    DELETE https://api.basicops.com/v1/project/<project-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/project/123 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success" : true,
    "data" : {
    "statusKind" : 2,
    "status" : "<name> deleted",
    "activities" : [ 436 ]
    }
    }

    Sections

    Sections are used for grouping tasks within a project.

    Data

    Field IDType
    idSection identifier
    nameString (required)

    Section filters

    You can filter on the following section fields: project, created and updated.

    Please refer to Filters for information about adding filters.

    Retrieve a Section

    GET https://api.basicops.com/v1/section/<section-id>

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/section/123

    Returns:

    JSON data:
    {
    "success": true,
    "data": {
    "endDate": "2018-03-31T07:00:00.000Z",
    "name": "Q1",
    "project": {
    "dueDate": "2018-08-01T07:00:00.000Z",
    "description": "Define our presence, define values we want to promote.",
    "id": 6,
    "title": "Corporate website",
    "status": "On Track"
    },
    "id": 1,
    "state": "Complete"
    }

    Retrieve a List of Sections

    GET https://api.basicops.com/v1/section

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/section

    Returns

    {
    "success": true,
    "data": [
    {
    "endDate": "2018-03-31T07:00:00.000Z",
    "name": "Q1",
    "project": {
    "dueDate": "2018-08-01T07:00:00.000Z",
    "description": "Define our presence, define values we want to promote.",
    "id": 6,
    "title": "Corporate website",
    "status": "On Track"
    },
    "id": 1,
    "state": "Complete"
    },
    ...
    ]
    }

    Retrieve a List of Sections from a Project

    GET https://api.basicops.com/v1/project/<project-id>/sections

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/project/123/sections

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 1,
    "name": "Q1",
    "endDate": "2018-03-31T07:00:00.000Z",
    "state": "Complete",
    "project": {
    "id": 6,
    "title": "Corporate website",
    "status": "On Track"
    }
    },
    ...
    ]
    }

    Create a Section

    POST https://api.basicops.com/v1/section
    {
    "endDate": "2018-09-30T07:00:00.000Z",
    "name": "Next release",
    "project": 6,
    "state": "Open"
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/section \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "Next release",
    "project": 6
    }'

    Returns:

    {
    "success" : true,
    "data" : {
    "id" : 146,
    "viewUrl" : "...",
    "bounceUrl" : "..."
    }
    }

    Update a Section

    PATCH https://api.basicops.com/v1/section/<section-id>
    {
    "endDate": "2018-10-30T07:00:00.000Z",
    "name": "Next release",
    "project": 8,
    "state": "Open"
    }

    Using CURL:

    curl -X PATCH \
    https://api.basicops.com/v1/section/146 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "Next release",
    "project": 8
    }'

    Returns:

    {
    "success" : true
    }

    Delete a Section

    DELETE https://api.basicops.com/v1/section/<section-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/section/123 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success" : true,
    "data" : {
    "statusKind" : 2,
    "status" : "<name> deleted",
    "activities" : [ 436 ]
    }
    }

    Tasks

    Tasks identify the work to be done. They can be organized in section and projects.

    Data

    Field IDType
    idTask identifier
    titleString (required)
    descriptionDescription
    projectIdentifier of the project the task belongs to or null if it doesn't belong to a project
    sectionIdentifier of the section the task belongs to or null if it doesn't belong to a section
    assigneeIdentifier of the user who is assigned to the task
    dueDateDate
    statusString, must be one of the following values (defaults to "New"):
    "New"
    "Accepted"
    "In Progress
    "Under Review"
    "Reviewed"
    "On Hold"
    "Blocked"
    "Complete"
    attachmentsAttached files
    createdThe date and time the task was created (date)
    updatedThe date and time of the last update of the task (date)

    Task filters

    You can filter on the following task fields: project, section, assignee, dueDate, status, created and updated.

    Please refer to Filters for information about adding filters.

    Retrieve a Task

    GET https://api.basicops.com/v1/task/<task-id>

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/task/123

    Returns:

    JSON data:
    {
    "success": true,
    "data": {
    "attachments": [
    {
    "Id": "8dMfbZuoDwmxVvx0W2rbWA%3D%3D",
    "FileName": "002.jpg",
    "Width": 498,
    "Height": 304,
    "Created": "2018-07-17T19:21:52.000Z",
    "Size": 257895,
    "DownloadURL": "https://api.basicops.com/v1/task/73/attachments/8dMfbZuoDwmxVvx0W2rbWA%3D%3D/download",
    "ThumbnailURL": "https://api.basicops.com/v1/task/73/attachments/8dMfbZuoDwmxVvx0W2rbWA%3D%3D/thumbnail/medium"
    },
    {
    "Id": "9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D",
    "FileName": "001.jpg",
    "Width": 498,
    "Height": 304,
    "Created": "2018-07-17T19:21:52.000Z",
    "Size": 380825,
    "DownloadURL": "https://api.basicops.com/v1/task/73/attachments/9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D/download",
    "ThumbnailURL": "https://api.basicops.com/v1/task/73/attachments/9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D/thumbnail/medium"
    }
    ],
    "section": {
    "endDate": "2018-03-31T07:00:00.000Z",
    "name": "Q1",
    "id": 1,
    "state": "Open"
    },
    "project": {
    "dueDate": "2018-08-01T07:00:00.000Z",
    "description": "Define our presence, define values we want to promote.",
    "id": 6,
    "title": "Corporate website",
    "status": "On Track"
    },
    "id": 73,
    "assignee": {
    "firstName": "Alex",
    "lastName": "Jackson",
    "id": 38,
    "email": "alex@testco.com",
    "picture": "https://api.basicops.com/v1/user/38/picture/mB1Wqsr7DjnvhagZeIag0w%3D%3D/download"
    },
    "title": "Organization of corporate website",
    "status": "Accepted"
    }
    }

    Retrieve a List of Tasks

    GET https://api.basicops.com/v1/task

    Optional parameter:

      ?archived=true

    By default, only active (non-archived) tasks are returned. Pass ?archived=true to retrieve archived tasks instead.

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/task

    Returns

    {
    "success": true,
    "data": [
    {
    "attachments": [],
    "section": {
    "endDate": "2018-03-31T07:00:00.000Z",
    "name": "Q1",
    "id": 1,
    "state": "Open"
    },
    "project": {
    "dueDate": "2018-08-01T07:00:00.000Z",
    "description": "Define our presence, define values we want to promote.",
    "id": 6,
    "title": "Corporate website",
    "status": "On Track"
    },
    "id": 73,
    "assignee": {
    "firstName": "Alex",
    "lastName": "Jackson",
    "id": 38,
    "email": "alex@testco.com",
    "picture": "https://api.basicops.com/v1/user/38/picture/mB1Wqsr7DjnvhagZeIag0w%3D%3D/download"
    },
    "title": "Organization of corporate website",
    "status": "Accepted"
    },
    ...
    ]
    }

    Retrieve a List of Tasks from a Project

    GET https://api.basicops.com/v1/project/<project-id>/tasks

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/project/123/tasks

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 73,
    "title": "Organization of corporate website",
    "status": "Accepted",
    "project": {
    "id": 6,
    "title": "Corporate website",
    "status": "On Track"
    },
    "section": {
    "id": 1,
    "name": "Q1",
    "state": "Open"
    },
    "assignee": {
    "id": 38,
    "firstName": "Alex",
    "lastName": "Jackson",
    "email": "alex@testco.com"
    },
    "attachments": []
    },
    ...
    ]
    }

    Retrieve a List of Subtasks from a Task

    GET https://api.basicops.com/v1/task/<task-id>/tasks

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/task/123/tasks

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 73,
    "title": "Organization of corporate website",
    "status": "Accepted",
    "project": {
    "id": 6,
    "title": "Corporate website",
    "status": "On Track"
    },
    "section": {
    "id": 1,
    "name": "Q1",
    "state": "Open"
    },
    "assignee": {
    "id": 38,
    "firstName": "Alex",
    "lastName": "Jackson",
    "email": "alex@testco.com"
    },
    "attachments": []
    },
    ...
    ]
    }

    Create a Task

    POST https://api.basicops.com/v1/task
    Authorization: Bearer <access-token>
    {
    "dueDate": "2018-08-01T07:00:00.000Z",
    "section": 1,
    "project": 6,
    "assignee": 38,
    "title": "Company info",
    "status": "New"
    }

    Optional field:

    "parent": ID of parent task

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/task \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "dueDate": "2018-08-01T07:00:00.000Z",
    "section": 1,
    "project": 6,
    "assignee": 38,
    "title": "Company info",
    "status": "New"
    }'

    Returns:

    {
    "success" : true,
    "data" : {
    "id" : 146,
    "viewUrl" : "...",
    "bounceUrl" : "..."
    }
    }

    Update a Task

    PATCH https://api.basicops.com/v1/task/<task-id>
    {
    "description": "Include management profiles",
    "title": "Company information",
    "status": "In Progress",
    "project": 8
    }

    Using CURL:

    curl -X PATCH \
    https://api.basicops.com/v1/task/146 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "description": "Include management profiles",
    "title": "Company information",
    "status": "In Progress",
    "project": 8
    }'

    Returns:

    {
    "success" : true
    }

    Attach a File to a Task

    POST https://api.basicops.com/v1/task/<task-id>/attachments
    Content-Disposition: attachment; filename="filename.ext"
    Content-Type: mime-type
    ...binary file content...

    Using CURL:

    curl https://api.basicops.com/v1/task/308/attachments \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Disposition: attachment; filename=\"sample.png\"" \
    --data-binary "@testfile.png"

    Attach a Cloud File to a Task

    POST https://api.basicops.com/v1/task/<task-id>/attachments
    Content-Disposition: attachment; filename="filename.ext"
    Content-Type: mime-type
    {
    "fileName": "sample.gif",
    "contentType": "photo",
    "cloudType": 1,
    "cloudId": "0B_8xh8GFMTbncGRWNU9LRDBCWEU"
    }

    The cloudType number can be one of these values:

    1: Google Drive
    2: Box
    3: Dropbox
    6: Microsoft OneDrive

    The cloudId value is the file identifier used in the cloud storage provider; its format depends on the provider.

    Download an Attachment from a Task

    GET https://api.basicops.com/v1/task/<task-id>/attachments/<attachment-id>

    The HTTP response contains the file to download:

    200 OK
    Content-Disposition: attachment; filename="sample.png"
    Content-Length: length

    ...binary file data....

    Download a Cloud File Attachment from a Task

    GET https://api.basicops.com/v1/task/<task-id>/attachments/<attachment-id>

    The HTTP response contains information for how to download the file from the cloud storage provider.

    {
    "fileName": "sample.gif",
    "contentType": "photo",
    "cloudType": 1,
    "cloudId": "0B_8xh8GFMTbncGRWNU9LRDBCWEU"
    }

    The cloudType number can be one of these values:

    1: Google Drive
    2: Box
    3: Dropbox
    6: Microsoft OneDrive

    The cloudId value is the file identifier used in the cloud storage provider; its format depends on the provider.

    Download a Thumbnail for an Attachment in a Task

    GET https://api.basicops.com/v1/task/<task-id>/attachments/<attachment-id>/thumbnail/<size>

    The <size> parameter can be one of the following values: icon, small, medium, and large.

    The HTTP response contains the thumbnail image:

    200 OK
    Content-Disposition: attachment; filename="sample-size.png"
    Content-Length: length

    ...binary file data....

    Delete a Task

    DELETE https://api.basicops.com/v1/task/<task-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/task/123 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success" : true,
    "data" : {
    "statusKind" : 2,
    "status" : "<name> deleted",
    "activities" : [ 436 ]
    }
    }

    Reviews

    Reviews allow tasks to be submitted for approval. A reviewer can then approve or reject the task.

    Request a Review

    Sends a review request to one or more users for a given task.

    POST https://api.basicops.com/v1/task/<task-id>/review/request
    {
    "reviewers": [123, 456],
    "message": "Please review this task"
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/task/73/review/request \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "reviewers": [123, 456],
    "message": "Please review this task"
    }'

    Returns:

    {
    "success": true
    }

    Submit a Review

    Submits a review decision for a task.

    POST https://api.basicops.com/v1/task/<task-id>/review/submit
    {
    "message": "Looks good, approved"
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/task/73/review/submit \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "message": "Looks good, approved"
    }'

    Returns:

    {
    "success": true
    }

    Dependencies

    Dependencies define ordering relationships between tasks, ensuring one task is completed before another begins.

    Data

    Field IDType
    idDependency identifier (String)
    taskIdentifier of the dependent task
    dependsOnTaskIdentifier of the task this task depends on
    typeDependency type (String)

    List Dependencies of a Task

    GET https://api.basicops.com/v1/task/<task-id>/dependency

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/task/123/dependency

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "dep-abc123",
    "task": 123,
    "dependsOnTask": 456,
    "type": "finish-to-start"
    },
    ...
    ]
    }

    List Dependencies of a Project

    List all dependencies of tasks within a project.

    GET https://api.basicops.com/v1/project/<project-id>/dependency

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/project/6/dependency

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "dep-abc123",
    "task": 123,
    "dependsOnTask": 456,
    "type": "finish-to-start"
    },
    ...
    ]
    }

    Create a Task Dependency

    POST https://api.basicops.com/v1/task/<task-id>/dependency
    {
    "dependsOnTask": 456,
    "type": "finish-to-start"
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/task/123/dependency \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "dependsOnTask": 456,
    "type": "finish-to-start"
    }'

    Returns:

    {
    "success": true,
    "data": {
    "id": "dep-abc123",
    "viewUrl": "...",
    "bounceUrl": "..."
    }
    }

    Delete a Dependency

    DELETE https://api.basicops.com/v1/dependency/<dependency-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/dependency/dep-abc123 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success": true
    }

    Time Tracking

    Time Tracking entries are used for recording time spent on tasks.

    Data

    Field IDType
    idTime Tracking identifier
    userIdentifier of the user for the entry. If this is not specified when creating a new time tracking entry, it will default to the owner of the access token.
    projectIdentifier of the project
    taskIdentifier of the task
    startTimeDate specifying the start time of the entry
    endTimeDate specifying the end time of the entry
    timeInteger denoting the number of seconds for the entry

    Time Tracking filters

    You can filter on the following time tracking fields: project, task, startTime, endTime, created and updated.

    Please refer to Filters for information about adding filters.

    Retrieve a Time Tracking entry

    GET https://api.basicops.com/v1/timetracking/<time-tracking-id>

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/timetracking/123

    Returns:

    JSON data:
    {
    "success": true,
    "data":
    {
    "id": 7,
    "note": "Note via API",
    "task":
    {
    "id": 1,
    "title": "Organization of corporate website",
    ...
    },
    "created": "2025-09-27T20:17:37.000Z",
    "project":
    {
    "id": 1,
    "title": "Corporate website",
    ...
    },
    "startTime": "2024-04-01T00:00:00.000Z",
    "endTime": "2024-04-01T01:00:00.000Z",
    "time": 3600,
    "updated": "2025-09-27T20:17:37.000Z",
    "user": 123
    }
    }

    Retrieve a List of Time Tracking entries

    GET https://api.basicops.com/v1/timetracking

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/timetracking

    Returns

    {
    "success": true,
    "data": [
    {
    "success": true,
    "data":
    {
    "id": 7,
    "note": "Note via API",
    "task":
    {
    "id": 1,
    "title": "Organization of corporate website",
    ...
    },
    "created": "2025-09-27T20:17:37.000Z",
    "project":
    {
    "id": 1,
    "title": "Corporate website",
    ...
    },
    "startTime": "2024-04-01T00:00:00.000Z",
    "endTime": "2024-04-01T01:00:00.000Z",
    "time": 3600,
    "updated": "2025-09-27T20:17:37.000Z",
    "user": 123
    }
    },
    ...
    ]
    }

    Create a Time Tracking entry

    Note that you can specify the user for the time tracking entry using the user field. If this is not specified, the user will default to the owner of the access token.

    POST https://api.basicops.com/v1/timetracking
    {
    "note": "A note...",
    "project": 123
    "task": 123,
    "user": 123,
    "startTime": "2024-04-01T00:00:00.000Z",
    "endTime": "2024-04-01T01:00:00.000Z",
    "time": 3600
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/timetracking \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "note": "A note...",
    "project": 123,
    "task": 123,
    "user": 123,
    "startTime": "2024-04-01T00:00:00.000Z",
    "endTime": "2024-04-01T01:00:00.000Z",
    "time": 3600
    }'

    Returns:

    {
    "success" : true,
    "data" : {
    "id" : 146,
    "viewUrl" : "...",
    "bounceUrl" : "..."
    }
    }

    Update a Time Tracking entry

    PATCH https://api.basicops.com/v1/timetracking/<time-tracking-id>
    {
    "note": "An updated note...",
    "endTime": "2024-04-01T02:00:00.000Z",
    "time": 7200
    }

    Using CURL:

    curl -X PATCH \
    https://api.basicops.com/v1/timetracking/146 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "note": "An updated note...",
    "endTime": "2024-04-01T02:00:00.000Z",
    "time": 7200
    }'

    Returns:

    {
    "success" : true
    }

    Delete a Time Tracking entry

    DELETE https://api.basicops.com/v1/timetracking/<time-tracking-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/timetracking/123 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success" : true,
    "data" : {
    "activities" : [ 436 ]
    }
    }

    Notes

    Notes contains free-form text and can contain references to tasks and files. Notes can be personal or belong to a project.

    Data

    Field IDType
    idnote identifier
    nameString (required)
    contentThe text of the note
    attachmentsAttached files

    Notes filters

    You can filter on the following note fields: created and updated.

    Please refer to Filters for information about adding filters.

    Retrieve a Note

    GET https://api.basicops.com/v1/note/<note-id>

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/note/123

    Returns:

    JSON data:
    {
    "success": true,
    "data": {
    "name": "Meeting summary",
    "id": 1,
    "content": "...",
    "attachments": [
    {
    "Id": "8dMfbZuoDwmxVvx0W2rbWA%3D%3D",
    "FileName": "002.jpg",
    "Width": 498,
    "Height": 304,
    "Created": "2018-07-17T19:21:52.000Z",
    "Size": 257895,
    "DownloadURL": "https://api.basicops.com/v1/task/73/attachments/8dMfbZuoDwmxVvx0W2rbWA%3D%3D/download",
    "ThumbnailURL": "https://api.basicops.com/v1/task/73/attachments/8dMfbZuoDwmxVvx0W2rbWA%3D%3D/thumbnail/medium"
    },
    {
    "Id": "9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D",
    "FileName": "001.jpg",
    "Width": 498,
    "Height": 304,
    "Created": "2018-07-17T19:21:52.000Z",
    "Size": 380825,
    "DownloadURL": "https://api.basicops.com/v1/task/73/attachments/9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D/download",
    "ThumbnailURL": "https://api.basicops.com/v1/task/73/attachments/9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D/thumbnail/medium"
    }
    ]
    }

    Retrieve a List of Notes

    GET https://api.basicops.com/v1/note

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/note

    Returns

    {
    "success": true,
    "data": [
    {
    "name": "Meeting summary",
    "id": 1,
    "content": "...",
    "attachments": [
    {
    "Id": "8dMfbZuoDwmxVvx0W2rbWA%3D%3D",
    "FileName": "002.jpg",
    "Width": 498,
    "Height": 304,
    "Created": "2018-07-17T19:21:52.000Z",
    "Size": 257895,
    "DownloadURL": "https://api.basicops.com/v1/task/73/attachments/8dMfbZuoDwmxVvx0W2rbWA%3D%3D/download",
    "ThumbnailURL": "https://api.basicops.com/v1/task/73/attachments/8dMfbZuoDwmxVvx0W2rbWA%3D%3D/thumbnail/medium"
    },
    {
    "Id": "9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D",
    "FileName": "001.jpg",
    "Width": 498,
    "Height": 304,
    "Created": "2018-07-17T19:21:52.000Z",
    "Size": 380825,
    "DownloadURL": "https://api.basicops.com/v1/task/73/attachments/9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D/download",
    "ThumbnailURL": "https://api.basicops.com/v1/task/73/attachments/9ovmKXhHsLHKT2Z5LJ4%2BHA%3D%3D/thumbnail/medium"
    }
    ]
    },
    ...
    ]
    }

    Retrieve a List of Notes from a Project

    GET https://api.basicops.com/v1/project/<project-id>/notes

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/project/123/notes

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 1,
    "name": "Meeting summary",
    "content": "...",
    "attachments": []
    },
    ...
    ]
    }

    Create a Note

    POST https://api.basicops.com/v1/note
    {
    "name": "Next release",
    "project": 6,
    "content": "..."
    }

    Instead of using the general form for creating a note specified above, you may specify one or more of the fields startTime, endTime, summary, actionItems and participants shown in the example below. The values of startTime, endTime, summary, actionItems and participants will then be formatted and added to the content field.

    If an action item in actionItems has the field addAsTask set to true, a task will automatically be created with the title defined by the title field, and a reference to the task will be inserted into the note.

    POST https://api.basicops.com/v1/note
    {
    "name": "Next release",
    "startTime": "2024-09-03T18:30:00.000Z",
    "endTime": "2024-09-03T19:10:00.000Z",
    "summary": "The summary",
    "actionItems": [
    {
    "title": "first action item",
    "addAsTask": true
    },
    {
    "title": "second action item",
    "addAsTask": false
    }],
    "participants": [
    {
    "firstName": "John",
    "lastName": "Doe",
    "email": "john@doe.com"
    },
    {
    "firstName": "Jane",
    "lastName": "Doe",
    "email": "jane@doe.com"
    }],
    "project": 6,
    "content": "..."
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/note \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "Next release",
    "startTime": "2024-09-03T18:30:00.000Z",
    "endTime": "2024-09-03T19:10:00.000Z",
    "summary": "The summary",
    "actionItems": [
    {
    "title": "first action item"
    },
    {
    "title": "second action item"
    }],
    "participants": [
    {
    "firstName": "John",
    "lastName": "Doe",
    "email": "john@doe.com"
    },
    {
    "firstName": "Jane",
    "lastName": "Doe",
    "email": "jane@doe.com"
    }],
    "project": 6,
    "content": "..."
    }'

    Returns:

    {
    "success" : true,
    "data" : {
    "id" : 146,
    "viewUrl" : "...",
    "bounceUrl" : "..."
    }
    }

    Update a Note

    PATCH https://api.basicops.com/v1/note/<note-id>
    {
    "name": "Next release",
    "project": 8,
    "content": "..."
    }

    Using CURL:

    curl -X PATCH \
    https://api.basicops.com/v1/note/146 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "Next release",
    "project": 8,
    "state": "..."
    }'

    Returns:

    {
    "success" : true
    }

    Delete a Note

    DELETE https://api.basicops.com/v1/note/<note-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/note/123 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success" : true,
    "data" : {
    "statusKind" : 2,
    "status" : "<name> deleted",
    "activities" : [ 436 ]
    }
    }

    Messages

    Messages can be posted to tasks, projects, chats, group chats, and channels.

    Data

    Field IDType
    idMessage identifier (String)
    messageThe text content of the message (String, required)
    attachmentsAttached files
    createdDate and time the message was created
    updatedDate and time the message was last updated

    Get a Message

    GET https://api.basicops.com/v1/message/<message-id>

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/message/<message-id>

    Returns:

    {
    "success": true,
    "data": {
    "id": "abc123",
    "message": "Hello world",
    "created": "2024-04-01T10:00:00.000Z",
    "updated": "2024-04-01T10:00:00.000Z"
    }
    }

    List Messages in a Task

    GET https://api.basicops.com/v1/task/<task-id>/message

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/task/<task-id>/message

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "abc123",
    "message": "Hello world",
    "created": "2024-04-01T10:00:00.000Z",
    "updated": "2024-04-01T10:00:00.000Z"
    },
    ...
    ]
    }

    List Messages in a Project

    GET https://api.basicops.com/v1/project/<project-id>/message

    Optional parameter:

    ?includeTaskMessages=true

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/project/<project-id>/message

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "abc123",
    "message": "Hello world",
    "created": "2024-04-01T10:00:00.000Z",
    "updated": "2024-04-01T10:00:00.000Z"
    },
    ...
    ]
    }

    List Messages in a Chat

    GET https://api.basicops.com/v1/chat/<chat-id>/message

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "abc123",
    "message": "Hello world",
    "created": "2024-04-01T10:00:00.000Z",
    "updated": "2024-04-01T10:00:00.000Z"
    },
    ...
    ]
    }

    List Messages in a Group Chat

    GET https://api.basicops.com/v1/groupchat/<groupchat-id>/message

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "abc123",
    "message": "Hello world",
    "created": "2024-04-01T10:00:00.000Z",
    "updated": "2024-04-01T10:00:00.000Z"
    },
    ...
    ]
    }

    List Messages in a Channel

    GET https://api.basicops.com/v1/channel/<channel-id>/message

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "abc123",
    "message": "Hello world",
    "created": "2024-04-01T10:00:00.000Z",
    "updated": "2024-04-01T10:00:00.000Z"
    },
    ...
    ]
    }

    Create a Message

    POST https://api.basicops.com/v1/<type>/<id>/message
    {
    "message": "Hello world"
    }

    Where <type> is one of: task, project, chat, groupchat, channel.

    To include attachments, add an attachments array containing identifiers returned by the Upload endpoints:

    POST https://api.basicops.com/v1/<type>/<id>/message
    {
    "message": "Please review the attached file",
    "attachments": ["8dMfbZuoDwmxVvx0W2rbWA=="]
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/task/123/message \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "message": "Hello world"
    }'

    Returns:

    {
    "success": true,
    "data": {
    "id": "abc123",
    "viewUrl": "...",
    "bounceUrl": "..."
    }
    }

    Update a Message

    This endpoint replaces the full content of the message, including its attachments. It is one of two PUT endpoints in the API (the other being Update a Reply). If you want to keep existing attachments, include their identifiers in the attachments field. Additional files uploaded via the Upload endpoints can be added to the array.

    PUT https://api.basicops.com/v1/message/<message-id>
    {
    "message": "Updated message text",
    "attachments": ["8dMfbZuoDwmxVvx0W2rbWA=="]
    }

    Using CURL:

    curl -X PUT \
    https://api.basicops.com/v1/message/abc123 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "message": "Updated message text",
    "attachments": ["8dMfbZuoDwmxVvx0W2rbWA=="]
    }'

    Returns:

    {
    "success": true
    }

    Delete a Message

    DELETE https://api.basicops.com/v1/message/<message-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/message/abc123 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success": true
    }

    Replies

    Replies are threaded responses to messages.

    Data

    Field IDType
    idReply identifier (String)
    messageThe text content of the reply (String, required)
    attachmentsAttached files
    createdDate and time the reply was created
    updatedDate and time the reply was last updated

    List Replies in a Message

    GET https://api.basicops.com/v1/message/<message-id>/reply

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/message/abc123/reply

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": "def456",
    "message": "This is a reply",
    "created": "2024-04-01T10:05:00.000Z",
    "updated": "2024-04-01T10:05:00.000Z"
    },
    ...
    ]
    }

    Create a Reply

    POST https://api.basicops.com/v1/message/<message-id>/reply
    {
    "message": "This is a reply"
    }

    To include attachments, add an attachments array containing identifiers returned by the Upload endpoints:

    POST https://api.basicops.com/v1/message/<message-id>/reply
    {
    "message": "See attached",
    "attachments": ["8dMfbZuoDwmxVvx0W2rbWA=="]
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/message/abc123/reply \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "message": "This is a reply"
    }'

    Returns:

    {
    "success": true,
    "data": {
    "id": "def456",
    "viewUrl": "...",
    "bounceUrl": "..."
    }
    }

    Update a Reply

    This endpoint replaces the full content of the reply, including its attachments. It is one of two PUT endpoints in the API (the other being Update a Message). If you want to keep existing attachments, include their identifiers in the attachments field. Additional files uploaded via the Upload endpoints can be added to the array.

    PUT https://api.basicops.com/v1/reply/<reply-id>
    {
    "message": "Updated reply text",
    "attachments": ["8dMfbZuoDwmxVvx0W2rbWA=="]
    }

    Using CURL:

    curl -X PUT \
    https://api.basicops.com/v1/reply/def456 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "message": "Updated reply text",
    "attachments": ["8dMfbZuoDwmxVvx0W2rbWA=="]
    }'

    Returns:

    {
    "success": true
    }

    Delete a Reply

    DELETE https://api.basicops.com/v1/reply/<reply-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/reply/def456 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success": true
    }

    Reactions

    Reactions are emoji responses to messages and replies. The toggle endpoint adds a reaction if it does not already exist for the current user, or removes it if it does.

    Toggle a Reaction on a Message

    POST https://api.basicops.com/v1/message/<message-id>/reaction
    {
    "reaction": "👍"
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/message/abc123/reaction \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "reaction": "👍"
    }'

    Toggle a Reaction on a Reply

    POST https://api.basicops.com/v1/reply/<reply-id>/reaction
    {
    "reaction": "👍"
    }

    List Reactions on a Message

    GET https://api.basicops.com/v1/message/<message-id>/reaction

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/message/abc123/reaction

    Returns:

    {
    "success": true,
    "data": [
    {
    "reaction": "👍",
    "user": 38
    },
    ...
    ]
    }

    List Reactions on a Reply

    GET https://api.basicops.com/v1/reply/<reply-id>/reaction

    Returns:

    {
    "success": true,
    "data": [
    {
    "reaction": "👍",
    "user": 38
    },
    ...
    ]
    }

    Chats

    Chats are direct 1:1 conversations between two users.

    Data

    Field IDType
    idChat identifier
    userIdentifier of the other user in the chat

    List Chats

    GET https://api.basicops.com/v1/chat

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/chat

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 7,
    "user": 38
    },
    ...
    ]
    }

    Create a Chat

    POST https://api.basicops.com/v1/chat
    {
    "user": 123
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/chat \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "user": 123
    }'

    Returns:

    {
    "success": true,
    "data": {
    "id": 7,
    "viewUrl": "...",
    "bounceUrl": "..."
    }
    }

    Group Chats

    Group chats are conversations between multiple users.

    Data

    Field IDType
    idGroup chat identifier
    nameGroup chat name (String)
    usersList of user identifiers
    avatarAvatar identifier

    List Group Chats

    GET https://api.basicops.com/v1/groupchat

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/groupchat

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 12,
    "name": "My group",
    "users": [38, 25]
    },
    ...
    ]
    }

    Create a Group Chat

    POST https://api.basicops.com/v1/groupchat
    {
    "name": "My group",
    "users": [123, 456]
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/groupchat \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "My group",
    "users": [123, 456]
    }'

    Returns:

    {
    "success": true,
    "data": {
    "id": 12,
    "viewUrl": "...",
    "bounceUrl": "..."
    }
    }

    Update a Group Chat

    PATCH https://api.basicops.com/v1/groupchat/<groupchat-id>
    {
    "name": "Updated name",
    "users": [123, 456, 789]
    }

    Using CURL:

    curl -X PATCH \
    https://api.basicops.com/v1/groupchat/12 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "Updated name",
    "users": [123, 456, 789]
    }'

    Returns:

    {
    "success": true
    }

    Delete a Group Chat

    DELETE https://api.basicops.com/v1/groupchat/<groupchat-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/groupchat/12 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success": true
    }

    Channels

    Channels are topic-based conversations accessible to team members.

    Data

    Field IDType
    idChannel identifier
    nameChannel name (String, required)
    isPublicWhether the channel is public (Boolean)
    usersList of user identifiers
    administratorsList of administrator user identifiers
    avatarAvatar identifier
    includeExternalUsersWhether external users are included (Boolean)
    includeClientsWhether clients are included (Boolean)

    List Channels

    GET https://api.basicops.com/v1/channel

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/channel

    Returns:

    {
    "success": true,
    "data": [
    {
    "id": 5,
    "name": "general",
    "isPublic": true,
    "users": [38, 25],
    "administrators": [38]
    },
    ...
    ]
    }

    Create a Channel

    POST https://api.basicops.com/v1/channel
    {
    "name": "general",
    "isPublic": true,
    "users": [123, 456]
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/channel \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "general",
    "isPublic": true,
    "users": [123, 456]
    }'

    Returns:

    {
    "success": true,
    "data": {
    "id": 5,
    "viewUrl": "...",
    "bounceUrl": "..."
    }
    }

    Update a Channel

    PATCH https://api.basicops.com/v1/channel/<channel-id>
    {
    "name": "updated-name",
    "users": [123, 456, 789]
    }

    Using CURL:

    curl -X PATCH \
    https://api.basicops.com/v1/channel/5 \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "updated-name",
    "users": [123, 456, 789]
    }'

    Returns:

    {
    "success": true
    }

    Delete a Channel

    DELETE https://api.basicops.com/v1/channel/<channel-id>

    Using CURL:

    curl -X DELETE \
    https://api.basicops.com/v1/channel/5 \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success": true
    }

    Users

    Data

    Field IDType
    idUser identifier
    firstNameString (required)
    lastNameString
    emailString, valid email address if the user is active, null if the user is deactivated
    rolesRoles the user belongs to
    pictureThe user's avatar or null

    User filters

    You can filter on the following user fields: created and updated.

    Please refer to Filters for information about adding filters.

    Retrieve a User

    GET https://api.basicops.com/v1/user/<user-id>

    or

    GET https://api.basicops.com/v1/user/me

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/user/123

    Returns:

    JSON data:
    {
    "success": true,
    "data": {
    "firstName": "Tim",
    "lastName": "Dalton",
    "roles": [
    {
    "name": "User Administrator",
    "id": 14
    }
    ],
    "id": 25,
    "email": "tim@testco.com",
    "picture": "https://api.basicops.com/v1/user/25/picture/PjS6Bj7ZiKra1tL54rpuKw%3D%3D/download"
    }
    }

    Retrieve a List of Users

    GET https://api.basicops.com/v1/user
    Authorization: Bearer <access-token>

    Optional parameter:

    ?name=<first and last name>
    ?email=<email address>

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/user

    Returns

    {
    "success": true,
    "data": [
    {
    "firstName": "Tim",
    "lastName": "Dalton",
    "roles": [
    {
    "name": "User Administrator",
    "id": 14
    }
    ],
    "id": 25,
    "email": "tim@testco.com",
    "picture": "https://api.basicops.com/v1/user/25/picture/PjS6Bj7ZiKra1tL54rpuKw%3D%3D/download"
    },
    ...
    ]
    }

    Webhooks

    Create a Webhook

    POST https://api.basicops.com/v1/webhook
    Authorization: Bearer <access-token>
    {
    "name": "my first webhook via rest",
    "url": "https://server.com/hook",
    "events": "basicops:task:created,basicops:task:updated,basicops:project:deleted",
    "project" : 1234,
    "section" : 1234,
    "excludeDetails" : false,
    "signing": "provided",
    "secret": "<your-secret>"
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/webhook \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "my first webhook via rest",
    "url": "https://server.com/hook",
    "events": "basicops:task:created,basicops:task:updated,basicops:project:deleted",
    "project" : 1234,
    "section" : 1234,
    "excludeDetails" : false,
    "signing": "provided",
    "secret": "<your-secret>"
    }'

    The value events is a comma-separated string; each element is composed of the form:

    basicops:<collection>:<action>

    Collections can be one of the following values: task, project, section, note, user. Action can be one of the following: created, updated, deleted.

    The project field is optional. If specified, the webhook will be activated only for objects within the project.

    The signing field controls payload signing and can be one of the following values:

    • "none" — No signing (default). The payload is delivered unsigned.
    • "generate" — BasicOps will generate a secret, which is returned in the result. BasicOps will sign each webhook payload using the generated secret. The signature is included in the request header so your server can verify the payload's authenticity.
    • "provided" — BasicOps will sign each webhook payload using the secret you provide. The signature is included in the request header so your server can verify the payload's authenticity.

    When signing is set to "provided", the secret field is required.

    Update a Webhook

    PUT https://api.basicops.com/v1/webhook/<webhook-EId>
    Authorization: Bearer <access-token>
    {
    "name": "my first webhook via rest",
    "url": "https://my.company.com/webhooks",
    "events": "basicops:task:created,basicops:task:updated,basicops:project:deleted",
    "excludeDetails" : false,
    "signing": "none"
    }

    Using CURL:

    curl -X PUT \
    https://api.basicops.com/v1/webhook/<webhook-EId> \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "my first webhook via rest",
    "url": "https://my.company.com/webhooks",
    "events": "basicops:task:created,basicops:task:updated,basicops:project:deleted",
    "excludeDetails" : false,
    "signing": "none"
    }'

    Returns:

    {
    "success" : true,
    "data" : {
    "Id" : 8,
    "CompanyId" : 2,
    "UserId" : 2,
    "EId" : "7f646881-2f1d-4266-a071-cbd3b0b0bfca",
    "Name" : "my first webhook via rest",
    "Url" : "https://server.com/hook",
    "Events" : "basicops:task:created,basicops:task:updated,basicops:project:deleted",
    "project" : 1234,
    "ExcludeDetails" : false
    }
    }

    The EId is used to refer to the webhook in other REST API methods.

    Delete a Webhook

    DELETE https://api.basicops.com/v1/webhook/<webhook-EId>

    CURL:

    The following would delete the webhook with an EId of 7f646881-2f1d-4266-a071-cbd3b0b0bfca:
    curl -X DELETE \
    https://api.basicops.com/v1/webhook/7f646881-2f1d-4266-a071-cbd3b0b0bfca \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <access-token>" \

    Retrieve a Webhook

    GET https://api.basicops.com/v1/webhook/<webhook-EId>

    CURL:

    curl -X GET \
    https://api.basicops.com/v1/webhook/7f646881-2f1d-4266-a071-cbd3b0b0bfca \
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success" : true,
    "data" : {
    "Id" : 8,
    "CompanyId" : 2,
    "UserId" : 2,
    "EId" : "7f646881-2f1d-4266-a071-cbd3b0b0bfca",
    "Name" : "my first webhook via rest",
    "Url" : "https://server.com/hook",
    "Events" : "basicops:task:created,basicops:task:updated,basicops:project:deleted",
    "ExcludeDetails" : false
    }
    }

    List Webhooks

    GET https://api.basicops.com/v1/webhook

    Using CURL:

    curl -X GET \
    https://api.basicops.com/v1/webhook
    -H "Authorization: Bearer <access-token>"

    Returns:

    {
    "success" : true,
    "data" : [ {
    "Id" : 8,
    "CompanyId" : 2,
    "UserId" : 2,
    "EId" : "7f646881-2f1d-4266-a071-cbd3b0b0bfca",
    "Name" : "my first webhook via rest",
    "Url" : "https://server.com/hook",
    "Events" : "basicops:task:created,basicops:task:updated,basicops:project:deleted",
    "ExcludeDetails" : false
    } ]
    }

    Executing the Webhook

    When the registered webhook event happens, the BasicOps server will execute an HTTP POST request to the registered webhook URL:

    POST https://my.company.com/webhooks
    {
    "events": [
    {
    "timestamp": "2017-01-08T21:00:00.000Z",
    "event": "basicops:task:updated",
    "user": {
    "firstName" : "demo",
    "lastName" : "user",
    "roles" : [ ],
    "id" : 25,
    "email" : "demo@mailexample.com"
    },
    "records": [
    ...
    ]
    }
    }

    Bulk Operations

    Bulk operations allow creating or updating up to 100 objects in a single request. Each item in the items array follows the same field structure as the corresponding single create/update endpoint. An item that includes an id field will be updated; an item without one will be created.

    Bulk Create or Update Projects

    POST https://api.basicops.com/v1/project/bulk
    {
    "items": [
    { "title": "Project A", "status": "On Track" },
    { "id": 123, "title": "Updated Project B" }
    ]
    }

    Bulk Create or Update Tasks

    POST https://api.basicops.com/v1/task/bulk
    {
    "items": [
    { "title": "Task A", "project": 6 },
    { "id": 73, "title": "Updated Task B" }
    ]
    }

    Bulk Create or Update Sections

    POST https://api.basicops.com/v1/section/bulk
    {
    "items": [
    { "name": "Section A", "project": 6 }
    ]
    }

    Bulk Create or Update Notes

    POST https://api.basicops.com/v1/note/bulk
    {
    "items": [
    { "name": "Note A", "project": 6 }
    ]
    }

    Bulk Create or Update Templates

    POST https://api.basicops.com/v1/project/bulk
    {
    "items": [
    { "title": "Template A", "isTemplate": true }
    ]
    }

    Returns:

    {
    "success": true,
    "data": {
    "created": [147, 148],
    "updated": [73]
    }
    }

    File Operations

    Upload a File

    Uploads a file and returns an attachment identifier that can be used to attach the file to a task, a message, or a reply. The identifier can only be used once.

    POST https://api.basicops.com/v1/upload
    Content-Disposition: attachment; filename="filename.ext"
    Content-Type: mime-type
    ...binary file content...

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/upload \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Disposition: attachment; filename=\"sample.png\"" \
    --data-binary "@sample.png"

    Returns:

    {
    "success": true,
    "data": {
    "id": "8dMfbZuoDwmxVvx0W2rbWA=="
    }
    }

    Upload a File via URL

    Uploads a file from a remote URL and returns an attachment identifier that can be used to attach the file to a task, a message, or a reply. The identifier can only be used once.

    POST https://api.basicops.com/v1/uploadurl
    {
    "url": "https://example.com/file.pdf"
    }

    Using CURL:

    curl -X POST \
    https://api.basicops.com/v1/uploadurl \
    -H "Authorization: Bearer <access-token>" \
    -H "Content-Type: application/json" \
    -d '{
    "url": "https://example.com/file.pdf"
    }'

    Returns:

    {
    "success": true,
    "data": {
    "id": "8dMfbZuoDwmxVvx0W2rbWA=="
    }
    }

    Get an Attachment Download URL

    Returns a pre-signed URL that can be used to download the attachment directly. The URL is valid for 15 minutes.

    GET https://api.basicops.com/v1/attachment/<attachment-id>/url

    Using CURL:

    curl -k -H "Authorization: Bearer <access-token>" https://api.basicops.com/v1/attachment/8dMfbZuoDwmxVvx0W2rbWA==/url

    Returns:

    {
    "success": true,
    "data": {
    "url": "https://..."
    }
    }

    Download an Attachment

    Downloads the binary content of an attachment.

    GET https://api.basicops.com/v1/attachment/<attachment-id>/download

    Optional parameter:

    ?maxSize=<max-bytes>

    The HTTP response contains the file to download:

    200 OK
    Content-Disposition: attachment; filename="sample.png"
    Content-Length: length
    Content-Type: image/png

    ...binary file data....

    Link endpoints return a shareable URL for navigating directly to an object in the BasicOps interface.

    GET https://api.basicops.com/v1/project/<project-id>/link
    GET https://api.basicops.com/v1/task/<task-id>/link
    GET https://api.basicops.com/v1/note/<note-id>/link
    GET https://api.basicops.com/v1/message/<message-id>/link
    GET https://api.basicops.com/v1/reply/<reply-id>/link

    All link endpoints return:

    {
    "success": true,
    "data": {
    "url": "https://app.basicops.com/..."
    }
    }