{
  "openapi": "3.1.0",
  "info": {
    "title": "Time API",
    "version": "1.0.0",
    "summary": "Free time tracker: timer, entries, projects and reports for one workspace.",
    "description": "Time (https://time-free.openapps.xyz/) is a free time tracker and a free alternative to Toggl Track and Harvest. This API lets an AI assistant start and stop the timer, add and list time, manage projects and read reports with billable amounts. Every route except GET / needs the workspace key the person creates in Time under Settings, sent as the x-workspace-key header. Errors are JSON with an error sentence that says what to change. Free, no limits. Guide for assistants: https://time-free.openapps.xyz/llms.txt",
    "contact": {
      "name": "OpenApps",
      "url": "https://free-apps.openapps.xyz/"
    }
  },
  "servers": [
    {
      "url": "https://functions.bounded.sh/apps/703ed60f2cc5ad3d98a5bf4a/api",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Guide for assistants (llms.txt)",
    "url": "https://time-free.openapps.xyz/llms.txt"
  },
  "security": [
    {
      "workspaceKey": []
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "listRoutes",
        "summary": "List the routes",
        "security": [],
        "responses": {
          "200": {
            "description": "The routes and where the docs are.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "about": {
                      "type": "string"
                    },
                    "docs": {
                      "type": "string"
                    },
                    "openapi": {
                      "type": "string"
                    },
                    "routes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "example": {
                  "name": "Time by OpenApps",
                  "docs": "https://time-free.openapps.xyz/llms.txt",
                  "routes": [
                    "GET /timer -> the running timer, or {running: false}"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/timer": {
      "get": {
        "operationId": "getTimer",
        "summary": "See the running timer",
        "responses": {
          "200": {
            "description": "The running timer, or {running: false}.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Timer"
                },
                "example": {
                  "running": true,
                  "description": "Homepage design",
                  "project": "Acme website",
                  "projectId": "p8Hn2Kq4Lm9s",
                  "tags": [
                    "design"
                  ],
                  "billable": true,
                  "start": "2026-10-19T07:10:00.000Z",
                  "startLocal": "2026-10-19 09:10",
                  "elapsed": "0:42:05",
                  "elapsedSeconds": 2525
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      }
    },
    "/timer/start": {
      "post": {
        "operationId": "startTimer",
        "summary": "Start a timer (a running one is stopped and saved first)",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "description": {
                    "type": "string",
                    "maxLength": 1000
                  },
                  "project": {
                    "type": "string",
                    "description": "Project name or id. Leave out for no project."
                  },
                  "tags": {
                    "oneOf": [
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "description": "Tag names; unknown tags are created."
                  },
                  "billable": {
                    "type": "boolean",
                    "description": "Defaults to the project's setting."
                  },
                  "start": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      }
                    ],
                    "description": "\"2026-10-18T09:30:00Z\" or with an offset (exact), \"2026-10-18 09:30\" (workspace time zone), \"09:30\" (today) or unix seconds."
                  }
                }
              },
              "example": {
                "description": "Homepage design",
                "project": "Acme website",
                "tags": [
                  "design"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The new timer, and the entry saved from a timer that was already running.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "timer": {
                      "$ref": "#/components/schemas/Timer"
                    },
                    "stopped": {
                      "oneOf": [
                        {
                          "$ref": "#/components/schemas/Entry"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  }
                },
                "example": {
                  "timer": {
                    "running": true,
                    "description": "Homepage design",
                    "project": "Acme website",
                    "projectId": "p8Hn2Kq4Lm9s",
                    "tags": [
                      "design"
                    ],
                    "billable": true,
                    "start": "2026-10-19T07:10:00.000Z",
                    "startLocal": "2026-10-19 09:10",
                    "elapsed": "0:42:05",
                    "elapsedSeconds": 2525
                  },
                  "stopped": null
                }
              }
            }
          },
          "400": {
            "description": "Bad input, like an unknown project.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "No project called \"Acme\". Projects: Acme website, Internal. Create one with POST /projects, or leave project out."
                }
              }
            }
          },
          "409": {
            "description": "The project is someone else's shared project that stopped taking time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "\"Launch\" is no longer shared with this workspace, so time cannot be added to it. Use another project."
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That key is not valid. It may have been revoked; the person can create a new one in Time under Settings."
                }
              }
            }
          }
        }
      }
    },
    "/timer/stop": {
      "post": {
        "operationId": "stopTimer",
        "summary": "Stop the timer and save the entry",
        "description": "A timer on someone else's shared project that stopped taking time (sharing stopped, or this workspace was removed) is still saved, in this workspace only.",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "end": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      }
                    ],
                    "description": "\"2026-10-18T09:30:00Z\" or with an offset (exact), \"2026-10-18 09:30\" (workspace time zone), \"09:30\" (today) or unix seconds."
                  }
                }
              },
              "example": {}
            }
          }
        },
        "responses": {
          "200": {
            "description": "The saved entry.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "entry": {
                      "$ref": "#/components/schemas/Entry"
                    }
                  }
                },
                "example": {
                  "entry": {
                    "id": "Xk3pQ9vLm2Rt7wYz1aBc",
                    "description": "Client call",
                    "project": "Acme website",
                    "projectId": "p8Hn2Kq4Lm9s",
                    "client": "Acme Inc.",
                    "tags": [
                      "calls"
                    ],
                    "billable": true,
                    "date": "2026-10-18",
                    "start": "2026-10-18T12:00:00.000Z",
                    "end": "2026-10-18T13:30:00.000Z",
                    "startLocal": "2026-10-18 14:00",
                    "endLocal": "2026-10-18 15:30",
                    "duration": "1:30:00",
                    "hours": "1.50",
                    "amount": "142.50"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad end time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "end must be after start."
                }
              }
            }
          },
          "409": {
            "description": "No timer is running.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "No timer is running."
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      }
    },
    "/entries": {
      "get": {
        "operationId": "listEntries",
        "summary": "List entries in a range, newest first",
        "parameters": [
          {
            "name": "period",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "today",
                "yesterday",
                "week",
                "last-week",
                "month",
                "last-month",
                "year"
              ]
            },
            "description": "A named range in the workspace's time zone. Weeks start on the workspace's week start."
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "First day, inclusive (YYYY-MM-DD). With to, at most 400 days."
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Last day, inclusive (YYYY-MM-DD). Defaults to from."
          },
          {
            "name": "project",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Only this project (name or id)."
          }
        ],
        "responses": {
          "200": {
            "description": "Entries and their total.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "from": {
                      "type": "string",
                      "format": "date"
                    },
                    "to": {
                      "type": "string",
                      "format": "date"
                    },
                    "timeZone": {
                      "type": "string"
                    },
                    "total": {
                      "type": "object",
                      "properties": {
                        "duration": {
                          "type": "string"
                        },
                        "hours": {
                          "type": "string"
                        }
                      }
                    },
                    "count": {
                      "type": "integer"
                    },
                    "entries": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Entry"
                      }
                    }
                  }
                },
                "example": {
                  "from": "2026-10-13",
                  "to": "2026-10-19",
                  "timeZone": "Europe/Berlin",
                  "total": {
                    "duration": "1:30:00",
                    "hours": "1.50"
                  },
                  "count": 1,
                  "entries": [
                    {
                      "id": "Xk3pQ9vLm2Rt7wYz1aBc",
                      "description": "Client call",
                      "project": "Acme website",
                      "projectId": "p8Hn2Kq4Lm9s",
                      "client": "Acme Inc.",
                      "tags": [
                        "calls"
                      ],
                      "billable": true,
                      "date": "2026-10-18",
                      "start": "2026-10-18T12:00:00.000Z",
                      "end": "2026-10-18T13:30:00.000Z",
                      "startLocal": "2026-10-18 14:00",
                      "endLocal": "2026-10-18 15:30",
                      "duration": "1:30:00",
                      "hours": "1.50",
                      "amount": "142.50"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "from and to must be dates like 2026-10-01."
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "addEntry",
        "summary": "Add time: start and end, or a duration",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "description": {
                    "type": "string",
                    "maxLength": 1000
                  },
                  "project": {
                    "type": "string"
                  },
                  "tags": {
                    "oneOf": [
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      {
                        "type": "string"
                      }
                    ]
                  },
                  "billable": {
                    "type": "boolean"
                  },
                  "start": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      }
                    ],
                    "description": "\"2026-10-18T09:30:00Z\" or with an offset (exact), \"2026-10-18 09:30\" (workspace time zone), \"09:30\" (today) or unix seconds."
                  },
                  "end": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      }
                    ],
                    "description": "\"2026-10-18T09:30:00Z\" or with an offset (exact), \"2026-10-18 09:30\" (workspace time zone), \"09:30\" (today) or unix seconds."
                  },
                  "duration": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "description": "\"1h30m\", \"1:30\", \"90m\", \"1.5\" or 1.5 (hours). Used when start and end are not both sent."
                  },
                  "date": {
                    "type": "string",
                    "format": "date",
                    "description": "With duration: the day (default today)."
                  },
                  "startTime": {
                    "type": "string",
                    "description": "With duration: when it started, like \"14:00\". Without it, today's entry ends now and another day's starts at 09:00."
                  }
                }
              },
              "example": {
                "description": "Client call",
                "project": "Acme website",
                "duration": "1h30m",
                "date": "2026-10-18",
                "startTime": "14:00"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The saved entry.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "entry": {
                      "$ref": "#/components/schemas/Entry"
                    }
                  }
                },
                "example": {
                  "entry": {
                    "id": "Xk3pQ9vLm2Rt7wYz1aBc",
                    "description": "Client call",
                    "project": "Acme website",
                    "projectId": "p8Hn2Kq4Lm9s",
                    "client": "Acme Inc.",
                    "tags": [
                      "calls"
                    ],
                    "billable": true,
                    "date": "2026-10-18",
                    "start": "2026-10-18T12:00:00.000Z",
                    "end": "2026-10-18T13:30:00.000Z",
                    "startLocal": "2026-10-18 14:00",
                    "endLocal": "2026-10-18 15:30",
                    "duration": "1:30:00",
                    "hours": "1.50",
                    "amount": "142.50"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send start and end, or a duration like \"1h30m\" (with an optional date and startTime)."
                }
              }
            }
          },
          "409": {
            "description": "The project is someone else's shared project that stopped taking time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "\"Launch\" is no longer shared with this workspace, so time cannot be added to it. Use another project."
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      }
    },
    "/entries/{id}": {
      "delete": {
        "operationId": "deleteEntry",
        "summary": "Delete an entry",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The deleted entry.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "deleted": {
                      "type": "boolean"
                    },
                    "entry": {
                      "$ref": "#/components/schemas/Entry"
                    }
                  }
                },
                "example": {
                  "deleted": true,
                  "entry": {
                    "id": "Xk3pQ9vLm2Rt7wYz1aBc",
                    "description": "Client call",
                    "project": "Acme website",
                    "projectId": "p8Hn2Kq4Lm9s",
                    "client": "Acme Inc.",
                    "tags": [
                      "calls"
                    ],
                    "billable": true,
                    "date": "2026-10-18",
                    "start": "2026-10-18T12:00:00.000Z",
                    "end": "2026-10-18T13:30:00.000Z",
                    "startLocal": "2026-10-18 14:00",
                    "endLocal": "2026-10-18 15:30",
                    "duration": "1:30:00",
                    "hours": "1.50",
                    "amount": "142.50"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No such entry.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "No entry with that id."
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      }
    },
    "/projects": {
      "get": {
        "operationId": "listProjects",
        "summary": "List projects, clients and tags",
        "responses": {
          "200": {
            "description": "Projects with clients and rates.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "currency": {
                      "type": "string"
                    },
                    "defaultHourlyRate": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "projects": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Project"
                      }
                    },
                    "clients": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "tags": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "example": {
                  "currency": "USD",
                  "defaultHourlyRate": "80.00",
                  "projects": [
                    {
                      "id": "p8Hn2Kq4Lm9s",
                      "name": "Acme website",
                      "client": "Acme Inc.",
                      "color": "#2e5ec4",
                      "hourlyRate": "95.00",
                      "billableByDefault": true,
                      "archived": false,
                      "sharedByLink": false,
                      "joinedFrom": null
                    }
                  ],
                  "clients": [
                    {
                      "id": "c1Fg7Hj3Kl5n",
                      "name": "Acme Inc."
                    }
                  ],
                  "tags": [
                    "calls",
                    "design"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "addProject",
        "summary": "Add a project (returns the existing one if the name is taken)",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 100
                  },
                  "client": {
                    "type": "string",
                    "description": "Client name or id; created if new."
                  },
                  "hourlyRate": {
                    "type": "string",
                    "description": "Amount in the workspace currency, like \"95\" or \"95.50\". Leave out to use the default rate."
                  },
                  "billable": {
                    "type": "boolean"
                  },
                  "color": {
                    "type": "string",
                    "enum": [
                      "#2e5ec4",
                      "#d0652b",
                      "#2f9466",
                      "#b8860b",
                      "#cf5f8c",
                      "#6a55c8",
                      "#00939e",
                      "#c2453f"
                    ]
                  }
                }
              },
              "example": {
                "name": "Acme website",
                "client": "Acme Inc.",
                "hourlyRate": "95"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The new project.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "project": {
                      "$ref": "#/components/schemas/Project"
                    }
                  }
                },
                "example": {
                  "project": {
                    "id": "p8Hn2Kq4Lm9s",
                    "name": "Acme website",
                    "client": "Acme Inc.",
                    "color": "#2e5ec4",
                    "hourlyRate": "95.00",
                    "billableByDefault": true,
                    "archived": false,
                    "sharedByLink": false,
                    "joinedFrom": null
                  }
                }
              }
            }
          },
          "200": {
            "description": "A project with that name already exists.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "project": {
                      "$ref": "#/components/schemas/Project"
                    },
                    "existing": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "name is required."
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      }
    },
    "/report": {
      "get": {
        "operationId": "getReport",
        "summary": "Totals by project, client, tag, person and day, with billable amounts",
        "parameters": [
          {
            "name": "period",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "today",
                "yesterday",
                "week",
                "last-week",
                "month",
                "last-month",
                "year"
              ]
            },
            "description": "A named range in the workspace's time zone. Weeks start on the workspace's week start."
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "First day, inclusive (YYYY-MM-DD). With to, at most 400 days."
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Last day, inclusive (YYYY-MM-DD). Defaults to from."
          }
        ],
        "responses": {
          "200": {
            "description": "The report.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Report"
                },
                "example": {
                  "from": "2026-10-01",
                  "to": "2026-10-31",
                  "timeZone": "Europe/Berlin",
                  "currency": "USD",
                  "total": {
                    "duration": "32:15:00",
                    "hours": "32.25",
                    "spoken": "32h 15m",
                    "billableHours": "28.00",
                    "amount": "2660.00",
                    "amountDisplay": "$2,660.00",
                    "entries": 41
                  },
                  "projects": [
                    {
                      "name": "Acme website",
                      "client": "Acme Inc.",
                      "duration": "28:00:00",
                      "hours": "28.00",
                      "billableHours": "28.00",
                      "amount": "2660.00",
                      "entries": 30
                    }
                  ],
                  "clients": [],
                  "tags": [],
                  "days": [
                    {
                      "date": "2026-10-01",
                      "duration": "6:30:00",
                      "hours": "6.50"
                    }
                  ],
                  "notes": [
                    "An entry with several tags counts under each tag."
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "period must be one of today, yesterday, week, last-week, month, last-month, year."
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or revoked key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send a workspace key in the x-workspace-key header."
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "workspaceKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-workspace-key",
        "description": "Created by the person in Time under Settings, API key for assistants. Looks like tk_<20 characters>_<32 characters>."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "A sentence that says what to change."
          }
        }
      },
      "Timer": {
        "type": "object",
        "required": [
          "running"
        ],
        "properties": {
          "running": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "project": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "billable": {
            "type": "boolean"
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "startLocal": {
            "type": "string"
          },
          "elapsed": {
            "type": "string",
            "example": "0:42:05"
          },
          "elapsedSeconds": {
            "type": "integer"
          }
        }
      },
      "Entry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "project": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "client": {
            "type": [
              "string",
              "null"
            ]
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "billable": {
            "type": "boolean"
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "format": "date-time"
          },
          "startLocal": {
            "type": "string"
          },
          "endLocal": {
            "type": "string"
          },
          "duration": {
            "type": "string",
            "example": "1:30:00"
          },
          "hours": {
            "type": "string",
            "example": "1.50"
          },
          "amount": {
            "type": [
              "string",
              "null"
            ],
            "description": "Billable amount in the workspace currency, or null when not billable or no rate."
          }
        }
      },
      "Project": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "client": {
            "type": [
              "string",
              "null"
            ]
          },
          "color": {
            "type": "string"
          },
          "hourlyRate": {
            "type": [
              "string",
              "null"
            ]
          },
          "billableByDefault": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "sharedByLink": {
            "type": "boolean"
          },
          "joinedFrom": {
            "type": [
              "string",
              "null"
            ],
            "description": "For someone else's project joined by link: the owner's name."
          }
        }
      },
      "Report": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "timeZone": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "total": {
            "type": "object",
            "properties": {
              "duration": {
                "type": "string"
              },
              "hours": {
                "type": "string"
              },
              "spoken": {
                "type": "string"
              },
              "billableHours": {
                "type": "string"
              },
              "amount": {
                "type": "string"
              },
              "amountDisplay": {
                "type": "string"
              },
              "entries": {
                "type": "integer"
              }
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "allOf": [
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "duration": {
                      "type": "string",
                      "example": "12:30:00"
                    },
                    "hours": {
                      "type": "string",
                      "example": "12.50"
                    },
                    "billableHours": {
                      "type": "string"
                    },
                    "amount": {
                      "type": "string",
                      "description": "Decimal string in the workspace currency."
                    },
                    "entries": {
                      "type": "integer"
                    }
                  }
                },
                {
                  "type": "object",
                  "properties": {
                    "client": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              ]
            }
          },
          "clients": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "duration": {
                  "type": "string",
                  "example": "12:30:00"
                },
                "hours": {
                  "type": "string",
                  "example": "12.50"
                },
                "billableHours": {
                  "type": "string"
                },
                "amount": {
                  "type": "string",
                  "description": "Decimal string in the workspace currency."
                },
                "entries": {
                  "type": "integer"
                }
              }
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "duration": {
                  "type": "string",
                  "example": "12:30:00"
                },
                "hours": {
                  "type": "string",
                  "example": "12.50"
                },
                "billableHours": {
                  "type": "string"
                },
                "amount": {
                  "type": "string",
                  "description": "Decimal string in the workspace currency."
                },
                "entries": {
                  "type": "integer"
                }
              }
            }
          },
          "people": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "duration": {
                  "type": "string",
                  "example": "12:30:00"
                },
                "hours": {
                  "type": "string",
                  "example": "12.50"
                },
                "billableHours": {
                  "type": "string"
                },
                "amount": {
                  "type": "string",
                  "description": "Decimal string in the workspace currency."
                },
                "entries": {
                  "type": "integer"
                }
              }
            },
            "description": "Only when teammates logged time to projects this workspace shared by link."
          },
          "days": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "duration": {
                  "type": "string"
                },
                "hours": {
                  "type": "string"
                }
              }
            }
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
