Tines REST API — PurpleSuite executable core

This reference is readable without JavaScript. Download the OpenAPI document.

Runtime

/api/purple-suite/{instanceId}/contracts/itsm/tines
[
  {
    "method": "get",
    "path": "/api/v2/cases",
    "operationId": "get_api_v2_cases"
  },
  {
    "method": "post",
    "path": "/api/v2/cases",
    "operationId": "post_api_v2_cases"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:id",
    "operationId": "get_api_v2_cases_by_id"
  },
  {
    "method": "patch",
    "path": "/api/v2/cases/:id",
    "operationId": "patch_api_v2_cases_by_id"
  },
  {
    "method": "put",
    "path": "/api/v2/cases/:id",
    "operationId": "put_api_v2_cases_by_id"
  },
  {
    "method": "delete",
    "path": "/api/v2/cases/:id",
    "operationId": "delete_api_v2_cases_by_id"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:case_id/comments",
    "operationId": "get_api_v2_cases_by_case_id_comments"
  },
  {
    "method": "post",
    "path": "/api/v2/cases/:case_id/comments",
    "operationId": "post_api_v2_cases_by_case_id_comments"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:case_id/comments/:id",
    "operationId": "get_api_v2_cases_by_case_id_comments_by_id"
  },
  {
    "method": "patch",
    "path": "/api/v2/cases/:case_id/comments/:id",
    "operationId": "patch_api_v2_cases_by_case_id_comments_by_id"
  },
  {
    "method": "put",
    "path": "/api/v2/cases/:case_id/comments/:id",
    "operationId": "put_api_v2_cases_by_case_id_comments_by_id"
  },
  {
    "method": "delete",
    "path": "/api/v2/cases/:case_id/comments/:id",
    "operationId": "delete_api_v2_cases_by_case_id_comments_by_id"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:case_id/tasks",
    "operationId": "get_api_v2_cases_by_case_id_tasks"
  },
  {
    "method": "post",
    "path": "/api/v2/cases/:case_id/tasks",
    "operationId": "post_api_v2_cases_by_case_id_tasks"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:case_id/tasks/:id",
    "operationId": "get_api_v2_cases_by_case_id_tasks_by_id"
  },
  {
    "method": "patch",
    "path": "/api/v2/cases/:case_id/tasks/:id",
    "operationId": "patch_api_v2_cases_by_case_id_tasks_by_id"
  },
  {
    "method": "put",
    "path": "/api/v2/cases/:case_id/tasks/:id",
    "operationId": "put_api_v2_cases_by_case_id_tasks_by_id"
  },
  {
    "method": "delete",
    "path": "/api/v2/cases/:case_id/tasks/:id",
    "operationId": "delete_api_v2_cases_by_case_id_tasks_by_id"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:case_id/assignees",
    "operationId": "get_api_v2_cases_by_case_id_assignees"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:case_id/activities",
    "operationId": "get_api_v2_cases_by_case_id_activities"
  },
  {
    "method": "get",
    "path": "/api/v2/cases/:case_id/pdf",
    "operationId": "get_api_v2_cases_by_case_id_pdf"
  },
  {
    "method": "get",
    "path": "/api/v1/teams",
    "operationId": "get_api_v1_teams"
  },
  {
    "method": "get",
    "path": "/api/v1/teams/:id",
    "operationId": "get_api_v1_teams_by_id"
  },
  {
    "method": "get",
    "path": "/api/v1/admin/users",
    "operationId": "get_api_v1_admin_users"
  },
  {
    "method": "get",
    "path": "/api/v1/admin/users/:id",
    "operationId": "get_api_v1_admin_users_by_id"
  },
  {
    "method": "get",
    "path": "/api/v1/case_sub_statuses",
    "operationId": "get_api_v1_case_sub_statuses"
  },
  {
    "method": "get",
    "path": "/api/v1/tags",
    "operationId": "get_api_v1_tags"
  },
  {
    "method": "get",
    "path": "/api/v1/info",
    "operationId": "get_api_v1_info"
  }
]

Credentials

Coverage and limitations

{
  "documentScope": "bounded",
  "runtimeFidelity": "mixed",
  "counts": {
    "operations": 28
  },
  "notes": [
    "27 modeled-core plus 1 unavailable operation of 369 in the pinned document; 341 are outside executable scope and are listed one row each in coverage.md. The pinned artifact is the complete published Tines surface, not a subset — the bound is on what this adapter executes, not on what it pinned.",
    "The served core is one coherent Cases v2 lifecycle — create, retrieve, list, update, close, delete, with comments, tasks, assignees and the activity timeline — plus the tenant reads a case references by id (teams, admin users, case sub-statuses, tags, info). Every id this contract emits resolves through another served operation, so a client can traverse the surface without a dangling reference.",
    "Cases v2 is served rather than Cases v1. Both are pinned; v2 is the current generation and names its path parameters consistently, while the v1 Cases family is one of the surfaces the published document names inconsistently enough that 44 of its path parameters had to be reconciled with their own routes before it could be validated at all.",
    "Stories, Actions, Events, Records, Global Resources, Run Script Environments, SCIM, Audit Logs, Admin roles/licence/SMTP/tunnels/sync-destinations and the AI surfaces are pinned and documented but not executed. Story and Action execution needs the Tines workflow engine; the AI surfaces need a hosted model; tunnels, SMTP and sync destinations need outbound network the contract deliberately does not make.",
    "Case PDF export is the single unavailable operation. It validates the request far enough to prove the case exists, then refuses in the vendor's error envelope. No fabricated document is returned and no state changes.",
    "The pinned document declares no error responses at all: all 369 operations publish only 200, 201 or 204, and no error schema or example appears anywhere. The handler-emitted 400, 401, 404, 422 and 500 therefore sit outside the served declarations by design, use { error: <message> }, and are modeled rather than pinned. Two error behaviours are honoured because the vendor documents them in prose: an under-privileged key receives 404 rather than 403, and a missing credential receives 401.",
    "Two vendor schema defects are narrowed away rather than approximated. case.assignees, case.activities, case.linked_cases, case.fields and case.tasks are each declared as a $ref to a singular object schema while the resource is a collection, and admin_user.team_memberships has the same defect; an array cannot validate against type:object, so no emittable value is both schema-conformant and correct. The served schemas drop those members and the adapter never emits them. Assignees, activities and tasks stay reachable through their own served sub-resource operations, each of which types its collection correctly.",
    "The pinned PaginationMeta declares current_page, per_page, total_pages and total_count while every published Tines response example shows current_page, previous_page, next_page, next_page_number, per_page, pages and count. The adapter emits the vendor's documented shape, which validates against the pinned schema because it declares neither a required array nor additionalProperties:false. per_page defaults to 20 and is capped at 500, as Tines documents.",
    "case.resolved_by is omitted until a case is closed. The pinned schema declares it as a non-nullable $ref to the user object, but an open case has no resolver, so there is no value it could carry: emitting null would be undeclared and emitting a fabricated resolver would be worse. The schema declares no required array, so omission is conformant.",
    "case.url is omitted. It is an absolute tenant origin, and this contract will not emit a link a client could follow off-instance.",
    "The 48-member filters object on GET /api/v2/cases is narrowed in the served document to the six members this adapter evaluates. A filter that were accepted and ignored would make a filtered list indistinguishable from an unfiltered one, which is the failure a grader cannot see.",
    "People come from the shared PurpleSuite identity roster, so a Tines user here is the same human the instance's HRIS and calendar apps know, joined on email. Cases, comments, tasks and assignees are all persisted per instance: a case created through POST /api/v2/cases is returned by the list, the retrieve, its own comments and tasks collections, and its assignees read, and a delete removes its comments and tasks with it.",
    "The pinned artifact is the vendor's published document with one disclosed class of mechanical repair: Tines names path parameters differently from its own route templates, leaving 45 placeholders undeclared and 44 declared parameters absent from their routes. Reconciling them is what makes the document callable and validatable at all; descriptions, schemas, bodies and responses are untouched, and the per-operation detail travels inside the artifact. Exactly one served operation is affected — GET /api/v1/admin/users/{id}, whose user_id parameter was renamed to id to match its route."
  ]
}

Servers

[
  {
    "url": "/api/purple-suite/{instanceId}/contracts/itsm/tines",
    "variables": {
      "instanceId": {
        "default": "instance-id"
      }
    }
  }
]

Authentication schemes

{
  "apiKey": {
    "type": "apiKey",
    "in": "header",
    "name": "X-User-Token",
    "description": "A Tines API key. Personal, service, team, and tenant owner keys are all accepted; the key's own access determines which resources the request can reach, and a key without access to a resource receives a 404. SCIM endpoints require a tenant owner key."
  },
  "bearerAuth": {
    "type": "http",
    "scheme": "bearer",
    "description": "A Tines API key. Personal, service, team, and tenant owner keys are all accepted; the key's own access determines which resources the request can reach, and a key without access to a resource receives a 404. SCIM endpoints require a tenant owner key."
  }
}

Each operation lists its security requirements. An empty security array permits an unauthenticated request. Use the scheme and headers declared for the selected contract.

Operations

GET /api/v2/cases

List cases

List cases

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List cases",
  "operationId": "get_api_v2_cases",
  "description": "List cases",
  "tags": [
    "Cases"
  ],
  "parameters": [
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number"
    },
    {
      "name": "team_id",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Filter by team ID"
    },
    {
      "name": "filters",
      "in": "query",
      "schema": {
        "type": "object",
        "properties": {
          "assignees": {
            "type": "array",
            "description": "Filter by assignee user IDs or email addresses. Use \"unassigned\" to match cases with no assignee. Cases matching any of the specified assignees will be returned."
          },
          "case_ids": {
            "type": "array",
            "description": "Filter by specific case IDs"
          },
          "name": {
            "type": "string",
            "description": "Filter by case name"
          },
          "priority": {
            "type": "array",
            "enum": [
              "LOW",
              "MEDIUM",
              "HIGH",
              "CRITICAL",
              "INFO"
            ],
            "description": "Filter by priority"
          },
          "search": {
            "type": "string",
            "description": "Free-text search across case content"
          },
          "status": {
            "type": "array",
            "enum": [
              "OPEN",
              "CLOSED"
            ],
            "description": "Filter by status"
          }
        }
      },
      "description": "Filter criteria"
    },
    {
      "name": "order",
      "in": "query",
      "schema": {
        "type": "string",
        "enum": [
          "RECENTLY_EDITED",
          "LEAST_RECENTLY_EDITED",
          "PRIORITY_ASC",
          "PRIORITY_DESC",
          "OPENED_ASC",
          "OPENED_DESC",
          "CREATED_ASC",
          "CREATED_DESC"
        ]
      },
      "description": "Sort order"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "cases": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/case"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

POST /api/v2/cases

Create a case

Create a case

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Create a case",
  "operationId": "post_api_v2_cases",
  "description": "Create a case",
  "tags": [
    "Cases"
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "The case name"
            },
            "description": {
              "type": "string",
              "description": "The case description"
            },
            "status": {
              "type": "string",
              "enum": [
                "OPEN",
                "CLOSED"
              ],
              "description": "The case status"
            },
            "priority": {
              "type": "string",
              "description": "Maps to severity"
            },
            "team_id": {
              "type": "integer",
              "description": "Team to create the case in"
            },
            "sub_status_id": {
              "type": "integer",
              "description": "The sub-status ID"
            },
            "template_id": {
              "type": "string",
              "description": "Template ID or slug"
            },
            "assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees"
            },
            "tag_names": {
              "type": "array",
              "description": "Tag names to apply"
            },
            "field_values": {
              "type": "object",
              "description": "Field values as key-value pairs"
            },
            "blocks": {
              "type": "array",
              "description": "Case blocks to create"
            },
            "author_email": {
              "type": "string",
              "description": "Email address of the case author"
            },
            "opened_at": {
              "type": "string",
              "description": "ISO 8601 datetime when the case was opened"
            },
            "resolved_at": {
              "type": "string",
              "description": "ISO 8601 datetime when the case was resolved"
            },
            "metadata": {
              "type": "object",
              "description": "Arbitrary key-value metadata to attach to the case"
            },
            "closure_conditions": {
              "type": "array",
              "description": "Array of closure condition objects with name and formula fields"
            },
            "tasks": {
              "type": "array",
              "description": "Array of task objects with description and optional assignee_emails"
            }
          },
          "required": [
            "name",
            "team_id"
          ]
        }
      }
    }
  },
  "responses": {
    "201": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/case"
          }
        }
      }
    }
  }
}

GET /api/v2/cases/{id}

Get a case

Get a case

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Get a case",
  "operationId": "get_api_v2_cases_by_id",
  "description": "Get a case",
  "tags": [
    "Cases"
  ],
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "resolve_mentions",
      "in": "query",
      "schema": {
        "type": "string"
      },
      "description": "Set to 'true' to resolve @mentions to display names"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/case"
          }
        }
      }
    }
  }
}

PATCH /api/v2/cases/{id}

Update a case

Update a case

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Update a case",
  "operationId": "patch_api_v2_cases_by_id",
  "description": "Update a case",
  "tags": [
    "Cases"
  ],
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "The case name"
            },
            "description": {
              "type": "string",
              "description": "The case description"
            },
            "status": {
              "type": "string",
              "enum": [
                "OPEN",
                "CLOSED"
              ],
              "description": "The case status"
            },
            "priority": {
              "type": "string",
              "description": "The case priority"
            },
            "team_id": {
              "type": "integer",
              "description": "The team ID"
            },
            "sub_status_id": {
              "type": "integer",
              "description": "The sub-status ID"
            },
            "add_assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees to add"
            },
            "remove_assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees to remove"
            },
            "add_tag_names": {
              "type": "array",
              "description": "Tag names to add"
            },
            "remove_tag_names": {
              "type": "array",
              "description": "Tag names to remove"
            },
            "closure_conditions": {
              "type": "array",
              "description": "Array of closure condition objects with name and formula fields"
            },
            "author_email": {
              "type": "string",
              "description": "Email address of the case author"
            },
            "opened_at": {
              "type": "string",
              "description": "ISO 8601 datetime when the case was opened"
            },
            "resolved_at": {
              "type": "string",
              "description": "ISO 8601 datetime when the case was resolved"
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/case"
          }
        }
      }
    }
  }
}

PUT /api/v2/cases/{id}

Update a case

Update a case

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Update a case",
  "operationId": "put_api_v2_cases_by_id",
  "description": "Update a case",
  "tags": [
    "Cases"
  ],
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "The case name"
            },
            "description": {
              "type": "string",
              "description": "The case description"
            },
            "status": {
              "type": "string",
              "enum": [
                "OPEN",
                "CLOSED"
              ],
              "description": "The case status"
            },
            "priority": {
              "type": "string",
              "description": "The case priority"
            },
            "team_id": {
              "type": "integer",
              "description": "The team ID"
            },
            "sub_status_id": {
              "type": "integer",
              "description": "The sub-status ID"
            },
            "add_assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees to add"
            },
            "remove_assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees to remove"
            },
            "add_tag_names": {
              "type": "array",
              "description": "Tag names to add"
            },
            "remove_tag_names": {
              "type": "array",
              "description": "Tag names to remove"
            },
            "closure_conditions": {
              "type": "array",
              "description": "Array of closure condition objects with name and formula fields"
            },
            "author_email": {
              "type": "string",
              "description": "Email address of the case author"
            },
            "opened_at": {
              "type": "string",
              "description": "ISO 8601 datetime when the case was opened"
            },
            "resolved_at": {
              "type": "string",
              "description": "ISO 8601 datetime when the case was resolved"
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/case"
          }
        }
      }
    }
  }
}

DELETE /api/v2/cases/{id}

Delete a case

Delete a case

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Delete a case",
  "operationId": "delete_api_v2_cases_by_id",
  "description": "Delete a case",
  "tags": [
    "Cases"
  ],
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    }
  ],
  "responses": {
    "204": {
      "description": "Empty response on success"
    }
  }
}

GET /api/v2/cases/{case_id}/comments

List comments

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List comments",
  "operationId": "get_api_v2_cases_by_case_id_comments",
  "tags": [
    "Cases > Comments"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "comments": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/activity"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              },
              "case_id": {
                "type": "integer",
                "description": "The case ID"
              }
            }
          }
        }
      }
    }
  }
}

POST /api/v2/cases/{case_id}/comments

Create a comment

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Create a comment",
  "operationId": "post_api_v2_cases_by_case_id_comments",
  "tags": [
    "Cases > Comments"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "value": {
              "type": "string",
              "description": "Comment text"
            },
            "author_email": {
              "type": "string",
              "description": "Email of comment author"
            }
          },
          "required": [
            "value"
          ]
        }
      }
    }
  },
  "responses": {
    "201": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/activity"
          }
        }
      }
    }
  }
}

GET /api/v2/cases/{case_id}/comments/{id}

Get a comment

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Get a comment",
  "operationId": "get_api_v2_cases_by_case_id_comments_by_id",
  "tags": [
    "Cases > Comments"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The comment ID"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/activity"
          }
        }
      }
    }
  }
}

PATCH /api/v2/cases/{case_id}/comments/{id}

Update a comment

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Update a comment",
  "operationId": "patch_api_v2_cases_by_case_id_comments_by_id",
  "tags": [
    "Cases > Comments"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The comment ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "value": {
              "type": "string",
              "description": "Updated comment text"
            }
          },
          "required": [
            "value"
          ]
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/activity"
          }
        }
      }
    }
  }
}

PUT /api/v2/cases/{case_id}/comments/{id}

Update a comment

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Update a comment",
  "operationId": "put_api_v2_cases_by_case_id_comments_by_id",
  "tags": [
    "Cases > Comments"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The comment ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "value": {
              "type": "string",
              "description": "Updated comment text"
            }
          },
          "required": [
            "value"
          ]
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/activity"
          }
        }
      }
    }
  }
}

DELETE /api/v2/cases/{case_id}/comments/{id}

Delete a comment

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Delete a comment",
  "operationId": "delete_api_v2_cases_by_case_id_comments_by_id",
  "tags": [
    "Cases > Comments"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The comment ID"
    }
  ],
  "responses": {
    "204": {
      "description": "Empty response on success"
    }
  }
}

GET /api/v2/cases/{case_id}/tasks

List tasks

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List tasks",
  "operationId": "get_api_v2_cases_by_case_id_tasks",
  "tags": [
    "Cases > Tasks"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "tasks": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/task"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

POST /api/v2/cases/{case_id}/tasks

Create a task

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Create a task",
  "operationId": "post_api_v2_cases_by_case_id_tasks",
  "tags": [
    "Cases > Tasks"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "description": {
              "type": "string",
              "description": "Task description"
            },
            "assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees"
            }
          },
          "required": [
            "description"
          ]
        }
      }
    }
  },
  "responses": {
    "201": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/task"
          }
        }
      }
    }
  }
}

GET /api/v2/cases/{case_id}/tasks/{id}

Get a task

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Get a task",
  "operationId": "get_api_v2_cases_by_case_id_tasks_by_id",
  "tags": [
    "Cases > Tasks"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The task ID"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/task"
          }
        }
      }
    }
  }
}

PATCH /api/v2/cases/{case_id}/tasks/{id}

Update a task

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Update a task",
  "operationId": "patch_api_v2_cases_by_case_id_tasks_by_id",
  "tags": [
    "Cases > Tasks"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The task ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "description": {
              "type": "string",
              "description": "Task description"
            },
            "completed": {
              "type": "boolean",
              "description": "Whether the task is completed"
            },
            "assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees"
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/task"
          }
        }
      }
    }
  }
}

PUT /api/v2/cases/{case_id}/tasks/{id}

Update a task

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Update a task",
  "operationId": "put_api_v2_cases_by_case_id_tasks_by_id",
  "tags": [
    "Cases > Tasks"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The task ID"
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "description": {
              "type": "string",
              "description": "Task description"
            },
            "completed": {
              "type": "boolean",
              "description": "Whether the task is completed"
            },
            "assignee_emails": {
              "type": "array",
              "description": "Email addresses of assignees"
            }
          }
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/task"
          }
        }
      }
    }
  }
}

DELETE /api/v2/cases/{case_id}/tasks/{id}

Delete a task

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Delete a task",
  "operationId": "delete_api_v2_cases_by_case_id_tasks_by_id",
  "tags": [
    "Cases > Tasks"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The task ID"
    }
  ],
  "responses": {
    "204": {
      "description": "Empty response on success"
    }
  }
}

GET /api/v2/cases/{case_id}/assignees

List assignees

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List assignees",
  "operationId": "get_api_v2_cases_by_case_id_assignees",
  "tags": [
    "Cases > Assignees"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "assignees": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/user"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

GET /api/v2/cases/{case_id}/activities

List activities

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List activities",
  "operationId": "get_api_v2_cases_by_case_id_activities",
  "tags": [
    "Cases > Activities"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    },
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number"
    },
    {
      "name": "activity_type",
      "in": "query",
      "schema": {
        "type": "string"
      },
      "description": "Filter by activity type"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "activities": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/activity"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

GET /api/v2/cases/{case_id}/pdf

Export case as PDF

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Export case as PDF",
  "operationId": "get_api_v2_cases_by_case_id_pdf",
  "tags": [
    "Cases"
  ],
  "parameters": [
    {
      "name": "case_id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The case ID"
    }
  ],
  "responses": {
    "200": {
      "description": "PDF document of the case"
    }
  }
}

GET /api/v1/teams

List teams

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List teams",
  "operationId": "get_api_v1_teams",
  "tags": [
    "Teams (v1)"
  ],
  "parameters": [
    {
      "name": "scope",
      "in": "query",
      "schema": {
        "type": "string",
        "enum": [
          "all",
          "standard",
          "personal_only"
        ]
      },
      "description": "Filter teams by scope (defaults to standard)"
    },
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number (defaults to 1)"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "teams": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/team"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

GET /api/v1/teams/{id}

Get a team

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Get a team",
  "operationId": "get_api_v1_teams_by_id",
  "tags": [
    "Teams (v1)"
  ],
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The ID of the team to retrieve"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/team"
          }
        }
      }
    }
  }
}

GET /api/v1/admin/users

List users

Retrieve a list of users from the Tines tenant.

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List users",
  "operationId": "get_api_v1_admin_users",
  "description": "Retrieve a list of users from the Tines tenant.",
  "tags": [
    "Admin > Users"
  ],
  "parameters": [
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page. Defaults to 20"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number. Defaults to 1"
    },
    {
      "name": "filter",
      "in": "query",
      "schema": {
        "type": "string",
        "enum": [
          "TENANT_OWNER"
        ]
      },
      "description": "Filter the returned users"
    },
    {
      "name": "search",
      "in": "query",
      "schema": {
        "type": "string"
      },
      "description": "Case-insensitive substring match against user name or email"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "admin/users": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/admin_user"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

GET /api/v1/admin/users/{id}

Get a user

Retrieve details of a specific user by ID or email address.

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Get a user",
  "operationId": "get_api_v1_admin_users_by_id",
  "description": "Retrieve details of a specific user by ID or email address.",
  "tags": [
    "Admin > Users"
  ],
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "schema": {
        "type": "string"
      },
      "required": true,
      "description": "ID of the user. An email address can be supplied in its place"
    },
    {
      "name": "include",
      "in": "query",
      "schema": {
        "type": "string",
        "enum": [
          "team_memberships"
        ]
      },
      "description": "Include additional related data in the response"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/admin_user"
          }
        }
      }
    }
  },
  "x-path-normalized": [
    "renamed path parameter 'user_id' to 'id' to match the route"
  ]
}

GET /api/v1/case_sub_statuses

List case statuses

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List case statuses",
  "operationId": "get_api_v1_case_sub_statuses",
  "tags": [
    "Cases (v1) > Case Statuses"
  ],
  "parameters": [
    {
      "name": "team_id",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "required": true,
      "description": "The team whose case statuses to retrieve"
    },
    {
      "name": "parent_status",
      "in": "query",
      "schema": {
        "type": "string",
        "enum": [
          "OPEN",
          "CLOSED"
        ]
      },
      "description": "Filter by parent status"
    },
    {
      "name": "search",
      "in": "query",
      "schema": {
        "type": "string"
      },
      "description": "Filter statuses whose name contains this text"
    },
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "case_sub_statuses": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/case_sub_status"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

GET /api/v1/tags

List tags

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "List tags",
  "operationId": "get_api_v1_tags",
  "tags": [
    "Tags"
  ],
  "parameters": [
    {
      "name": "team_id",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Filter tags by team"
    },
    {
      "name": "per_page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Number of results per page"
    },
    {
      "name": "page",
      "in": "query",
      "schema": {
        "type": "integer"
      },
      "description": "Page number"
    }
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "tags": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/tag"
                }
              },
              "meta": {
                "$ref": "#/components/schemas/PaginationMeta"
              }
            }
          }
        }
      }
    }
  }
}

GET /api/v1/info

Get tenant stack information

Retrieve basic information regarding your tenant's stack.

Authentication

[
  {
    "apiKey": []
  },
  {
    "bearerAuth": []
  }
]

Request, responses and operation details

{
  "summary": "Get tenant stack information",
  "operationId": "get_api_v1_info",
  "description": "Retrieve basic information regarding your tenant's stack.",
  "tags": [
    "Info"
  ],
  "responses": {
    "200": {
      "description": "Successful response",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/info"
          }
        }
      }
    }
  }
}

Schemas and reusable components

securitySchemes

apiKey

{
  "type": "apiKey",
  "in": "header",
  "name": "X-User-Token",
  "description": "A Tines API key. Personal, service, team, and tenant owner keys are all accepted; the key's own access determines which resources the request can reach, and a key without access to a resource receives a 404. SCIM endpoints require a tenant owner key."
}

bearerAuth

{
  "type": "http",
  "scheme": "bearer",
  "description": "A Tines API key. Personal, service, team, and tenant owner keys are all accepted; the key's own access determines which resources the request can reach, and a key without access to a resource receives a 404. SCIM endpoints require a tenant owner key."
}

schemas

PaginationMeta

{
  "type": "object",
  "properties": {
    "current_page": {
      "type": "integer"
    },
    "per_page": {
      "type": "integer"
    },
    "total_pages": {
      "type": "integer"
    },
    "total_count": {
      "type": "integer"
    }
  }
}

activity

{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Activity ID"
    },
    "activity_type": {
      "type": "string",
      "description": "Type of activity"
    },
    "value": {
      "type": "string",
      "nullable": true,
      "description": "Activity content"
    },
    "file": {
      "type": "object",
      "nullable": true,
      "description": "Attached file with filename and url"
    },
    "created_at": {
      "type": "string",
      "description": "When the activity was created"
    },
    "user": {
      "$ref": "#/components/schemas/user"
    },
    "reactions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "nullable": true,
      "description": "Emoji reactions"
    }
  },
  "description": "A case activity or comment"
}

admin_user

{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "User ID"
    },
    "scim_uid": {
      "type": "string",
      "nullable": true,
      "description": "SCIM user ID"
    },
    "email": {
      "type": "string",
      "description": "User email"
    },
    "first_name": {
      "type": "string",
      "description": "First name"
    },
    "last_name": {
      "type": "string",
      "description": "Last name"
    },
    "admin": {
      "type": "boolean",
      "description": "Whether the user is an admin"
    },
    "is_active": {
      "type": "boolean",
      "description": "Whether the user is active"
    },
    "tenant_permissions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "nullable": true,
      "description": "Tenant permission names granted to the user"
    },
    "last_seen": {
      "type": "string",
      "nullable": true,
      "description": "When the user was last seen in the platform"
    },
    "created_at": {
      "type": "string",
      "description": "When the user was created"
    },
    "updated_at": {
      "type": "string",
      "description": "When the user was last updated"
    }
  },
  "description": "A user in the Tines tenant"
}

case

{
  "type": "object",
  "properties": {
    "case_id": {
      "type": "integer",
      "description": "Case ID"
    },
    "name": {
      "type": "string",
      "description": "Case name"
    },
    "description": {
      "type": "string",
      "nullable": true,
      "description": "Case description"
    },
    "status": {
      "type": "string",
      "description": "Case status (OPEN, CLOSED)"
    },
    "sub_status": {
      "type": "object",
      "nullable": true,
      "description": "Sub-status with id and name"
    },
    "priority": {
      "type": "string",
      "description": "Priority level"
    },
    "metadata": {
      "type": "object",
      "nullable": true,
      "description": "Arbitrary metadata object"
    },
    "author": {
      "$ref": "#/components/schemas/user"
    },
    "opened_by": {
      "$ref": "#/components/schemas/user"
    },
    "resolved_by": {
      "$ref": "#/components/schemas/user"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Tags"
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Associated records"
    },
    "team": {
      "type": "object",
      "description": "Team the case belongs to"
    },
    "sla": {
      "type": "object",
      "nullable": true,
      "description": "SLA status"
    },
    "slas": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "SLA statuses"
    },
    "actions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Case actions"
    },
    "closure_conditions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Closure conditions"
    },
    "blocks": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Case blocks"
    },
    "opened_at": {
      "type": "string",
      "nullable": true,
      "description": "When the case was opened"
    },
    "resolved_at": {
      "type": "string",
      "nullable": true,
      "description": "When the case was resolved"
    },
    "created_at": {
      "type": "string",
      "description": "When the case was created"
    },
    "updated_at": {
      "type": "string",
      "description": "When the case was last updated"
    }
  },
  "description": "A case"
}

case_sub_status

{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Case status ID"
    },
    "name": {
      "type": "string",
      "description": "Status name"
    },
    "slug": {
      "type": "string",
      "description": "Human-readable identifier, auto-generated from the name"
    },
    "description": {
      "type": "string",
      "nullable": true,
      "description": "Status description"
    },
    "parent_status": {
      "type": "string",
      "description": "Parent status (OPEN or CLOSED)"
    },
    "default": {
      "type": "boolean",
      "description": "Whether this is the default status for its parent status"
    },
    "team": {
      "type": "object",
      "description": "Team the status belongs to"
    },
    "created_at": {
      "type": "string",
      "description": "When the status was created"
    },
    "updated_at": {
      "type": "string",
      "description": "When the status was last updated"
    }
  },
  "description": "A case status"
}

info

{
  "type": "object",
  "properties": {
    "stack": {
      "$ref": "#/components/schemas/info_stack"
    }
  },
  "description": "Information about the tenant's stack"
}

info_stack

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The name assigned to the tenant's stack"
    },
    "type": {
      "type": "string",
      "description": "Whether the stack is dedicated or shared"
    },
    "region": {
      "type": "string",
      "description": "The AWS region the stack is hosted in"
    },
    "egress_ips": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The origin IPs used for any request originating from the tenant"
    }
  },
  "description": "Details about a tenant's stack"
}

tag

{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Tag ID"
    },
    "name": {
      "type": "string",
      "description": "Tag name"
    },
    "color": {
      "type": "string",
      "description": "Tag color as a #RRGGBB hex value"
    },
    "teams": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Teams the tag belongs to (id, name)"
    },
    "created_at": {
      "type": "string",
      "description": "When the tag was created"
    },
    "updated_at": {
      "type": "string",
      "description": "When the tag was last updated"
    }
  },
  "description": "A tag"
}

task

{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Task ID"
    },
    "description": {
      "type": "string",
      "description": "Task description"
    },
    "completed": {
      "type": "boolean",
      "description": "Whether the task is completed"
    },
    "created_at": {
      "type": "string",
      "description": "When the task was created"
    },
    "updated_at": {
      "type": "string",
      "description": "When the task was last updated"
    },
    "assignees": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Assigned users (id, email, first_name, last_name)"
    }
  },
  "description": "A case task"
}

team

{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "The team ID"
    },
    "name": {
      "type": "string",
      "description": "The team name"
    },
    "groups": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "The team groups (id, name)"
    }
  },
  "description": "A team"
}

user

{
  "type": "object",
  "properties": {
    "user_id": {
      "type": "integer",
      "description": "User ID"
    },
    "first_name": {
      "type": "string",
      "description": "First name"
    },
    "last_name": {
      "type": "string",
      "description": "Last name"
    },
    "email": {
      "type": "string",
      "description": "Email address"
    },
    "avatar_url": {
      "type": "string",
      "nullable": true,
      "description": "Avatar URL"
    },
    "is_service_account": {
      "type": "boolean",
      "description": "Whether this is a service account"
    }
  },
  "description": "A Tines user"
}

Document metadata and extensions

{
  "openapi": "3.0.3",
  "info": {
    "title": "Tines REST API — PurpleSuite executable core",
    "version": "1.0.0"
  },
  "security": [
    {
      "apiKey": []
    },
    {
      "bearerAuth": []
    }
  ]
}
Interactive API explorer (requires JavaScript)