Quire API API Reference

Introduction

Welcome to the reference for the Quire REST API!

The Quire REST API provides a broad set of operations and resources that:

  • Consistently do repetitive or tedious tasks.
  • Chain a process together for your team’s process and workflow.
    • Pull information from other locations such as email and Evernote into Quire.
    • Push information from Quire to other locations such as email and Zapier.

Want to share your thoughts on how Quire API works for you? Tell us how you feel about using our API and what we can do to make it better.

REST is a web-service protocol for rapid development by using HTTP and JSON technology.

API Changelog

You can find the Changelog of the API Reference in the Quire Community.

Authentication

For full setup instructions, see our Complete Setup Guide on the Quire blog.

OAuth v2.0

Quire uses OAuth v2.0 to authenticate your app and access the Quire REST API on a user’s behalf—without requiring the user’s password.

Authenticating via OAuth2 requires the following steps:

  1. Register Your Application on Quire
  2. Ask a Quire User to Grant Access to Your Application
  3. Retrieve an Access Token
  4. Make Authenticated Requests

Register Your Application on Quire

Quire API

1. Give your app a cool name

Your app deserves a cool name that lives up to its broad range of great features.

All of the app users will see this name in public, so think carefully!

2. Choose the Quire Organization that your app belongs to

You can choose an organization in Quire that your app belongs to.

If one day you decide to leave the organization, you will lose the authority to manage the app.

3. Redirect URL

When users grant your app authorization request, users will be directed to the configured URL that you’ve set.

4. Choose permission scopes

You can set permission on what your app can do with Quire. There are several options for you to choose from.

Note: If none of the options is selected, the app can only read user’s data.

5. Development Client ID and Client Secret

Quire Open API

The Client ID and Client secret will be automatically generated as you create an app.

The Client ID is a unique ID to identify your app.

You should keep your client secret safe, which means you should never share your client secret with anyone. If you choose to regenerate the client secret, the old one will immediately become invalid.

6. Update your App

If your app hasn't been published to Quire App Directory, it will remain as unpublished status. You can still use the configured shareable link in the Developer App Console Distribution to share the app with other users for testing or integration.

When you make changes to the app, you can use the shareable link to access the development copy as well. Working on your development copy will not affect your live App Directory app. When your updated app is ready to be published and replaced the old version on Quire App Directory, your published app will have a different Client ID to the unpublished one.

There are two sets of Client ID and Client Secret.

  • Development set - should be used during developing and testing internally of the app.
  • Production set - should be used once your app is ready and published on Quire App Directory.

Fulfill Authorization Request

Ask a Quire User to Grant Access to Your Application

Once registering your application, you can ask your user to grant access to your application.

The authorization endpoint lets users grant your app access to the requested permissions.

The authorization endpoint should look like this:

https://quire.io/oauth?client_id=your-client-ID&redirect_uri=your-redirect-uri

Quire Grant Access

After your user clicks Allow, the access will be granted, and he will be redirected to the URL you specified in the redirect_uri parameter with an authorization code provided as a query parameter called code.

After your app is granted, you can have an authorization code to exchange access token for access Quire API. The redirect_uri is optional. If not being specified, we will automatically use the one that is previously detected in the app. If specified, the redirect URL must start with the prefix of the one that was previously detected in the app.

Parameter Value
client_id {your-client-ID}
redirect_uri Optional. The redirect URL after granted. If specified, it must match the redirect URL specified in your app's config. Otherwise, the configured URL will be used.
state Optional. A random string generated by your app to protect from XSRF.

Retrieve Access Token

To retrieve the access token, you have to post a request to https://quire.io/oauth/token with the following data:

Parameter Value
grant_type authorization_code
code {your-authorization-code}
client_id {your-client-ID}
client_secret {your-client-secret}
curl -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code&code=Your_code_from_previous_step&client_id=Your_app_client_id&client_secret=Your_app_client_secret" \
  https://quire.io/oauth/token

Then, the access token will be returned in the response's body.

{
  "access_token":"ACCESS_TOKEN",
  "token_type": "bearer",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN"
}

The token should be kept carefully and permanently since you need it to access every Quire API.

PKCE Support

Quire supports PKCE (RFC 7636) for public clients such as single-page apps. To use it:

  1. Add code_challenge and code_challenge_method=S256 to the authorization request.
  2. Send code_verifier instead of client_secret when exchanging the authorization code for a token.

Note: Only S256 is supported. PKCE tokens do not include a refresh_token.

Use Access Token to Access Quire API

In each request, the access token must be put in the header. The header name is Authorization and the value is Bearer your_token.

After you exchange the access token, your app can make requests to Quire API on behalf of the authorized users.

curl -H 'Authorization: Bearer {access_token}' \
https://quire.io/api/user/id/me
{
  "email": "[email protected]",
  "website": "https://coolwebsites.com",
  "id": "My_ID",
  "description": "This is *cool*!",
  "url": "https://quire.io/u/My_ID",
  "nameText": "My Name",
  "nameHtml": "My Name",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "iconColor": "37",
  "name": "My Name",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Token Expiration

A refresh token might stop working for one of these reasons:

  • The user has revoked your app's access.
  • The refresh token has not been used for 6 months.

Publish App

Quire Publish App

By default, your app will be set as Private. You can change the app distribution to Public so that other Quire users can install your app to their workspace as well.

If your app is made available on Quire App Directory and you want to delete the app, you should communicate with your users first before depreciating the app.

WebHook

When one event on Quire is triggered, the system will send a payload to the webhook's configured URL.

A webhook is used by Quire to call an app, while Quire API is used by an app to call Quire. To receive these events, you have to specify a valid URL for Webhooks when configuring your app.

For a complete guide, see our blog post.

System Events

A system event is used to notify your app about system or app's activities.

Token Expiration

When the token has been expired or revoked, an event will be sent to your app. You can clean up your storage if necessary.

{
  "type": "system",
  "token": "hook-token-defined-by-you",
  "secret": "secret-defined-by-you",
  "data": {
    "type": "token-revocation",
    "token": "the-refresh-token"
  }
}

Host Revocation

When the user revokes the grant to a host (either a project or an organization), an event will be sent to your app. You can clean up your storage if necessary.

{
  "type": "system",
  "token": "hook-token-defined-by-you",
  "secret": "secret-defined-by-you",
  "data": {
    "type": "host-revocation",
    "token": "the-refresh-token",
    "host": "host-oid",
    "otype": "host-type",
  }
}

Notification Events

A notification is the information about an update (aka., an activity). Here is an example:

{
  "type": "notification",
  "token": "hook-token-defined-by-you",
  "secret": "secret-defined-by-you",
  "projectSummary": {
    "oid": "project-oid-where-event-occurred",
    "id": "project-id"
  },
  "organizationSummary": {
    "oid": "organization-where-event-occurred",
    "id": "organization-id"
  },
  "data": {
    "type": 0, //activity's type
    "when": "2019-09-30T08:20:12.000Z",
    "what": {
      "oid": "YxjapXXRCOYxoaiCT4tT3OQm", //OID of a task, project, or organization depending on type
      "id": 101,
      "name": "Brand new start",
      "parent": {
        "oid": "parent-oid",
        "id": "parent-id",
        "parent": {
          "oid": "grand-parent-oid",
          "id": "grand-parent-id",
        }
      }
    },
    "user": {
      "oid": "1AbDEFed2A5031BEDDweqmde", //OID of the user
      "id": "john.doer",
      "name": "John Doer"
    },
    "message": "<a href=\"https://quire.io/u/john.doer\">John Doer</a> added <a href=\"https://quire.io/w/MyProjects/101\">Brand new start</a>",
    "text": "John Doer added Brand new start",
    "url": "https://quire.io/w/MyProjects/101"
  } 
}
  • The data map may also include an optional value field, which provides detailed information as a map. For example, for an assignment notification, value includes the assignee’s ID, name, and URL.

  • If the notification is about a start or due change, the data map will include an additional due field. This value is a date/time formatted in the user’s locale and time zone.

  • If the event notifies a task update and the task has a parent, the parent information is included in the parent field. The parent field is a map containing the task’s oid and id. If the task’s parent also has a parent, the map includes a nested parent field as well.

  • The projectSummary and organizationSummary fields provide information about the project and organization where the event occurred.

  • There is an additional field, taskSummaries, for activities that can affect multiple tasks (for example, removing a task that has subtasks). This field is a list of map instances. Each map represents a task that was changed. If any of that task's subtasks were also changed, they are included in the map’s tasks field.

Registration for Notifications

For instructions on updating a project, see Update a project by OID.

If the app wants to receive notifications of a specific projects or tasks, it can follow the projects or apps by sending a PUT request to the URL. To add a follower, the body of the request can be:

Syntax 1

{
  "addFollowers": ["app"]
}

where app is a keyword. It indicates that the app would like to receives the notifications about the given target (a project or a task). That is, it'll add the app into the target's followers.

Syntax 2

In additions, you can specify additional information that will be passed as part of a notification in the following syntax.

"app|team|channel"

where app is a keyword while team and channel are application specific. That is, you can pass any value to team and channel.

Note: team and channel can not contain '|'.

For example,

{
  "addFollowers": ["app|extra101"]
}

Then, the notification will carry additional field called team with the value "extra101":

{
  "type": "notification",
  "team": "extra101",
  "data": {
    //refer the Notifications section for details
  }
}

Another example:

{
  "addFollowers": ["app|extra101|channel9"]
}

You'll get:

{
  "type": "notification",
  "team": "extra101",
  "channel": "channel9",
  "data": {
    //refer the Notifications section for details
  }
}

Syntax 3

"app|team|channel|mine"

where both app and mine are keywords. It is similar to Syntax 2, except it receives only notifications that match the notification setting of the user.

If you don't need both team and channel, you can specify: "app|||mine.

The notification setting can be found at https://quire.io/w/YourProject?view=setting&tab=options#notifications

Syntax 4

"app|/path"

where app is a keyword, and /path is application specific. The path will be appended to the app's hook URL. For example, assume the app's hook URL is "https://super.app/hooks/standard", and the follower "app|/soc/id279/channel51". Then, the notification will be posted the following URL: "https://super.app/hooks/standard/soc/id279/channel51".

Syntax 5

If you'd like to pass additional information in this syntax, you can append it as follows.

"app|/path|channel"

For example, app|/soc/id8|box51. Then, box51 will be part of the JSON object sent to the hook URL.

{
  "type": "notification",
  "channel": "box51",
  "data": {
    //refer the Notifications section for details
  }
}

Responding and Retries

When receiving the notification, your Web Hook shall return a status code between 200 and 299 to indicate success.

If a status code other than above is returned, we will retry 15 minutes later, then 1 hour later and 1 day later.

Activities Types

Rate Limits

To protect the stability of the API and keep it available to all users, Quire enforces multiple kinds of rate limiting. Requests that hit any of our rate limits will receive a 429 Too Many Requests response. We may change these quotas or add new quotas in the future.

Here are the limits for free plans.

Plan Maximum requests per organization, per minute Maximum requests per organization, per hour
Free 25 120

Note: the limit is per-organization. It sums up the total number of all accesses from all applications for each organization. For more quota, please refer to Pricing.

When a rate limit is exceeded, the response includes a standard Retry-After header whose value is the number of seconds to wait before retrying. The value reflects the time until the offending per-minute or per-hour counter resets, so clients can back off precisely instead of guessing.

HTTP/1.1 429 Too Many Requests
            Retry-After: 37
            Content-Type: application/json
            
            {"code": 429, "message": "..."}
            

Size limits

The size of each request can't be larger than 1MB. Requests that hit this limit will receive a 413 Content too large response.

Status Codes

Code Meaning Description
200 Success Request successful
400 Bad Request You're using a wrong parameter, or passing incorrect data.
401 Unauthorized Invalid or expired token.
402 Payment required The organization’s subscription does not permit use of this app.
403 Forbidden Not authorized to access the resource.
404 Not Found The specified resource could not be found.
405 Method not allowed Method not allowed or supported.
409 Conflict There is already a resource with the same criteria.
413 Content too large The request's content is larger than 1MB.
418 Not valid JSON content The request's content doesn't appear to be JSON.
429 Too Many Requests Exceeded the rate limit for API calls
500 Internal Server Error There is an unexpected error.
503 Service Unavailable Server is down for maintenance.

Error Responses

The following JSON data is returned in the response body when an error occurs.

{
    "code": a_number,
  "message": "an error message here"
}
Error Code Meaning
100 General authentication error.
400 Bad request including wrong request body, wrong parameter and so on.
401 Invalid or expired token.
403 Forbidden.
404 Resource not found.
405 Method not allowed.
413 Request too large.
429 Too many invocations.
469 Quota exceeded, such as number of projects and number of members.
500 General invocation error. Most likely, an internal error.

Quire MCP Server

Quire offers an MCP (Model Context Protocol) server that lets AI assistants — Claude, ChatGPT, Cursor, VS Code, and other MCP-compatible clients — work with your Quire workspace through natural language.

Once connected, the assistant can list and search your projects, create or update tasks and subtasks, post comments, manage tags, sublists, statuses, documents, chats, insights, and more — all on your behalf and within the permissions you grant.

Quire MCP is built on top of the same Quire REST API documented here, so anything an integration can do via REST is reachable from an AI assistant once it is connected.

Server URL

The Quire MCP server is hosted at:

https://mcp.quire.app/mcp

Authentication is handled by OAuth 2.1 — your AI assistant walks you through the standard authorization screen, you approve access for the workspaces you choose, and the assistant receives a token scoped to your account. No client ID or client secret needs to be configured by the end user.

The server speaks the Streamable HTTP transport and supports Dynamic Client Registration (RFC 7591) and PKCE (RFC 7636), so any compliant MCP client can connect with just the URL above.

What you can do

The Quire MCP server exposes the full Quire object model as MCP tools. At a high level:

Category What the AI can do
User & Organizations Identify the current user, look up users, list and update organizations
Projects List, search, and inspect projects; manage members, custom fields, and approval categories
Tasks Create, update, move, transfer, complete, approve, and delete tasks; manage dates, peekaboo, and time logs; search across a project, folder, or organization
Bulk operations Create, update, move, transfer, approve, or delete many tasks in one call
Subtasks & Sublists Build task hierarchies, group tasks into sublists, and reorder within sublists
Comments & Attachments Read and post comments on tasks and chats; attach files to tasks or comments
Tags & Statuses Manage the project's tag library and workflow statuses
Documents Create, read, update, and delete project documents
Chats & Insights Start chat threads, post chat comments, and manage insight reports and their fields
Partners List and inspect partner workspaces
URL resolver Turn any pasted Quire URL (task, project, document, …) into the underlying object

For the authoritative, always-up-to-date list of tools and their parameters, run tools/list from your MCP client after connecting.

Connect your AI assistant

You only need the server URL — the authorization flow is started by the client and completed in your browser.

Claude Desktop

  1. Open Settings → Connectors.
  2. Click Add custom connector.
  3. Enter a name (for example, Quire) and the URL https://mcp.quire.app/mcp.
  4. Save and click Connect. Claude Desktop will open a browser window where you can sign in to Quire and grant access.

Claude Code

Add the server with one command:

claude mcp add --transport http quire https://mcp.quire.app/mcp

Then trigger the OAuth flow from inside Claude Code:

/mcp

Pick quire, follow the link to authorize, and you're done.

Gemini CLI

Edit ~/.gemini/settings.json (user scope) or .gemini/settings.json (project scope):

{
  "mcpServers": {
    "quire": {
      "httpUrl": "https://mcp.quire.app/mcp",
      "authProviderType": "dynamic_discovery"
    }
  }
}

Restart Gemini CLI, then trigger OAuth:

/mcp auth quire

dynamic_discovery makes the CLI auto-detect the OAuth requirement, register a client, and open a browser to authorize. (OAuth requires that your local machine can receive a redirect on http://localhost:7777/oauth/callback.)

ChatGPT

ChatGPT supports remote MCP servers as Connectors (available on Plus, Pro, Business, Enterprise, and Edu plans).

  1. Open chatgpt.com and go to Settings → Connectors.
  2. Click Add connector.
  3. Enter a name (for example, Quire) and the URL https://mcp.quire.app/mcp.
  4. Sign in to Quire when prompted and approve access.

Perplexity

Perplexity supports remote MCP servers as Custom Connectors on paid plans (Pro, Max, Enterprise).

  1. Open perplexity.ai and go to Settings → Connectors.
  2. Click Add Connector → Advanced (or Add custom connector).
  3. Enter a name (for example, Quire), set the URL to https://mcp.quire.app/mcp, and choose Streamable HTTP as the transport with OAuth as the authentication method.
  4. Save, then click Connect and sign in to Quire to approve access.

Cursor

Add the following entry to your MCP settings (~/.cursor/mcp.json or Settings → MCP):

{
  "mcpServers": {
    "quire": {
      "url": "https://mcp.quire.app/mcp"
    }
  }
}

Reload Cursor and complete the OAuth flow when prompted.

VS Code (GitHub Copilot Chat)

Create or edit .vscode/mcp.json in your workspace (or the user-level equivalent):

{
  "servers": {
    "quire": {
      "type": "http",
      "url": "https://mcp.quire.app/mcp"
    }
  }
}

Open the Command Palette and run MCP: List Servers, select quire, and start it. VS Code will open a browser to authorize.

Windsurf

Edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "quire": {
      "serverUrl": "https://mcp.quire.app/mcp"
    }
  }
}

Restart Windsurf and authorize when prompted.

Other MCP clients

Any client that supports Streamable HTTP MCP servers with OAuth can connect — just point it at https://mcp.quire.app/mcp. For clients that only speak the older stdio transport, use a bridge such as mcp-remote:

{
  "mcpServers": {
    "quire": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.quire.app/mcp"]
    }
  }
}

Authorization scopes

The first time you connect, Quire shows the standard authorization screen. You can choose:

  • Which organizations and projects the assistant may access.
  • What it may do — the same permission scopes that apply to regular Quire OAuth apps (see Authentication).

You can revoke access at any time from your Quire account settings, or by removing the connector from your AI client.

Privacy and rate limits

  • Quire MCP requests count against the same per-organization API quotas as direct REST calls — see Rate Limits.
  • Conversations with your AI assistant are not stored on Quire's servers; the MCP server only sees the individual tool calls the assistant makes on your behalf.
  • All traffic is encrypted in transit (HTTPS); access tokens are never exposed to model output.

Troubleshooting

  • "Connection refused" or "Failed to authenticate" — make sure the URL is exactly https://mcp.quire.app/mcp (with the /mcp path) and that your client supports the Streamable HTTP transport.
  • Authorization screen never appears — some clients require you to manually trigger the OAuth flow (for example, /mcp in Claude Code). Check the client's MCP server panel for an "authorize" button or status message.
  • The assistant can't see a project — confirm the project belongs to an organization you authorized, and that your Quire role on that project allows the action you're asking for.
  • Tool calls return 429 Too Many Requests — you have hit the per-organization rate limit. The assistant will receive a Retry-After value; wait that many seconds before retrying.

If a problem persists, contact Quire support with the timestamp of the failing request and (if shown) the request ID surfaced by the MCP client.

API Endpoint
https://quire.io/api
Schemes: https
Version: 1.0.0

chat

Chat channels.

Create a chat channel by owner OID.

POST /chat/{ownerType}/{ownerOid}

Adds a new chat channel to the specified owner (currently only project).

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /abc123 is equivalent to /project/abc123.

ownerOid: string
in path

Owner OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK

OK — created chat channel.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to create a chat in this owner.

404 Not Found

Not Found — parent owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Create a chat channel by owner ID.

POST /chat/id/{ownerType}/{ownerId}

Adds a new chat channel to the specified owner by ID (currently only project).

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK

OK — created chat channel.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to create a chat in this owner.

404 Not Found

Not Found — parent owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get a chat channel by ID.

GET /chat/id/{ownerType}/{ownerId}/{chatId}

Returns the full chat channel record for the given owner and channel ID.

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

chatId: string
in path

Chat channel ID.

200 OK

OK — chat channel record.

404 Not Found

Not Found — chat does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get a chat channel by OID.

GET /chat/{oid}

Returns the full chat channel record.

oid: string
in path

Chat channel OID.

200 OK

OK — chat channel record.

404 Not Found

Not Found — chat does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

List chat channels by owner ID.

GET /chat/list/id/{ownerType}/{ownerId}

Returns all chat channel records for the given owner.

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /list/id/foo is equivalent to /list/id/project/foo.

ownerId: string
in path

Owner ID.

200 OK

OK — list of chat channels (may be empty).

404 Not Found

Not Found — parent owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?chat=Highlight101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]

List chat channels by owner OID.

GET /chat/list/{ownerType}/{ownerOid}

Returns all chat channel records for the given owner.

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /list/abc123 is equivalent to /list/project/abc123.

ownerOid: string
in path

Owner OID.

200 OK

OK — list of chat channels (may be empty).

404 Not Found

Not Found — parent owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?chat=Highlight101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]

Undo the removal of a chat channel by ID.

PUT /chat/undo-remove/id/{ownerType}/{ownerId}/{chatId}

Restores a previously-removed chat channel. Idempotent: if the channel is not currently removed, this is a no-op and returns the current channel record.

Subject to the chat-channel-per-project quota: may return 429 Too Many Requests if the plan's chat-channel limit is already reached.

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /undo-remove/id/foo/bar is equivalent to /undo-remove/id/project/foo/bar.

ownerId: string
in path

Owner ID.

chatId: string
in path

Chat channel ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK

OK — restored chat channel.

403 Forbidden

Forbidden — caller lacks permission to modify this chat.

404 Not Found

Not Found — chat does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Undo the removal of a chat channel by OID.

PUT /chat/undo-remove/{oid}

Restores a previously-removed chat channel. Idempotent: if the channel is not currently removed, this is a no-op and returns the current channel record.

Subject to the chat-channel-per-project quota: may return 429 Too Many Requests if the plan's chat-channel limit is already reached.

oid: string
in path

Chat channel OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK

OK — restored chat channel.

403 Forbidden

Forbidden — caller lacks permission to modify this chat.

404 Not Found

Not Found — chat does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update a chat channel by ID.

PUT /chat/id/{ownerType}/{ownerId}/{chatId}

Updates an existing chat channel and returns the updated record.

To archive or unarchive, set archived: true or archived: false in the body.

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

chatId: string
in path

Chat channel ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK

OK — updated chat channel.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify this chat.

404 Not Found

Not Found — chat does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update a chat channel by OID.

PUT /chat/{oid}

Updates an existing chat channel and returns the updated record.

To archive or unarchive, set archived: true or archived: false in the body.

oid: string
in path

Chat channel OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK

OK — updated chat channel.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify this chat.

404 Not Found

Not Found — chat does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Delete a chat channel by ID.

DELETE /chat/id/{ownerType}/{ownerId}/{chatId}

Deletes the specified chat channel.

Note: Returns 204 No Content regardless of whether the chat exists.

ownerType: string
in path

Owner type. Currently only project is supported. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

chatId: string
in path

Chat channel ID.

204 No Content

No Content

Response Content-Types: application/json

Delete a chat channel by OID.

DELETE /chat/{oid}

Deletes the specified chat channel.

Note: Returns 204 No Content regardless of whether the chat exists.

oid: string
in path

Chat channel OID.

204 No Content

No Content

Response Content-Types: application/json

comment

A comment that a user can add to a chat channel or a task.

Upload an attachment to a comment (by comment OID).

POST /comment/attach/{commentOid}/{filename}

Uploads an attachment to an existing comment.

commentOid: string
in path

Comment OID.

filename: string
in path

Attachment file name, e.g., readme.txt.

Provide a meaningful extension so the browser can recognize the MIME type (e.g., revenue.pdf, contacts.json).

Alternatively, set the MIME type via the Content-Type header.

Request Example
"object"

OK — attachment record.

400 Bad Request

Bad Request — bad payload or filename.

403 Forbidden

Forbidden — caller lacks permission to attach to this comment.

404 Not Found

Not Found — comment does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
  "name": "file.txt",
  "length": 20000
}

Add a new comment to a chat channel (by project ID and chat ID).

POST /comment/chat/id/{projectId}/{chatId}

Adds a new comment to the specified chat channel.

projectId: string
in path

Project ID.

chatId: string
in path

Chat channel ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

Content of the new comment (Markdown supported).

asUser: boolean

(Optional) If true, marks this comment as created by the app. Default: false (created by the authorizing user).

pinned: boolean

(Optional) Whether to pin this comment. Default: false.

Request Example
{
  "description": "Adjust style",
  "asUser": true,
  "pinned": false
}
200 OK

OK — created comment record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to add a comment to this chat channel.

404 Not Found

Not Found — chat channel does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Add a new comment to a chat channel (by chat OID).

POST /comment/chat/{chatOid}

Adds a new comment to the specified chat channel.

chatOid: string
in path

OID of the chat channel.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

Content of the new comment (Markdown supported).

asUser: boolean

(Optional) If true, marks this comment as created by the app. Default: false (created by the authorizing user).

pinned: boolean

(Optional) Whether to pin this comment. Default: false.

Request Example
{
  "description": "Adjust style",
  "asUser": true,
  "pinned": false
}
200 OK

OK — created comment record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to add a comment to this chat channel.

404 Not Found

Not Found — chat channel does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Add a new comment to a task (by task OID).

POST /comment/{taskOid}

Adds a new comment to the specified task.

taskOid: string
in path

OID of the task.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

Content of the new comment (Markdown supported).

asUser: boolean

(Optional) If true, marks this comment as created by the app. Default: false (created by the authorizing user).

pinned: boolean

(Optional) Whether to pin this comment. Default: false.

Request Example
{
  "description": "Adjust style",
  "asUser": true,
  "pinned": false
}
200 OK

OK — created comment record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to add a comment to this task.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Add a new comment to a task (by project ID and task ID).

POST /comment/id/{projectId}/{taskId}

Adds a new comment to the specified task.

projectId: string
in path

Project ID.

taskId: integer
in path

Task ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

Content of the new comment (Markdown supported).

asUser: boolean

(Optional) If true, marks this comment as created by the app. Default: false (created by the authorizing user).

pinned: boolean

(Optional) Whether to pin this comment. Default: false.

Request Example
{
  "description": "Adjust style",
  "asUser": true,
  "pinned": false
}
200 OK

OK — created comment record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to add a comment to this task.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Get an existing comment (by comment OID).

GET /comment/{commentOid}

Returns the full comment record.

commentOid: string
in path

Comment OID.

200 OK

OK — comment record.

404 Not Found

Not Found — comment does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Get all comments of a chat channel (by project ID and chat ID).

GET /comment/list/chat/id/{projectId}/{chatId}

Returns all comments of the specified chat channel.

projectId: string
in path

Project ID.

chatId: string
in path

Chat channel ID.

200 OK

OK — list of comments (may be empty).

404 Not Found

Not Found — chat channel does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "oid": "iDsPd.QP_qM.hN.Trymukn8b",
    "description": "It is *cool*!",
    "descriptionText": "It is cool!",
    "descriptionHtml": "It is <i>cool</i>!",
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        }
      }
    ],
    "pinAt": "2018-12-22T02:06:58.158Z",
    "pinBy": "#/definitions/SimpleIdentity",
    "editedBy": "#/definitions/SimpleIdentity",
    "url": "string",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "owner": {
      "url": "https://quire.io/w/my_id",
      "type": "Project",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Get all comments of a chat channel (by chat OID).

GET /comment/list/chat/{chatOid}

Returns all comments of the specified chat channel.

chatOid: string
in path

OID of the chat channel.

200 OK

OK — list of comments (may be empty).

404 Not Found

Not Found — chat channel does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "oid": "iDsPd.QP_qM.hN.Trymukn8b",
    "description": "It is *cool*!",
    "descriptionText": "It is cool!",
    "descriptionHtml": "It is <i>cool</i>!",
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        }
      }
    ],
    "pinAt": "2018-12-22T02:06:58.158Z",
    "pinBy": "#/definitions/SimpleIdentity",
    "editedBy": "#/definitions/SimpleIdentity",
    "url": "string",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "owner": {
      "url": "https://quire.io/w/my_id",
      "type": "Project",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Get all comments of a task (by project ID and task ID).

GET /comment/list/id/{projectId}/{taskId}

Returns all comments of the specified task.

projectId: string
in path

Project ID.

taskId: integer
in path

Task ID.

200 OK

OK — list of comments (may be empty).

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "oid": "iDsPd.QP_qM.hN.Trymukn8b",
    "description": "It is *cool*!",
    "descriptionText": "It is cool!",
    "descriptionHtml": "It is <i>cool</i>!",
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        }
      }
    ],
    "pinAt": "2018-12-22T02:06:58.158Z",
    "pinBy": "#/definitions/SimpleIdentity",
    "editedBy": "#/definitions/SimpleIdentity",
    "url": "string",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "owner": {
      "url": "https://quire.io/w/my_id",
      "type": "Project",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Get all comments of a task (by task OID).

GET /comment/list/{taskOid}

Returns all comments of the specified task.

taskOid: string
in path

OID of the task.

200 OK

OK — list of comments (may be empty).

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "oid": "iDsPd.QP_qM.hN.Trymukn8b",
    "description": "It is *cool*!",
    "descriptionText": "It is cool!",
    "descriptionHtml": "It is <i>cool</i>!",
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        }
      }
    ],
    "pinAt": "2018-12-22T02:06:58.158Z",
    "pinBy": "#/definitions/SimpleIdentity",
    "editedBy": "#/definitions/SimpleIdentity",
    "url": "string",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "owner": {
      "url": "https://quire.io/w/my_id",
      "type": "Project",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Undo the removal of a comment (by comment OID).

PUT /comment/undo-remove/{commentOid}

Restores a previously-removed comment. Idempotent: if the comment is not currently removed, this is a no-op and returns the current comment record.

commentOid: string
in path

Comment OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK

OK — restored comment record.

403 Forbidden

Forbidden — caller lacks permission to restore this comment.

404 Not Found

Not Found — comment does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Update an existing comment (by comment OID).

PUT /comment/{commentOid}

Updates an existing comment and returns the updated record.

commentOid: string
in path

Comment OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New comment content (Markdown supported).

pinned: boolean

(Optional) Whether the comment is pinned.

Request Example
{
  "description": "Adjust style",
  "pinned": false
}
200 OK

OK — updated comment record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify this comment.

404 Not Found

Not Found — comment does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Delete an existing comment (by comment OID).

DELETE /comment/{commentOid}

Deletes an existing comment.

Note: Returns 204 No Content regardless of whether the comment exists.

commentOid: string
in path

Comment OID.

204 No Content

No Content

Response Content-Types: application/json

doc

Documents.

doc

Create a document by owner OID.

POST /doc/{ownerType}/{ownerOid}

Adds a new document to the specified owner (project, organization, folder, or smart-folder).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /abc123 is equivalent to /project/abc123.

ownerOid: string
in path

Owner OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK
Doc

OK — created doc record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to create a doc in this owner.

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

Create a document by owner ID.

POST /doc/id/{ownerType}/{ownerId}

Adds a new document to the specified owner by ID (project, organization, folder, or smart-folder).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK
Doc

OK — created doc record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to create a doc in this owner.

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

Get a document by ID.

GET /doc/id/{ownerType}/{ownerId}/{docId}

Returns the full document record for the given owner and document ID.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

docId: string
in path

Document ID.

200 OK
Doc

OK — doc record.

404 Not Found

Not Found — doc does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

Get a document by OID.

GET /doc/{oid}

Returns the full document record.

oid: string
in path

Document OID.

200 OK
Doc

OK — doc record.

404 Not Found

Not Found — doc does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

List documents by owner ID.

GET /doc/list/id/{ownerType}/{ownerId}

Returns all documents for the specified owner.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /list/id/foo is equivalent to /list/id/project/foo.

ownerId: string
in path

Owner ID.

200 OK
Doc

OK — list of doc records (may be empty).

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?doc=Highlight101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]
doc

List documents by owner OID.

GET /doc/list/{ownerType}/{ownerOid}

Returns all documents for the specified owner.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /list/abc123 is equivalent to /list/project/abc123.

ownerOid: string
in path

Owner OID.

200 OK
Doc

OK — list of doc records (may be empty).

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?doc=Highlight101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]
doc

Undo the removal of a document by ID.

PUT /doc/undo-remove/id/{ownerType}/{ownerId}/{docId}

Restores a previously-removed document. Idempotent: if the document is not currently removed, this is a no-op and returns the current document record.

Subject to the document-per-owner quota: may return 429 Too Many Requests if the plan's document limit is already reached.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /undo-remove/id/foo/bar is equivalent to /undo-remove/id/project/foo/bar.

ownerId: string
in path

Owner ID.

docId: string
in path

Document ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK
Doc

OK — restored doc record.

403 Forbidden

Forbidden — caller lacks permission to restore this doc.

404 Not Found

Not Found — doc does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

Undo the removal of a document by OID.

PUT /doc/undo-remove/{oid}

Restores a previously-removed document. Idempotent: if the document is not currently removed, this is a no-op and returns the current document record.

Subject to the document-per-owner quota: may return 429 Too Many Requests if the plan's document limit is already reached.

oid: string
in path

OID of the document to restore.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK
Doc

OK — restored doc record.

403 Forbidden

Forbidden — caller lacks permission to restore this doc.

404 Not Found

Not Found — doc does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

Update a document by ID.

PUT /doc/id/{ownerType}/{ownerId}/{docId}

Updates an existing document and returns the updated record.

To archive or unarchive, set archived: true or archived: false in the body.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

docId: string
in path

Document ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK
Doc

OK — updated doc record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify this doc.

404 Not Found

Not Found — doc does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

Update a document by OID.

PUT /doc/{oid}

Updates an existing document and returns the updated record.

To archive or unarchive, set archived: true or archived: false in the body.

oid: string
in path

Document OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK
Doc

OK — updated doc record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify this doc.

404 Not Found

Not Found — doc does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}
doc

Delete a document by ID.

DELETE /doc/id/{ownerType}/{ownerId}/{docId}

Deletes the specified document.

Note: Returns 204 No Content regardless of whether the doc exists.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

docId: string
in path

Document ID.

204 No Content

No Content

Response Content-Types: application/json
doc

Delete a document by OID.

DELETE /doc/{oid}

Deletes the specified document.

Note: Returns 204 No Content regardless of whether the doc exists.

oid: string
in path

Document OID.

204 No Content

No Content

Response Content-Types: application/json

insight

Insight views — configurable task views with filters and columns.

Add a custom-field definition to an insight view by ID.

POST /insight/add-field/id/{ownerType}/{ownerId}/{insightId}

Adds a custom-field definition to an insight view, identifying the insight by owner-type + owner ID + insight ID. Only formula and lookup field types are allowed on insight views. See also /insight/add-field/{oid} for the OID form.

ownerType: string project, organization, folder, smart-folder
in path

Owner type.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Required for formula) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Conditional-format rules. Applicable to date, number, money, duration, lookup, and formula fields whose resultType resolves to one of those.

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Required for lookup) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity (e.g. user OIDs when lookupType=User). Values are numbers.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys. Default: User.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Required for select) Option list.

name: string

Unique name for this field. Must be a non-empty string and must not contain }, ", or \.

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

Field type. For insight views, only formula and lookup are accepted.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. When omitted on a money field, defaults to $.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "name": "Priority",
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — created field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight or owner does not exist.

429 Too Many Requests

Too Many Requests — custom-field quota reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Add a custom-field definition to an insight view.

POST /insight/add-field/{oid}

Adds a new custom-field definition to the insight view (by OID). The response is the created field in public form (same shape as entries in Insight.fields, with an extra name key).

Only formula and lookup types are allowed on insight views; all other field types are rejected with 400.

Requires the Admin scope to invoke.

oid: string
in path

Insight OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Required for formula) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Conditional-format rules. Applicable to date, number, money, duration, lookup, and formula fields whose resultType resolves to one of those.

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Required for lookup) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity (e.g. user OIDs when lookupType=User). Values are numbers.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys. Default: User.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Required for select) Option list.

name: string

Unique name for this field. Must be a non-empty string and must not contain }, ", or \.

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

Field type. For insight views, only formula and lookup are accepted.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. When omitted on a money field, defaults to $.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "name": "Priority",
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — created field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight does not exist.

429 Too Many Requests

Too Many Requests — custom-field quota reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Create an insight view by owner OID.

POST /insight/{ownerType}/{ownerOid}

Adds a new insight view to the specified owner (project, organization, folder, or smart-folder).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /abc123 is equivalent to /project/abc123.

ownerOid: string
in path

Owner OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK

OK — created insight record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — owner does not exist.

429 Too Many Requests

Too Many Requests — insight quota reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Create an insight view by owner ID.

POST /insight/id/{ownerType}/{ownerId}

Adds a new insight view to the specified owner by ID (project, organization, folder, or smart-folder).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK

OK — created insight record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — owner does not exist.

429 Too Many Requests

Too Many Requests — insight quota reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get an insight view by ID.

GET /insight/id/{ownerType}/{ownerId}/{insightId}

Returns the full insight record for the given owner and insight ID.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

200 OK

OK — insight record.

404 Not Found

Not Found — insight or owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get an insight view by OID.

GET /insight/{oid}

Returns the full insight record.

oid: string
in path

Insight OID.

200 OK

OK — insight record.

404 Not Found

Not Found — insight does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

List insight views by owner ID.

GET /insight/list/id/{ownerType}/{ownerId}

Returns all insight views for the specified owner.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /list/id/foo is equivalent to /list/id/project/foo.

ownerId: string
in path

Owner ID.

200 OK

OK — list of insight records (may be empty).

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?insight=View101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "fields": "object",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]

List insight views by owner OID.

GET /insight/list/{ownerType}/{ownerOid}

Returns all insight views for the specified owner.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /list/abc123 is equivalent to /list/project/abc123.

ownerOid: string
in path

Owner OID.

200 OK

OK — list of insight records (may be empty).

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?insight=View101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "fields": "object",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]

Reorder a custom-field definition on an insight view by ID.

PUT /insight/move-field/id/{ownerType}/{ownerId}/{insightId}/{fieldName}

Reorders a custom-field definition on an insight view, identifying the insight by owner-type + owner ID + insight ID. Pass ?before={otherName} to place the field before another; omit to move it to the end. See also /insight/move-field/{oid}/{fieldName} for the OID form.

ownerType: string project, organization, folder, smart-folder
in path

Owner type.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

fieldName: string
in path

Name of the field to move.

before: string
in query

(Optional) Name of the field to insert before. If omitted, the field is moved to the end.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — moved field definition.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight or owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Reorder a custom-field definition on an insight view.

PUT /insight/move-field/{oid}/{fieldName}

Moves the named field to a new position. By default the field is moved to the end; pass ?before={otherName} to place it immediately before another field.

Requires the Admin scope to invoke.

Response body is a FieldDefinition with an extra name key (equal to the field's name), or an empty object if the field does not exist or ?before={otherName} refers to a missing field.

oid: string
in path

Insight OID.

fieldName: string
in path

Name of the field to move.

before: string
in query

(Optional) Name of the field to insert before. If omitted, the field is moved to the end.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — moved field definition.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Rename a custom-field definition on an insight view by ID.

PUT /insight/rename-field/id/{ownerType}/{ownerId}/{insightId}/{fieldName}/{newName}

Renames a custom-field definition on an insight view, identifying the insight by owner-type + owner ID + insight ID. The field's content is preserved. See also /insight/rename-field/{oid}/{fieldName}/{newName} for the OID form.

ownerType: string project, organization, folder, smart-folder
in path

Owner type.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

fieldName: string
in path

Current field name.

newName: string
in path

New field name.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — renamed field definition.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight or owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Rename a custom-field definition on an insight view.

PUT /insight/rename-field/{oid}/{fieldName}/{newName}

Renames the field in place and returns the renamed field. The field's content is preserved.

Requires the Admin scope to invoke.

Response body is a FieldDefinition with an extra name key (equal to the new name), or an empty object if the source field is missing or the target name is already in use.

oid: string
in path

Insight OID.

fieldName: string
in path

Current field name.

newName: string
in path

New field name.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — renamed field definition.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Undo the removal of an insight view by ID.

PUT /insight/undo-remove/id/{ownerType}/{ownerId}/{insightId}

Restores a previously-removed insight view. Idempotent: if the insight is not currently removed, this is a no-op and returns the current insight record.

Subject to the insight-per-owner quota: may return 429 Too Many Requests if the plan's insight limit is already reached.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /undo-remove/id/foo/bar is equivalent to /undo-remove/id/project/foo/bar.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK

OK — restored insight record.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight or owner does not exist.

429 Too Many Requests

Too Many Requests — insight quota reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Undo the removal of an insight view by OID.

PUT /insight/undo-remove/{oid}

Restores a previously-removed insight view. Idempotent: if the insight is not currently removed, this is a no-op and returns the current insight record.

Subject to the insight-per-owner quota: may return 429 Too Many Requests if the plan's insight limit is already reached.

oid: string
in path

OID of the insight to restore.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK

OK — restored insight record.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight does not exist.

429 Too Many Requests

Too Many Requests — insight quota reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update a custom-field definition on an insight view by ID.

PUT /insight/update-field/id/{ownerType}/{ownerId}/{insightId}/{fieldName}

Updates an existing custom-field definition on an insight view, identifying the insight by owner-type + owner ID + insight ID. type is immutable; omitted keys preserve current values. See also /insight/update-field/{oid}/{fieldName} for the OID form.

ownerType: string project, organization, folder, smart-folder
in path

Owner type.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

fieldName: string
in path

Name of the field to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Optional, formula only) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Replacement conditional-format rules (replaces the entire list).

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Optional, lookup only) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity. Replaces the entire map.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Optional, select only) Replacement option list (replaces the entire set).

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

(Optional) Field type. Immutable on update — if supplied, must match the existing field's type. Usually omitted; include only to verify the stored type.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. Pass $ to reset a money field to its default.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — updated field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight or owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Update a custom-field definition on an insight view.

PUT /insight/update-field/{oid}/{fieldName}

Updates the content of an existing custom field. type is immutable — if supplied, it must match the existing type. Keys that are omitted leave their current values intact (including individual flag bits — flags are merged, not replaced).

Requires the Admin scope to invoke.

To rename a field, use /insight/rename-field/id/{ownerType}/{ownerId}/{insightId}/{fieldName}/{newName}; to reorder, use /insight/move-field/id/{ownerType}/{ownerId}/{insightId}/{fieldName}. (The /{oid}/... URL form is also accepted.)

Response body is a FieldDefinition with an extra name key (equal to the field's name), or an empty object if the field does not exist.

oid: string
in path

Insight OID.

fieldName: string
in path

Name of the field to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Optional, formula only) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Replacement conditional-format rules (replaces the entire list).

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Optional, lookup only) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity. Replaces the entire map.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Optional, select only) Replacement option list (replaces the entire set).

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

(Optional) Field type. Immutable on update — if supplied, must match the existing field's type. Usually omitted; include only to verify the stored type.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. Pass $ to reset a money field to its default.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — updated field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Update an insight view by ID.

PUT /insight/id/{ownerType}/{ownerId}/{insightId}

Updates an existing insight view and returns the updated record.

To archive or unarchive, set archived: true or archived: false in the body.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK

OK — updated insight record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight or owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update an insight view by OID.

PUT /insight/{oid}

Updates an existing insight view and returns the updated record.

To archive or unarchive, set archived: true or archived: false in the body.

oid: string
in path

Insight OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK

OK — updated insight record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (or Admin scope required).

404 Not Found

Not Found — insight does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Remove a custom-field definition from an insight view by ID.

DELETE /insight/remove-field/id/{ownerType}/{ownerId}/{insightId}/{fieldName}

Removes the named custom field from an insight view, identifying the insight by owner-type + owner ID + insight ID. Returns 204 No Content regardless of whether the field exists. See also /insight/remove-field/{oid}/{fieldName} for the OID form.

ownerType: string project, organization, folder, smart-folder
in path

Owner type.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

fieldName: string
in path

Name of the field to remove.

204 No Content

No Content — field removed (or already absent).

Response Content-Types: application/json

Remove a custom-field definition from an insight view.

DELETE /insight/remove-field/{oid}/{fieldName}

Removes the named custom field from the insight view.

Requires the Admin scope to invoke.

Note: Returns 204 No Content regardless of whether the field exists.

oid: string
in path

Insight OID.

fieldName: string
in path

Name of the field to remove.

204 No Content

No Content — field removed (or already absent).

Response Content-Types: application/json

Delete an insight view by ID.

DELETE /insight/id/{ownerType}/{ownerId}/{insightId}

Deletes the specified insight view.

Note: Returns 204 No Content regardless of whether the insight exists.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed; e.g., /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

Owner ID.

insightId: string
in path

Insight ID.

204 No Content

No Content

Response Content-Types: application/json

Delete an insight view by OID.

DELETE /insight/{oid}

Deletes the specified insight view.

Note: Returns 204 No Content regardless of whether the insight exists.

oid: string
in path

Insight OID.

204 No Content

No Content

Response Content-Types: application/json

notification

Send a notification to the user who authorized this app. Typically used to surface errors or important alerts.

Send a notification.

POST /notification

Sends a notification to the current authorized user.

url: string

(Optional) URL associated with the message. When provided, the client may render the message as a hyperlink.

message: string

Notification message.

Request Example
{
  "url": "https://superheros.com/sync",
  "message": "Unable to synchronize"
}
200 OK

ok

Response Content-Types: application/json

organization

An organization is a group of projects where members collaborate.

Get an organization by ID.

GET /organization/id/{id}

Returns the complete organization record for the given ID.

id: string
in path

Organization ID.

OK — organization record with plan info.

404 Not Found

Not Found — organization does not exist, or is not accessible to the caller.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/c/my_organization",
  "email": "[email protected]",
  "nameText": "My Organization",
  "nameHtml": "My Organization",
  "name": "My Organization",
  "id": "my_organization",
  "website": "https://coolwebsites.com",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "subscription": {
    "due": "2038-02-22T02:06:58Z",
    "expired": false,
    "plan": "Professional"
  },
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Get an organization by OID.

GET /organization/{oid}

Returns the complete organization record for the given OID.

oid: string
in path

Organization OID.

OK — organization record with plan info.

404 Not Found

Not Found — organization does not exist, or is not accessible to the caller.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/c/my_organization",
  "email": "[email protected]",
  "nameText": "My Organization",
  "nameHtml": "My Organization",
  "name": "My Organization",
  "id": "my_organization",
  "website": "https://coolwebsites.com",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "subscription": {
    "due": "2038-02-22T02:06:58Z",
    "expired": false,
    "plan": "Professional"
  },
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Get all organizations.

GET /organization/list

Returns organization records that the current user can authorize for this application, or already has authorized.

200 OK

OK — list of organizations (may be empty).

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/c/my_organization",
    "email": "[email protected]",
    "nameText": "My Organization",
    "nameHtml": "My Organization",
    "name": "My Organization",
    "id": "my_organization",
    "website": "https://coolwebsites.com",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "followers": [
      {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Update an organization by ID.

PUT /organization/id/{id}

Updates an existing organization and returns the complete updated record. Omitted body fields are left unchanged.

id: string
in path

Organization ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full organization record, or compact for identifiers only ({"oid":…, "id":…}). See API description for ?return= semantics.

description: string

(Optional) New description for this organization (Markdown supported).

followers: string[]

(Optional) Followers to replace the current followers of this organization (user OIDs). This replaces all existing followers. To modify incrementally, use addFollowers or removeFollowers.

Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

addFollowers: string[]

(Optional) Followers to add to this organization (user OIDs). Special values:

  • "me": the current user follows the organization
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL when invoking the registered hook. Example: hook https://super.app/hooks/standard + follower app|/soc1/33456/a7https://super.app/hooks/standard/soc1/33456/a7
removeFollowers: string[]

(Optional) Followers to remove from this organization (user OIDs). Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

name: string

(Optional) New display name for this organization (Markdown supported).

Request Example
{
  "description": "**Great** organization to start with.",
  "followers": [
    "string"
  ],
  "addFollowers": [
    "string"
  ],
  "removeFollowers": [
    "string"
  ],
  "name": "My Organization"
}
200 OK

OK — updated organization record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to update this organization.

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/c/my_organization",
  "email": "[email protected]",
  "nameText": "My Organization",
  "nameHtml": "My Organization",
  "name": "My Organization",
  "id": "my_organization",
  "website": "https://coolwebsites.com",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Update an organization by OID.

PUT /organization/{oid}

Updates an existing organization and returns the complete updated record. Omitted body fields are left unchanged.

oid: string
in path

Organization OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full organization record, or compact for identifiers only ({"oid":…, "id":…}). See API description for ?return= semantics.

description: string

(Optional) New description for this organization (Markdown supported).

followers: string[]

(Optional) Followers to replace the current followers of this organization (user OIDs). This replaces all existing followers. To modify incrementally, use addFollowers or removeFollowers.

Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

addFollowers: string[]

(Optional) Followers to add to this organization (user OIDs). Special values:

  • "me": the current user follows the organization
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL when invoking the registered hook. Example: hook https://super.app/hooks/standard + follower app|/soc1/33456/a7https://super.app/hooks/standard/soc1/33456/a7
removeFollowers: string[]

(Optional) Followers to remove from this organization (user OIDs). Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

name: string

(Optional) New display name for this organization (Markdown supported).

Request Example
{
  "description": "**Great** organization to start with.",
  "followers": [
    "string"
  ],
  "addFollowers": [
    "string"
  ],
  "removeFollowers": [
    "string"
  ],
  "name": "My Organization"
}
200 OK

OK — updated organization record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to update this organization.

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/c/my_organization",
  "email": "[email protected]",
  "nameText": "My Organization",
  "nameHtml": "My Organization",
  "name": "My Organization",
  "id": "my_organization",
  "website": "https://coolwebsites.com",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

partner

An external team (aka a partner) is a group of users who can access only the tasks assigned to that team.

Get an external team by OID.

GET /partner/{oid}

Returns the full external team record for the given OID.

oid: string
in path

External team OID.

200 OK

OK — external team record.

404 Not Found

Not Found — external team does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "UI design team",
  "color": "35",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "project": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

List external teams by project ID.

GET /partner/list/id/{projectId}

Returns all external teams in the specified project (by project ID).

projectId: string
in path

Project ID.

200 OK

OK — list of external teams (may be empty).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "name": "UI design team",
    "color": "35",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "project": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

List external teams by project OID.

GET /partner/list/{projectOid}

Returns all external teams in the specified project (by project OID).

projectOid: string
in path

Project OID.

200 OK

OK — list of external teams (may be empty).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "name": "UI design team",
    "color": "35",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "project": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

project

A project represents a prioritized list of tasks in Quire. It belongs to a single organization and is accessible to a subset of users in that organization, depending on its permissions.

Add an approval category to a project by ID.

POST /project/add-appv-cat/id/{id}

Adds an approval category to the project, identifying the project by its ID. See also /project/add-appv-cat/{oid} for the OID form.

Example:

{
  "name": "Legal review",
  "claimers": ["[email protected]"],
  "approvers": ["[email protected]"]
}

Each entry in claimers / approvers is a user OID, ID, or email — same dispatch as the User custom-field type.

id: string
in path

Project ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

claimers: string[]

(Optional) Users allowed to request approval in this category.

  • Omit or null: anyone can request.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
approvers: string[]

(Optional) Users allowed to approve, reject, or request changes in this category.

  • Omit or null: anyone can respond.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
name: string

Display name.

id: string

Category identifier (URL-safe). Must be unique within the project. The identifier "" is reserved for the implicit default category.

Request Example
{
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "name": "Legal Review",
  "id": "legal"
}
200 OK

OK — created approval category.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Legal Review",
  "id": "legal",
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "createdAt": "2026-04-24T10:00:00.000Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Add an approval category to a project.

POST /project/add-appv-cat/{oid}

Adds a new approval category to the project. Projects carry an implicit default category (id "") that is always available; use this endpoint to define additional categories with their own claimer / approver rosters.

Requires the Admin scope to invoke.

oid: string
in path

Project OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

claimers: string[]

(Optional) Users allowed to request approval in this category.

  • Omit or null: anyone can request.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
approvers: string[]

(Optional) Users allowed to approve, reject, or request changes in this category.

  • Omit or null: anyone can respond.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
name: string

Display name.

id: string

Category identifier (URL-safe). Must be unique within the project. The identifier "" is reserved for the implicit default category.

Request Example
{
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "name": "Legal Review",
  "id": "legal"
}
200 OK

OK — created approval category.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Legal Review",
  "id": "legal",
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "createdAt": "2026-04-24T10:00:00.000Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Add a custom-field definition to a project by ID.

POST /project/add-field/id/{id}

Adds a custom-field definition to the project, identifying the project by its ID. See also /project/add-field/{oid} for the OID form.

Example — a single-select "Priority" field with three options:

{
  "name": "Priority",
  "type": "select",
  "options": ["Low", "Medium", "High"]
}

See FieldDefinition for the full list of supported type values (text, number, money, select, checkbox, date, duration, email, hyperlink, user, task, formula, lookup) and the type-specific keys each one accepts.

id: string
in path

Project ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Required for formula) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Conditional-format rules. Applicable to date, number, money, duration, lookup, and formula fields whose resultType resolves to one of those.

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Required for lookup) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity (e.g. user OIDs when lookupType=User). Values are numbers.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys. Default: User.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Required for select) Option list.

name: string

Unique name for this field. Must be a non-empty string and must not contain }, ", or \.

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

Field type. For insight views, only formula and lookup are accepted.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. When omitted on a money field, defaults to $.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "name": "Priority",
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — created custom-field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

429 Too Many Requests

Too Many Requests — plan's custom-field limit is reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Add a custom-field definition to a project.

POST /project/add-field/{oid}

Adds a new custom-field definition to the project (by OID). The response is the created field in public form (same shape as entries in Project.fields, with an extra name key).

Requires the Admin scope to invoke.

oid: string
in path

Project OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Required for formula) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Conditional-format rules. Applicable to date, number, money, duration, lookup, and formula fields whose resultType resolves to one of those.

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Required for lookup) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity (e.g. user OIDs when lookupType=User). Values are numbers.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys. Default: User.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Required for select) Option list.

name: string

Unique name for this field. Must be a non-empty string and must not contain }, ", or \.

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

Field type. For insight views, only formula and lookup are accepted.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. When omitted on a money field, defaults to $.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "name": "Priority",
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — created custom-field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

429 Too Many Requests

Too Many Requests — plan's custom-field limit is reached.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Export a project to CSV by ID.

GET /project/export-csv/id/{id}

Returns a CSV string containing the project, tasks, and related data. Available on the Professional plan and above. Rate-limit cost (#24558): proportional to the project's task count — max(1, ceil(tasks / 100)) units. So a 50-task project costs 1, a 1,000-task project costs 10. (Plus a small fixed export overhead.)

id: string
in path

Project ID.

status: string
in query

Task status filter. Use active for active tasks, completed for completed tasks, or all for all tasks. Default: all.

merge: boolean
in query

Whether to merge multiple values of the same header into one column (e.g., all tags in a single column). Default: false.

200 OK

OK — CSV export of project.

403 Forbidden

Forbidden — caller lacks permission or plan does not include CSV export.

404 Not Found

Not Found — project does not exist.

Response Content-Types: text/csv
Response Example (200 OK)
"ID",Name,Status,Started,Completed,Priority,Start,Due,Assignee,Tag,Created,Created by,Description
#6,Task A,In Progress,"Mar 8, 2022",,Medium,,"Mar 8, 2022",,,"Mar 7, 2022",John,
"#6, #8",Task A1,To-Do,"Jan 24, 2022",,Urgent,,,,,"Mar 7, 2022",John,
#7,Task B,In Progress,"Jan 24, 2022",,Urgent,,"Mar 4, 2022",,,"Mar 7, 2022",John,
"#7, #9",Task B1,In Progress,"Jan 24, 2022",,Medium,,,,,"Mar 7, 2022",John,
"#7, #4",Task B2,In Progress,"Mar 2, 2022",,Medium,,"Mar 8, 2022",,,"Mar 2, 2022",John,

Export a project to CSV by OID.

GET /project/export-csv/{oid}

Returns a CSV string containing the project, tasks, and related data. Available on the Professional plan and above. Rate-limit cost (#24558): proportional to the project's task count — max(1, ceil(tasks / 100)) units. So a 50-task project costs 1, a 1,000-task project costs 10. (Plus a small fixed export overhead.)

oid: string
in path

Project OID.

status: string
in query

Task status filter. Use active for active tasks, completed for completed tasks, or all for all tasks. Default: all.

merge: boolean
in query

Whether to merge multiple values of the same header into one column (e.g., all tags in a single column). Default: false.

200 OK

OK — CSV export of project.

403 Forbidden

Forbidden — caller lacks permission or plan does not include CSV export.

404 Not Found

Not Found — project does not exist.

Response Content-Types: text/csv
Response Example (200 OK)
"ID",Name,Status,Started,Completed,Priority,Start,Due,Assignee,Tag,Created,Created by,Description
#6,Task A,In Progress,"Mar 8, 2022",,Medium,,"Mar 8, 2022",,,"Mar 7, 2022",John,
"#6, #8",Task A1,To-Do,"Jan 24, 2022",,Urgent,,,,,"Mar 7, 2022",John,
#7,Task B,In Progress,"Jan 24, 2022",,Urgent,,"Mar 4, 2022",,,"Mar 7, 2022",John,
"#7, #9",Task B1,In Progress,"Jan 24, 2022",,Medium,,,,,"Mar 7, 2022",John,
"#7, #4",Task B2,In Progress,"Mar 2, 2022",,Medium,,"Mar 8, 2022",,,"Mar 2, 2022",John,

Export a project to JSON by ID.

GET /project/export-json/id/{id}

Returns a JSON map containing the project, all tasks, and related data. Available on the Professional plan and above. Rate-limit cost (#24558): proportional to the project's task count — max(1, ceil(tasks / 100)) units. So a 50-task project costs 1, a 1,000-task project costs 10. (Plus a small fixed export overhead.)

id: string
in path

Project ID.

OK — JSON export of project.

403 Forbidden

Forbidden — caller lacks permission or plan does not include JSON export.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "name": "My Project",
  "id": "My_Project"
}

Export a project to JSON by OID.

GET /project/export-json/{oid}

Returns a JSON map containing the project, all tasks, and related data. Available on the Professional plan and above. Rate-limit cost (#24558): proportional to the project's task count — max(1, ceil(tasks / 100)) units. So a 50-task project costs 1, a 1,000-task project costs 10. (Plus a small fixed export overhead.)

oid: string
in path

Project OID.

OK — JSON export of project.

403 Forbidden

Forbidden — caller lacks permission or plan does not include JSON export.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "name": "My Project",
  "id": "My_Project"
}

Get a project by ID.

GET /project/id/{id}

Returns the complete project record for the given ID.

id: string
in path

Project ID.

OK — project record.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "rootCount": 5,
  "url": "https://quire.io/w/my_project",
  "nameText": "My Project",
  "nameHtml": "My Project",
  "activeCount": 20,
  "taskCount": 30,
  "organization": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "name": "My Project",
  "id": "my_project",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "subscription": {
    "due": "2038-02-22T02:06:58Z",
    "expired": false,
    "plan": "Professional"
  },
  "archivedAt": "2018-12-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "publicAt": "2018-12-22T02:06:58.158Z",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "approvalCategories": [
    {
      "name": "Legal Review",
      "id": "legal",
      "claimers": [
        "string"
      ],
      "approvers": [
        "string"
      ],
      "createdAt": "2026-04-24T10:00:00.000Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "fields": "object",
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Get a project by OID.

GET /project/{oid}

Returns the complete project record for the given OID.

oid: string
in path

Project OID.

OK — project record.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "rootCount": 5,
  "url": "https://quire.io/w/my_project",
  "nameText": "My Project",
  "nameHtml": "My Project",
  "activeCount": 20,
  "taskCount": 30,
  "organization": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "name": "My Project",
  "id": "my_project",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "subscription": {
    "due": "2038-02-22T02:06:58Z",
    "expired": false,
    "plan": "Professional"
  },
  "archivedAt": "2018-12-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "publicAt": "2018-12-22T02:06:58.158Z",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "approvalCategories": [
    {
      "name": "Legal Review",
      "id": "legal",
      "claimers": [
        "string"
      ],
      "approvers": [
        "string"
      ],
      "createdAt": "2026-04-24T10:00:00.000Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "fields": "object",
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Get all authorized projects.

GET /project/list

Returns projects that the current user has authorized for this application.

archived: boolean
in query

Whether to include archived projects. By default, archived projects are excluded. If the parameter is present without a value, true is assumed.

add-task: boolean
in query

Whether to return only projects to which you can add tasks. Default: false. If the parameter is present without a value, true is assumed.

200 OK

OK — list of authorized projects (may be empty).

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "rootCount": 5,
    "url": "https://quire.io/w/my_project",
    "nameText": "My Project",
    "nameHtml": "My Project",
    "activeCount": 20,
    "taskCount": 30,
    "organization": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "name": "My Project",
    "id": "my_project",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "archivedAt": "2018-12-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "publicAt": "2018-12-22T02:06:58.158Z",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "approvalCategories": [
      {
        "name": "Legal Review",
        "id": "legal",
        "claimers": [
          "string"
        ],
        "approvers": [
          "string"
        ],
        "createdAt": "2026-04-24T10:00:00.000Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "fields": "object",
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Get authorized projects by organization ID.

GET /project/list/id/{organizationId}

Returns projects in the specified organization (by ID) that the current user has authorized.

organizationId: string
in path

Organization ID.

archived: boolean
in query

Whether to include archived projects. By default, archived projects are excluded. If the parameter is present without a value, true is assumed.

add-task: boolean
in query

Whether to return only projects to which you can add tasks. Default: false. If the parameter is present without a value, true is assumed.

200 OK

OK — list of authorized projects (may be empty).

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "rootCount": 5,
    "url": "https://quire.io/w/my_project",
    "nameText": "My Project",
    "nameHtml": "My Project",
    "activeCount": 20,
    "taskCount": 30,
    "organization": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "name": "My Project",
    "id": "my_project",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "archivedAt": "2018-12-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "publicAt": "2018-12-22T02:06:58.158Z",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "approvalCategories": [
      {
        "name": "Legal Review",
        "id": "legal",
        "claimers": [
          "string"
        ],
        "approvers": [
          "string"
        ],
        "createdAt": "2026-04-24T10:00:00.000Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "fields": "object",
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Get authorized projects by organization OID.

GET /project/list/{organizationOid}

Returns projects in the specified organization (by OID) that the current user has authorized.

organizationOid: string
in path

Organization OID.

archived: boolean
in query

Whether to include archived projects. By default, archived projects are excluded. If the parameter is present without a value, true is assumed.

add-task: boolean
in query

Whether to return only projects to which you can add tasks. Default: false. If the parameter is present without a value, true is assumed.

200 OK

OK — list of authorized projects (may be empty).

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "rootCount": 5,
    "url": "https://quire.io/w/my_project",
    "nameText": "My Project",
    "nameHtml": "My Project",
    "activeCount": 20,
    "taskCount": 30,
    "organization": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "name": "My Project",
    "id": "my_project",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "archivedAt": "2018-12-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "publicAt": "2018-12-22T02:06:58.158Z",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "approvalCategories": [
      {
        "name": "Legal Review",
        "id": "legal",
        "claimers": [
          "string"
        ],
        "approvers": [
          "string"
        ],
        "createdAt": "2026-04-24T10:00:00.000Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "fields": "object",
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Reorder a custom-field definition on a project by ID.

PUT /project/move-field/id/{id}/{fieldName}

Reorders a custom-field definition on the project, identifying the project by its ID. Pass ?before={otherName} to place the field before another; omit to move it to the end. See also /project/move-field/{oid}/{fieldName} for the OID form.

id: string
in path

Project ID.

fieldName: string
in path

Name of the field to move.

before: string
in query

(Optional) Name of the field to insert before. If omitted, the field is moved to the end.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — moved custom-field definition.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Reorder a custom-field definition on a project.

PUT /project/move-field/{oid}/{fieldName}

Moves the named field to a new position. By default the field is moved to the end; pass ?before={otherName} to place it immediately before another field.

Requires the Admin scope to invoke.

Response body is a FieldDefinition with an extra name key (equal to the field's name), or an empty object if the field does not exist or ?before={otherName} refers to a missing field.

oid: string
in path

Project OID.

fieldName: string
in path

Name of the field to move.

before: string
in query

(Optional) Name of the field to insert before. If omitted, the field is moved to the end.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — moved custom-field definition.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Rename a custom-field definition on a project by ID.

PUT /project/rename-field/id/{id}/{fieldName}/{newName}

Renames a custom-field definition on the project, identifying the project by its ID. The field's content is preserved; task values under the old name are migrated to the new name. See also /project/rename-field/{oid}/{fieldName}/{newName} for the OID form.

id: string
in path

Project ID.

fieldName: string
in path

Current field name.

newName: string
in path

New field name.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — renamed custom-field definition.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Rename a custom-field definition on a project.

PUT /project/rename-field/{oid}/{fieldName}/{newName}

Renames the field in place and returns the renamed field. The field's content is preserved; any task values under the old name are migrated to the new name.

Requires the Admin scope to invoke.

Response body is a FieldDefinition with an extra name key (equal to the new name), or an empty object if the source field is missing or the target name is already in use.

oid: string
in path

Project OID.

fieldName: string
in path

Current field name.

newName: string
in path

New field name.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — renamed custom-field definition.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Update an approval category on a project by ID.

PUT /project/update-appv-cat/id/{id}/{catId}

Updates an approval category on the project, identifying the project by its ID. Partial update — omitted keys preserve their current values; at least one of name, claimers, or approvers must be present. See also /project/update-appv-cat/{oid}/{catId} for the OID form.

id: string
in path

Project ID.

catId: string
in path

Category id.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

claimers: string[]

(Optional) New claimers list — users allowed to request approval in this category.

  • null: anyone can request.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
approvers: string[]

(Optional) New approvers list — users allowed to approve, reject, or request changes in this category.

  • null: anyone can respond.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
name: string

(Optional) New display name.

Request Example
{
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "name": "Legal Review"
}
200 OK

OK — updated approval category.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Legal Review",
  "id": "legal",
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "createdAt": "2026-04-24T10:00:00.000Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update an approval category on a project.

PUT /project/update-appv-cat/{oid}/{catId}

Partial update: any of name, claimers, or approvers may be supplied; omitted keys preserve their current values. At least one key must be present.

Requires the Admin scope to invoke.

Response body is the updated category, or an empty object if the category no longer exists (e.g. removed concurrently).

oid: string
in path

Project OID.

catId: string
in path

Category id.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

claimers: string[]

(Optional) New claimers list — users allowed to request approval in this category.

  • null: anyone can request.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
approvers: string[]

(Optional) New approvers list — users allowed to approve, reject, or request changes in this category.

  • null: anyone can respond.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
name: string

(Optional) New display name.

Request Example
{
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "name": "Legal Review"
}
200 OK

OK — updated approval category.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Legal Review",
  "id": "legal",
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "createdAt": "2026-04-24T10:00:00.000Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update a custom-field definition on a project by ID.

PUT /project/update-field/id/{id}/{fieldName}

Updates an existing custom-field definition on the project, identifying the project by its ID. type is immutable; omitted keys preserve their current values (flags are merged). See also /project/update-field/{oid}/{fieldName} for the OID form.

id: string
in path

Project ID.

fieldName: string
in path

Name of the field to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Optional, formula only) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Replacement conditional-format rules (replaces the entire list).

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Optional, lookup only) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity. Replaces the entire map.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Optional, select only) Replacement option list (replaces the entire set).

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

(Optional) Field type. Immutable on update — if supplied, must match the existing field's type. Usually omitted; include only to verify the stored type.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. Pass $ to reset a money field to its default.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — updated custom-field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Update a custom-field definition on a project.

PUT /project/update-field/{oid}/{fieldName}

Updates the content of an existing custom field. type is immutable — if supplied, it must match the existing type. Keys that are omitted leave their current values intact (including individual flag bits — flags are merged, not replaced).

Requires the Admin scope to invoke.

To rename a field, use /project/rename-field/id/{projectId}/{fieldName}/{newName}; to reorder, use /project/move-field/id/{projectId}/{fieldName}. (The /{oid}/... URL form is also accepted.)

Response body is a FieldDefinition with an extra name key (equal to the field's name), or an empty object if the field does not exist.

oid: string
in path

Project OID.

fieldName: string
in path

Name of the field to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Optional, formula only) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Replacement conditional-format rules (replaces the entire list).

private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Optional, lookup only) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity. Replaces the entire map.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Optional, select only) Replacement option list (replaces the entire set).

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

(Optional) Field type. Immutable on update — if supplied, must match the existing field's type. Usually omitted; include only to verify the stored type.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. Pass $ to reset a money field to its default.

Request Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

OK — updated custom-field definition.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

Update a project by ID.

PUT /project/id/{id}

Updates an existing project and returns the complete updated record.

To archive or unarchive, set archived: true or archived: false in the body.

id: string
in path

Project ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this project (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this project; specify false to unarchive.

start: string

(Optional) Target start date for this project.

due: string

(Optional) Target due date for this project.

followers: string[]

(Optional) Followers to replace the current followers of this project (user OIDs). This replaces all existing followers. To modify incrementally, use addFollowers or removeFollowers.

Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

addFollowers: string[]

(Optional) Followers to add to this project (user OIDs). Special values:

  • "me": the current user follows the project
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL when invoking the registered hook. Example: hook https://super.app/hooks/standard + follower app|/soc1/33456/a7https://super.app/hooks/standard/soc1/33456/a7
removeFollowers: string[]

(Optional) Followers to remove from this project (user OIDs). Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

public: boolean

(Optional) Public toggle. Specify true to make this project public; specify false to make it private.

name: string

(Optional) New display name for this project (Markdown supported).

Request Example
{
  "description": "**Great** project to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl",
    "app"
  ],
  "addFollowers": [
    "sfsvLbDVPvi1QMf2GkDn7VSy"
  ],
  "removeFollowers": [
    "aBuz4MwfZ5CasOae6stnFa2f"
  ],
  "public": true,
  "name": "My Project"
}
200 OK

OK — updated project record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "rootCount": 5,
  "url": "https://quire.io/w/my_project",
  "nameText": "My Project",
  "nameHtml": "My Project",
  "activeCount": 20,
  "taskCount": 30,
  "organization": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "name": "My Project",
  "id": "my_project",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "archivedAt": "2018-12-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "publicAt": "2018-12-22T02:06:58.158Z",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "approvalCategories": [
    {
      "name": "Legal Review",
      "id": "legal",
      "claimers": [
        "string"
      ],
      "approvers": [
        "string"
      ],
      "createdAt": "2026-04-24T10:00:00.000Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "fields": "object",
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Update a project by OID.

PUT /project/{oid}

Updates an existing project and returns the complete updated record.

To archive or unarchive, set archived: true or archived: false in the body.

oid: string
in path

Project OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

description: string

(Optional) New description for this project (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this project; specify false to unarchive.

start: string

(Optional) Target start date for this project.

due: string

(Optional) Target due date for this project.

followers: string[]

(Optional) Followers to replace the current followers of this project (user OIDs). This replaces all existing followers. To modify incrementally, use addFollowers or removeFollowers.

Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

addFollowers: string[]

(Optional) Followers to add to this project (user OIDs). Special values:

  • "me": the current user follows the project
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL when invoking the registered hook. Example: hook https://super.app/hooks/standard + follower app|/soc1/33456/a7https://super.app/hooks/standard/soc1/33456/a7
removeFollowers: string[]

(Optional) Followers to remove from this project (user OIDs). Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

public: boolean

(Optional) Public toggle. Specify true to make this project public; specify false to make it private.

name: string

(Optional) New display name for this project (Markdown supported).

Request Example
{
  "description": "**Great** project to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl",
    "app"
  ],
  "addFollowers": [
    "sfsvLbDVPvi1QMf2GkDn7VSy"
  ],
  "removeFollowers": [
    "aBuz4MwfZ5CasOae6stnFa2f"
  ],
  "public": true,
  "name": "My Project"
}
200 OK

OK — updated project record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission (Admin scope may be required).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "rootCount": 5,
  "url": "https://quire.io/w/my_project",
  "nameText": "My Project",
  "nameHtml": "My Project",
  "activeCount": 20,
  "taskCount": 30,
  "organization": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "name": "My Project",
  "id": "my_project",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "archivedAt": "2018-12-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "publicAt": "2018-12-22T02:06:58.158Z",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "approvalCategories": [
    {
      "name": "Legal Review",
      "id": "legal",
      "claimers": [
        "string"
      ],
      "approvers": [
        "string"
      ],
      "createdAt": "2026-04-24T10:00:00.000Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "fields": "object",
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Remove an approval category from a project by ID.

DELETE /project/remove-appv-cat/id/{id}/{catId}

Removes an approval category from the project, identifying the project by its ID. Any task whose approval references this category has its approval cleared. Returns 204 No Content regardless of whether the category exists. See also /project/remove-appv-cat/{oid}/{catId} for the OID form.

id: string
in path

Project ID.

catId: string
in path

Category id.

204 No Content

No Content — category removed (or already absent).

Response Content-Types: application/json

Remove an approval category from a project.

DELETE /project/remove-appv-cat/{oid}/{catId}

Removes the named category. Any task whose approval references this category has its approval cleared.

Requires the Admin scope to invoke.

Note: Returns 204 No Content regardless of whether the category exists.

oid: string
in path

Project OID.

catId: string
in path

Category id.

204 No Content

No Content — category removed (or already absent).

Response Content-Types: application/json

Remove a custom-field definition from a project by ID.

DELETE /project/remove-field/id/{id}/{fieldName}

Removes the named custom field from the project, identifying the project by its ID. Returns 204 No Content regardless of whether the field exists. See also /project/remove-field/{oid}/{fieldName} for the OID form.

id: string
in path

Project ID.

fieldName: string
in path

Name of the field to remove.

204 No Content

No Content — field removed (or already absent).

Response Content-Types: application/json

Remove a custom-field definition from a project.

DELETE /project/remove-field/{oid}/{fieldName}

Removes the named custom field from the project.

Requires the Admin scope to invoke.

Note: Returns 204 No Content regardless of whether the field exists.

oid: string
in path

Project OID.

fieldName: string
in path

Name of the field to remove.

204 No Content

No Content — field removed (or already absent).

Response Content-Types: application/json

rate_limit

Inspect the current API rate-limit usage for an organization. Calls to this endpoint do not count against the rate limit, so you can query it even when you have been throttled.

Get rate-limit usage by organization ID.

GET /rate_limit/id/{id}

Returns the current per-hour and per-minute API usage for the organization with the given ID. For organizations in a paid master group, counters are shared across all organizations in the group.

id: string
in path

Organization ID.

200 OK

OK — current rate-limit counters.

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "plan": "Enterprise",
  "organization": "YxjapXXRCOYxoaiCT4tT3OQm",
  "hour": {
    "reset": 1774863600,
    "used": 42,
    "limit": 1250,
    "remaining": 1208
  },
  "minute": "#/definitions/RateLimitBucket"
}

Get rate-limit usage by organization OID.

GET /rate_limit/{oid}

Returns the current per-hour and per-minute API usage for the organization with the given OID. For organizations in a paid master group, counters are shared across all organizations in the group.

oid: string
in path

Organization OID.

200 OK

OK — current rate-limit counters.

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "plan": "Enterprise",
  "organization": "YxjapXXRCOYxoaiCT4tT3OQm",
  "hour": {
    "reset": 1774863600,
    "used": 42,
    "limit": 1250,
    "remaining": 1208
  },
  "minute": "#/definitions/RateLimitBucket"
}

status

Task statuses represent progress values for tasks.

Add a new task status (by project OID).

POST /status/{projectOid}

Creates a new task status in the specified project.

projectOid: string
in path

Project OID to add the status to.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

color: string

(Optional) Status color index from Quire’s predefined palette. If omitted, a color will be generated automatically. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35).

name: string

Display name of the status.

value: integer

Non-negative integer indicating progress. Must be unique within its context (e.g., project). Values ≥ 100 are treated as completed.

Request Example
{
  "color": "35",
  "name": "Doing",
  "value": 50
}
200 OK

OK — newly created status.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify the project.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

Add a new task status (by project ID).

POST /status/id/{projectId}

Creates a new task status in the specified project.

projectId: string
in path

Project ID to add the status to.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

color: string

(Optional) Status color index from Quire’s predefined palette. If omitted, a color will be generated automatically. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35).

name: string

Display name of the status.

value: integer

Non-negative integer indicating progress. Must be unique within its context (e.g., project). Values ≥ 100 are treated as completed.

Request Example
{
  "color": "35",
  "name": "Doing",
  "value": 50
}
200 OK

OK — newly created status.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify the project.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

Get a task status by value (project OID).

GET /status/{projectOid}/{value}

Returns the status record matching the given value in the specified project.

projectOid: string
in path

Project OID.

value: integer
in path

Status value to fetch.

200 OK

OK — status record.

404 Not Found

Not Found — project or status does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

Get a task status by value (project ID).

GET /status/id/{projectId}/{value}

Returns the status record matching the given value in the specified project.

projectId: string
in path

Project ID.

value: integer
in path

Status value to fetch.

200 OK

OK — status record.

404 Not Found

Not Found — project or status does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

List all statuses (by project ID).

GET /status/list/id/{projectId}

Returns all status records in the specified project.

projectId: string
in path

Project ID.

200 OK

OK — list of statuses (may be empty).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "color": "35",
    "name": "Doing",
    "value": 50
  }
]

List all statuses (by project OID).

GET /status/list/{projectOid}

Returns all status records in the specified project.

projectOid: string
in path

Project OID.

200 OK

OK — list of statuses (may be empty).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "color": "35",
    "name": "Doing",
    "value": 50
  }
]

Update a task status (by project OID).

PUT /status/{projectOid}/{value}

Updates an existing status and returns the complete updated record. Omitted body fields are left unchanged.

projectOid: string
in path

Project OID.

value: integer
in path

Status value to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

color: string

(Optional) Status color index from Quire’s predefined palette (two digits: first 0–5, second 0–7; e.g., 35).

name: string

(Optional) New display name for the status.

value: integer

(Optional) New numeric status value. Non-negative integer indicating progress. Must be unique within the context (e.g., project). Values ≥ 100 are treated as completed.

Request Example
{
  "color": "35",
  "name": "Later",
  "value": 50
}
200 OK

OK — updated status record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify the project.

404 Not Found

Not Found — project or status does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

Update a task status (by project ID).

PUT /status/id/{projectId}/{value}

Updates an existing status and returns the complete updated record. Omitted body fields are left unchanged.

projectId: string
in path

Project ID.

value: integer
in path

Status value to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

color: string

(Optional) Status color index from Quire’s predefined palette (two digits: first 0–5, second 0–7; e.g., 35).

name: string

(Optional) New display name for the status.

value: integer

(Optional) New numeric status value. Non-negative integer indicating progress. Must be unique within the context (e.g., project). Values ≥ 100 are treated as completed.

Request Example
{
  "color": "35",
  "name": "Later",
  "value": 50
}
200 OK

OK — updated status record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify the project.

404 Not Found

Not Found — project or status does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

Delete a task status (by project OID).

DELETE /status/{projectOid}/{value}

Deletes the specified status.

Note: Returns 204 No Content regardless of whether the status exists.

projectOid: string
in path

Project OID.

value: integer
in path

Status value to delete.

204 No Content

No Content

Response Content-Types: application/json

Delete a task status (by project ID).

DELETE /status/id/{projectId}/{value}

Deletes the specified status.

Note: Returns 204 No Content regardless of whether the status exists.

projectId: string
in path

Project ID.

value: integer
in path

Status value to delete.

204 No Content

No Content

Response Content-Types: application/json

storage

A simple key–value storage for application-specific data. Data is scoped to the current access token and will be deleted when the token is revoked or expires.

Get a stored value.

GET /storage/{name}

Returns the application-specific value stored under the given name. Note: values are scoped per access token.

name: string
in path

The key name.

200 OK

OK — stored value.

404 Not Found

Not Found — no value stored under this key for the current access token.

Response Content-Types: application/json
Response Example (200 OK)
{
  "key": "My data"
}

List all stored entries.

GET /storage/list

Returns all stored entries (up to 20) for the current access token.

200 OK

OK — list of stored entries (may be empty).

Response Content-Types: application/json
Response Example (200 OK)
{
  "currentProject": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "myList": "[\"alpha\", \"beta\", \"gamma\"]",
  "latest": {
    "key": "My data"
  }
}

List stored entries by prefix.

GET /storage/list/{prefix}

Returns up to 20 entries whose keys start with the given prefix. Use this to page or group application-specific values by a common key prefix.

prefix: string
in path

Key prefix to match.

200 OK

OK — list of matching entries (may be empty).

Response Content-Types: application/json
Response Example (200 OK)
{
  "currentProject": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "myList": "[\"alpha\", \"beta\", \"gamma\"]",
  "latest": {
    "key": "My data"
  }
}

Create or update a stored value.

PUT /storage/{name}

Creates or replaces the value stored under the given name. If null is provided as the value, the key will be deleted. Note: values are scoped per access token.

name: string
in path

The key name.

key: string

Value stored under the given key.

Request Example
{
  "key": "My data"
}
204 No Content

No Content — value stored (or deleted if null).

400 Bad Request

Bad Request — payload too large, or malformed JSON.

Response Content-Types: application/json

Delete a stored value.

DELETE /storage/{name}

Deletes the value stored under the given name.

Note: Returns 204 No Content regardless of whether the value exists. Also note: values are scoped per access token.

name: string
in path

The key name.

204 No Content

No Content

Response Content-Types: application/json

sublist

A sublist is a collection of tasks, representing a subset of tasks from a larger scope.

Create a sublist by owner OID.

POST /sublist/{ownerType}/{ownerOid}

Creates a new sublist under the specified owner (by OID).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /abc123 is equivalent to /project/abc123.

ownerOid: string
in path

OID of the owner the new sublist will belong to.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

includes: string[]

(Optional) List of task OIDs to include in this sublist. All descendants of the specified tasks will be included as well.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "includes": [
    "string"
  ],
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK

OK — created sublist record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to create a sublist under this owner.

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Create a sublist by owner ID.

POST /sublist/id/{ownerType}/{ownerId}

Creates a new sublist under the specified owner (by ID).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

ID of the owner the new sublist will belong to.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

includes: string[]

(Optional) List of task OIDs to include in this sublist. All descendants of the specified tasks will be included as well.

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Request Example
{
  "includes": [
    "string"
  ],
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}
200 OK

OK — created sublist record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to create a sublist under this owner.

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get a sublist by ID.

GET /sublist/id/{ownerType}/{ownerId}/{sublistId}

Returns the complete sublist record for the given ID.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

ID of the owner the sublist belongs to.

sublistId: string
in path

ID of the sublist.

200 OK

OK — sublist record.

404 Not Found

Not Found — sublist does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get a sublist by OID.

GET /sublist/{oid}

Returns the complete sublist record for the given OID.

oid: string
in path

OID of the sublist.

200 OK

OK — sublist record.

404 Not Found

Not Found — sublist does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

List sublists by owner ID.

GET /sublist/list/id/{ownerType}/{ownerId}

Returns all sublists under the specified owner (by ID).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /list/id/foo is equivalent to /list/id/project/foo.

ownerId: string
in path

ID of the owner.

200 OK

OK — list of sublist records (may be empty).

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?sublist=Highlight101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]

List sublists by owner OID.

GET /sublist/list/{ownerType}/{ownerOid}

Returns all sublists under the specified owner (by OID).

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /list/abc123 is equivalent to /list/project/abc123.

ownerOid: string
in path

OID of the owner.

200 OK

OK — list of sublist records (may be empty).

404 Not Found

Not Found — owner does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/w/my_project?sublist=Highlight101",
    "nameText": "Highlight 101",
    "nameHtml": "Highlight 101",
    "name": "Highlight 101",
    "id": "Highlight101",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "partner": {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "archivedAt": "2020-02-22T02:06:58.158Z",
    "start": "2024-01-02",
    "due": "2024-05-25",
    "owner": {
      "url": "https://quire.io/w/prj_id",
      "type": "Project",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  }
]

Undo the removal of a sublist by ID.

PUT /sublist/undo-remove/id/{ownerType}/{ownerId}/{sublistId}

Restores a previously-removed sublist. Idempotent: if the sublist is not currently removed, this is a no-op and returns the current sublist record.

Subject to the sublist-per-owner quota: may return 429 Too Many Requests if the plan's sublist limit is already reached.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /undo-remove/id/foo/bar is equivalent to /undo-remove/id/project/foo/bar.

ownerId: string
in path

ID of the owner.

sublistId: string
in path

ID of the sublist to restore.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK

OK — restored sublist record.

403 Forbidden

Forbidden — caller lacks permission to restore this sublist.

404 Not Found

Not Found — sublist does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Undo the removal of a sublist by OID.

PUT /sublist/undo-remove/{oid}

Restores a previously-removed sublist. Idempotent: if the sublist is not currently removed, this is a no-op and returns the current sublist record.

Subject to the sublist-per-owner quota: may return 429 Too Many Requests if the plan's sublist limit is already reached.

oid: string
in path

OID of the sublist to restore.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

200 OK

OK — restored sublist record.

403 Forbidden

Forbidden — caller lacks permission to restore this sublist.

404 Not Found

Not Found — sublist does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update a sublist by ID.

PUT /sublist/id/{ownerType}/{ownerId}/{sublistId}

Updates an existing sublist and returns the complete updated record.

To archive or unarchive, set archived: true or archived: false in the body.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

ID of the owner.

sublistId: string
in path

ID of the sublist to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

changes: Change

(Optional) List of changes that add or remove tasks from this sublist. See Change for the operation schema.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "changes": [
    {
      "exclude": false,
      "single": false,
      "task": "2MmYOpJH_ZLeehIjjytH1Rwr"
    }
  ],
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK

OK — updated sublist record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify this sublist.

404 Not Found

Not Found — sublist does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update a sublist by OID.

PUT /sublist/{oid}

Updates an existing sublist and returns the complete updated record.

To archive or unarchive, set archived: true or archived: false in the body.

oid: string
in path

OID of the sublist to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

changes: Change

(Optional) List of changes that add or remove tasks from this sublist. See Change for the operation schema.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Request Example
{
  "changes": [
    {
      "exclude": false,
      "single": false,
      "task": "2MmYOpJH_ZLeehIjjytH1Rwr"
    }
  ],
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}
200 OK

OK — updated sublist record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to modify this sublist.

404 Not Found

Not Found — sublist does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Delete a sublist by ID.

DELETE /sublist/id/{ownerType}/{ownerId}/{sublistId}

Deletes the sublist with the given ID.

Note: Returns 204 No Content regardless of whether the sublist exists.

ownerType: string
in path

Owner type. One of project, organization, folder, or smart-folder. If omitted, project is assumed. For example, /id/foo is equivalent to /id/project/foo.

ownerId: string
in path

ID of the owner.

sublistId: string
in path

ID of the sublist to delete.

204 No Content

No Content

Response Content-Types: application/json

Delete a sublist by OID.

DELETE /sublist/{oid}

Deletes the sublist with the given OID.

Note: Returns 204 No Content regardless of whether the sublist exists.

oid: string
in path

OID of the sublist to delete.

204 No Content

No Content

Response Content-Types: application/json

tag

A tag is a label that can be attached to a task in Quire.

tag

Create a tag.

POST /tag/{projectOid}

Creates a new tag in the specified project (by OID).

projectOid: string
in path

OID of the project to add the new tag to. Specify "-" to add it to personal tasks (My Tasks, not in a specific project).

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

color: string

(Optional) Tag color index from Quire’s predefined palette. If omitted, a color will be generated automatically. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35).

name: string

Display name of the tag.

global: boolean

(Optional) Whether this tag is global (available across projects). If omitted, the tag is not global.

Request Example
{
  "color": "35",
  "name": "Later",
  "global": true
}
200 OK
Tag

OK — newly created tag.

400 Bad Request

Bad Request — body validation failed (e.g., name missing or too long).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "global": true,
  "color": "35",
  "name": "Later",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "project": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}
tag

Create a tag.

POST /tag/id/{projectId}

Creates a new tag in the specified project (by ID).

projectId: string
in path

ID of the project to add the new tag to. Specify "-" to add it to personal tasks (My Tasks, not in a specific project).

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

color: string

(Optional) Tag color index from Quire’s predefined palette. If omitted, a color will be generated automatically. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35).

name: string

Display name of the tag.

global: boolean

(Optional) Whether this tag is global (available across projects). If omitted, the tag is not global.

Request Example
{
  "color": "35",
  "name": "Later",
  "global": true
}
200 OK
Tag

OK — newly created tag.

400 Bad Request

Bad Request — body validation failed.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "global": true,
  "color": "35",
  "name": "Later",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "project": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}
tag

Get a tag.

GET /tag/{oid}

Returns the complete tag record for the given OID.

oid: string
in path

OID of the tag to fetch.

200 OK
Tag

OK — tag record.

404 Not Found

Not Found — tag does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "global": true,
  "color": "35",
  "name": "Later",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "project": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}
tag

List tags by project ID.

GET /tag/list/id/{projectId}

Returns all tags in the specified project (by ID).

projectId: string
in path

ID of the project. Specify "-" to list tags used in personal tasks (My Tasks, not in a specific project).

200 OK
Tag

OK — list of tags (may be empty).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "global": true,
    "color": "35",
    "name": "Later",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "project": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]
tag

List tags by project OID.

GET /tag/list/{projectOid}

Returns all tags in the specified project (by OID).

projectOid: string
in path

OID of the project. Specify "-" to list tags used in personal tasks (My Tasks, not in a specific project).

200 OK
Tag

OK — list of tags (may be empty).

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "global": true,
    "color": "35",
    "name": "Later",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "project": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]
tag

Update a tag.

PUT /tag/{oid}

Updates an existing tag and returns the complete updated record. Omitted body fields are left unchanged.

oid: string
in path

OID of the tag to update.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

color: string

(Optional) Tag color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 35, 57). NOT a CSS hex color.

project: string

(Optional) Project OID that this tag is limited to. Used only when global is explicitly set to false; ignored otherwise.

name: string

(Optional) New display name for the tag.

global: boolean

(Optional) Whether the tag is global (available across projects). If set to false, you must also provide project.

Request Example
{
  "color": "35",
  "project": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "name": "Later",
  "global": true
}
200 OK
Tag

OK — updated tag record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to update this tag.

404 Not Found

Not Found — tag does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "global": true,
  "color": "35",
  "name": "Later",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "project": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}
tag

Delete a tag.

DELETE /tag/{oid}

Deletes the tag with the given OID.

Note: Returns 204 No Content regardless of whether the tag exists.

oid: string
in path

OID of the tag to delete.

204 No Content

No Content

Response Content-Types: application/json

task

Tasks are the basic units of work you and your team collaborate on.

Add a time log to a task by ID.

POST /task/add-timelog/id/{projectId}/{taskId}

Adds a time log to the task identified by project + task ID. The new log is credited to the authenticated caller unless user is supplied in the body.

Identity of a log is the triple (user, start, end). Sub-second precision in start / end is truncated to whole seconds.

On success returns the task's full timelogs array. Example:

[
  {
    "start": "2026-04-26T09:00:00.000Z",
    "end": "2026-04-26T10:30:00.000Z",
    "billable": true,
    "note": "Pair-programming session",
    "user": { "oid": "u-123", "name": "John Doe" }
  }
]
projectId: string
in path

Project ID.

taskId: integer
in path

Task ID.

end: string

End timestamp (ISO 8601, UTC). Must be on or after start. Sub-second precision is truncated to whole seconds.

user: string

(Optional) User identifier (OID, ID, or email) the log is credited to. Omitted, null, or empty defaults to the authenticated caller. Unknown users return 400 Bad Request.

start: string

Start timestamp (ISO 8601, UTC). Sub-second precision is truncated to whole seconds.

billable: boolean

(Optional) Whether this log is billable. Omitted or null defaults to true.

note: string

(Optional) Free-form note for the log. Omitted, null, or empty stores no note.

Request Example
{
  "end": "2026-04-26T10:30:00Z",
  "user": "[email protected]",
  "start": "2026-04-26T09:00:00Z",
  "billable": true,
  "note": "Pair-programming session"
}
200 OK

OK — task's full timelogs array.

400 Bad Request

Bad Request — start / end missing or malformed, end precedes start, or user is unknown.

404 Not Found

Not Found — task does not exist.

409 Conflict

Conflict — a log with the same (user, start, end) already exists; use PUT /task/update-timelog/... to amend it.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "start": "2023-02-20T00:00:00.000Z",
    "end": "2023-02-20T00:05:35.000Z",
    "user": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "billable": true,
    "note": "A piece of cake"
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (409 Conflict)
{
  "code": 429,
  "message": "Something went wrong."
}

Add a time log to a task by OID.

POST /task/add-timelog/{oid}

Adds a time log to a task, identifying the task by OID. See POST /task/add-timelog/id/{projectId}/{taskId} for the preferred by-ID form, full semantics, and an example response.

oid: string
in path

Task OID.

end: string

End timestamp (ISO 8601, UTC). Must be on or after start. Sub-second precision is truncated to whole seconds.

user: string

(Optional) User identifier (OID, ID, or email) the log is credited to. Omitted, null, or empty defaults to the authenticated caller. Unknown users return 400 Bad Request.

start: string

Start timestamp (ISO 8601, UTC). Sub-second precision is truncated to whole seconds.

billable: boolean

(Optional) Whether this log is billable. Omitted or null defaults to true.

note: string

(Optional) Free-form note for the log. Omitted, null, or empty stores no note.

Request Example
{
  "end": "2026-04-26T10:30:00Z",
  "user": "[email protected]",
  "start": "2026-04-26T09:00:00Z",
  "billable": true,
  "note": "Pair-programming session"
}
200 OK

OK — task's full timelogs array.

400 Bad Request

Bad Request.

404 Not Found

Not Found — task does not exist.

409 Conflict

Conflict — duplicate (user, start, end).

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "start": "2023-02-20T00:00:00.000Z",
    "end": "2023-02-20T00:05:35.000Z",
    "user": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "billable": true,
    "note": "A piece of cake"
  }
]

Set or transition a task's approval state.

POST /task/approve/id/{projectId}/{taskId}

Sets the task's approval, or transitions it from its current state. The ?state= query parameter selects the transition:

  • request — request approval, or roll forward from approved / rejected / changes back to awaiting.
  • approve / reject / change — approver's decision.

The caller must be a claimer (for request) or an approver (for approve / reject / change) of the category. The original requester is preserved across approve / reject / change transitions.

Example: POST /task/approve/id/my_project/42?category=Legal&state=approve (the request body is unused and may be empty).

To cancel an approval, use DELETE /task/revoke-approval/id/{projectId}/{taskId}.

Returns 400 Bad Request if ?state= is missing or unknown; 403 Forbidden if the caller isn't a claimer / approver; 404 Not Found if the task or ?category= doesn't exist.

projectId: string
in path

Project ID.

taskId: integer
in path

Task ID.

state: string request, approve, reject, change
in query

Approval transition to apply. Same vocabulary as bulk-approve.

category: string
in query

(Optional) Approval category ID. Defaults to the project's default category (id "").

return: string full, compact
in query

(Optional) Response shape: full (default) for the full approval record, or compact for identifiers only ({"oid": <taskOid>, "id": <taskId>}). See API description for ?return= semantics.

200 OK

successful operation

Response Content-Types: application/json
Response Example (200 OK)
{
  "category": "legal",
  "requester": "string",
  "approver": "string",
  "toggledAt": "2026-04-24T10:05:00.000Z",
  "state": "awaiting"
}

Set or transition a task's approval state by OID.

POST /task/approve/{oid}

OID-form of POST /task/approve/id/{projectId}/{taskId} — see that endpoint for ?state= / ?category= grammar, permission rules, and error semantics.

oid: string
in path

Task OID.

state: string request, approve, reject, change
in query

(no description)

category: string
in query

(no description)

return: string full, compact
in query

(no description)

200 OK

successful operation

Response Content-Types: application/json
Response Example (200 OK)
{
  "category": "legal",
  "requester": "string",
  "approver": "string",
  "toggledAt": "2026-04-24T10:05:00.000Z",
  "state": "awaiting"
}

Upload an attachment to a task by ID.

POST /task/attach/id/{projectId}/{taskId}/{filename}

Uploads an attachment to an existing task.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

taskId: integer
in path

Task ID.

filename: string
in path

Attachment file name, e.g., readme.txt.

Provide a meaningful extension so the browser can recognize the MIME type (e.g., revenue.pdf, contacts.json).

Alternatively, set the MIME type via the Content-Type header.

Request Example
"object"

OK — newly created attachment.

400 Bad Request

Bad Request — filename or payload invalid.

403 Forbidden

Forbidden — caller lacks permission to attach to this task.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
  "name": "file.txt",
  "length": 20000
}

Upload an attachment to a task by OID.

POST /task/attach/{taskOid}/{filename}

Uploads an attachment to an existing task.

taskOid: string
in path

Task OID.

filename: string
in path

Attachment file name, e.g., readme.txt.

Provide a meaningful extension so the browser can recognize the MIME type (e.g., revenue.pdf, contacts.json).

Alternatively, set the MIME type via the Content-Type header.

Request Example
"object"

OK — newly created attachment.

400 Bad Request

Bad Request — filename or payload invalid.

403 Forbidden

Forbidden — caller lacks permission to attach to this task.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
  "name": "file.txt",
  "length": 20000
}

Bulk-add N root tasks to a project by ID.

POST /task/bulk-add/id/{projectId}

Creates up to 300 root tasks in one transaction.

Body is a top-level JSON array of CreateTaskBody items (no envelope) — same shape as single-task POST /task/.... Items can include nested tasks to create subtrees in the same call; only the root of each item is echoed in the response (use GET /task/list/id/{projectId}/{rootId} to enumerate the created subtree).

Example request body:

[
  {
    "name": "Design new logo",
    "priority": 2,
    "tags": ["design"],
    "assignees": ["me"]
  },
  { "name": "Write spec", "due": "2026-05-10" },
  { "name": "Review" }
]

Example response (full mode, abbreviated):

[
  { "oid": "iuRRiKoyrxdBFhFTTo", "id": 42, "name": "Design new logo", "priority": 2 },
  { "oid": "abcXyzPqRs",        "id": 43, "name": "Write spec" },
  { "oid": "defLmnQrSt",        "id": 44, "name": "Review" }
]

With ?return=compact, each element is just {oid, id}.

Atomic: any per-item validation / permission / DB error rolls back the whole batch and returns {code, message} with items[i]: prefixed so the agent can pinpoint the offending row. Fix the value and retry. Example error:

{ "code": 400, "message": "items[1]: Invalid value for `priority`: 99 (expected -1, 0, 1, or 2)" }

Rate-limit cost: each bulk call costs N units against the per-minute / per-hour API quota, where N is the number of submitted items — the same total cost as N equivalent single-task calls. Charged upfront; if the cost would exceed the quota, the whole batch is rejected with 429 before any item is processed.

projectId: string
in path

Project ID.

return: string full, compact
in query

(Optional) Response shape — full (default) or compact (returns {oid, id} per element instead of the full task record). Recommended for large batches.

Request Example
[
  {
    "description": "This is a *cool* task.",
    "assignees": [
      "6QMKkEPBVWETLWrXqws94ALU"
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "recurrence": {
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "asUser": true,
    "followers": [
      "tzufRLqCnud74dARyDSvjWDl"
    ],
    "successors": "[\"#13\"]",
    "yourField": "object",
    "tags": [
      "X6nmx9XjEO2wKbqeB1pRT43C"
    ],
    "tasks": [
      "#/definitions/CreateTaskBody"
    ],
    "name": "Design new **logo**",
    "etc": 0,
    "status": 0,
    "priority": 0,
    "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
  }
]
200 OK

OK — array of created tasks (one per submitted item, root only for nested subtrees).

400 Bad Request

Bad Request — body not a JSON array, empty, over the 300-item cap, or any per-item validation failure (whole batch rolled back).

403 Forbidden

Forbidden — caller lacks permission to add tasks to the project.

404 Not Found

Not Found — project does not exist.

413 Request Entity Too Large

Payload Too Large — body exceeds the API packet size limit.

429 Too Many Requests

Too Many Requests — the batch's rate-limit cost (items.length units) would exceed the caller's per-minute / per-hour API quota, OR the batch would exceed the project's task quota.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-add N tasks relative to a task by ID.

POST /task/bulk-add/id/{projectId}/{taskId}

Creates up to 300 tasks anchored at the task identified by projectId + taskId. The optional ?position= query parameter mirrors single-task POST /task/... semantics:

  • parent (default): children of the anchor task.
  • before: siblings immediately before the anchor.
  • after: siblings immediately after the anchor.

Submitted-order is preserved across the batch regardless of ?position= (the server uses a sliding-chain insert internally) — i.e. given input [A, B, C], the final tree order is always A, B, C from left to right.

Example: POST /task/bulk-add/id/my_project/42?position=after&return=compact

Request body:

[
  { "name": "Subtask 1" },
  { "name": "Subtask 2" },
  { "name": "Subtask 3" }
]

Response (compact mode):

[
  { "oid": "abc1", "id": 100 },
  { "oid": "abc2", "id": 101 },
  { "oid": "abc3", "id": 102 }
]

All three become siblings of task 42, in submitted order, immediately after task 42.

See POST /task/bulk-add/id/{projectId} for full body / response semantics, atomic-rollback rules, and ?return= details.

projectId: string
in path

Project ID.

taskId: integer
in path

Anchor task ID.

position: string parent, before, after
in query

(Optional) Placement of the new tasks relative to the anchor: parent (default), before, or after. Any other value returns 400 Bad Request.

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  {
    "description": "This is a *cool* task.",
    "assignees": [
      "6QMKkEPBVWETLWrXqws94ALU"
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "recurrence": {
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "asUser": true,
    "followers": [
      "tzufRLqCnud74dARyDSvjWDl"
    ],
    "successors": "[\"#13\"]",
    "yourField": "object",
    "tags": [
      "X6nmx9XjEO2wKbqeB1pRT43C"
    ],
    "tasks": [
      "#/definitions/CreateTaskBody"
    ],
    "name": "Design new **logo**",
    "etc": 0,
    "status": 0,
    "priority": 0,
    "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
  }
]
200 OK

OK — array of created tasks.

400 Bad Request

Bad Request.

403 Forbidden

Forbidden.

404 Not Found

Not Found — project or anchor task does not exist.

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-add N tasks by OID (project or task anchor).

POST /task/bulk-add/{oid}

Creates up to 300 tasks anchored at the entity identified by oid — a project OID creates root tasks, a task OID creates subtasks (or siblings, depending on ?position=).

See the by-ID forms POST /task/bulk-add/id/{projectId} and POST /task/bulk-add/id/{projectId}/{taskId} for body shape, atomic semantics, sliding-chain order preservation, and response details.

oid: string
in path

OID of the project (root tasks) or anchor task (subtasks / siblings, per ?position=).

position: string parent, before, after
in query

(Optional) Placement when oid refers to a task: parent (default), before, or after. Ignored when oid is a project.

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  {
    "description": "This is a *cool* task.",
    "assignees": [
      "6QMKkEPBVWETLWrXqws94ALU"
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "recurrence": {
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "asUser": true,
    "followers": [
      "tzufRLqCnud74dARyDSvjWDl"
    ],
    "successors": "[\"#13\"]",
    "yourField": "object",
    "tags": [
      "X6nmx9XjEO2wKbqeB1pRT43C"
    ],
    "tasks": [
      "#/definitions/CreateTaskBody"
    ],
    "name": "Design new **logo**",
    "etc": 0,
    "status": 0,
    "priority": 0,
    "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
  }
]
200 OK

OK — array of created tasks.

400 Bad Request

Bad Request.

403 Forbidden

Forbidden.

404 Not Found

Not Found — anchor does not exist.

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-approve N tasks in a project by ID.

POST /task/bulk-approve/id/{projectId}

Applies a single approval transition (request / approve / reject / change) to all tasks in the batch. Body is a top-level JSON array of task references (OID string, integer ID, or "#<id>" string; mixed forms allowed). Up to 300 items per call.

Same atomic / skip-not-found / items[i]: error / rate-limit conventions as the other bulk endpoints (see bulk-update for details).

Example:

POST /task/bulk-approve/id/my_project?category=Legal&state=approve
Body: [42, "#43", "iuRRiKoyrxdBFhFTTo"]

Permissions — same per-task role checks as the single-task POST /task/approve/id/{projectId}/{taskId}. Any per-item permission failure rolls back the whole batch with an items[i]: ... prefixed error.

projectId: string
in path

Project ID.

state: string request, approve, reject, change
in query

Approval transition to apply to every task in the batch. request requests approval (or rolls forward from a decided state back to awaiting); approve / reject / change records the approver's decision.

category: string
in query

(Optional) Approval category ID. Defaults to the project's default category (id "").

return: string full, compact
in query

(Optional) Response shape — full (default; per-item full task record with approval field) or compact (per-item {oid, id}). null slots are preserved in either mode.

Request Example
[
  "object"
]

OK — array of updated tasks (same length as the request body; null for skipped items whose task wasn't found).

400 Bad Request

Bad Request — body shape, missing or invalid ?state=, malformed item ref, or per-item validation error (with items[i]: prefix).

403 Forbidden

Forbidden — caller lacks claimer / approver role on at least one item (whole batch rolled back).

404 Not Found

Not Found — project or approval ?category= does not exist.

429 Too Many Requests

Too Many Requests — bulk rate-limit cost is N units (one per item).

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-approve N tasks in a project by OID.

POST /task/bulk-approve/{projectOid}

OID-form of POST /task/bulk-approve/id/{projectId} — see that endpoint for body shape, query params, atomic / skip-not-found semantics, and rate-limit details.

projectOid: string
in path

Project OID.

state: string request, approve, reject, change
in query

(no description)

category: string
in query

(no description)

return: string full, compact
in query

(no description)

Request Example
[
  "object"
]

successful operation

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]

Add a new root task.

POST /task/id/{projectId}

Adds a new root task to a project.

Minimal request body only needs name. A fuller example:

{
  "name": "Design new logo",
  "description": "Needs to match the brand guide.",
  "priority": 2,
  "tags": ["design", "urgent"],
  "assignees": ["me"],
  "start": "2026-05-01",
  "due": "2026-05-10",
  "Priority": 3,
  "Owners": ["[email protected]"]
}

Priority / Owners in this example are custom-field keys from the project's own /project/add-field definitions — they are not fixed API fields and are only recognised by name. See CreateTaskBody.yourField for the rules on each custom-field type.

projectId: string
in path

ID of the project to which this new task will be added. The task will be created as a root task. Specify "-" to add it to personal tasks (in My Tasks).

return: string full, compact
in query

(Optional) Response shape: full (default) for the full task record, or compact for identifiers only ({"oid":…, "id":…}). See POST /task/{oid} for full semantics.

description: string

(Optional) A description of the task.

assignees: string[]

(Optional) A list of user identifiers (OID, ID, or email) to assign this task to.

  • Use "me" to indicate the current user.
  • Use "inherit" to include all assignees of the parent task.
start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. Null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Whether to duplicate subtasks when completed. Default: true.
  • sincelatest: For daily only. Whether to repeat based on last completion date. Default: false.
peekaboo:
boolean
integer

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely.
  • positive integer: Number of days to hide.
  • false: Cancel previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this task as created by the app. Default: false (created by the authorizing user).

followers: string[]

(Optional) List of user identifiers (OID, ID, or email) who follow this task.

  • Use "me" for the current user.
  • Use "inherit" to include followers of the parent task.
  • Use "app" for the application itself to follow (receive notifications).

For app followers, additional syntaxes are supported:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
successors: string[]

(Optional) List of successor task identifiers (OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

tags: string[]

(Optional) A list of tag OIDs or names to be added to the new task. Tag names are case-insensitive.

tasks: CreateTaskBody

(Optional) List of subtasks to create along with this task.

name: string

The name of the task.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative.

status: integer

(Optional) Task status. Must be between 0 and 100. Default: 0.

priority: integer -1, 0, 1, 2

(Optional) Task priority. -1 (lowest) through 2 (highest); 0 is Normal. Default: 0. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to attach to the task. Available via API when retrieving the task.

If the entry contains a key text, its value will be displayed client-side and should be formatted in Markdown. It is recommended to include a source link.

Request Example
{
  "description": "This is a *cool* task.",
  "assignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl"
  ],
  "successors": "[\"#13\"]",
  "yourField": "object",
  "tags": [
    "X6nmx9XjEO2wKbqeB1pRT43C"
  ],
  "tasks": [
    "#/definitions/CreateTaskBody"
  ],
  "name": "Design new **logo**",
  "etc": 0,
  "status": 0,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}
200 OK

OK — newly created task.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to add a task to this project.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Add a new task relative to another task.

POST /task/id/{projectId}/{taskId}

Adds a new task under another task, or before or after another task. See POST /task/id/{projectId} for a full request-body example — the body shape is identical.

projectId: string
in path

ID of the project to which the new task will be added. Specify "-" to add it to personal tasks in My Tasks.

taskId: integer
in path

ID of the referenced task.

position: string parent, before, after
in query

(Optional) Placement of the new task relative to the task referenced by taskId:

  • parent (default): child of the referenced task.
  • before: sibling immediately before the referenced task.
  • after: sibling immediately after the referenced task.

Omitted or empty → same as parent. Any other value returns 400 Bad Request.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full task record, or compact for identifiers only ({"oid":…, "id":…}). See POST /task/{oid} for full semantics.

description: string

(Optional) A description of the task.

assignees: string[]

(Optional) A list of user identifiers (OID, ID, or email) to assign this task to.

  • Use "me" to indicate the current user.
  • Use "inherit" to include all assignees of the parent task.
start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. Null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Whether to duplicate subtasks when completed. Default: true.
  • sincelatest: For daily only. Whether to repeat based on last completion date. Default: false.
peekaboo:
boolean
integer

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely.
  • positive integer: Number of days to hide.
  • false: Cancel previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this task as created by the app. Default: false (created by the authorizing user).

followers: string[]

(Optional) List of user identifiers (OID, ID, or email) who follow this task.

  • Use "me" for the current user.
  • Use "inherit" to include followers of the parent task.
  • Use "app" for the application itself to follow (receive notifications).

For app followers, additional syntaxes are supported:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
successors: string[]

(Optional) List of successor task identifiers (OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

tags: string[]

(Optional) A list of tag OIDs or names to be added to the new task. Tag names are case-insensitive.

tasks: CreateTaskBody

(Optional) List of subtasks to create along with this task.

name: string

The name of the task.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative.

status: integer

(Optional) Task status. Must be between 0 and 100. Default: 0.

priority: integer -1, 0, 1, 2

(Optional) Task priority. -1 (lowest) through 2 (highest); 0 is Normal. Default: 0. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to attach to the task. Available via API when retrieving the task.

If the entry contains a key text, its value will be displayed client-side and should be formatted in Markdown. It is recommended to include a source link.

Request Example
{
  "description": "This is a *cool* task.",
  "assignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl"
  ],
  "successors": "[\"#13\"]",
  "yourField": "object",
  "tags": [
    "X6nmx9XjEO2wKbqeB1pRT43C"
  ],
  "tasks": [
    "#/definitions/CreateTaskBody"
  ],
  "name": "Design new **logo**",
  "etc": 0,
  "status": 0,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}
200 OK

OK — newly created task.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to add a task here.

404 Not Found

Not Found — project or parent task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Add a new root task, or relative to another task.

POST /task/{oid}

Adds a new task to a project, under another task, or before or after another task.

oid: string
in path

OID of the project or task to which the new task will be added. If the OID refers to a project, the new task becomes a root task. If it refers to a task, the new task becomes its subtask. Specify "-" to add the task to My Tasks.

position: string parent, before, after
in query

(Optional) Placement of the new task relative to the task referenced by oid. This parameter applies only when oid refers to a task:

  • parent (default): child of the referenced task.
  • before: sibling immediately before the referenced task.
  • after: sibling immediately after the referenced task.

Omitted or empty → same as parent. Any other value returns 400 Bad Request.

return: string full, compact
in query

(Optional) Response shape:

  • full (default): the full task record.
  • compact: identifiers only ({"oid":…, "id":…}). Saves payload, tokens, and a server-side reload + render. Recommended for MCP / scripted callers that only need the OID/ID to chain follow-up calls.

Any other value returns 400 Bad Request.

description: string

(Optional) A description of the task.

assignees: string[]

(Optional) A list of user identifiers (OID, ID, or email) to assign this task to.

  • Use "me" to indicate the current user.
  • Use "inherit" to include all assignees of the parent task.
start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. Null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Whether to duplicate subtasks when completed. Default: true.
  • sincelatest: For daily only. Whether to repeat based on last completion date. Default: false.
peekaboo:
boolean
integer

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely.
  • positive integer: Number of days to hide.
  • false: Cancel previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this task as created by the app. Default: false (created by the authorizing user).

followers: string[]

(Optional) List of user identifiers (OID, ID, or email) who follow this task.

  • Use "me" for the current user.
  • Use "inherit" to include followers of the parent task.
  • Use "app" for the application itself to follow (receive notifications).

For app followers, additional syntaxes are supported:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
successors: string[]

(Optional) List of successor task identifiers (OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

tags: string[]

(Optional) A list of tag OIDs or names to be added to the new task. Tag names are case-insensitive.

tasks: CreateTaskBody

(Optional) List of subtasks to create along with this task.

name: string

The name of the task.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative.

status: integer

(Optional) Task status. Must be between 0 and 100. Default: 0.

priority: integer -1, 0, 1, 2

(Optional) Task priority. -1 (lowest) through 2 (highest); 0 is Normal. Default: 0. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to attach to the task. Available via API when retrieving the task.

If the entry contains a key text, its value will be displayed client-side and should be formatted in Markdown. It is recommended to include a source link.

Request Example
{
  "description": "This is a *cool* task.",
  "assignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl"
  ],
  "successors": "[\"#13\"]",
  "yourField": "object",
  "tags": [
    "X6nmx9XjEO2wKbqeB1pRT43C"
  ],
  "tasks": [
    "#/definitions/CreateTaskBody"
  ],
  "name": "Design new **logo**",
  "etc": 0,
  "status": 0,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}
200 OK

OK — newly created task.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to add a task here.

404 Not Found

Not Found — project or parent task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Search tasks in a folder by folder ID.

GET /task/search-folder/id/{folderId}

Returns tasks that match the specified criteria in the given folder. Tasks in archived projects are excluded.

Available for Professional plans and above

folderId: string
in path

Folder ID.

text: string
in query

Full-text query against task name, description, and attachments. Note: does not include comment content or comment attachments. Indexing can take ~10 seconds or more after updates.

name: string
in query

Task name filter. Prefix with ~ for regex, ~* for case-insensitive regex. Use text for full-text search.

description: string
in query

Task description filter. Prefix with ~ for regex, ~* for case-insensitive regex.

status: string
in query

Task status filter. Specify 0–100, or "active" / "completed".

scheduled: boolean
in query

Return only scheduled tasks (start or due is set). If scheduled=false, returns only tasks where neither start nor due is set.

mine: boolean
in query

Return only "My Tasks" (assigned to me, or created by me and scheduled but unassigned).

assignee: string
in query

Filter by assignee. Each value is a user OID, user ID, or email.

Combine values with , (AND), | (OR), and ! (NOT). AND binds tighter than OR.

Examples:

  • alice — a single user (by ID)
  • [email protected] — by email
  • alice,bob — assigned to both
  • alice|bob — assigned to either
  • alice,!bob — assigned to alice but not bob
  • alice,bob|carol(alice AND bob) OR carol
assignor: string
in query

Filter by assignor (the user who set the assignment). Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

follower: string
in query

Filter by follower. Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

tag: string
in query

Filter by tag. Each value is a tag OID or a tag name (names are resolved within the search's organization).

Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Names containing ,, |, !, ", or whitespace must be wrapped in "...". Inside quotes, write \" for a literal " and \\ for a literal \; any other \x is preserved as two literal characters.

Examples:

  • Legal — a single tag
  • Legal,!Draft — has Legal but not Draft
  • "In Progress",!Done — quoted name with space
  • "Foo\"s Go"|Other — quoted with escaped "
modified: string
in query

Return only tasks created or modified recently. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

commented: string
in query

Return only tasks with recent comments. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

sourceRef: string
in query

Filter by source ref key. See sourceRef in the task creation API.

created: string
in query

Filter by the task's createdAt timestamp. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<timestamp> or {between|notBetween}:<timestamp>,<timestamp>
  • <timestamp> is ISO 8601 YYYY-MM-DDTHH:MM:SSZ (UTC)
  • Day boundaries resolve in the caller's timezone; week start follows the caller's locale
  • past on this field is < now()
  • Tokens and keywords are case-insensitive

Examples: today, last7d, ge:2026-04-01T00:00:00Z, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

edited: string
in query

Filter by the task's editedAt timestamp. Same grammar as created. Note: editedAt is NULL for tasks that have never been edited after creation; such tasks are excluded by every op (use created to filter by creation time).

Examples: today, last7d, ge:2026-04-01T00:00:00Z.

archived: string
in query

Filter by the task's archivedAt timestamp. Same grammar as created, plus null ops since the field is nullable:

  • isNull — not archived
  • isNotNull — archived (any time)

Examples: isNotNull, today, ge:2026-04-01T00:00:00Z.

unarchived: string
in query

Filter by the task's reshowAt timestamp (scheduled un-archive). Same grammar as archived (supports isNull / isNotNull).

Examples: isNotNull, today, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

toggled: string
in query

Filter by the task's toggledAt timestamp (when its completion status was last changed). Same grammar as archived (supports isNull / isNotNull).

Examples: today, isNotNull, ge:2026-04-01T00:00:00Z.

start: string
in query

Filter by the task's start date/time. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<value> or {between|notBetween}:<value>,<value>
  • Null op: isNull, isNotNull
  • <value> is either a date (YYYY-MM-DD) or a full ISO 8601 timestamp (YYYY-MM-DDTHH:MM:SSZ)
  • A date operand expands to a whole-day window in the caller's timezone (ge:2026-04-01 means "on or after Apr 1 in the caller's calendar"); gt:D/le:D use end-of-day, lt:D/ge:D use start-of-day
  • past on start/due is < today 00:00 in the caller's timezone (not < now())
  • upcoming on start/due is the window [tomorrow, today + 7 days)

Examples: today, upcoming, ge:2026-04-01, between:2026-04-01,2026-04-30, isNull.

due: string
in query

Filter by the task's due date/time. Same grammar and semantics as start (accepts date-only operands, isNull/isNotNull, and the same keyword/value ops).

Examples: today, upcoming, le:2026-04-30, isNotNull.

limit: string
in query

Maximum number of tasks to return. Default: 30. Use no to return all matches.

Note: On free plans, this cannot exceed 30 or no (unlimited).

OK — matching tasks (may be empty).

400 Bad Request

Bad Request — invalid query params.

403 Forbidden

Forbidden — caller lacks permission to search this folder.

404 Not Found

Not Found — folder does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]

Search tasks in a folder by folder OID.

GET /task/search-folder/{folderOid}

Returns tasks that match the specified criteria in the given folder. Tasks in archived projects are excluded.

Available for Professional plans and above

folderOid: string
in path

Folder OID.

text: string
in query

Full-text query against task name, description, and attachments. Note: does not include comment content or comment attachments. Indexing can take ~10 seconds or more after updates.

name: string
in query

Task name filter. Prefix with ~ for regex, ~* for case-insensitive regex. Use text for full-text search.

description: string
in query

Task description filter. Prefix with ~ for regex, ~* for case-insensitive regex.

status: string
in query

Task status filter. Specify 0–100, or "active" / "completed".

scheduled: boolean
in query

Return only scheduled tasks (start or due is set). If scheduled=false, returns only tasks where neither start nor due is set.

mine: boolean
in query

Return only "My Tasks" (assigned to me, or created by me and scheduled but unassigned).

assignee: string
in query

Filter by assignee. Each value is a user OID, user ID, or email.

Combine values with , (AND), | (OR), and ! (NOT). AND binds tighter than OR.

Examples:

  • alice — a single user (by ID)
  • [email protected] — by email
  • alice,bob — assigned to both
  • alice|bob — assigned to either
  • alice,!bob — assigned to alice but not bob
  • alice,bob|carol(alice AND bob) OR carol
assignor: string
in query

Filter by assignor (the user who set the assignment). Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

follower: string
in query

Filter by follower. Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

tag: string
in query

Filter by tag. Each value is a tag OID or a tag name (names are resolved within the search's organization).

Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Names containing ,, |, !, ", or whitespace must be wrapped in "...". Inside quotes, write \" for a literal " and \\ for a literal \; any other \x is preserved as two literal characters.

Examples:

  • Legal — a single tag
  • Legal,!Draft — has Legal but not Draft
  • "In Progress",!Done — quoted name with space
  • "Foo\"s Go"|Other — quoted with escaped "
modified: string
in query

Return only tasks created or modified recently. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

commented: string
in query

Return only tasks with recent comments. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

sourceRef: string
in query

Filter by source ref key. See sourceRef in the task creation API.

created: string
in query

Filter by the task's createdAt timestamp. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<timestamp> or {between|notBetween}:<timestamp>,<timestamp>
  • <timestamp> is ISO 8601 YYYY-MM-DDTHH:MM:SSZ (UTC)
  • Day boundaries resolve in the caller's timezone; week start follows the caller's locale
  • past on this field is < now()
  • Tokens and keywords are case-insensitive

Examples: today, last7d, ge:2026-04-01T00:00:00Z, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

edited: string
in query

Filter by the task's editedAt timestamp. Same grammar as created. Note: editedAt is NULL for tasks that have never been edited after creation; such tasks are excluded by every op (use created to filter by creation time).

Examples: today, last7d, ge:2026-04-01T00:00:00Z.

archived: string
in query

Filter by the task's archivedAt timestamp. Same grammar as created, plus null ops since the field is nullable:

  • isNull — not archived
  • isNotNull — archived (any time)

Examples: isNotNull, today, ge:2026-04-01T00:00:00Z.

unarchived: string
in query

Filter by the task's reshowAt timestamp (scheduled un-archive). Same grammar as archived (supports isNull / isNotNull).

Examples: isNotNull, today, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

toggled: string
in query

Filter by the task's toggledAt timestamp (when its completion status was last changed). Same grammar as archived (supports isNull / isNotNull).

Examples: today, isNotNull, ge:2026-04-01T00:00:00Z.

start: string
in query

Filter by the task's start date/time. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<value> or {between|notBetween}:<value>,<value>
  • Null op: isNull, isNotNull
  • <value> is either a date (YYYY-MM-DD) or a full ISO 8601 timestamp (YYYY-MM-DDTHH:MM:SSZ)
  • A date operand expands to a whole-day window in the caller's timezone (ge:2026-04-01 means "on or after Apr 1 in the caller's calendar"); gt:D/le:D use end-of-day, lt:D/ge:D use start-of-day
  • past on start/due is < today 00:00 in the caller's timezone (not < now())
  • upcoming on start/due is the window [tomorrow, today + 7 days)

Examples: today, upcoming, ge:2026-04-01, between:2026-04-01,2026-04-30, isNull.

due: string
in query

Filter by the task's due date/time. Same grammar and semantics as start (accepts date-only operands, isNull/isNotNull, and the same keyword/value ops).

Examples: today, upcoming, le:2026-04-30, isNotNull.

limit: string
in query

Maximum number of tasks to return. Default: 30. Use no to return all matches.

Note: On free plans, this cannot exceed 30 or no (unlimited).

OK — matching tasks (may be empty).

400 Bad Request

Bad Request — invalid query params.

403 Forbidden

Forbidden — caller lacks permission to search this folder.

404 Not Found

Not Found — folder does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]

Search tasks in an organization by organization ID.

GET /task/search-organization/id/{organizationId}

Returns tasks that match the specified criteria in the given organization. Tasks in archived projects are excluded.

Available for Professional plans and above

organizationId: string
in path

Organization ID.

text: string
in query

Full-text query against task name, description, and attachments. Note: does not include comment content or comment attachments. Indexing can take ~10 seconds or more after updates.

name: string
in query

Task name filter. Prefix with ~ for regex, ~* for case-insensitive regex. Use text for full-text search.

description: string
in query

Task description filter. Prefix with ~ for regex, ~* for case-insensitive regex.

status: string
in query

Task status filter. Specify 0–100, or "active" / "completed".

scheduled: boolean
in query

Return only scheduled tasks (start or due is set). If scheduled=false, returns only tasks where neither start nor due is set.

mine: boolean
in query

Return only "My Tasks" (assigned to me, or created by me and scheduled but unassigned).

assignee: string
in query

Filter by assignee. Each value is a user OID, user ID, or email.

Combine values with , (AND), | (OR), and ! (NOT). AND binds tighter than OR.

Examples:

  • alice — a single user (by ID)
  • [email protected] — by email
  • alice,bob — assigned to both
  • alice|bob — assigned to either
  • alice,!bob — assigned to alice but not bob
  • alice,bob|carol(alice AND bob) OR carol
assignor: string
in query

Filter by assignor (the user who set the assignment). Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

follower: string
in query

Filter by follower. Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

tag: string
in query

Filter by tag. Each value is a tag OID or a tag name (names are resolved within the search's organization).

Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Names containing ,, |, !, ", or whitespace must be wrapped in "...". Inside quotes, write \" for a literal " and \\ for a literal \; any other \x is preserved as two literal characters.

Examples:

  • Legal — a single tag
  • Legal,!Draft — has Legal but not Draft
  • "In Progress",!Done — quoted name with space
  • "Foo\"s Go"|Other — quoted with escaped "
modified: string
in query

Return only tasks created or modified recently. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

commented: string
in query

Return only tasks with recent comments. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

sourceRef: string
in query

Filter by source ref key. See sourceRef in the task creation API.

created: string
in query

Filter by the task's createdAt timestamp. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<timestamp> or {between|notBetween}:<timestamp>,<timestamp>
  • <timestamp> is ISO 8601 YYYY-MM-DDTHH:MM:SSZ (UTC)
  • Day boundaries resolve in the caller's timezone; week start follows the caller's locale
  • past on this field is < now()
  • Tokens and keywords are case-insensitive

Examples: today, last7d, ge:2026-04-01T00:00:00Z, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

edited: string
in query

Filter by the task's editedAt timestamp. Same grammar as created. Note: editedAt is NULL for tasks that have never been edited after creation; such tasks are excluded by every op (use created to filter by creation time).

Examples: today, last7d, ge:2026-04-01T00:00:00Z.

archived: string
in query

Filter by the task's archivedAt timestamp. Same grammar as created, plus null ops since the field is nullable:

  • isNull — not archived
  • isNotNull — archived (any time)

Examples: isNotNull, today, ge:2026-04-01T00:00:00Z.

unarchived: string
in query

Filter by the task's reshowAt timestamp (scheduled un-archive). Same grammar as archived (supports isNull / isNotNull).

Examples: isNotNull, today, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

toggled: string
in query

Filter by the task's toggledAt timestamp (when its completion status was last changed). Same grammar as archived (supports isNull / isNotNull).

Examples: today, isNotNull, ge:2026-04-01T00:00:00Z.

start: string
in query

Filter by the task's start date/time. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<value> or {between|notBetween}:<value>,<value>
  • Null op: isNull, isNotNull
  • <value> is either a date (YYYY-MM-DD) or a full ISO 8601 timestamp (YYYY-MM-DDTHH:MM:SSZ)
  • A date operand expands to a whole-day window in the caller's timezone (ge:2026-04-01 means "on or after Apr 1 in the caller's calendar"); gt:D/le:D use end-of-day, lt:D/ge:D use start-of-day
  • past on start/due is < today 00:00 in the caller's timezone (not < now())
  • upcoming on start/due is the window [tomorrow, today + 7 days)

Examples: today, upcoming, ge:2026-04-01, between:2026-04-01,2026-04-30, isNull.

due: string
in query

Filter by the task's due date/time. Same grammar and semantics as start (accepts date-only operands, isNull/isNotNull, and the same keyword/value ops).

Examples: today, upcoming, le:2026-04-30, isNotNull.

limit: string
in query

Maximum number of tasks to return. Default: 30. Use no to return all matches.

Note: On free plans, this cannot exceed 30 or no (unlimited).

OK — matching tasks (may be empty).

400 Bad Request

Bad Request — invalid query params.

403 Forbidden

Forbidden — caller lacks permission to search this organization.

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]

Search tasks in an organization by organization OID.

GET /task/search-organization/{organizationOid}

Returns tasks that match the specified criteria in the given organization. Tasks in archived projects are excluded.

Available for Professional plans and above

organizationOid: string
in path

Organization OID.

text: string
in query

Full-text query against task name, description, and attachments. Note: does not include comment content or comment attachments. Indexing can take ~10 seconds or more after updates.

name: string
in query

Task name filter. Prefix with ~ for regex, ~* for case-insensitive regex. Use text for full-text search.

description: string
in query

Task description filter. Prefix with ~ for regex, ~* for case-insensitive regex.

status: string
in query

Task status filter. Specify 0–100, or "active" / "completed".

scheduled: boolean
in query

Return only scheduled tasks (start or due is set). If scheduled=false, returns only tasks where neither start nor due is set.

mine: boolean
in query

Return only "My Tasks" (assigned to me, or created by me and scheduled but unassigned).

assignee: string
in query

Filter by assignee. Each value is a user OID, user ID, or email.

Combine values with , (AND), | (OR), and ! (NOT). AND binds tighter than OR.

Examples:

  • alice — a single user (by ID)
  • [email protected] — by email
  • alice,bob — assigned to both
  • alice|bob — assigned to either
  • alice,!bob — assigned to alice but not bob
  • alice,bob|carol(alice AND bob) OR carol
assignor: string
in query

Filter by assignor (the user who set the assignment). Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

follower: string
in query

Filter by follower. Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

tag: string
in query

Filter by tag. Each value is a tag OID or a tag name (names are resolved within the search's organization).

Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Names containing ,, |, !, ", or whitespace must be wrapped in "...". Inside quotes, write \" for a literal " and \\ for a literal \; any other \x is preserved as two literal characters.

Examples:

  • Legal — a single tag
  • Legal,!Draft — has Legal but not Draft
  • "In Progress",!Done — quoted name with space
  • "Foo\"s Go"|Other — quoted with escaped "
modified: string
in query

Return only tasks created or modified recently. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

commented: string
in query

Return only tasks with recent comments. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

sourceRef: string
in query

Filter by source ref key. See sourceRef in the task creation API.

created: string
in query

Filter by the task's createdAt timestamp. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<timestamp> or {between|notBetween}:<timestamp>,<timestamp>
  • <timestamp> is ISO 8601 YYYY-MM-DDTHH:MM:SSZ (UTC)
  • Day boundaries resolve in the caller's timezone; week start follows the caller's locale
  • past on this field is < now()
  • Tokens and keywords are case-insensitive

Examples: today, last7d, ge:2026-04-01T00:00:00Z, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

edited: string
in query

Filter by the task's editedAt timestamp. Same grammar as created. Note: editedAt is NULL for tasks that have never been edited after creation; such tasks are excluded by every op (use created to filter by creation time).

Examples: today, last7d, ge:2026-04-01T00:00:00Z.

archived: string
in query

Filter by the task's archivedAt timestamp. Same grammar as created, plus null ops since the field is nullable:

  • isNull — not archived
  • isNotNull — archived (any time)

Examples: isNotNull, today, ge:2026-04-01T00:00:00Z.

unarchived: string
in query

Filter by the task's reshowAt timestamp (scheduled un-archive). Same grammar as archived (supports isNull / isNotNull).

Examples: isNotNull, today, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

toggled: string
in query

Filter by the task's toggledAt timestamp (when its completion status was last changed). Same grammar as archived (supports isNull / isNotNull).

Examples: today, isNotNull, ge:2026-04-01T00:00:00Z.

start: string
in query

Filter by the task's start date/time. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<value> or {between|notBetween}:<value>,<value>
  • Null op: isNull, isNotNull
  • <value> is either a date (YYYY-MM-DD) or a full ISO 8601 timestamp (YYYY-MM-DDTHH:MM:SSZ)
  • A date operand expands to a whole-day window in the caller's timezone (ge:2026-04-01 means "on or after Apr 1 in the caller's calendar"); gt:D/le:D use end-of-day, lt:D/ge:D use start-of-day
  • past on start/due is < today 00:00 in the caller's timezone (not < now())
  • upcoming on start/due is the window [tomorrow, today + 7 days)

Examples: today, upcoming, ge:2026-04-01, between:2026-04-01,2026-04-30, isNull.

due: string
in query

Filter by the task's due date/time. Same grammar and semantics as start (accepts date-only operands, isNull/isNotNull, and the same keyword/value ops).

Examples: today, upcoming, le:2026-04-30, isNotNull.

limit: string
in query

Maximum number of tasks to return. Default: 30. Use no to return all matches.

Note: On free plans, this cannot exceed 30 or no (unlimited).

OK — matching tasks (may be empty).

400 Bad Request

Bad Request — invalid query params.

403 Forbidden

Forbidden — caller lacks permission to search this organization.

404 Not Found

Not Found — organization does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]

Get an existing task by its ID.

GET /task/id/{projectId}/{taskId}

Returns the full task record.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

taskId: integer
in path

Task ID.

OK — task record.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get an existing task by its OID.

GET /task/{oid}

Returns the full task record.

oid: string
in path

Task OID.

OK — task record.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Get all root tasks of the given project.

GET /task/list/id/{projectId}

Returns all root tasks of the project as a bare JSON array.

Pagination is opt-in via ?limit=N (1..1000). Without ?limit= or ?cursor=, the response is the full bare array. When ?limit=N is set and more results exist, the LAST item carries "cursor": "<token>" — pass it back as ?cursor=<token> (plus the same ?limit= and any filter like ?status=) to fetch the next page. End of stream is signalled by the absence of cursor on the last item. ?limit=no is an explicit "return everything". Same pagination grammar applies to the subtasks endpoint GET /task/list/id/{projectId}/{taskId}.

Pair with ?return=compact to render each item as {oid, id, cursor?} for navigation/lookup workloads at minimal token cost.

Rate-limit cost (#24558): proportional to the number of items returned — max(1, ceil(items / 100)) units. So ?limit=100 (or fewer items) costs 1, ?limit=1000 costs 10, ?limit=no returning 5,000 items costs 50. Symmetric with bulk-write cost.

To retrieve all tasks (including all subtasks), use the search API.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

limit: string
in query

Page size (1..1000). Omit for the default unpaginated full list, or pass no to be explicit. When set and more results exist, the last item in the response carries a cursor field.

cursor: string
in query

Continuation token. Pass back the cursor value from the last item of the previous page to fetch the next page. Re-pass any filter (?status=) and ?limit= on the same call.

200 OK

OK — bare array of root tasks (may be empty). With ?limit=N, the last item may carry a cursor field if more results exist.

400 Bad Request

Bad Request — invalid ?limit= value, or ?cursor= doesn't belong to this list.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Get the subtasks of the given task.

GET /task/list/id/{projectId}/{taskId}

By default returns only the direct subtasks of {taskId} (one level). To fetch a whole subtree in a single call, set ?depth=N or ?depth=full — each task in the response then carries a nested tasks field with its walked children, recursively.

When to use which:

  • Default (no ?depth): you only need the immediate children.
  • ?depth=2 or 3: small subtree where you know the shape.
  • ?depth=full: full subtree snapshot — pair with ?return=compact for navigation/lookup workloads to keep the payload (and LLM-token cost) small.

Per-tier total-nodes cap when ?depth>1: Free → rejected (402), Pro → 500, Premium → 2,000, Enterprise → unlimited (bounded only by the global response-size ceiling). When the cap fires mid-walk, the partial subtree is returned and the last emitted sibling at the cropped level carries "cropped": true. Recovery: call GET /task/list/id/{prj}/{croppedSiblingParentId} (default ?depth=1) to fetch the rest of that level — flat single-level lists have no cap.

Tree shape signals for the agent:

  • Node has a tasks array → its children were walked. Empty array means a true leaf.
  • Node has no tasks field → its children were not walked (depth limit reached, or cap fired before reaching it). Drill in if you need them.
  • Node has "cropped": true → more siblings of this node exist at the same level.

Pagination (flat path only, cannot be combined with ?depth>1): pass ?limit=N (1..1000) to opt into paginated chunks. When more results exist, the LAST item carries "cursor": "<token>" — pass it back as ?cursor=<token> (plus the same ?limit= and ?status=) for the next page. Without ?limit= / ?cursor=, the response is the full bare array. ?limit=no is an explicit "return everything". Composes with ?return=compact.

Notes: Subtree responses (?depth>1) omit the per-task childCount field — the tasks array is the canonical signal. The flat default (?depth=1) and single-task GET /task/{oid} still include childCount. ?depth>1 cannot be combined with ?limit= or ?cursor= (returns 400).

Rate-limit cost (#24558): proportional to the number of tasks returned across the whole tree — max(1, ceil(items / 100)) units. So a flat ?limit=100 (or fewer) costs 1; a ?depth=full returning 500 nodes costs 5; a ?depth=full returning 2,000 (Premium cap) costs 20.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

taskId: integer
in path

Parent task ID.

status: string
in query

Task status filter. Specify a value 0–100, or use "active" for active tasks or "completed" for completed tasks.

depth: string
in query

Subtree depth. Omit or 1 for the default flat single-level list (immediate children only). Any positive integer returns a multi-level subtree capped at the given depth; full walks every level (bounded by the per-tier total-nodes cap). ?depth>1 requires the Professional plan or above and cannot be combined with ?limit/?cursor.

limit: string
in query

Page size for the flat path (1..1000). Omit for the default unpaginated full list. Pass no to be explicit. When set and more results exist, the last item in the response carries a cursor field. Cannot be combined with ?depth>1.

cursor: string
in query

Continuation token. Pass back the cursor value from the last item of the previous page to fetch the next page. Re-pass ?limit= and any filter (?status=) on the same call. Cannot be combined with ?depth>1.

return: string full, compact
in query

Response shape. full (default) returns the standard task records; compact returns identifier-only items — {oid, id, tasks?, cropped?} in subtree mode, {oid, id, cursor?} in flat / paginated mode. Pair with ?depth=full (subtree) or ?limit=N (paginated) to fetch a whole subtree's / page's identifier graph at minimal token cost; the agent then GET /task/{oid} for only the items it wants in detail.

200 OK

OK — list of subtasks (may be empty). With ?depth>1, each entry may carry nested tasks + cropped fields.

400 Bad Request

Bad Request — invalid depth / limit value, ?depth>1 without a task ID in the URL, ?depth>1 combined with ?limit/?cursor, or ?cursor= doesn't belong to this list.

402 Payment Required

Payment Required — ?depth>1 requires the Professional plan or above. Use ?depth=1 (or omit ?depth) for unrestricted flat per-level listing.

404 Not Found

Not Found — project or parent task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Get all root tasks of the given project or all subtasks of the given task.

GET /task/list/{oid}

Returns all root tasks of a project or all direct subtasks of a task by OID. If the OID is a project, root tasks are returned. If it is a task, its direct subtasks are returned. Note: only one level is returned—subtasks of subtasks are not included; retrieve them recursively.

oid: string
in path

OID of the project or parent task. Specify "-" to retrieve My Tasks (no specific project).

200 OK

OK — list of tasks (may be empty).

404 Not Found

Not Found — project or parent task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]

Search tasks in a project by project ID.

GET /task/search/id/{projectId}

Returns tasks that match the specified criteria in the project.

Custom Field Filtering

You can filter by custom fields by passing the field name as a query parameter (case-insensitive). For example, ?cost=13 or ?approvedBy=john.doe.

Supported field types and value formats:

Type Value format Example
Number, Money Numeric value cost=13
Checkbox true or false done=true
Select Option name priority=High
User User ID, email, or OID approvedBy=john.doe
Task Task ID (integer) or OID blockedBy=42
Email, Hyperlink Exact value, or prefix with ~ for regex, ~* for case-insensitive regex website=~example\.com
Duration Seconds, or with suffix: d (days), h (hours), m (minutes) estimate=2h
Date Same grammar as the start / due query params — keyword ops (today, past, last7d, ...), value ops (ge:<v>, lt:<v>, between:<v1>,<v2>, ...), and null ops (isNull, isNotNull). <v> is YYYY-MM-DD or ISO 8601 YYYY-MM-DDTHH:MM:SSZ; timestamp operands require a withTime: true field. approvedAt=today, approvedAt=ge:2026-04-01, approvedAt=between:2026-04-01,2026-04-30, approvedAt=isNull

Not supported: Text (use text for full-text search instead), Formula, File, Lookup.

Pagination

Pass ?limit=N to cap each response at N items. When more results exist, the last item carries a cursor field; pass its value back as ?cursor=<token> (along with the same ?limit= and any filter) to fetch the next page. End of stream is signalled by the absence of cursor on the last item.

Example loop:

GET /task/search/id/my_project?status=active&limit=3030 items; last has cursor: "crsr1u"
GET /task/search/id/my_project?status=active&limit=30&cursor=crsr1u
    → 30 items; last has cursor: "crsr11k"
GET /task/search/id/my_project?status=active&limit=30&cursor=crsr11k
    → 12 items; no cursor on last item → stop

Cannot be combined with ?sublist=. The cursor token is opaque — use it verbatim from the previous response.

Rate-limit cost: proportional to the number of items returned — max(1, ceil(items / 100)) units. So ?limit=100 (or fewer matches) costs 1, ?limit=1000 costs 10, ?limit=no returning 5,000 matches costs 50.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

text: string
in query

Full-text query against task name, description, and attachments. Note: does not include comment content or comment attachments. Indexing can take ~10 seconds or more after updates.

name: string
in query

Task name filter. Prefix with ~ for regex, ~* for case-insensitive regex. Use text for full-text search.

description: string
in query

Task description filter. Prefix with ~ for regex, ~* for case-insensitive regex.

sublist: string
in query

Task sublist ID or OID filter.

status: string
in query

Task status filter. Specify 0–100, or "active" / "completed".

scheduled: boolean
in query

Return only scheduled tasks (start or due is set). If scheduled=false, returns only tasks where neither start nor due is set.

mine: boolean
in query

Return only "My Tasks" (assigned to me, or created by me and scheduled but unassigned).

assignee: string
in query

Filter by assignee. Each value is a user OID, user ID, or email.

Combine values with , (AND), | (OR), and ! (NOT). AND binds tighter than OR.

Examples:

  • alice — a single user (by ID)
  • [email protected] — by email
  • alice,bob — assigned to both
  • alice|bob — assigned to either
  • alice,!bob — assigned to alice but not bob
  • alice,bob|carol(alice AND bob) OR carol
assignor: string
in query

Filter by assignor (the user who set the assignment). Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

follower: string
in query

Filter by follower. Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

tag: string
in query

Filter by tag. Each value is a tag OID or a tag name (names are resolved within the search's organization).

Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Names containing ,, |, !, ", or whitespace must be wrapped in "...". Inside quotes, write \" for a literal " and \\ for a literal \; any other \x is preserved as two literal characters.

Examples:

  • Legal — a single tag
  • Legal,!Draft — has Legal but not Draft
  • "In Progress",!Done — quoted name with space
  • "Foo\"s Go"|Other — quoted with escaped "
modified: string
in query

Return only tasks created or modified recently. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

commented: string
in query

Return only tasks with recent comments. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

sourceRef: string
in query

Filter by source ref key. See sourceRef in the task creation API.

created: string
in query

Filter by the task's createdAt timestamp. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<timestamp> or {between|notBetween}:<timestamp>,<timestamp>
  • <timestamp> is ISO 8601 YYYY-MM-DDTHH:MM:SSZ (UTC)
  • Day boundaries resolve in the caller's timezone; week start follows the caller's locale
  • past on this field is < now()
  • Tokens and keywords are case-insensitive

Examples: today, last7d, ge:2026-04-01T00:00:00Z, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

edited: string
in query

Filter by the task's editedAt timestamp. Same grammar as created. Note: editedAt is NULL for tasks that have never been edited after creation; such tasks are excluded by every op (use created to filter by creation time).

Examples: today, last7d, ge:2026-04-01T00:00:00Z.

archived: string
in query

Filter by the task's archivedAt timestamp. Same grammar as created, plus null ops since the field is nullable:

  • isNull — not archived
  • isNotNull — archived (any time)

Examples: isNotNull, today, ge:2026-04-01T00:00:00Z.

unarchived: string
in query

Filter by the task's reshowAt timestamp (scheduled un-archive). Same grammar as archived (supports isNull / isNotNull).

Examples: isNotNull, today, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

toggled: string
in query

Filter by the task's toggledAt timestamp (when its completion status was last changed). Same grammar as archived (supports isNull / isNotNull).

Examples: today, isNotNull, ge:2026-04-01T00:00:00Z.

start: string
in query

Filter by the task's start date/time. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<value> or {between|notBetween}:<value>,<value>
  • Null op: isNull, isNotNull
  • <value> is either a date (YYYY-MM-DD) or a full ISO 8601 timestamp (YYYY-MM-DDTHH:MM:SSZ)
  • A date operand expands to a whole-day window in the caller's timezone (ge:2026-04-01 means "on or after Apr 1 in the caller's calendar"); gt:D/le:D use end-of-day, lt:D/ge:D use start-of-day
  • past on start/due is < today 00:00 in the caller's timezone (not < now())
  • upcoming on start/due is the window [tomorrow, today + 7 days)

Examples: today, upcoming, ge:2026-04-01, between:2026-04-01,2026-04-30, isNull.

due: string
in query

Filter by the task's due date/time. Same grammar and semantics as start (accepts date-only operands, isNull/isNotNull, and the same keyword/value ops).

Examples: today, upcoming, le:2026-04-30, isNotNull.

priority: string
in query

Filter by task priority. Each value is an integer (-1..2) or a label (low, medium, high, urgent, none; case-insensitive).

Combine with , (AND), | (OR), ! (NOT). AND of two distinct positives is the empty set (a column has exactly one priority); negation works as expected.

Examples: high, 1, high|urgent, !low.

type: string
in query

Filter by task type. Values: normal (or task), section, milestone. Combine with , / | / !. Useful for structural navigation (e.g., listing only sections in a project).

Examples: section, section|milestone, !section.

createdBy: string
in query

Filter by the user who created the task. Each value is a user OID, user ID, or email. Combine with , / | / ! (same grammar as assignee).

Examples: alice, alice|bob, !alice.

recurring: string
in query

Filter on whether the task has a recurrence configured. true (or empty) returns only recurring tasks; false returns only non-recurring tasks. Any other value returns 400 Bad Request.

limit: string
in query

Maximum number of tasks to return. Default: 30. Use no to return all matches.

Note: On free plans, this cannot exceed 30 or no (unlimited).

cursor: string
in query

Continuation token from the previous page's last item. See Pagination in the operation notes for the loop. Cannot be combined with ?sublist=.

OK — matching tasks (may be empty). With ?limit=N, the last item may carry a cursor field if more results exist.

400 Bad Request

Bad Request — invalid query params (incl. malformed cursor).

403 Forbidden

Forbidden — caller lacks permission to search this project.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]

Search tasks in a project by project OID.

GET /task/search/{projectOid}

Returns tasks that match the specified criteria in the project.

Custom Field Filtering

You can filter by custom fields by passing the field name as a query parameter (case-insensitive). For example, ?cost=13 or ?approvedBy=john.doe.

Supported field types and value formats:

Type Value format Example
Number, Money Numeric value cost=13
Checkbox true or false done=true
Select Option name priority=High
User User ID, email, or OID approvedBy=john.doe
Task Task ID (integer) or OID blockedBy=42
Email, Hyperlink Exact value, or prefix with ~ for regex, ~* for case-insensitive regex website=~example\.com
Duration Seconds, or with suffix: d (days), h (hours), m (minutes) estimate=2h
Date Same grammar as the start / due query params — keyword ops (today, past, last7d, ...), value ops (ge:<v>, lt:<v>, between:<v1>,<v2>, ...), and null ops (isNull, isNotNull). <v> is YYYY-MM-DD or ISO 8601 YYYY-MM-DDTHH:MM:SSZ; timestamp operands require a withTime: true field. approvedAt=today, approvedAt=ge:2026-04-01, approvedAt=between:2026-04-01,2026-04-30, approvedAt=isNull

Not supported: Text (use text for full-text search instead), Formula, File, Lookup.

Pagination

Pass ?limit=N to cap each response at N items. When more results exist, the last item carries a cursor field; pass its value back as ?cursor=<token> (along with the same ?limit= and any filter) to fetch the next page. End of stream is signalled by the absence of cursor on the last item.

Example loop:

GET /task/search/id/my_project?status=active&limit=3030 items; last has cursor: "crsr1u"
GET /task/search/id/my_project?status=active&limit=30&cursor=crsr1u
    → 30 items; last has cursor: "crsr11k"
GET /task/search/id/my_project?status=active&limit=30&cursor=crsr11k
    → 12 items; no cursor on last item → stop

Cannot be combined with ?sublist=. The cursor token is opaque — use it verbatim from the previous response.

Rate-limit cost: proportional to the number of items returned — max(1, ceil(items / 100)) units. So ?limit=100 (or fewer matches) costs 1, ?limit=1000 costs 10, ?limit=no returning 5,000 matches costs 50.

projectOid: string
in path

Project OID. Specify "-" to search in My Tasks (no specific project).

text: string
in query

Full-text query against task name, description, and attachments. Note: does not include comment content or comment attachments. Indexing can take ~10 seconds or more after updates.

name: string
in query

Task name filter. Prefix with ~ for regex, ~* for case-insensitive regex. Use text for full-text search.

description: string
in query

Task description filter. Prefix with ~ for regex, ~* for case-insensitive regex.

sublist: string
in query

Task sublist ID or OID filter.

status: string
in query

Task status filter. Specify 0–100, or "active" / "completed".

scheduled: boolean
in query

Return only scheduled tasks (start or due is set). If scheduled=false, returns only tasks where neither start nor due is set.

mine: boolean
in query

Return only "My Tasks" (assigned to me, or created by me and scheduled but unassigned).

assignee: string
in query

Filter by assignee. Each value is a user OID, user ID, or email.

Combine values with , (AND), | (OR), and ! (NOT). AND binds tighter than OR.

Examples:

  • alice — a single user (by ID)
  • [email protected] — by email
  • alice,bob — assigned to both
  • alice|bob — assigned to either
  • alice,!bob — assigned to alice but not bob
  • alice,bob|carol(alice AND bob) OR carol
assignor: string
in query

Filter by assignor (the user who set the assignment). Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

follower: string
in query

Filter by follower. Each value is a user OID, user ID, or email. Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Examples: alice, alice,!bob, alice|bob.

tag: string
in query

Filter by tag. Each value is a tag OID or a tag name (names are resolved within the search's organization).

Combine with , (AND), | (OR), ! (NOT); AND binds tighter than OR.

Names containing ,, |, !, ", or whitespace must be wrapped in "...". Inside quotes, write \" for a literal " and \\ for a literal \; any other \x is preserved as two literal characters.

Examples:

  • Legal — a single tag
  • Legal,!Draft — has Legal but not Draft
  • "In Progress",!Done — quoted name with space
  • "Foo\"s Go"|Other — quoted with escaped "
modified: string
in query

Return only tasks created or modified recently. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

commented: string
in query

Return only tasks with recent comments. Specify an integer (days); default 7 if omitted. Supports d, h, m suffixes (e.g., 8h).

sourceRef: string
in query

Filter by source ref key. See sourceRef in the task creation API.

created: string
in query

Filter by the task's createdAt timestamp. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<timestamp> or {between|notBetween}:<timestamp>,<timestamp>
  • <timestamp> is ISO 8601 YYYY-MM-DDTHH:MM:SSZ (UTC)
  • Day boundaries resolve in the caller's timezone; week start follows the caller's locale
  • past on this field is < now()
  • Tokens and keywords are case-insensitive

Examples: today, last7d, ge:2026-04-01T00:00:00Z, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

edited: string
in query

Filter by the task's editedAt timestamp. Same grammar as created. Note: editedAt is NULL for tasks that have never been edited after creation; such tasks are excluded by every op (use created to filter by creation time).

Examples: today, last7d, ge:2026-04-01T00:00:00Z.

archived: string
in query

Filter by the task's archivedAt timestamp. Same grammar as created, plus null ops since the field is nullable:

  • isNull — not archived
  • isNotNull — archived (any time)

Examples: isNotNull, today, ge:2026-04-01T00:00:00Z.

unarchived: string
in query

Filter by the task's reshowAt timestamp (scheduled un-archive). Same grammar as archived (supports isNull / isNotNull).

Examples: isNotNull, today, between:2026-04-01T00:00:00Z,2026-04-30T23:59:59Z.

toggled: string
in query

Filter by the task's toggledAt timestamp (when its completion status was last changed). Same grammar as archived (supports isNull / isNotNull).

Examples: today, isNotNull, ge:2026-04-01T00:00:00Z.

start: string
in query

Filter by the task's start date/time. Value grammar:

  • Keyword: past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek
  • Value op: {ge|gt|le|lt|eq|ne}:<value> or {between|notBetween}:<value>,<value>
  • Null op: isNull, isNotNull
  • <value> is either a date (YYYY-MM-DD) or a full ISO 8601 timestamp (YYYY-MM-DDTHH:MM:SSZ)
  • A date operand expands to a whole-day window in the caller's timezone (ge:2026-04-01 means "on or after Apr 1 in the caller's calendar"); gt:D/le:D use end-of-day, lt:D/ge:D use start-of-day
  • past on start/due is < today 00:00 in the caller's timezone (not < now())
  • upcoming on start/due is the window [tomorrow, today + 7 days)

Examples: today, upcoming, ge:2026-04-01, between:2026-04-01,2026-04-30, isNull.

due: string
in query

Filter by the task's due date/time. Same grammar and semantics as start (accepts date-only operands, isNull/isNotNull, and the same keyword/value ops).

Examples: today, upcoming, le:2026-04-30, isNotNull.

limit: string
in query

Maximum number of tasks to return. Default: 30. Use no to return all matches.

Note: On free plans, this cannot exceed 30 or no (unlimited).

OK — matching tasks (may be empty). With ?limit=N, the last item may carry a cursor field if more results exist.

400 Bad Request

Bad Request — invalid query params (incl. malformed cursor).

403 Forbidden

Forbidden — caller lacks permission to search this project.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]

Bulk-move N tasks within a project by ID.

PUT /task/bulk-move/id/{projectId}

Repositions up to 300 tasks within a project to the same destination anchor in one transaction. Same query-param grammar as single-task PUT /task/move/...:

  • ?task=root — move items to project root (only valid with default ?position=parent).
  • ?task={ref}&position=parent (default) — items become children of the reference task.
  • ?task={ref}&position=before — items become siblings immediately before the reference.
  • ?task={ref}&position=after — items become siblings immediately after the reference.

{ref} follows the URL grammar (same as single-task move): the by-ID URL form expects an integer task ID (or root); the by-OID form expects a task OID. Items in the body use the bulk mixed-form convention (OID / integer ID / #<id> string) — same as bulk-remove.

Example: PUT /task/bulk-move/id/my_project?task=99&return=compact

Request body (mixed-form refs):

[ 42, "#17", "iuRRiKoyrxdBFhFTTo" ]

Response (compact mode; slot 1 was already removed by another caller, so it's null):

[
  { "oid": "abc1Foo", "id": 42 },
  null,
  { "oid": "iuRRiKoyrxdBFhFTTo", "id": 88 }
]

Atomic on real bugs: validation / permission / DB errors (cycle detection — making a task its own ancestor — throws 400) propagate as {code, message} with items[i]: prefix and roll back the whole batch.

Skip-not-found: items whose target task can't be resolved (already removed, never existed, cascade-removed by an earlier item, in a different project, etc.) are silently skipped — the corresponding response slot is null. Idempotent for agents.

Order preservation (sliding chain): items are moved in submitted order. Items 1..N-1 are positioned after the previous successful move, regardless of the URL ?position= — without this, ?position=after R would reverse the batch.

Rate-limit cost: each bulk call costs N units against the per-minute / per-hour API quota, where N is items.length — same total cost as N equivalent single-task moves.

All items must belong to the project in the URL. Cross-project moves go through bulk-transfer (see #24555).

projectId: string
in path

Project ID.

task: string
in query

Reference task ID (the destination anchor for the whole batch), or root to move items to the project root.

position: string parent, before, after
in query

(Optional) Placement of moved items relative to the reference: parent (default), before, or after. before / after require ?task= to refer to a task (not root).

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  "object"
]

OK — array of moved tasks (slots for not-found items are null).

400 Bad Request

Bad Request — body not a JSON array, empty, over the 300-item cap, item shape error, missing ?task=, invalid ?position=, ?task=root&position=before|after, cycle detection (item is an ancestor of ?task=), or cross-project ref. Whole batch rolled back.

403 Forbidden

Forbidden — caller lacks permission on the project or any task in the batch (whole batch rolled back).

404 Not Found

Not Found — project (URL scope) or ?task= reference does not exist. (Item-level not-found is silent skip.)

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests — the batch's rate-limit cost (items.length units) would exceed the caller's per-minute / per-hour API quota.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-move N tasks within a project by OID.

PUT /task/bulk-move/{projectOid}

OID-form of PUT /task/bulk-move/id/{projectId} — see that endpoint for body shape, atomic / skip-not-found semantics, sliding-chain order preservation, and rate-limit details.

Note: {ref} (in ?task=) is a task OID (or root) in this URL form, matching the by-OID grammar.

projectOid: string
in path

Project OID.

task: string
in query

Reference task OID (destination anchor), or root.

position: string parent, before, after
in query

(Optional) parent (default), before, or after.

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  "object"
]

OK — array of moved tasks.

400 Bad Request

Bad Request.

403 Forbidden

Forbidden.

404 Not Found

Not Found — project does not exist.

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-transfer N tasks across projects by ID.

PUT /task/bulk-transfer/id/{sourceProjectId}

Transfers up to 300 tasks from the source project (URL path) to a different target project (?project=) in one transaction. Same query-param grammar as single-task PUT /task/transfer/...:

  • ?project={target} (required) — target project ID, or - for the user's Inbox.
  • ?task={ref} (optional) — destination anchor in the target project. Omitted, empty, or root → items become root tasks of the target.
  • ?position=parent (default), before, or after.
  • ?invite, ?tag, ?status, ?custom-field — auto-remap flags, all default true.

Items in the body use the bulk mixed-form convention (OID / integer ID / #<id> string) — same as bulk-remove / bulk-move.

Example: PUT /task/bulk-transfer/id/my_project?project=archive_2026&task=root&return=compact

Request body (mixed-form refs):

[ 42, "#99", "iuRRiKoyrxdBFhFTTo" ]

Response (compact mode; OIDs are preserved across transfer, IDs are reassigned from the target's counter):

[
  { "oid": "abc1Foo",            "id": 7 },
  null,
  { "oid": "iuRRiKoyrxdBFhFTTo", "id": 8 }
]

Atomic on real bugs: validation / permission / DB errors propagate as {code, message} with items[i]: prefix and roll back both source and target locks.

Skip-not-found: items not in the source project (already in target / in another project / removed / never existed) are silently skipped — the response slot is null.

Source == target: if ?project= resolves to the same project as the URL source, the whole batch is rejected with 400 (use bulk-move for within-project reorder).

Order preservation (sliding chain): items are transferred in submitted order — items 1..N-1 land after the previous successful transfer, regardless of ?position=.

Rate-limit cost: each bulk call costs N units against the per-minute / per-hour API quota, where N is items.length — same total cost as N equivalent single-task transfers.

sourceProjectId: string
in path

Source project ID.

project: string
in query

Target project ID. Specify - for the user's Inbox.

task: string
in query

(Optional) Reference task ID in the target project (destination anchor for the whole batch), or root to transfer items to the target project's root.

position: string parent, before, after
in query

(Optional) Placement of transferred items relative to the reference: parent (default), before, or after. before / after require ?task= to refer to a task (not root).

invite: string
in query

(Optional, default true) Auto-invite assignees to the target project if not already members.

tag: string
in query

(Optional, default true) Auto-create tags in the target project if not already present.

status: string
in query

(Optional, default true) Auto-remap statuses to the target project.

custom-field: string
in query

(Optional, default true) Auto-create / remap non-empty custom fields in the target project.

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  "object"
]

OK — array of transferred tasks (slots for not-found items are null).

400 Bad Request

Bad Request — body not a JSON array, empty, over the 300-item cap, item shape error, missing ?project=, invalid ?position=, ?task=root&position=before|after, ?project= resolves to the URL source project, or any per-item validation failure. Whole batch rolled back.

403 Forbidden

Forbidden — caller lacks permission on the source or target project, or on any individual task in the batch. Whole batch rolled back.

404 Not Found

Not Found — source project, target project, or ?task= reference does not exist. (Item-level not-found is silent skip.)

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests — the batch's rate-limit cost (items.length units) would exceed the caller's per-minute / per-hour API quota.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-transfer N tasks across projects by OID.

PUT /task/bulk-transfer/{sourceProjectOid}

OID-form of PUT /task/bulk-transfer/id/{sourceProjectId} — see that endpoint for body shape, atomic / skip-not-found semantics, sliding-chain order preservation, auto-remap flags, and rate-limit details.

Note: ?project= and ?task= are OIDs (or root / -) in this URL form, matching the by-OID grammar.

sourceProjectOid: string
in path

Source project OID.

project: string
in query

Target project OID. Specify - for the user's Inbox.

task: string
in query

(Optional) Reference task OID, or root.

position: string parent, before, after
in query

(Optional) parent (default), before, or after.

invite: string
in query

(Optional, default true)

tag: string
in query

(Optional, default true)

status: string
in query

(Optional, default true)

custom-field: string
in query

(Optional, default true)

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  "object"
]

OK — array of transferred tasks.

400 Bad Request

Bad Request.

403 Forbidden

Forbidden.

404 Not Found

Not Found — source or target project does not exist.

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "parent": {
      "id": 12
    }
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-update N tasks in a project by ID.

PUT /task/bulk-update/id/{projectId}

Updates up to 300 tasks in one transaction. Body is a top-level JSON array of BulkUpdateTaskItem — each item carries exactly one of oid / id plus the UpdateTaskBody-shape fields to apply.

Example: PUT /task/bulk-update/id/my_project?return=compact

Request body:

[
  { "id": 42, "status": 100, "addTags": ["done"] },
  { "id": 99, "addAssignees": ["[email protected]"] },
  { "id": 17, "name": "Renamed" }
]

Response (compact mode; slot for a not-found item is null):

[
  { "oid": "iuRRiKoyrxdBFhFTTo", "id": 42 },
  null,
  { "oid": "defLmnQrSt", "id": 17 }
]

Atomic on real bugs: validation / permission / DB errors propagate as {code, message} with items[i]: prefix and roll back the whole batch. Example error:

{ "code": 400, "message": "items[1]: `priority`: Invalid value 99 (expected -1, 0, 1, or 2)" }

Skip-not-found: items whose target task can't be found (already removed, never existed, etc.) are silently skipped — the corresponding response slot is null and the rest of the batch proceeds. This makes the endpoint idempotent for agents — safe to re-submit after a partial network failure or concurrent removal without diffing state first. Shape errors (both / neither oid and id, malformed ref) still 400 + rollback — those are typos, not state races.

Rate-limit cost: each bulk call costs N units against the per-minute / per-hour API quota, where N is items.length — the same total cost as N equivalent single-task PUTs. The cost does not adjust for skipped items; the per-item resolve still runs.

projectId: string
in path

Project ID.

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  {
    "oid": "iuRRiKoyrxdBFhFTTo",
    "id": 42,
    "description": "This is a **cool** task.",
    "assignees": "[\"me\", \"[email protected]\"]",
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "recurrence": {
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "peekaboo": "true",
    "section": true,
    "milestone": true,
    "asUser": true,
    "followers": "[\"[email protected]\"]",
    "successors": "[\"#13\"]",
    "yourField": "object",
    "addTags": "[\"urgent\"]",
    "removeTags": "[\"draft\"]",
    "addAssignees": "[\"me\"]",
    "removeAssignees": "[\"[email protected]\"]",
    "addFollowers": "[\"me\"]",
    "removeFollowers": "[\"[email protected]\"]",
    "addSuccessors": "[\"#13\"]",
    "removeSuccessors": "[\"#13\"]",
    "tags": "[\"urgent\", \"design\"]",
    "name": "New idea",
    "etc": 0,
    "status": 100,
    "priority": 0,
    "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
  }
]
200 OK

OK — array of updated tasks (slots for not-found items are null).

400 Bad Request

Bad Request — body not a JSON array, empty, over the 300-item cap, item shape error (both/neither oid+id, malformed ref), or any per-item validation failure (whole batch rolled back).

403 Forbidden

Forbidden — caller lacks permission on the project or any task in the batch (whole batch rolled back).

404 Not Found

Not Found — project does not exist. (Item-level not-found is silent skip.)

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests — the batch's rate-limit cost (items.length units) would exceed the caller's per-minute / per-hour API quota.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-update N tasks in a project by OID.

PUT /task/bulk-update/{projectOid}

OID-form of PUT /task/bulk-update/id/{projectId} — see that endpoint for body shape, atomic semantics, skip-not-found behaviour, and response details.

projectOid: string
in path

Project OID.

return: string full, compact
in query

(Optional) Response shape — full (default) or compact.

Request Example
[
  {
    "oid": "iuRRiKoyrxdBFhFTTo",
    "id": 42,
    "description": "This is a **cool** task.",
    "assignees": "[\"me\", \"[email protected]\"]",
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "recurrence": {
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "peekaboo": "true",
    "section": true,
    "milestone": true,
    "asUser": true,
    "followers": "[\"[email protected]\"]",
    "successors": "[\"#13\"]",
    "yourField": "object",
    "addTags": "[\"urgent\"]",
    "removeTags": "[\"draft\"]",
    "addAssignees": "[\"me\"]",
    "removeAssignees": "[\"[email protected]\"]",
    "addFollowers": "[\"me\"]",
    "removeFollowers": "[\"[email protected]\"]",
    "addSuccessors": "[\"#13\"]",
    "removeSuccessors": "[\"#13\"]",
    "tags": "[\"urgent\", \"design\"]",
    "name": "New idea",
    "etc": 0,
    "status": 100,
    "priority": 0,
    "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
  }
]
200 OK

OK — array of updated tasks.

400 Bad Request

Bad Request.

403 Forbidden

Forbidden.

404 Not Found

Not Found — project does not exist.

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "successors": "['#135', '#26']",
    "tags": [
      {
        "color": "35",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    ],
    "predecessors": "['#17', '#66', '#91']",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "id": 12,
    "nameText": "Design new logo",
    "nameHtml": "Design new <b>logo</b>",
    "name": "Design new **logo**",
    "description": "This is a *cool* task.",
    "descriptionText": "This is a cool task.",
    "descriptionHtml": "This is a <i>cool</i> task.",
    "etc": 500,
    "recurrence": {
      "seriesId": "j47xvxul26",
      "freq": "weekly",
      "interval": 1,
      "byweekday": "[1,3]",
      "byweekno": 2,
      "bydayno": 25,
      "bymonth": 10,
      "dupsubtasks": false,
      "sincelatest": true,
      "until": "2020-12-22"
    },
    "timelogs": [
      {
        "start": "2023-02-20T00:00:00.000Z",
        "end": "2023-02-20T00:05:35.000Z",
        "user": {
          "url": "https://quire.io/u/my_id",
          "id": "my_id",
          "iconColor": "37",
          "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
          "name": "Foo",
          "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
        },
        "billable": true,
        "note": "A piece of cake"
      }
    ],
    "start": "2018-12-20T00:00:00.000Z",
    "due": "2018-12-22T00:00:00.000Z",
    "status": 0,
    "priority": 0,
    "assignors": [
      "#/definitions/SimpleIdentity"
    ],
    "partner": "#/definitions/SimpleTaggingEntity",
    "partnerBy": "#/definitions/SimpleIdentity",
    "assignees": [
      "#/definitions/SimpleIdentity"
    ],
    "order": 99,
    "attachments": [
      {
        "type": 2,
        "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
        "name": "file.txt",
        "length": 20000,
        "createdAt": "2018-12-22T02:06:58.158Z",
        "createdBy": "#/definitions/SimpleIdentity"
      }
    ],
    "cover": "qfqVmUtC",
    "childCount": 5,
    "referrers": [
      {
        "when": "2018-12-22T02:06:58.158Z",
        "user": "wrSpgghWFCzPHBqiShSurDeD",
        "task": "wrSpgghWFCzPHBqiShSurDeD"
      }
    ],
    "peekaboo": true,
    "section": true,
    "milestone": true,
    "url": "https://quire.io/w/my_project/123",
    "followers": [
      "#/definitions/SimpleIdentity"
    ],
    "mutes": [
      "#/definitions/SimpleIdentity"
    ],
    "favorites": [
      "#/definitions/SimpleIdentity"
    ],
    "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
    "toggledAt": "2018-12-22T02:06:58.158Z",
    "toggledBy": "#/definitions/SimpleIdentity",
    "editedAt": "2018-12-22T02:06:58.158Z",
    "commentedAt": "2023-12-22T09:06:28.253Z",
    "approval": {
      "category": "legal",
      "requester": "string",
      "approver": "string",
      "toggledAt": "2026-04-24T10:05:00.000Z",
      "state": "awaiting"
    },
    "createdAt": "2018-12-22T02:06:58.158Z",
    "createdBy": "#/definitions/SimpleIdentity"
  }
]
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Move an existing task by its ID.

PUT /task/move/id/{projectId}/{taskId}

Moves an existing task under another task as a subtask, reorders it among siblings, or sends it to the root level.

Use ?task= to name the reference task and ?position= to choose placement (parent / before / after).

Examples:

  • PUT /task/move/id/my_project/42?task=99 — reparent (default: child of task 99).
  • PUT /task/move/id/my_project/42?task=99&position=before — place task 42 before task 99.
  • PUT /task/move/id/my_project/42?task=99&position=after — place task 42 after task 99.
  • PUT /task/move/id/my_project/42?task=root — move to root level.

Returns the updated task record.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

taskId: integer
in path

Task ID to be moved.

task: string
in query

Reference task ID. How it's used depends on position:

  • parent (default): the moved task becomes a child of task.
  • before / after: the moved task is placed as a sibling, under task's parent.

Specify root to move to the root level (only valid with the default parent position).

position: string parent, before, after
in query

(Optional) Placement relative to task:

  • parent (default): child of task.
  • before: sibling immediately before task.
  • after: sibling immediately after task.

Omitted or empty → same as parent. Any other value returns 400 Bad Request. before / after require task to refer to a task (not root).

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — updated task record.

400 Bad Request

Bad Request — invalid task or position.

403 Forbidden

Forbidden — caller lacks permission to move this task.

404 Not Found

Not Found — task or reference task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Move an existing task by its OID.

PUT /task/move/{oid}

Moves an existing task under another task as a subtask, reorders it among siblings, or sends it to the root level.

Use ?task= to name the reference task and ?position= to choose placement (parent / before / after). See the by-ID variant PUT /task/move/id/{projectId}/{taskId} for the preferred URL form.

Returns the updated task record.

oid: string
in path

Task OID to be moved.

task: string
in query

Reference task OID. How it's used depends on position:

  • parent (default): the moved task becomes a child of task.
  • before / after: the moved task is placed as a sibling, under task's parent.

Specify root to move to the root level (only valid with the default parent position).

position: string parent, before, after
in query

(Optional) Placement relative to task:

  • parent (default): child of task.
  • before: sibling immediately before task.
  • after: sibling immediately after task.

Omitted or empty → same as parent. Any other value returns 400 Bad Request. before / after require task to refer to a task (not root).

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — updated task record.

400 Bad Request

Bad Request — invalid task or position.

403 Forbidden

Forbidden — caller lacks permission to move this task.

404 Not Found

Not Found — task or reference task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Transfer an existing task by its ID to another project.

PUT /task/transfer/id/{projectId}/{taskId}

Transfers an existing task to another project, optionally positioning it relative to an existing task in the target (?task= + ?position=).

Examples:

  • PUT /task/transfer/id/my_project/42?project=archive — transfer to root of target project.
  • PUT /task/transfer/id/my_project/42?project=archive&task=99 — transfer as a child of task 99 in target.
  • PUT /task/transfer/id/my_project/42?project=archive&task=99&position=before — transfer and place before task 99.
  • PUT /task/transfer/id/my_project/42?project=- — transfer to the user's Inbox.

Returns the updated task record.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

taskId: integer
in path

Task ID to be transferred.

project: string
in query

ID of the target project to which the task will be transferred. Specify "-" for personal tasks in My Tasks.

task: string
in query

(Optional) ID of a reference task in the target project. How it's used depends on position:

  • parent (default): the transferred task becomes a child of task.
  • before / after: the transferred task is placed as a sibling, under task's parent.

If omitted (or root), the transferred task becomes a root task in the target project.

position: string parent, before, after
in query

(Optional) Placement relative to task in the target project:

  • parent (default): child of task.
  • before: sibling immediately before task.
  • after: sibling immediately after task.

Omitted or empty → same as parent. Any other value returns 400 Bad Request. before / after require task to refer to a task (not omitted, not root).

invite: string
in query

Whether to invite assignees to the target project if they are not already members.

If omitted, true is assumed. Specify false to disable this.

tag: string
in query

Whether to add tags to the target project if they are not already present.

If omitted, true is assumed. Specify false to disable this.

status: string
in query

Whether to add statuses to the target project if they are not already present.

If omitted, true is assumed. Specify false to disable this.

custom-field: string
in query

Whether to add non-empty custom fields to the target project if they are not already present.

If omitted, true is assumed. Specify false to disable this.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — updated task record.

400 Bad Request

Bad Request — invalid project, task, or position.

403 Forbidden

Forbidden — caller lacks permission to transfer this task.

404 Not Found

Not Found — task, target project, or reference task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Transfer an existing task by its OID to another project.

PUT /task/transfer/{oid}

Transfers an existing task to another project, optionally positioning it relative to an existing task in the target (?task= + ?position=). See the by-ID variant PUT /task/transfer/id/{projectId}/{taskId} for the preferred URL form.

Returns the updated task record.

oid: string
in path

Task OID to be transferred.

project: string
in query

OID of the target project to which the task will be transferred. Specify "-" for personal tasks in My Tasks.

task: string
in query

(Optional) OID of a reference task in the target project. How it's used depends on position:

  • parent (default): the transferred task becomes a child of task.
  • before / after: the transferred task is placed as a sibling, under task's parent.

If omitted (or root), the transferred task becomes a root task in the target project.

position: string parent, before, after
in query

(Optional) Placement relative to task in the target project:

  • parent (default): child of task.
  • before: sibling immediately before task.
  • after: sibling immediately after task.

Omitted or empty → same as parent. Any other value returns 400 Bad Request. before / after require task to refer to a task (not omitted, not root).

invite: string
in query

Whether to invite assignees to the target project if they are not already members.

If omitted, true is assumed. Specify false to disable this.

tag: string
in query

Whether to add tags to the target project if they are not already present.

If omitted, true is assumed. Specify false to disable this.

status: string
in query

Whether to add statuses to the target project if they are not already present.

If omitted, true is assumed. Specify false to disable this.

custom-field: string
in query

Whether to add non-empty custom fields to the target project if they are not already present.

If omitted, true is assumed. Specify false to disable this.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — updated task record.

400 Bad Request

Bad Request — invalid project, task, or position.

403 Forbidden

Forbidden — caller lacks permission to transfer this task.

404 Not Found

Not Found — task, target project, or reference task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Undo the removal of a task by its ID.

PUT /task/undo-remove/id/{projectId}/{taskId}

Restores a previously-removed task. Idempotent: if the task is not currently removed, this is a no-op and returns the current task record.

Subject to the task-creation quota (same as creating a new task): may return 429 Too Many Requests if the organization is at the plan's task limit.

projectId: string
in path

Project ID. Specify "-" for personal tasks in My Tasks.

taskId: integer
in path

Task ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — restored task record.

403 Forbidden

Forbidden — caller lacks permission to restore this task.

404 Not Found

Not Found — task does not exist.

429 Too Many Requests

Too Many Requests — organization is at the plan's task limit.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Undo the removal of a task by its OID.

PUT /task/undo-remove/{oid}

Restores a previously-removed task. Idempotent: if the task is not currently removed, this is a no-op and returns the current task record.

Subject to the task-creation quota (same as creating a new task): may return 429 Too Many Requests if the organization is at the plan's task limit.

oid: string
in path

Task OID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full record, or compact for identifiers only. See API description for ?return= semantics.

OK — restored task record.

403 Forbidden

Forbidden — caller lacks permission to restore this task.

404 Not Found

Not Found — task does not exist.

429 Too Many Requests

Too Many Requests — organization is at the plan's task limit.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update an existing time log on a task by ID.

PUT /task/update-timelog/id/{projectId}/{taskId}

Updates an existing time log on the task identified by project + task ID. The log to update is located by the start, end, and (optional) user query parameters — that triple is the log's identity. The body carries new values; any field omitted or set to null preserves the existing value (so an agent that always includes every field with null for unchanged ones is safe). To clear note, send an empty string.

Sub-second precision in time values is truncated to whole seconds (in both query params and body).

On success returns the task's full timelogs array. Example:

[
  {
    "start": "2026-04-26T09:15:00.000Z",
    "end": "2026-04-26T10:45:00.000Z",
    "billable": true,
    "note": "Updated note",
    "user": { "oid": "u-123", "name": "John Doe" }
  }
]
projectId: string
in path

Project ID.

taskId: integer
in path

Task ID.

start: string
in query

Start timestamp of the existing log (identifies the log together with end and user). ISO 8601, UTC.

end: string
in query

End timestamp of the existing log. ISO 8601, UTC.

user: string
in query

(Optional) User the existing log is credited to (OID, ID, or email). Omitted defaults to the authenticated caller.

end: string

(Optional) New end timestamp (ISO 8601, UTC). Must be on or after the (new or existing) start. Sub-second precision is truncated to whole seconds. Omit or set null to preserve.

user: string

(Optional) New user the log is credited to (OID, ID, or email). Omit or set null to preserve. Send empty string to reset to the authenticated caller.

start: string

(Optional) New start timestamp (ISO 8601, UTC). Sub-second precision is truncated to whole seconds. Omit or set null to preserve.

billable: boolean

(Optional) New billable flag. Omit or set null to preserve.

note: string

(Optional) New note. Omit or set null to preserve. Send empty string to clear.

Request Example
{
  "end": "2026-04-26T10:45:00Z",
  "user": "[email protected]",
  "start": "2026-04-26T09:15:00Z",
  "billable": false,
  "note": "Updated note"
}
200 OK

OK — task's full timelogs array.

400 Bad Request

Bad Request — query params missing or malformed, or new end precedes new start.

404 Not Found

Not Found — no log matches the identifying triple, or the task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "start": "2023-02-20T00:00:00.000Z",
    "end": "2023-02-20T00:05:35.000Z",
    "user": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "billable": true,
    "note": "A piece of cake"
  }
]

Update an existing time log on a task by OID.

PUT /task/update-timelog/{oid}

Updates an existing time log, identifying the task by OID. See PUT /task/update-timelog/id/{projectId}/{taskId} for the preferred by-ID form, full semantics, and an example response.

oid: string
in path

Task OID.

start: string
in query

Start timestamp of the existing log. ISO 8601, UTC.

end: string
in query

End timestamp of the existing log. ISO 8601, UTC.

user: string
in query

(Optional) User the existing log is credited to. Defaults to the caller.

end: string

(Optional) New end timestamp (ISO 8601, UTC). Must be on or after the (new or existing) start. Sub-second precision is truncated to whole seconds. Omit or set null to preserve.

user: string

(Optional) New user the log is credited to (OID, ID, or email). Omit or set null to preserve. Send empty string to reset to the authenticated caller.

start: string

(Optional) New start timestamp (ISO 8601, UTC). Sub-second precision is truncated to whole seconds. Omit or set null to preserve.

billable: boolean

(Optional) New billable flag. Omit or set null to preserve.

note: string

(Optional) New note. Omit or set null to preserve. Send empty string to clear.

Request Example
{
  "end": "2026-04-26T10:45:00Z",
  "user": "[email protected]",
  "start": "2026-04-26T09:15:00Z",
  "billable": false,
  "note": "Updated note"
}
200 OK

OK — task's full timelogs array.

400 Bad Request

Bad Request.

404 Not Found

Not Found — no log matches the identifying triple, or the task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "start": "2023-02-20T00:00:00.000Z",
    "end": "2023-02-20T00:05:35.000Z",
    "user": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "billable": true,
    "note": "A piece of cake"
  }
]

Update an existing task by its ID.

PUT /task/id/{projectId}/{taskId}

Updates an existing task and returns the updated record.

Only the fields you include are updated; omitted fields are left unchanged. Example — complete the task, add a tag, and remove an assignee:

{
  "status": 100,
  "addTags": ["done"],
  "removeAssignees": ["[email protected]"]
}

Note the replace-vs-incremental pattern: tags replaces the entire tag set; addTags / removeTags modify the set in place. Same for assignees / addAssignees / removeAssignees, and followers / successors / etc. Mix whichever suits the intent.

To archive (hide indefinitely) or snooze a task, set the peekaboo field: true hides it indefinitely, a positive integer hides it for that many days, false unhides.

projectId: string
in path

ID of the task's project. Specify "-" for personal tasks in My Tasks.

taskId: integer
in path

Task ID.

return: string full, compact
in query

(Optional) Response shape: full (default) for the full task record, or compact for identifiers only ({"oid":…, "id":…}). See PUT /task/{oid} for full semantics.

description: string

(Optional) New task description.

assignees: string[]

(Optional) Assignees to replace the current assignees (OID, ID, or email). This replaces all existing assignees. To modify incrementally, use addAssignees or removeAssignees.

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [1], [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Duplicate subtasks when the task is completed. Default: true.
  • sincelatest: Daily only. Repeat based on the last completion date. Default: false.
peekaboo:
boolean
integer

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely (task and subtasks).
  • positive integer: Number of days to hide.
  • false: Undo previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this update as performed by the app. Default: false (updated by the authorizing user).

followers: string[]

(Optional) Followers to replace the current followers (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
successors: string[]

(Optional) Successors to replace the current successors (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list. Pass null to clear the field.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

addTags: string[]

(Optional) Tags to add to this task (OID or name). Tag names are case-insensitive.

removeTags: string[]

(Optional) Tags to remove from this task (OID or name). Tag names are case-insensitive.

addAssignees: string[]

(Optional) Assignees to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include all assignees of the parent task
removeAssignees: string[]

(Optional) Assignees to remove (OID, ID, or email).

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

addFollowers: string[]

(Optional) Followers to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
removeFollowers: string[]

(Optional) Followers to remove (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": remove followers that were inherited from the parent task
  • "app": the application

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL.
addSuccessors: string[]

(Optional) Successors to add (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

removeSuccessors: string[]

(Optional) Successors to remove (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

tags: string[]

(Optional) Tags to replace the current tags on this task (OID or name). This replaces all existing tags. To modify incrementally, use addTags or removeTags. Tag names are case-insensitive.

name: string

(Optional) New task name.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative or null. Specify null to clear the value.

status: integer

(Optional) New status, between 0 and 100. Specify 100 to complete the task.

priority: integer -1, 0, 1, 2

(Optional) New priority. -1 (lowest) through 2 (highest); 0 is Normal. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to store with the task. Available via API on retrieval.

If the map contains text, its value will be displayed client-side and should be Markdown. Including a source link is recommended.

Request Example
{
  "description": "This is a **cool** task.",
  "assignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl",
    "app"
  ],
  "successors": "[\"#13\"]",
  "yourField": "object",
  "addTags": [
    "X6nmx9XjEO2wKbqeB1pRT43C"
  ],
  "removeTags": [
    "mPAQrYU1qt8wAYAInKRlTnvl"
  ],
  "addAssignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "removeAssignees": [
    "Job4NSW9xK6Owcke8iKj7zyH"
  ],
  "addFollowers": [
    "sfsvLbDVPvi1QMf2GkDn7VSy"
  ],
  "removeFollowers": [
    "aBuz4MwfZ5CasOae6stnFa2f"
  ],
  "addSuccessors": "[\"#13\"]",
  "removeSuccessors": "[\"#13\"]",
  "tags": [
    "ITaVbkhh3iVcEcV3vuSLeE2k"
  ],
  "name": "New idea",
  "etc": 0,
  "status": 100,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}

OK — updated task record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to update this task.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Update an existing task by its OID.

PUT /task/{oid}

Updates an existing task and returns the updated record. See PUT /task/id/{projectId}/{taskId} for a full request-body example and the replace-vs-incremental field pattern.

To archive (hide indefinitely) or snooze a task, set the peekaboo field: true hides it indefinitely, a positive integer hides it for that many days, false unhides.

oid: string
in path

Task OID.

return: string full, compact
in query

(Optional) Response shape:

  • full (default): the full task record.
  • compact: identifiers only ({"oid":…, "id":…}). Saves payload, tokens, and a server-side reload + render. Recommended for MCP / scripted callers that already have the OID/ID and just need confirmation that the update succeeded.

Any other value returns 400 Bad Request.

description: string

(Optional) New task description.

assignees: string[]

(Optional) Assignees to replace the current assignees (OID, ID, or email). This replaces all existing assignees. To modify incrementally, use addAssignees or removeAssignees.

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [1], [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Duplicate subtasks when the task is completed. Default: true.
  • sincelatest: Daily only. Repeat based on the last completion date. Default: false.
peekaboo:
boolean
integer

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely (task and subtasks).
  • positive integer: Number of days to hide.
  • false: Undo previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this update as performed by the app. Default: false (updated by the authorizing user).

followers: string[]

(Optional) Followers to replace the current followers (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
successors: string[]

(Optional) Successors to replace the current successors (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list. Pass null to clear the field.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

addTags: string[]

(Optional) Tags to add to this task (OID or name). Tag names are case-insensitive.

removeTags: string[]

(Optional) Tags to remove from this task (OID or name). Tag names are case-insensitive.

addAssignees: string[]

(Optional) Assignees to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include all assignees of the parent task
removeAssignees: string[]

(Optional) Assignees to remove (OID, ID, or email).

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

addFollowers: string[]

(Optional) Followers to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
removeFollowers: string[]

(Optional) Followers to remove (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": remove followers that were inherited from the parent task
  • "app": the application

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL.
addSuccessors: string[]

(Optional) Successors to add (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

removeSuccessors: string[]

(Optional) Successors to remove (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

tags: string[]

(Optional) Tags to replace the current tags on this task (OID or name). This replaces all existing tags. To modify incrementally, use addTags or removeTags. Tag names are case-insensitive.

name: string

(Optional) New task name.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative or null. Specify null to clear the value.

status: integer

(Optional) New status, between 0 and 100. Specify 100 to complete the task.

priority: integer -1, 0, 1, 2

(Optional) New priority. -1 (lowest) through 2 (highest); 0 is Normal. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to store with the task. Available via API on retrieval.

If the map contains text, its value will be displayed client-side and should be Markdown. Including a source link is recommended.

Request Example
{
  "description": "This is a **cool** task.",
  "assignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl",
    "app"
  ],
  "successors": "[\"#13\"]",
  "yourField": "object",
  "addTags": [
    "X6nmx9XjEO2wKbqeB1pRT43C"
  ],
  "removeTags": [
    "mPAQrYU1qt8wAYAInKRlTnvl"
  ],
  "addAssignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "removeAssignees": [
    "Job4NSW9xK6Owcke8iKj7zyH"
  ],
  "addFollowers": [
    "sfsvLbDVPvi1QMf2GkDn7VSy"
  ],
  "removeFollowers": [
    "aBuz4MwfZ5CasOae6stnFa2f"
  ],
  "addSuccessors": "[\"#13\"]",
  "removeSuccessors": "[\"#13\"]",
  "tags": [
    "ITaVbkhh3iVcEcV3vuSLeE2k"
  ],
  "name": "New idea",
  "etc": 0,
  "status": 100,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}

OK — updated task record.

400 Bad Request

Bad Request — body validation failed.

403 Forbidden

Forbidden — caller lacks permission to update this task.

404 Not Found

Not Found — task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Bulk-remove N tasks from a project by ID.

DELETE /task/bulk-remove/id/{projectId}

Removes up to 300 tasks in one transaction. Body is a top-level JSON array of task references — each element is one of:

  • a task OID (string),
  • an integer task ID, or
  • a "#<id>" string (the ID-with-hash form).

Mixed forms in the same batch are allowed.

Example: DELETE /task/bulk-remove/id/my_project

Request body (mixed forms — all three reference shapes in one batch):

[ 42, "#99", "iuRRiKoyrxdBFhFTTo" ]

Response (slot 1 didn't resolve — already removed — so it's null):

[
  { "oid": "abc1Foo" },
  null,
  { "oid": "iuRRiKoyrxdBFhFTTo" }
]

Atomic on real bugs: malformed refs (non-string / non-int / unsupported shape) and permission failures roll back the whole batch.

Skip-not-found: refs that don't resolve (already removed, cascade-removed by an earlier item in the same batch, etc.) are silently skipped — the corresponding response slot is null and the rest of the batch proceeds. This makes the endpoint idempotent for agents — safe to re-submit duplicates or already-removed OIDs.

?return=compact is a no-op here (the response is already in identifier shape).

Rate-limit cost: each bulk call costs N units against the per-minute / per-hour API quota, where N is items.length — the same total cost as N equivalent single-task DELETEs. The cost does not adjust for skipped items.

projectId: string
in path

Project ID.

Request Example
[
  "object"
]
200 OK

OK — array of {oid} elements (slots for not-found items are null).

400 Bad Request

Bad Request — body not a JSON array, empty, over the 300-item cap, or any item is a malformed ref (whole batch rolled back).

403 Forbidden

Forbidden — caller lacks permission on the project or any task in the batch (whole batch rolled back).

404 Not Found

Not Found — project does not exist. (Item-level not-found is silent skip.)

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests — the batch's rate-limit cost (items.length units) would exceed the caller's per-minute / per-hour API quota.

Response Content-Types: application/json
Response Example (200 OK)
"object"
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Bulk-remove N tasks from a project by OID.

DELETE /task/bulk-remove/{projectOid}

OID-form of DELETE /task/bulk-remove/id/{projectId} — see that endpoint for body shape, atomic semantics, skip-not-found behaviour, and response details.

projectOid: string
in path

Project OID.

Request Example
[
  "object"
]
200 OK

OK — array of {oid} elements.

400 Bad Request

Bad Request.

403 Forbidden

Forbidden.

404 Not Found

Not Found — project does not exist.

413 Request Entity Too Large

Payload Too Large.

429 Too Many Requests

Too Many Requests.

Response Content-Types: application/json
Response Example (200 OK)
"object"
Response Example (400 Bad Request)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (403 Forbidden)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (404 Not Found)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (413 Request Entity Too Large)
{
  "code": 429,
  "message": "Something went wrong."
}
Response Example (429 Too Many Requests)
{
  "code": 429,
  "message": "Something went wrong."
}

Remove a time log from a task by ID.

DELETE /task/remove-timelog/id/{projectId}/{taskId}

Removes the time log identified by the (user, start, end) triple from the task identified by project + task ID. Sub-second precision in the query params is truncated to whole seconds before matching.

On success returns the task's remaining timelogs array (empty when no logs remain). Example after removing the only log:

[]
projectId: string
in path

Project ID.

taskId: integer
in path

Task ID.

start: string
in query

Start timestamp of the log to remove. ISO 8601, UTC.

end: string
in query

End timestamp of the log to remove. ISO 8601, UTC.

user: string
in query

(Optional) User the log is credited to. Defaults to the authenticated caller.

200 OK

OK — task's remaining timelogs array (empty when none remain).

400 Bad Request

Bad Request — start / end query params missing or malformed.

404 Not Found

Not Found — no log matches the triple, or the task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "start": "2023-02-20T00:00:00.000Z",
    "end": "2023-02-20T00:05:35.000Z",
    "user": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "billable": true,
    "note": "A piece of cake"
  }
]

Remove a time log from a task by OID.

DELETE /task/remove-timelog/{oid}

Removes a time log from a task, identifying the task by OID. See DELETE /task/remove-timelog/id/{projectId}/{taskId} for the preferred by-ID form, full semantics, and an example response.

oid: string
in path

Task OID.

start: string
in query

Start timestamp of the log to remove. ISO 8601, UTC.

end: string
in query

End timestamp of the log to remove. ISO 8601, UTC.

user: string
in query

(Optional) User the log is credited to.

200 OK

OK — task's remaining timelogs array (empty when none remain).

400 Bad Request

Bad Request.

404 Not Found

Not Found — no log matches the triple, or the task does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "start": "2023-02-20T00:00:00.000Z",
    "end": "2023-02-20T00:05:35.000Z",
    "user": {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    },
    "billable": true,
    "note": "A piece of cake"
  }
]

Cancel a task's approval.

DELETE /task/revoke-approval/id/{projectId}/{taskId}

Revokes the task's current approval. The effect depends on the current state:

  • awaiting / changes → clears the approval entirely.
  • approved / rejected → rolls back to awaiting (the original requester is preserved; the approver can re-decide via POST /task/approve/id/{projectId}/{taskId}, or DELETE again to clear).

Idempotent: returns 204 No Content even when no approval is set.

projectId: string
in path

Project ID.

taskId: integer
in path

Task ID.

204 No Content

No Content — approval revoked (or already absent).

Response Content-Types: application/json

Cancel a task's approval by OID.

DELETE /task/revoke-approval/{oid}

OID-form of DELETE /task/revoke-approval/id/{projectId}/{taskId} — see that endpoint for the smart-dispatch behavior and idempotency guarantee.

oid: string
in path

Task OID.

204 No Content

No Content — approval revoked (or already absent).

Response Content-Types: application/json

Delete a task and all of its subtasks by its ID.

DELETE /task/id/{projectId}/{taskId}

Deletes an existing task and all of its subtasks.

Note: Returns 204 No Content regardless of whether the task exists.

projectId: string
in path

Project ID. Specify "-" to remove from personal tasks in My Tasks.

taskId: integer
in path

Task ID.

204 No Content

No Content

Response Content-Types: application/json

Delete a task and all of its subtasks by its OID.

DELETE /task/{oid}

Deletes an existing task and all of its subtasks.

Note: Returns 204 No Content regardless of whether the task exists.

oid: string
in path

Task OID.

204 No Content

No Content

Response Content-Types: application/json

user

Represents a Quire account that can access organizations, projects, and tasks.

Get a user by ID or email address.

GET /user/id/{id}

Returns the full user record for the given user ID, email address, or "me" (the current user).

id: string
in path

User ID, email address, or "me".

200 OK

OK — user record.

404 Not Found

Not Found — user does not exist, or is not visible to the caller.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/u/john",
  "nameText": "John",
  "nameHtml": "John",
  "name": "John",
  "id": "john",
  "timeZone": "`{'offset': 0, 'name': 'Europe/London'}`",
  "locale": "en_GB",
  "website": "https://coolwebsites.com",
  "email": "[email protected]",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Get a user by OID.

GET /user/{oid}

Returns the full user record for the given OID.

oid: string
in path

User OID.

200 OK

OK — user record.

404 Not Found

Not Found — user does not exist, or is not visible to the caller.

Response Content-Types: application/json
Response Example (200 OK)
{
  "url": "https://quire.io/u/john",
  "nameText": "John",
  "nameHtml": "John",
  "name": "John",
  "id": "john",
  "timeZone": "`{'offset': 0, 'name': 'Europe/London'}`",
  "locale": "en_GB",
  "website": "https://coolwebsites.com",
  "email": "[email protected]",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Get all user records.

GET /user/list

Returns all colleagues of the current user if the user granted the app access to contacts. Otherwise, returns only colleagues who also authorized the same app. If the user did not grant contact access and none of the user’s colleagues authorized this app, only the current user is returned. The first record is always the current user.

200 OK

OK — list of user records; first entry is always the current user.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/u/john",
    "nameText": "John",
    "nameHtml": "John",
    "name": "John",
    "id": "john",
    "timeZone": "`{'offset': 0, 'name': 'Europe/London'}`",
    "locale": "en_GB",
    "website": "https://coolwebsites.com",
    "email": "[email protected]",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
]

Get all user records of the given project (by project ID).

GET /user/list/project/id/{projectId}

Returns all members of the specified project by project ID. If the current user did not grant the app access to contacts, only basic information is returned. The first record is always the current user.

projectId: string
in path

Project ID.

200 OK

OK — list of project members.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/u/john",
    "nameText": "John",
    "nameHtml": "John",
    "name": "John",
    "id": "john",
    "timeZone": "`{'offset': 0, 'name': 'Europe/London'}`",
    "locale": "en_GB",
    "website": "https://coolwebsites.com",
    "email": "[email protected]",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
]

Get all user records of the given project (by project OID).

GET /user/list/project/{oid}

Returns all members of the specified project by project OID. If the current user did not grant the app access to contacts, only basic information is returned. The first record is always the current user.

oid: string
in path

Project OID.

200 OK

OK — list of project members.

404 Not Found

Not Found — project does not exist.

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "url": "https://quire.io/u/john",
    "nameText": "John",
    "nameHtml": "John",
    "name": "John",
    "id": "john",
    "timeZone": "`{'offset': 0, 'name': 'Europe/London'}`",
    "locale": "en_GB",
    "website": "https://coolwebsites.com",
    "email": "[email protected]",
    "description": "This is *cool*!",
    "descriptionText": "This is cool!",
    "descriptionHtml": "This is <i>cool</i>!",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
]

Schema Definitions

AddAppvCatBody: object

claimers: string[]

(Optional) Users allowed to request approval in this category.

  • Omit or null: anyone can request.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
string
approvers: string[]

(Optional) Users allowed to approve, reject, or request changes in this category.

  • Omit or null: anyone can respond.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
string
name: string

Display name.

id: string

Category identifier (URL-safe). Must be unique within the project. The identifier "" is reserved for the implicit default category.

Example
{
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "name": "Legal Review",
  "id": "legal"
}

AddFieldBody: object

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Required for formula) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Conditional-format rules. Applicable to date, number, money, duration, lookup, and formula fields whose resultType resolves to one of those.

FieldConditionFormat
private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Required for lookup) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity (e.g. user OIDs when lookupType=User). Values are numbers.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys. Default: User.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Required for select) Option list.

FieldOption
name: string

Unique name for this field. Must be a non-empty string and must not contain }, ", or \.

type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

Field type. For insight views, only formula and lookup are accepted.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. When omitted on a money field, defaults to $.

Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "name": "Priority",
  "type": "number",
  "percent": false,
  "currency": "USD"
}

AddTimelogBody: object

end: string

End timestamp (ISO 8601, UTC). Must be on or after start. Sub-second precision is truncated to whole seconds.

user: string

(Optional) User identifier (OID, ID, or email) the log is credited to. Omitted, null, or empty defaults to the authenticated caller. Unknown users return 400 Bad Request.

start: string

Start timestamp (ISO 8601, UTC). Sub-second precision is truncated to whole seconds.

billable: boolean

(Optional) Whether this log is billable. Omitted or null defaults to true.

note: string

(Optional) Free-form note for the log. Omitted, null, or empty stores no note.

Example
{
  "end": "2026-04-26T10:30:00Z",
  "user": "[email protected]",
  "start": "2026-04-26T09:00:00Z",
  "billable": true,
  "note": "Pair-programming session"
}

Approval: object

category: string

Identifier of the approval category this approval belongs to. The default category has id "".

requester: string

OID of the user who originally requested approval. Preserved across subsequent approve / reject / change transitions.

approver: string

OID of the user who most recently approved / rejected / requested changes. Null while state is awaiting.

toggledAt: string

Timestamp (UTC, ISO 8601) of the last state transition.

state: string awaiting, approved, rejected, changes

Current approval state. Derived from the last POST to /task/approve/id/{projectId}/{taskId} (or the OID form):

  • awaitingrequest was posted (initial or rolled-back).
  • approvedapprove was posted.
  • rejectedreject was posted.
  • changeschange (request-for-changes) was posted.
Example
{
  "category": "legal",
  "requester": "string",
  "approver": "string",
  "toggledAt": "2026-04-24T10:05:00.000Z",
  "state": "awaiting"
}

AppvCat: object

name: string

Display name.

id: string

Category identifier (URL-safe). The implicit default category has an empty id.

claimers: string[]

Users allowed to request approval in this category.

  • Omitted from the response: anyone can request.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
string
approvers: string[]

Users allowed to approve, reject, or request changes in this category.

  • Omitted from the response: anyone can respond.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
string
createdAt: string

Timestamp (UTC, ISO 8601) when this category was created.

createdBy: SimpleIdentity

User who created this category.

Example
{
  "name": "Legal Review",
  "id": "legal",
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "createdAt": "2026-04-24T10:00:00.000Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

Attachment: object

type: integer

Attachment source type. 1 = Google Drive, 2 = Quire storage.

url: string

Direct URL to access this attachment.

name: string

File name of the attachment.

length: integer

Size of the attachment in bytes.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "type": 2,
  "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
  "name": "file.txt",
  "length": 20000,
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

BulkUpdateTaskItem: object

oid: string

Target task OID. Exactly one of oid / id must be supplied per item.

id: integer

Target task ID. Exactly one of oid / id must be supplied per item.

description: string

(Optional) New task description.

assignees: string[]

(Optional) Assignees to replace the current assignees (OID, ID, or email). This replaces all existing assignees. To modify incrementally, use addAssignees or removeAssignees.

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

string
start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [1], [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Duplicate subtasks when the task is completed. Default: true.
  • sincelatest: Daily only. Repeat based on the last completion date. Default: false.
peekaboo: object

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely (task and subtasks).
  • positive integer: Number of days to hide.
  • false: Undo previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this update as performed by the app. Default: false (updated by the authorizing user).

followers: string[]

(Optional) Followers to replace the current followers (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
string
successors: string[]

(Optional) Successors to replace the current successors (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

string
yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list. Pass null to clear the field.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

addTags: string[]

(Optional) Tags to add to this task (OID or name). Tag names are case-insensitive.

string
removeTags: string[]

(Optional) Tags to remove from this task (OID or name). Tag names are case-insensitive.

string
addAssignees: string[]

(Optional) Assignees to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include all assignees of the parent task
string
removeAssignees: string[]

(Optional) Assignees to remove (OID, ID, or email).

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

string
addFollowers: string[]

(Optional) Followers to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
string
removeFollowers: string[]

(Optional) Followers to remove (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": remove followers that were inherited from the parent task
  • "app": the application

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL.
string
addSuccessors: string[]

(Optional) Successors to add (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

string
removeSuccessors: string[]

(Optional) Successors to remove (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

string
tags: string[]

(Optional) Tags to replace the current tags on this task (OID or name). This replaces all existing tags. To modify incrementally, use addTags or removeTags. Tag names are case-insensitive.

string
name: string

(Optional) New task name.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative or null. Specify null to clear the value.

status: integer

(Optional) New status, between 0 and 100. Specify 100 to complete the task.

priority: integer -1, 0, 1, 2

(Optional) New priority. -1 (lowest) through 2 (highest); 0 is Normal. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to store with the task. Available via API on retrieval.

If the map contains text, its value will be displayed client-side and should be Markdown. Including a source link is recommended.

Example
{
  "oid": "iuRRiKoyrxdBFhFTTo",
  "id": 42,
  "description": "This is a **cool** task.",
  "assignees": "[\"me\", \"[email protected]\"]",
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": "true",
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": "[\"[email protected]\"]",
  "successors": "[\"#13\"]",
  "yourField": "object",
  "addTags": "[\"urgent\"]",
  "removeTags": "[\"draft\"]",
  "addAssignees": "[\"me\"]",
  "removeAssignees": "[\"[email protected]\"]",
  "addFollowers": "[\"me\"]",
  "removeFollowers": "[\"[email protected]\"]",
  "addSuccessors": "[\"#13\"]",
  "removeSuccessors": "[\"#13\"]",
  "tags": "[\"urgent\", \"design\"]",
  "name": "New idea",
  "etc": 0,
  "status": 100,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}

Change: object

exclude: boolean

Whether to exclude the task. Default: false (include).

single: boolean

Whether the operation applies only to the specified task. Default: false — all descendant tasks are also included or excluded. Note: this does not change descendants that were explicitly included or excluded in prior operations.

task: string

OID of the task to include or exclude.

Example
{
  "exclude": false,
  "single": false,
  "task": "2MmYOpJH_ZLeehIjjytH1Rwr"
}

Chat: object

url: string

URL of this chat on the Quire website.

nameText: string

Name with Markdown removed.

nameHtml: string

Name rendered as an HTML fragment converted from Markdown.

name: string

Display name (Markdown supported).

id: string

ID.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

partner: SimpleTaggingEntity

External team this record belongs to. Null if the record is not accessible to external-team members.

archivedAt: string

Timestamp (UTC, ISO 8601) when this record was archived. Null if not archived.

start: string

Target start date for this record, or null if not specified.

due: string

Target due date for this record, or null if not specified.

owner: ChatOwner

Project this chat channel belongs to.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "url": "https://quire.io/w/my_project?chat=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

ChatOwner: object

url: string

URL of this owner on the Quire website.

type: string

Type of the owning object (e.g., Project).

id: string

Identifier for this record.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

name: string

Display name.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "url": "https://quire.io/w/prj_id",
  "type": "Project",
  "id": "my_id",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "name": "Foo",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Comment: object

oid: string

Object identifier (OID), a UUID-like unique string.

description: string

Comment content (Markdown supported).

descriptionText: string

Comment content with Markdown removed.

descriptionHtml: string

Comment content rendered as an HTML fragment converted from Markdown.

attachments: Attachment

Attachments associated with this comment.

Attachment
pinAt: string

Timestamp (UTC, ISO 8601) when this comment was pinned, or null if not pinned.

pinBy: SimpleIdentity

User who pinned this comment, or null if not pinned.

editedBy: SimpleIdentity

User who last edited this comment, or null if not edited.

url: string

URL of this comment on the Quire website.

editedAt: string

Timestamp (UTC, ISO 8601) when this comment was last edited, or null if not edited.

owner: CommentOwner

Object this comment was added to.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "oid": "iDsPd.QP_qM.hN.Trymukn8b",
  "description": "It is *cool*!",
  "descriptionText": "It is cool!",
  "descriptionHtml": "It is <i>cool</i>!",
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      }
    }
  ],
  "pinAt": "2018-12-22T02:06:58.158Z",
  "pinBy": "#/definitions/SimpleIdentity",
  "editedBy": "#/definitions/SimpleIdentity",
  "url": "string",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "owner": {
    "url": "https://quire.io/w/my_id",
    "type": "Project",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

CommentOwner: object

url: string

URL of this owner on the Quire website.

type: string

Type of the owning object (e.g., Project).

name: string

Display name.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "url": "https://quire.io/w/my_id",
  "type": "Project",
  "name": "Foo",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

CreateChatBody: object

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}

CreateCommentBody: object

description: string

Content of the new comment (Markdown supported).

asUser: boolean

(Optional) If true, marks this comment as created by the app. Default: false (created by the authorizing user).

pinned: boolean

(Optional) Whether to pin this comment. Default: false.

Example
{
  "description": "Adjust style",
  "asUser": true,
  "pinned": false
}

CreateDocBody: object

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}

CreateInsightBody: object

description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Example
{
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}

CreateNotificationBody: object

url: string

(Optional) URL associated with the message. When provided, the client may render the message as a hyperlink.

message: string

Notification message.

Example
{
  "url": "https://superheros.com/sync",
  "message": "Unable to synchronize"
}

CreateStatusBody: object

color: string

(Optional) Status color index from Quire’s predefined palette. If omitted, a color will be generated automatically. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35).

name: string

Display name of the status.

value: integer

Non-negative integer indicating progress. Must be unique within its context (e.g., project). Values ≥ 100 are treated as completed.

Example
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

CreateSublistBody: object

includes: string[]

(Optional) List of task OIDs to include in this sublist. All descendants of the specified tasks will be included as well.

string
description: string

(Optional) Description of the record (Markdown supported).

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image identifier.

name: string

Display name of the record (Markdown supported).

id: string

(Optional) ID for this record. If omitted, Quire generates one automatically. Must be unique within the project.

partner: string

(Optional) OID of the external team this record belongs to.

start: string

(Optional) Target start date.

due: string

(Optional) Target due date.

Example
{
  "includes": [
    "string"
  ],
  "description": "**Great** record to start with.",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101",
  "partner": "rcBHBYXZSiyDRrHrWPutatfF",
  "start": "2024-01-02",
  "due": "2024-05-25"
}

CreateTagBody: object

color: string

(Optional) Tag color index from Quire’s predefined palette. If omitted, a color will be generated automatically. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35).

name: string

Display name of the tag.

global: boolean

(Optional) Whether this tag is global (available across projects). If omitted, the tag is not global.

Example
{
  "color": "35",
  "name": "Later",
  "global": true
}

CreateTaskBody: object

description: string

(Optional) A description of the task.

assignees: string[]

(Optional) A list of user identifiers (OID, ID, or email) to assign this task to.

  • Use "me" to indicate the current user.
  • Use "inherit" to include all assignees of the parent task.
string
start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. Null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Whether to duplicate subtasks when completed. Default: true.
  • sincelatest: For daily only. Whether to repeat based on last completion date. Default: false.
peekaboo:
boolean
integer

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely.
  • positive integer: Number of days to hide.
  • false: Cancel previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this task as created by the app. Default: false (created by the authorizing user).

followers: string[]

(Optional) List of user identifiers (OID, ID, or email) who follow this task.

  • Use "me" for the current user.
  • Use "inherit" to include followers of the parent task.
  • Use "app" for the application itself to follow (receive notifications).

For app followers, additional syntaxes are supported:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
string
successors: string[]

(Optional) List of successor task identifiers (OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

string
yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

tags: string[]

(Optional) A list of tag OIDs or names to be added to the new task. Tag names are case-insensitive.

string
tasks: CreateTaskBody

(Optional) List of subtasks to create along with this task.

CreateTaskBody
name: string

The name of the task.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative.

status: integer

(Optional) Task status. Must be between 0 and 100. Default: 0.

priority: integer -1, 0, 1, 2

(Optional) Task priority. -1 (lowest) through 2 (highest); 0 is Normal. Default: 0. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to attach to the task. Available via API when retrieving the task.

If the entry contains a key text, its value will be displayed client-side and should be formatted in Markdown. It is recommended to include a source link.

Example
{
  "description": "This is a *cool* task.",
  "assignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl"
  ],
  "successors": "[\"#13\"]",
  "yourField": "object",
  "tags": [
    "X6nmx9XjEO2wKbqeB1pRT43C"
  ],
  "tasks": [
    {
      "description": "This is a *cool* task.",
      "assignees": [
        "6QMKkEPBVWETLWrXqws94ALU"
      ],
      "start": "2018-12-20T00:00:00.000Z",
      "due": "2018-12-22T00:00:00.000Z",
      "recurrence": "#/definitions/Recurrence",
      "peekaboo": true,
      "section": true,
      "milestone": true,
      "asUser": true,
      "followers": [
        "tzufRLqCnud74dARyDSvjWDl"
      ],
      "successors": "[\"#13\"]",
      "yourField": "object",
      "tags": [
        "X6nmx9XjEO2wKbqeB1pRT43C"
      ],
      "tasks": [
        "#/definitions/CreateTaskBody"
      ],
      "name": "Design new **logo**",
      "etc": 0,
      "status": 0,
      "priority": 0,
      "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
    }
  ],
  "name": "Design new **logo**",
  "etc": 0,
  "status": 0,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}

Doc: object

url: string

URL of this document on the Quire website.

nameText: string

Name with Markdown removed.

nameHtml: string

Name rendered as an HTML fragment converted from Markdown.

name: string

Display name (Markdown supported).

id: string

ID.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

partner: SimpleTaggingEntity

External team this record belongs to. Null if the record is not accessible to external-team members.

archivedAt: string

Timestamp (UTC, ISO 8601) when this record was archived. Null if not archived.

start: string

Target start date for this record, or null if not specified.

due: string

Target due date for this record, or null if not specified.

owner: DocOwner

Project this document belongs to.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "url": "https://quire.io/w/my_project?doc=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

DocOwner: object

url: string

URL of this owner on the Quire website.

type: string

Type of the owning object (e.g., Project).

id: string

Identifier for this record.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

name: string

Display name.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "url": "https://quire.io/w/prj_id",
  "type": "Project",
  "id": "my_id",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "name": "Foo",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

ErrorResponse: object

Represents an error response.

code: integer

The error code.

message: string

Human-readable error message.

Example
{
  "code": 429,
  "message": "Something went wrong."
}

FieldConditionFormat: object

when: string past, yesterday, today, tomorrow, upcoming, last7d, next7d, lastWeek, thisWeek, nextWeek

(Date fields) Date condition.

op: string >=, >, <=, <, =, !=, between, notBetween

(Value fields) Comparison operator.

color: string

Palette color index. Format: two digits [0-5][0-7] (first = row 0-5, second = column 0-7). Examples: 00, 13, 57. NOT a CSS hex color.

first: Number

(Value fields) First operand. For duration, must be an integer number of seconds.

second: Number

(Value fields, between/notBetween only) Second operand. For duration, must be an integer number of seconds.

Example
{
  "when": "today",
  "op": ">=",
  "color": "42",
  "first": "100",
  "second": "#/definitions/Number"
}

FieldDefinition: object

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Required for formula) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Conditional-format rules. Applicable to date (date rules use when) and to number/money/duration/lookup (value rules use op/first/second). A formula is resolved by its resultType: date → date rules, number/money/duration → value rules.

FieldConditionFormat
private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration or formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Required for lookup) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity (e.g. user OIDs when lookupType=User). Values are numbers. Example: {"abc123": 1, "def456": 2}.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys. Default: User.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Required for select) Option list.

FieldOption
type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

Field type.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money or formula only) Currency symbol. When omitted on a money field, defaults to $.

Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

FieldDefinitionWithName: object

name: string

Field name (equals the path fieldName for update/rename/move, or the name supplied in the body for add).

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Required for formula) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Conditional-format rules. Applicable to date (date rules use when) and to number/money/duration/lookup (value rules use op/first/second). A formula is resolved by its resultType: date → date rules, number/money/duration → value rules.

FieldConditionFormat
private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration or formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Required for lookup) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity (e.g. user OIDs when lookupType=User). Values are numbers. Example: {"abc123": 1, "def456": 2}.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys. Default: User.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Required for select) Option list.

FieldOption
type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

Field type.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money or formula only) Currency symbol. When omitted on a money field, defaults to $.

Example
{
  "name": "Priority",
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

FieldOption: object

color: string

(Optional) Palette color index for the option's chip. Format: two digits [0-5][0-7] (first = row 0-5, second = column 0-7). Examples: 00, 13, 57. NOT a CSS hex color. If omitted on creation, a color is auto-assigned.

name: string

Option name (unique within the field).

Example
{
  "color": "13",
  "name": "High"
}

Insight: object

url: string

URL of this insight view on the Quire website.

nameText: string

Name with Markdown removed.

nameHtml: string

Name rendered as an HTML fragment converted from Markdown.

name: string

Display name (Markdown supported).

id: string

ID.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

partner: SimpleTaggingEntity

External team this record belongs to. Null if the record is not accessible to external-team members.

archivedAt: string

Timestamp (UTC, ISO 8601) when this record was archived. Null if not archived.

start: string

Target start date for this record, or null if not specified.

due: string

Target due date for this record, or null if not specified.

fields: object

Custom-field definitions for this insight view, keyed by field name. Use the add-field, update-field, remove-field, rename-field, and move-field extensions to mutate entries.

owner: InsightOwner

Owner this insight belongs to.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "url": "https://quire.io/w/my_project?insight=View101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "fields": "object",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

InsightOwner: object

url: string

URL of this owner on the Quire website.

type: string

Type of the owning object (e.g., Project).

id: string

Identifier for this record.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

name: string

Display name.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "url": "https://quire.io/w/prj_id",
  "type": "Project",
  "id": "my_id",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "name": "Foo",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Number: object

Example
"object"

Organization: object

url: string

URL of this organization on the Quire website.

email: string

Organization email address.

nameText: string

Organization name with Markdown removed.

nameHtml: string

Organization name rendered as an HTML fragment converted from Markdown.

name: string

Display name of the organization (Markdown supported).

id: string

Organization ID.

website: string

Website URL.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

editedAt: string

Timestamp (UTC, ISO 8601) when this record was last edited.

followers: SimpleIdentity

Users who follow this organization.

SimpleIdentity
createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "url": "https://quire.io/c/my_organization",
  "email": "[email protected]",
  "nameText": "My Organization",
  "nameHtml": "My Organization",
  "name": "My Organization",
  "id": "my_organization",
  "website": "https://coolwebsites.com",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

OrganizationWithPlan: object

url: string

URL of this organization on the Quire website.

email: string

Organization email address.

nameText: string

Organization name with Markdown removed.

nameHtml: string

Organization name rendered as an HTML fragment converted from Markdown.

name: string

Display name of the organization (Markdown supported).

id: string

Organization ID.

website: string

Website URL.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

subscription: Subscription

Subscription details for this organization.

editedAt: string

Timestamp (UTC, ISO 8601) when this record was last edited.

followers: SimpleIdentity

Users who follow this organization.

SimpleIdentity
createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "url": "https://quire.io/c/my_organization",
  "email": "[email protected]",
  "nameText": "My Organization",
  "nameHtml": "My Organization",
  "name": "My Organization",
  "id": "my_organization",
  "website": "https://coolwebsites.com",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "subscription": {
    "due": "2038-02-22T02:06:58Z",
    "expired": false,
    "plan": "Professional"
  },
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    {
      "url": "https://quire.io/u/my_id",
      "id": "my_id",
      "iconColor": "37",
      "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Partner: object

name: string

Display name of the external team.

color: string

Color index from Quire’s predefined color palette. Two-digit code where the first digit is 0–5 and the second digit is 0–7 (e.g., 35). The palette is available in Quire’s color picker.

oid: string

Object identifier (OID), a UUID-like unique string.

image: string

Image URL representing this team.

project: SimpleIdentity

The project this tag belongs to.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "name": "UI design team",
  "color": "35",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "project": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Project: object

rootCount: integer

Number of root (top-level) tasks in this project.

url: string

URL of this project on the Quire website.

nameText: string

Project name with Markdown removed.

nameHtml: string

Project name rendered as an HTML fragment converted from Markdown.

activeCount: integer

Number of active (not completed) tasks in this project.

taskCount: integer

Total number of tasks in this project.

organization: SimpleIdentity

Organization this project belongs to.

name: string

Display name of the project (Markdown supported).

id: string

Project ID.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

archivedAt: string

Timestamp (UTC, ISO 8601) when this project was archived (peekaboo). Null if not archived.

start: string

Target start date for this project. Null if not set.

due: string

Target due date for this project. Null if not set.

publicAt: string

Timestamp (UTC, ISO 8601) when this project was made public. Null if not public.

editedAt: string

Timestamp (UTC, ISO 8601) when this record was last edited.

followers: SimpleIdentity

Users who follow this project.

SimpleIdentity
attachments: Attachment

Attachments associated with this project.

Attachment
approvalCategories: AppvCat

Approval categories defined on this project. Use the add-appv-cat, update-appv-cat, and remove-appv-cat extensions to mutate entries. Null when only the implicit default category is in effect.

AppvCat
fields: object

Custom-field definitions for this project, keyed by field name. Use the add-field, update-field, remove-field, rename-field, and move-field extensions to mutate entries.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "rootCount": 5,
  "url": "https://quire.io/w/my_project",
  "nameText": "My Project",
  "nameHtml": "My Project",
  "activeCount": 20,
  "taskCount": 30,
  "organization": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "name": "My Project",
  "id": "my_project",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "archivedAt": "2018-12-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "publicAt": "2018-12-22T02:06:58.158Z",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "approvalCategories": [
    {
      "name": "Legal Review",
      "id": "legal",
      "claimers": [
        "string"
      ],
      "approvers": [
        "string"
      ],
      "createdAt": "2026-04-24T10:00:00.000Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "fields": "object",
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

ProjectJsonMap: object

oid: string

Object identifier (OID), a UUID-like unique string.

name: string

Display name of the project.

id: string

Project ID.

Example
{
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "name": "My Project",
  "id": "My_Project"
}

ProjectWithPlan: object

rootCount: integer

Number of root (top-level) tasks in this project.

url: string

URL of this project on the Quire website.

nameText: string

Project name with Markdown removed.

nameHtml: string

Project name rendered as an HTML fragment converted from Markdown.

activeCount: integer

Number of active (not completed) tasks in this project.

taskCount: integer

Total number of tasks in this project.

organization: SimpleIdentity

Organization this project belongs to.

name: string

Display name of the project (Markdown supported).

id: string

Project ID.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

subscription: Subscription

Subscription details for this project.

archivedAt: string

Timestamp (UTC, ISO 8601) when this project was archived (peekaboo). Null if not archived.

start: string

Target start date for this project. Null if not set.

due: string

Target due date for this project. Null if not set.

publicAt: string

Timestamp (UTC, ISO 8601) when this project was made public. Null if not public.

editedAt: string

Timestamp (UTC, ISO 8601) when this record was last edited.

followers: SimpleIdentity

Users who follow this project.

SimpleIdentity
attachments: Attachment

Attachments associated with this project.

Attachment
approvalCategories: AppvCat

Approval categories defined on this project. Use the add-appv-cat, update-appv-cat, and remove-appv-cat extensions to mutate entries. Null when only the implicit default category is in effect.

AppvCat
fields: object

Custom-field definitions for this project, keyed by field name. Use the add-field, update-field, remove-field, rename-field, and move-field extensions to mutate entries.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "rootCount": 5,
  "url": "https://quire.io/w/my_project",
  "nameText": "My Project",
  "nameHtml": "My Project",
  "activeCount": 20,
  "taskCount": 30,
  "organization": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "name": "My Project",
  "id": "my_project",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "subscription": {
    "due": "2038-02-22T02:06:58Z",
    "expired": false,
    "plan": "Professional"
  },
  "archivedAt": "2018-12-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "publicAt": "2018-12-22T02:06:58.158Z",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "approvalCategories": [
    {
      "name": "Legal Review",
      "id": "legal",
      "claimers": [
        "string"
      ],
      "approvers": [
        "string"
      ],
      "createdAt": "2026-04-24T10:00:00.000Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "fields": "object",
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

RateLimit: object

plan: string

Plan name: Free, Professional, Premium, or Enterprise.

organization: string

OID of the organization these limits apply to.

hour: RateLimitBucket

Hourly rate-limit bucket.

minute: RateLimitBucket

Per-minute rate-limit bucket.

Example
{
  "plan": "Enterprise",
  "organization": "YxjapXXRCOYxoaiCT4tT3OQm",
  "hour": {
    "reset": 1774863600,
    "used": 42,
    "limit": 1250,
    "remaining": 1208
  },
  "minute": "#/definitions/RateLimitBucket"
}

RateLimitBucket: object

reset: integer

Unix epoch (seconds) of the next wall-clock boundary at which the used counter will reset.

used: integer

Number of calls consumed so far in the current window.

limit: integer

Maximum number of calls allowed in this window. -1 indicates no limit.

remaining: integer

Remaining calls: max(limit - used, 0), or -1 if unlimited.

Example
{
  "reset": 1774863600,
  "used": 42,
  "limit": 1250,
  "remaining": 1208
}

Recurrence: object

freq: string daily, weekly, monthly, yearly

Recurrence frequency.

interval: integer

Interval between occurrences. For example, 2 with weekly means every 2 weeks. Default: 1.

byweekday: integer[]

Days of the week to apply the recurrence. Integers where 0=Mon, 1=Tue, …, 6=Sun. For weekly recurrences, provide a list (e.g., [1], [0,3]). When provided, these days define when the recurrence occurs.

integer
byweekno: integer

Week number (1-based) used with monthly or yearly frequencies.

bydayno: integer

Day number (1-based) used with monthly or yearly frequencies. Note: byweekday and bydayno cannot be specified at the same time.

bymonth: integer

Month number (1–12) used with yearly frequency.

dupsubtasks: boolean

Whether to duplicate subtasks when the task is completed. Default: true.

sincelatest: boolean

Whether to repeat relative to the last completion date (daily frequency only). Default: false.

until: string

End date for the recurrence (UTC, ISO 8601). If not specified, the series never ends.

Example
{
  "freq": "weekly",
  "interval": 1,
  "byweekday": "[1,3]",
  "byweekno": 2,
  "bydayno": 25,
  "bymonth": 10,
  "dupsubtasks": false,
  "sincelatest": true,
  "until": "2020-12-22"
}

RecurrenceX: object

seriesId: string

Identifier for the recurrence series this task belongs to. Tasks that share the same seriesId are part of the same recurring series.

freq: string daily, weekly, monthly, yearly

Recurrence frequency.

interval: integer

Interval between occurrences. For example, 2 with weekly means every 2 weeks. Default: 1.

byweekday: integer[]

Days of the week to apply the recurrence. Integers where 0=Mon, 1=Tue, …, 6=Sun. For weekly recurrences, provide a list (e.g., [1], [0,3]). When provided, these days define when the recurrence occurs.

integer
byweekno: integer

Week number (1-based) used with monthly or yearly frequencies.

bydayno: integer

Day number (1-based) used with monthly or yearly frequencies. Note: byweekday and bydayno cannot be specified at the same time.

bymonth: integer

Month number (1–12) used with yearly frequency.

dupsubtasks: boolean

Whether to duplicate subtasks when the task is completed. Default: true.

sincelatest: boolean

Whether to repeat relative to the last completion date (daily frequency only). Default: false.

until: string

End date for the recurrence (UTC, ISO 8601). If not specified, the series never ends.

Example
{
  "seriesId": "j47xvxul26",
  "freq": "weekly",
  "interval": 1,
  "byweekday": "[1,3]",
  "byweekno": 2,
  "bydayno": 25,
  "bymonth": 10,
  "dupsubtasks": false,
  "sincelatest": true,
  "until": "2020-12-22"
}

Referrer: object

when: string

Timestamp (UTC, ISO 8601) when this reference was created.

user: string

OID of the user who created this reference.

task: string

OID of the task that references another task (the referrer task).

Example
{
  "when": "2018-12-22T02:06:58.158Z",
  "user": "wrSpgghWFCzPHBqiShSurDeD",
  "task": "wrSpgghWFCzPHBqiShSurDeD"
}

SimpleAttachment: object

url: string

Direct URL to access this attachment.

name: string

File name of the attachment.

length: integer

Size of the attachment in bytes.

Example
{
  "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
  "name": "file.txt",
  "length": 20000
}

SimpleEntityWithId: object

id: string

Identifier for this record.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "id": "my_id",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

SimpleIdentity: object

url: string

URL of this record on the Quire website.

id: string

Identifier for this record.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

name: string

Display name.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "url": "https://quire.io/u/my_id",
  "id": "my_id",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "name": "Foo",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

SimpleTaggingEntity: object

color: string

Color index from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35). The palette appears in Quire’s color picker.

name: string

Display name.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "color": "35",
  "name": "Foo",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Status: object

color: string

Color index from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 35).

name: string

Display name of the status.

value: integer

Non-negative integer indicating progress. Must be unique within its context (e.g., project). Values ≥ 100 are treated as completed.

Example
{
  "color": "35",
  "name": "Doing",
  "value": 50
}

StorageList: object

currentProject: string

Value stored under the key currentProject (e.g., a project OID).

myList: string[]

List stored under the key myList.

string
latest: StorageMap

Object stored under the key latest (key–value map of properties).

Example
{
  "currentProject": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "myList": "[\"alpha\", \"beta\", \"gamma\"]",
  "latest": {
    "key": "My data"
  }
}

StorageMap: object

key: string

Value stored under the given key.

Example
{
  "key": "My data"
}

Sublist: object

url: string

URL of this sublist on the Quire website.

nameText: string

Name with Markdown removed.

nameHtml: string

Name rendered as an HTML fragment converted from Markdown.

name: string

Display name (Markdown supported).

id: string

ID.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

partner: SimpleTaggingEntity

External team this record belongs to. Null if the record is not accessible to external-team members.

archivedAt: string

Timestamp (UTC, ISO 8601) when this record was archived. Null if not archived.

start: string

Target start date for this record, or null if not specified.

due: string

Target due date for this record, or null if not specified.

owner: SublistOwner

Project this sublist belongs to.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "url": "https://quire.io/w/my_project?sublist=Highlight101",
  "nameText": "Highlight 101",
  "nameHtml": "Highlight 101",
  "name": "Highlight 101",
  "id": "Highlight101",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "partner": {
    "color": "35",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "archivedAt": "2020-02-22T02:06:58.158Z",
  "start": "2024-01-02",
  "due": "2024-05-25",
  "owner": {
    "url": "https://quire.io/w/prj_id",
    "type": "Project",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  }
}

SublistOwner: object

url: string

URL of this owner on the Quire website.

type: string

Type of the owning object (e.g., Project).

id: string

Identifier for this record.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

name: string

Display name.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "url": "https://quire.io/w/prj_id",
  "type": "Project",
  "id": "my_id",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "name": "Foo",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Subscription: object

due: string

Subscription due/renewal timestamp in UTC (ISO 8601).

expired: boolean

Whether the subscription is expired. Available only when a due date is present.

plan: string

Plan name (e.g., Free, Professional, Premium, Enterprise).

Example
{
  "due": "2038-02-22T02:06:58Z",
  "expired": false,
  "plan": "Professional"
}

Tag: object

global: boolean

Whether this tag is global (available across projects). May be omitted in responses when false.

color: string

Color index from Quire’s predefined color palette. Two-digit code where the first digit is 0–5 and the second digit is 0–7 (e.g., 35). The palette is available in Quire’s color picker.

name: string

Display name of the tag.

oid: string

Object identifier (OID), a UUID-like unique string.

project: SimpleIdentity

The project this tag belongs to.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "global": true,
  "color": "35",
  "name": "Later",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "project": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

Task: object

successors: string[]

IDs of tasks that depend on this task.

string
tags: SimpleTaggingEntity

Tags applied to this task.

SimpleTaggingEntity
predecessors: string[]

IDs of tasks that this task depends on.

string
oid: string

Object identifier (OID), a UUID-like unique string.

id: integer

Task id.

nameText: string

Task name with Markdown removed.

nameHtml: string

Task name rendered as an HTML fragment converted from Markdown.

name: string

Task name (Markdown supported).

description: string

Task description (Markdown supported).

descriptionText: string

Task description with Markdown removed.

descriptionHtml: string

Task description rendered as an HTML fragment converted from Markdown.

etc: integer

The estimated time to complete the task, expressed in seconds. If null, no estimate has been specified.

recurrence: RecurrenceX

Contains the recurrence details of this task. If null, the task does not repeat.

timelogs: Timelog

The time log entries associated with this task.

Timelog
start: string

Start date/time in UTC. If a time component is present, milliseconds are set to 001. If date-only, milliseconds are 000 (and hour, minute, second are also zero).

due: string

Due date/time in UTC. If a time component is present, milliseconds are set to 001. If date-only, milliseconds are 000 (and hour, minute, second are also zero).

status: integer

Task status, from 0 to 100. 100 indicates the task is completed.

priority: integer

Task priority, from -1 (lowest) to 2 (highest). Default: 0.

assignors: SimpleIdentity

A list of users who assigned this task. Each item in assignors corresponds by index to the matching item in assignees (e.g., the first assignee was assigned by the first assignor).

SimpleIdentity
partner: SimpleTaggingEntity

The external team to which this task belongs. If null, this task is not associated with any external team.

partnerBy: SimpleIdentity

The user who assigned this task to the external team. If null, the task is not associated with any external team.

assignees: SimpleIdentity

Users assigned to this task.

SimpleIdentity
order: integer

Indicates the display order of this task in the board view. A smaller value means the task appears earlier. This field is only relevant in board view and has no meaning elsewhere.

attachments: Attachment

The list of files attached to this task.

Attachment
cover: string

The ID of the attachment used as the cover image for this task.

childCount: integer

The number of subtasks belonging to this task. To retrieve the subtasks, send a GET request to "/task/list/{oid}".

referrers: Referrer

A list of items that reference this task. Note: Some referrers may no longer exist.

Referrer
peekaboo: boolean

Whether the task is currently peekabooed (arhived).

section: boolean

Whether this task is a section.

milestone: boolean

Whether this task is a milestone.

url: string

URL of this task on the Quire website.

followers: SimpleIdentity

The list of users who are following this task.

SimpleIdentity
mutes: SimpleIdentity

The list of users who have muted this task and will not receive notifications about it, even if they are assigned.

SimpleIdentity
favorites: SimpleIdentity

The list of users who have marked this task as a favorite.

SimpleIdentity
sourceRef: object

Source reference data stored by an app.

toggledAt: string

The timestamp of the most recent status change for this task.

toggledBy: SimpleIdentity

The user who last changed the status of this task.

editedAt: string

Represents the timestamp of the most recent edit to this record.

commentedAt: string

Indicates the timestamp of the most recent comment posted on this record.

If null, the record has never had a comment.

Since comments can be removed, this value may not always match the current set of comments.

approval: Approval

The task's current approval state. Null if no approval has been requested. Mutate via POST /task/approve/{oid} (request / approve / reject / change) and DELETE /task/revoke-approval/{oid} (cancel).

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "createdAt": "2018-12-22T02:06:58.158Z",
  "createdBy": "#/definitions/SimpleIdentity"
}

TaskInfo: object

id: integer

Task id.

oid: string

Object identifier (OID), a UUID-like unique string.

parent: TaskInfo

Parent task information, if this task has a parent.

At most 10 levels of ancestors are returned. If exceeded, the 10th ancestor contains only the OID to indicate this case.

Example
{
  "id": 12,
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "parent": "#/definitions/TaskInfo"
  }
}

TaskWithParentInfo: object

successors: string[]

IDs of tasks that depend on this task.

string
tags: SimpleTaggingEntity

Tags applied to this task.

SimpleTaggingEntity
predecessors: string[]

IDs of tasks that this task depends on.

string
oid: string

Object identifier (OID), a UUID-like unique string.

id: integer

Task id.

nameText: string

Task name with Markdown removed.

nameHtml: string

Task name rendered as an HTML fragment converted from Markdown.

name: string

Task name (Markdown supported).

description: string

Task description (Markdown supported).

descriptionText: string

Task description with Markdown removed.

descriptionHtml: string

Task description rendered as an HTML fragment converted from Markdown.

etc: integer

The estimated time to complete the task, expressed in seconds. If null, no estimate has been specified.

recurrence: RecurrenceX

Contains the recurrence details of this task. If null, the task does not repeat.

timelogs: Timelog

The time log entries associated with this task.

Timelog
start: string

Start date/time in UTC. If a time component is present, milliseconds are set to 001. If date-only, milliseconds are 000 (and hour, minute, second are also zero).

due: string

Due date/time in UTC. If a time component is present, milliseconds are set to 001. If date-only, milliseconds are 000 (and hour, minute, second are also zero).

status: integer

Task status, from 0 to 100. 100 indicates the task is completed.

priority: integer

Task priority, from -1 (lowest) to 2 (highest). Default: 0.

assignors: SimpleIdentity

A list of users who assigned this task. Each item in assignors corresponds by index to the matching item in assignees (e.g., the first assignee was assigned by the first assignor).

SimpleIdentity
partner: SimpleTaggingEntity

The external team to which this task belongs. If null, this task is not associated with any external team.

partnerBy: SimpleIdentity

The user who assigned this task to the external team. If null, the task is not associated with any external team.

assignees: SimpleIdentity

Users assigned to this task.

SimpleIdentity
order: integer

Indicates the display order of this task in the board view. A smaller value means the task appears earlier. This field is only relevant in board view and has no meaning elsewhere.

attachments: Attachment

The list of files attached to this task.

Attachment
cover: string

The ID of the attachment used as the cover image for this task.

childCount: integer

The number of subtasks belonging to this task. To retrieve the subtasks, send a GET request to "/task/list/{oid}".

referrers: Referrer

A list of items that reference this task. Note: Some referrers may no longer exist.

Referrer
peekaboo: boolean

Whether the task is currently peekabooed (arhived).

section: boolean

Whether this task is a section.

milestone: boolean

Whether this task is a milestone.

url: string

URL of this task on the Quire website.

followers: SimpleIdentity

The list of users who are following this task.

SimpleIdentity
mutes: SimpleIdentity

The list of users who have muted this task and will not receive notifications about it, even if they are assigned.

SimpleIdentity
favorites: SimpleIdentity

The list of users who have marked this task as a favorite.

SimpleIdentity
sourceRef: object

Source reference data stored by an app.

toggledAt: string

The timestamp of the most recent status change for this task.

toggledBy: SimpleIdentity

The user who last changed the status of this task.

editedAt: string

Represents the timestamp of the most recent edit to this record.

commentedAt: string

Indicates the timestamp of the most recent comment posted on this record.

If null, the record has never had a comment.

Since comments can be removed, this value may not always match the current set of comments.

approval: Approval

The task's current approval state. Null if no approval has been requested. Mutate via POST /task/approve/{oid} (request / approve / reject / change) and DELETE /task/revoke-approval/{oid} (cancel).

parent: TaskInfo

The parent information, if this task has a parent. If this task has no parent, this field will be null.

Note: It returns at most 10 levels of parent tasks. If exceeded, the 11th item will contain only the id.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "parent": "#/definitions/TaskInfo"
  }
}

TaskWithProjectParentInfo: object

successors: string[]

IDs of tasks that depend on this task.

string
tags: SimpleTaggingEntity

Tags applied to this task.

SimpleTaggingEntity
predecessors: string[]

IDs of tasks that this task depends on.

string
oid: string

Object identifier (OID), a UUID-like unique string.

id: integer

Task id.

nameText: string

Task name with Markdown removed.

nameHtml: string

Task name rendered as an HTML fragment converted from Markdown.

name: string

Task name (Markdown supported).

description: string

Task description (Markdown supported).

descriptionText: string

Task description with Markdown removed.

descriptionHtml: string

Task description rendered as an HTML fragment converted from Markdown.

etc: integer

The estimated time to complete the task, expressed in seconds. If null, no estimate has been specified.

recurrence: RecurrenceX

Contains the recurrence details of this task. If null, the task does not repeat.

timelogs: Timelog

The time log entries associated with this task.

Timelog
start: string

Start date/time in UTC. If a time component is present, milliseconds are set to 001. If date-only, milliseconds are 000 (and hour, minute, second are also zero).

due: string

Due date/time in UTC. If a time component is present, milliseconds are set to 001. If date-only, milliseconds are 000 (and hour, minute, second are also zero).

status: integer

Task status, from 0 to 100. 100 indicates the task is completed.

priority: integer

Task priority, from -1 (lowest) to 2 (highest). Default: 0.

assignors: SimpleIdentity

A list of users who assigned this task. Each item in assignors corresponds by index to the matching item in assignees (e.g., the first assignee was assigned by the first assignor).

SimpleIdentity
partner: SimpleTaggingEntity

The external team to which this task belongs. If null, this task is not associated with any external team.

partnerBy: SimpleIdentity

The user who assigned this task to the external team. If null, the task is not associated with any external team.

assignees: SimpleIdentity

Users assigned to this task.

SimpleIdentity
order: integer

Indicates the display order of this task in the board view. A smaller value means the task appears earlier. This field is only relevant in board view and has no meaning elsewhere.

attachments: Attachment

The list of files attached to this task.

Attachment
cover: string

The ID of the attachment used as the cover image for this task.

childCount: integer

The number of subtasks belonging to this task. To retrieve the subtasks, send a GET request to "/task/list/{oid}".

referrers: Referrer

A list of items that reference this task. Note: Some referrers may no longer exist.

Referrer
peekaboo: boolean

Whether the task is currently peekabooed (arhived).

section: boolean

Whether this task is a section.

milestone: boolean

Whether this task is a milestone.

url: string

URL of this task on the Quire website.

followers: SimpleIdentity

The list of users who are following this task.

SimpleIdentity
mutes: SimpleIdentity

The list of users who have muted this task and will not receive notifications about it, even if they are assigned.

SimpleIdentity
favorites: SimpleIdentity

The list of users who have marked this task as a favorite.

SimpleIdentity
sourceRef: object

Source reference data stored by an app.

toggledAt: string

The timestamp of the most recent status change for this task.

toggledBy: SimpleIdentity

The user who last changed the status of this task.

editedAt: string

Represents the timestamp of the most recent edit to this record.

commentedAt: string

Indicates the timestamp of the most recent comment posted on this record.

If null, the record has never had a comment.

Since comments can be removed, this value may not always match the current set of comments.

approval: Approval

The task's current approval state. Null if no approval has been requested. Mutate via POST /task/approve/{oid} (request / approve / reject / change) and DELETE /task/revoke-approval/{oid} (cancel).

parent: TaskInfo

The parent information, if this task has a parent. If this task has no parent, this field will be null.

Note: It returns at most 10 levels of parent tasks. If exceeded, the 11th item will contain only the id.

project: SimpleEntityWithId

The project to which this task belongs.

createdAt: string

Creation timestamp in UTC (ISO 8601).

createdBy: SimpleIdentity

User who created this record.

Example
{
  "successors": "['#135', '#26']",
  "tags": [
    {
      "color": "35",
      "name": "Foo",
      "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
    }
  ],
  "predecessors": "['#17', '#66', '#91']",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "id": 12,
  "nameText": "Design new logo",
  "nameHtml": "Design new <b>logo</b>",
  "name": "Design new **logo**",
  "description": "This is a *cool* task.",
  "descriptionText": "This is a cool task.",
  "descriptionHtml": "This is a <i>cool</i> task.",
  "etc": 500,
  "recurrence": {
    "seriesId": "j47xvxul26",
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "timelogs": [
    {
      "start": "2023-02-20T00:00:00.000Z",
      "end": "2023-02-20T00:05:35.000Z",
      "user": {
        "url": "https://quire.io/u/my_id",
        "id": "my_id",
        "iconColor": "37",
        "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
        "name": "Foo",
        "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
      },
      "billable": true,
      "note": "A piece of cake"
    }
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "status": 0,
  "priority": 0,
  "assignors": [
    "#/definitions/SimpleIdentity"
  ],
  "partner": "#/definitions/SimpleTaggingEntity",
  "partnerBy": "#/definitions/SimpleIdentity",
  "assignees": [
    "#/definitions/SimpleIdentity"
  ],
  "order": 99,
  "attachments": [
    {
      "type": 2,
      "url": "https://quire.io/att/Ta/sdcQOGgeUtyaFFzb9p0IwAgi/qfqVmUtC/image.png",
      "name": "file.txt",
      "length": 20000,
      "createdAt": "2018-12-22T02:06:58.158Z",
      "createdBy": "#/definitions/SimpleIdentity"
    }
  ],
  "cover": "qfqVmUtC",
  "childCount": 5,
  "referrers": [
    {
      "when": "2018-12-22T02:06:58.158Z",
      "user": "wrSpgghWFCzPHBqiShSurDeD",
      "task": "wrSpgghWFCzPHBqiShSurDeD"
    }
  ],
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "url": "https://quire.io/w/my_project/123",
  "followers": [
    "#/definitions/SimpleIdentity"
  ],
  "mutes": [
    "#/definitions/SimpleIdentity"
  ],
  "favorites": [
    "#/definitions/SimpleIdentity"
  ],
  "sourceRef": "{'text': 'Source: [Gmail](https://gmail.com/link)'}",
  "toggledAt": "2018-12-22T02:06:58.158Z",
  "toggledBy": "#/definitions/SimpleIdentity",
  "editedAt": "2018-12-22T02:06:58.158Z",
  "commentedAt": "2023-12-22T09:06:28.253Z",
  "approval": {
    "category": "legal",
    "requester": "string",
    "approver": "string",
    "toggledAt": "2026-04-24T10:05:00.000Z",
    "state": "awaiting"
  },
  "parent": {
    "id": 12,
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
    "parent": "#/definitions/TaskInfo"
  }
}

Timelog: object

start: string

Start timestamp (UTC) for this time log.

end: string

End timestamp (UTC) for this time log.

user: SimpleIdentity

User who recorded this time log.

billable: boolean

Whether this time log is billable. May be omitted in responses when false.

note: string

Optional note for this time log.

Example
{
  "start": "2023-02-20T00:00:00.000Z",
  "end": "2023-02-20T00:05:35.000Z",
  "user": {
    "url": "https://quire.io/u/my_id",
    "id": "my_id",
    "iconColor": "37",
    "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
    "name": "Foo",
    "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
  },
  "billable": true,
  "note": "A piece of cake"
}

UpdateAppvCatBody: object

claimers: string[]

(Optional) New claimers list — users allowed to request approval in this category.

  • null: anyone can request.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
string
approvers: string[]

(Optional) New approvers list — users allowed to approve, reject, or request changes in this category.

  • null: anyone can respond.
  • [] (empty list): admins only.
  • List of user OIDs: those specific users.
string
name: string

(Optional) New display name.

Example
{
  "claimers": [
    "string"
  ],
  "approvers": [
    "string"
  ],
  "name": "Legal Review"
}

UpdateChatBody: object

Request body for updating a chat channel. Extends UpdateWorkBody with no additional fields; omitted fields preserve existing values.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}

UpdateCommentBody: object

description: string

(Optional) New comment content (Markdown supported).

pinned: boolean

(Optional) Whether the comment is pinned.

Example
{
  "description": "Adjust style",
  "pinned": false
}

UpdateDocBody: object

Request body for updating a doc. Extends UpdateWorkBody with no additional fields; omitted fields preserve existing values.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}

UpdateFieldBody: object

resultType: string text, number, money, date, duration, checkbox

(Optional, formula only) Expected result type.

formula: string

(Optional, formula only) Formula expression.

conditionFormat: FieldConditionFormat

(Optional) Replacement conditional-format rules (replaces the entire list).

FieldConditionFormat
private: boolean

(Optional) Restrict access to non-guest members only.

durationFormat: string hh:mm:ss, hh:mm, 1h1m, 1h, 1d1h, dd:hh:mm:ss, dd:hh:mm, dd:hh

(Optional, duration/formula only) Duration display format.

withTime: boolean

(Optional, date only) Include time-of-day in addition to the date.

lookup: object

(Optional, lookup only) Map from lookup key to numeric value. Keys are OIDs of the configured lookupType entity. Replaces the entire map.

lookupType: string User, Task, Project, Organization

(Optional, lookup only) Source type for lookup keys.

hidden: boolean

(Optional) Hide this field from the task detail panel.

ndecimal: integer -1, 0, 1, 2, 3

(Optional, number/money only) Number of decimal digits. -1 means no rounding.

multiple: boolean

(Optional) Allow multiple values. Applies to select, user, task, and file (always true for file).

clearOnDup: boolean

(Optional) Clear this field when duplicating a task.

options: FieldOption

(Optional, select only) Replacement option list (replaces the entire set).

FieldOption
type: string text, number, money, date, duration, select, checkbox, user, task, hyperlink, email, formula, file, lookup

(Optional) Field type. Immutable on update — if supplied, must match the existing field's type. Usually omitted; include only to verify the stored type.

percent: boolean

(Optional, number only) Format the value as a percentage.

currency: string

(Optional, money/formula only) Currency symbol. Pass $ to reset a money field to its default.

Example
{
  "resultType": "number",
  "formula": "SUM(Subtask.Amount)",
  "conditionFormat": [
    {
      "when": "today",
      "op": ">=",
      "color": "42",
      "first": "100",
      "second": "#/definitions/Number"
    }
  ],
  "private": false,
  "durationFormat": "hh:mm",
  "withTime": false,
  "lookup": "object",
  "lookupType": "User",
  "hidden": false,
  "ndecimal": 2,
  "multiple": true,
  "clearOnDup": false,
  "options": [
    {
      "color": "13",
      "name": "High"
    }
  ],
  "type": "number",
  "percent": false,
  "currency": "USD"
}

UpdateInsightBody: object

Request body for updating an insight view. Extends UpdateWorkBody with no additional fields; omitted fields preserve existing values.

description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Example
{
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}

UpdateOrganizationBody: object

description: string

(Optional) New description for this organization (Markdown supported).

followers: string[]

(Optional) Followers to replace the current followers of this organization (user OIDs). This replaces all existing followers. To modify incrementally, use addFollowers or removeFollowers.

Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

string
addFollowers: string[]

(Optional) Followers to add to this organization (user OIDs). Special values:

  • "me": the current user follows the organization
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL when invoking the registered hook. Example: hook https://super.app/hooks/standard + follower app|/soc1/33456/a7https://super.app/hooks/standard/soc1/33456/a7
string
removeFollowers: string[]

(Optional) Followers to remove from this organization (user OIDs). Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

string
name: string

(Optional) New display name for this organization (Markdown supported).

Example
{
  "description": "**Great** organization to start with.",
  "followers": [
    "string"
  ],
  "addFollowers": [
    "string"
  ],
  "removeFollowers": [
    "string"
  ],
  "name": "My Organization"
}

UpdateProjectBody: object

description: string

(Optional) New description for this project (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this project; specify false to unarchive.

start: string

(Optional) Target start date for this project.

due: string

(Optional) Target due date for this project.

followers: string[]

(Optional) Followers to replace the current followers of this project (user OIDs). This replaces all existing followers. To modify incrementally, use addFollowers or removeFollowers.

Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

string
addFollowers: string[]

(Optional) Followers to add to this project (user OIDs). Special values:

  • "me": the current user follows the project
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL when invoking the registered hook. Example: hook https://super.app/hooks/standard + follower app|/soc1/33456/a7https://super.app/hooks/standard/soc1/33456/a7
string
removeFollowers: string[]

(Optional) Followers to remove from this project (user OIDs). Accepts the same special values as addFollowers: "me" (the current user) and "app" / "app|team" / "app|team|channel" / "app|/path" (the application).

string
public: boolean

(Optional) Public toggle. Specify true to make this project public; specify false to make it private.

name: string

(Optional) New display name for this project (Markdown supported).

Example
{
  "description": "**Great** project to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl",
    "app"
  ],
  "addFollowers": [
    "sfsvLbDVPvi1QMf2GkDn7VSy"
  ],
  "removeFollowers": [
    "aBuz4MwfZ5CasOae6stnFa2f"
  ],
  "public": true,
  "name": "My Project"
}

UpdateStatusBody: object

color: string

(Optional) Status color index from Quire’s predefined palette (two digits: first 0–5, second 0–7; e.g., 35).

name: string

(Optional) New display name for the status.

value: integer

(Optional) New numeric status value. Non-negative integer indicating progress. Must be unique within the context (e.g., project). Values ≥ 100 are treated as completed.

Example
{
  "color": "35",
  "name": "Later",
  "value": 50
}

UpdateSublistBody: object

changes: Change

(Optional) List of changes that add or remove tasks from this sublist. See Change for the operation schema.

Change
description: string

(Optional) New description for this record (Markdown supported).

archived: boolean

(Optional) Archive toggle. Specify true to archive this record; specify false to unarchive.

start: string

(Optional) Target start date for this record.

due: string

(Optional) Target due date for this record.

iconColor: string

(Optional) Icon color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 37, 57). NOT a CSS hex color.

image: string icon-view-list, icon-view-kanban, icon-briefcase-o, icon-rocket-o, icon-bug-o, icon-leaf-o, icon-clapperboard, icon-sitemap-o, icon-flash-on-o, icon-piggy-bank-o, icon-graduation-cap-o, icon-paper-plane-o, icon-globe-o, icon-music-o, icon-detail, icon-beach-o, icon-paper, icon-home-o, icon-building, icon-database-o, icon-microscope-o, icon-hamburger-o, icon-trophy-o, icon-thumbs-o-up, icon-thumbs-o-down, icon-smile-o, icon-frown-o, icon-meh-o, icon-bullseye, icon-square-dotted-o

(Optional) Icon image for this record.

name: string

(Optional) New display name for this record.

id: string

(Optional) New ID for this record.

Example
{
  "changes": [
    {
      "exclude": false,
      "single": false,
      "task": "2MmYOpJH_ZLeehIjjytH1Rwr"
    }
  ],
  "description": "**Great** record to start with.",
  "archived": true,
  "start": "2024-01-02",
  "due": "2024-05-25",
  "iconColor": "37",
  "image": "icon-view-kanban",
  "name": "Highlight 101",
  "id": "Highlight101"
}

UpdateTagBody: object

color: string

(Optional) Tag color index from Quire's predefined palette. Two-digit code [0-5][0-7]: first digit 0-5, second digit 0-7 (e.g. 00, 35, 57). NOT a CSS hex color.

project: string

(Optional) Project OID that this tag is limited to. Used only when global is explicitly set to false; ignored otherwise.

name: string

(Optional) New display name for the tag.

global: boolean

(Optional) Whether the tag is global (available across projects). If set to false, you must also provide project.

Example
{
  "color": "35",
  "project": "Dyh2YkFcu9uLgLFIeN1kB4Ld",
  "name": "Later",
  "global": true
}

UpdateTaskBody: object

description: string

(Optional) New task description.

assignees: string[]

(Optional) Assignees to replace the current assignees (OID, ID, or email). This replaces all existing assignees. To modify incrementally, use addAssignees or removeAssignees.

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

string
start: string

(Optional) Start date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
due: string

(Optional) Due date/time in UTC.

  • With time: yyyy-MM-dd'T'HH:mmZ (e.g., 2020-10-30T09:30Z).
  • Date only: yyyy-MM-dd (e.g., 2020-10-30).

Notes:

  • Seconds are not supported.
  • 2020-10-30T00:00:00 is treated as 2020-10-30 (date only).
  • To specify exactly midnight UTC, use 2020-10-30T00:00 (no seconds).
recurrence: Recurrence

(Optional) Recurrence details. null if the task is not recurring.

  • freq: daily, weekly, monthly, yearly.
  • interval: Interval between occurrences. Default: 1.
  • until: End date. Default: never ends.
  • bymonth: Month (1 = January). Supported only with yearly. Default: 1.
  • byweekno: Week number (starting from 1) or last. Supported with monthly/yearly.
  • byweekday: Day(s) of week (0 = Monday ... 6 = Sunday). For weekly, use a list (e.g., [1], [0,3]).
  • bydayno: Day of month (1 = first day). Supported with monthly/yearly. Note: byweekday and bydayno cannot both be specified.
  • dupsubtasks: Duplicate subtasks when the task is completed. Default: true.
  • sincelatest: Daily only. Repeat based on the last completion date. Default: false.
peekaboo:
boolean
integer

(Optional) Peekaboo setting. Accepts a boolean or a positive integer:

  • true: Hide indefinitely (task and subtasks).
  • positive integer: Number of days to hide.
  • false: Undo previous peekaboo.

Default: false.

section: boolean

(Optional) Whether this task is a section. Default: false.

milestone: boolean

(Optional) Whether this task is a milestone. Default: false.

asUser: boolean

(Optional) If true, marks this update as performed by the app. Default: false (updated by the authorizing user).

followers: string[]

(Optional) Followers to replace the current followers (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
string
successors: string[]

(Optional) Successors to replace the current successors (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

string
yourField: object

PLACEHOLDER — do NOT send a key literally named yourField. Instead, use the custom field's own name (as defined via /project/add-field) as the JSON key, with a value matching the field's type:

  • Text / Email / Hyperlink: string.
  • Number / Money: numeric value (no currency symbol).
  • Checkbox: true or false.
  • Select: option name (string).
  • Date: ISO 8601 timestamp (yyyy-MM-dd'T'HH:mm:ssZ) or date-only (yyyy-MM-dd).
  • Duration: number of seconds.
  • User: user OID, user ID, or email — server resolves to the user's OID.
  • Task: task OID, integer task ID, or #<id> string — server resolves to the task's OID (scoped to this project).
  • Multi-value (fields configured with multiple: true): provide a list. Pass null to clear the field.

Example body fragment: {"Priority": 3, "Owners": ["alice", "[email protected]"], "Depends": ["#42"]}.

addTags: string[]

(Optional) Tags to add to this task (OID or name). Tag names are case-insensitive.

string
removeTags: string[]

(Optional) Tags to remove from this task (OID or name). Tag names are case-insensitive.

string
addAssignees: string[]

(Optional) Assignees to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include all assignees of the parent task
string
removeAssignees: string[]

(Optional) Assignees to remove (OID, ID, or email).

Accepts the same special values as addAssignees: "me" (the current user) and "inherit" (all assignees of the parent task).

string
addFollowers: string[]

(Optional) Followers to add (OID, ID, or email). Special values:

  • "me": the current user
  • "inherit": include followers of the parent task
  • "app": the application follows (receives notifications)

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL (e.g., .../standard/soc1/33456/a7).
string
removeFollowers: string[]

(Optional) Followers to remove (OID, ID, or email).

Special values:

  • "me": the current user
  • "inherit": remove followers that were inherited from the parent task
  • "app": the application

App follower syntax:

  • app|team or app|team|channel
  • app|/path → appended to the hook URL.
string
addSuccessors: string[]

(Optional) Successors to add (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

string
removeSuccessors: string[]

(Optional) Successors to remove (task OID or ID).

IDs can be specified as #id or id. Integer IDs are also accepted.

string
tags: string[]

(Optional) Tags to replace the current tags on this task (OID or name). This replaces all existing tags. To modify incrementally, use addTags or removeTags. Tag names are case-insensitive.

string
name: string

(Optional) New task name.

etc: integer

(Optional) Estimated time to complete, in seconds. Must be non-negative or null. Specify null to clear the value.

status: integer

(Optional) New status, between 0 and 100. Specify 100 to complete the task.

priority: integer -1, 0, 1, 2

(Optional) New priority. -1 (lowest) through 2 (highest); 0 is Normal. (The server also accepts the case-insensitive English names Low, Medium, High, Urgent, but the integer form is recommended for typed callers.)

sourceRef: object

(Optional) Arbitrary source reference data to store with the task. Available via API on retrieval.

If the map contains text, its value will be displayed client-side and should be Markdown. Including a source link is recommended.

Example
{
  "description": "This is a **cool** task.",
  "assignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "start": "2018-12-20T00:00:00.000Z",
  "due": "2018-12-22T00:00:00.000Z",
  "recurrence": {
    "freq": "weekly",
    "interval": 1,
    "byweekday": "[1,3]",
    "byweekno": 2,
    "bydayno": 25,
    "bymonth": 10,
    "dupsubtasks": false,
    "sincelatest": true,
    "until": "2020-12-22"
  },
  "peekaboo": true,
  "section": true,
  "milestone": true,
  "asUser": true,
  "followers": [
    "tzufRLqCnud74dARyDSvjWDl",
    "app"
  ],
  "successors": "[\"#13\"]",
  "yourField": "object",
  "addTags": [
    "X6nmx9XjEO2wKbqeB1pRT43C"
  ],
  "removeTags": [
    "mPAQrYU1qt8wAYAInKRlTnvl"
  ],
  "addAssignees": [
    "6QMKkEPBVWETLWrXqws94ALU"
  ],
  "removeAssignees": [
    "Job4NSW9xK6Owcke8iKj7zyH"
  ],
  "addFollowers": [
    "sfsvLbDVPvi1QMf2GkDn7VSy"
  ],
  "removeFollowers": [
    "aBuz4MwfZ5CasOae6stnFa2f"
  ],
  "addSuccessors": "[\"#13\"]",
  "removeSuccessors": "[\"#13\"]",
  "tags": [
    "ITaVbkhh3iVcEcV3vuSLeE2k"
  ],
  "name": "New idea",
  "etc": 0,
  "status": 100,
  "priority": 0,
  "sourceRef": "{\"text\": \"Source: [Gmail](https://gmail.com/link)\"}"
}

UpdateTimelogBody: object

end: string

(Optional) New end timestamp (ISO 8601, UTC). Must be on or after the (new or existing) start. Sub-second precision is truncated to whole seconds. Omit or set null to preserve.

user: string

(Optional) New user the log is credited to (OID, ID, or email). Omit or set null to preserve. Send empty string to reset to the authenticated caller.

start: string

(Optional) New start timestamp (ISO 8601, UTC). Sub-second precision is truncated to whole seconds. Omit or set null to preserve.

billable: boolean

(Optional) New billable flag. Omit or set null to preserve.

note: string

(Optional) New note. Omit or set null to preserve. Send empty string to clear.

Example
{
  "end": "2026-04-26T10:45:00Z",
  "user": "[email protected]",
  "start": "2026-04-26T09:15:00Z",
  "billable": false,
  "note": "Updated note"
}

User: object

url: string

URL of this user on the Quire website.

nameText: string

User name with Markdown removed.

nameHtml: string

User name rendered as an HTML fragment converted from Markdown.

name: string

Display name of the user (Markdown supported).

id: string

User ID.

timeZone: object

The time zone of the current user, or null if the user is not the current one.

locale: string

The locale of the current user, or null if the user is not the current one.

website: string

Website URL.

email: string

Email address.

description: string

Description (Markdown supported).

descriptionText: string

Description with Markdown removed.

descriptionHtml: string

Description rendered as an HTML fragment converted from Markdown.

iconColor: string

Color index for the icon from Quire’s predefined palette. Two-digit code: first digit 0–5, second digit 0–7 (e.g., 37).

image: string

Image URL representing this record.

oid: string

Object identifier (OID), a UUID-like unique string.

Example
{
  "url": "https://quire.io/u/john",
  "nameText": "John",
  "nameHtml": "John",
  "name": "John",
  "id": "john",
  "timeZone": "`{'offset': 0, 'name': 'Europe/London'}`",
  "locale": "en_GB",
  "website": "https://coolwebsites.com",
  "email": "[email protected]",
  "description": "This is *cool*!",
  "descriptionText": "This is cool!",
  "descriptionHtml": "This is <i>cool</i>!",
  "iconColor": "37",
  "image": "https://quire.s3.amazonaws.com/oid/image.jpg",
  "oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}

Recurring:

byweekday: object
Example
{
  "byweekday": [
    1,
    4
  ]
}