time-free.openapps.xyz

Source

This app’s code and revision history are public. Download a copy or explore the files below.

Public
The app’s code and revision history are public.
Owned app · rev 4857f8a940b5
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone 703ed60f2cc5ad3d98a5bf4a
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
← All files
public/openapi.json
{
  "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://openapps.free/"
    }
  },
  "servers": [
    {
      "url": "https://functions.openapps.xyz/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"
            }
          }
        }
      }
    }
  }
}

Change history

Point OpenApps links to openapps.free
4857f8a940 · 19 hours ago
Bind agent address constants in policy
62b1e6acb2 · 20 hours ago
Use functions.openapps.xyz alias and add OpenApp contribution strip
61d972193a · 20 hours ago
Bounded source sync
fc644b4327 · 1 day ago
Bounded source sync
22f511f3db · 1 day ago
Bounded source sync
351a8d754c · 1 day ago
Bounded source sync
0da238a77e · 1 day ago