Properties
| Name | Type | Description |
|---|---|---|
| can_edit_details | boolean | |
| id | integer | |
| active | boolean | |
| account_id | integer | |
| name | string | |
| description | nullstring | |
| color | string | hex code |
| rate_type | string | |
| billable | boolean | |
| created_at | integer | |
| updated_at | integer | |
| external_id | nullstring | |
| budget_scope | nullstring | |
| client | object | |
| required_notes | boolean | |
| required_labels | boolean | |
| budget_expired_on | nullstring | |
| has_recurrence | boolean | |
| enable_labels | string | |
| created_from | string | |
| default_labels | boolean | |
| allow_only_one_tag | boolean | Whether only one tag is allowed per time entry |
| currency | object | |
| team_ids | array | |
| update_hour_billable_state | boolean | |
| budget | number | |
| budget_type | string | |
| budget_calculation | string | |
| hour_rate | number | |
| hour_rate_in_cents | number | |
| budget_progress | number | |
| budget_percent | number | |
| invoice_by_budget | boolean | |
| users | array | |
| labels | array | |
| label_ids | array | |
| required_label_ids | array | |
| default_label_ids | array | |
| first_logged_on | nullstring | The date in ISO 8601 format (YYYY-MM-DD) |
| last_logged_on | nullstring | The date in ISO 8601 format (YYYY-MM-DD) |
| locked_hours | boolean | Whether the project has locked or billed or invoiced hours |
| tic | object | Integration metadata (internal only). Present for synced projects. |
| cost | object | V1::Cost schema or empty object |
| estimated_cost | object | V1::Cost schema or empty object |
| billed_cost | object | V1::Cost schema or empty object |
| unbilled_cost | object | V1::Cost schema or empty object |
| internal_cost | object | V1::Cost schema or empty object |
| profit | object | V1::Cost schema or empty object |
| duration | object | |
| estimated_duration | object | |
| billed_duration | object | |
| unbilled_duration | object | |
| billable_duration | object | |
| non_billable_duration | object | |
| profitability | number |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/timely/main/json-schema/timely-v1-project-schema.json",
"title": "V1.Project",
"x-generated": "2026-10-27",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/timely-openapi.json#/components/schemas/V1.Project",
"type": "object",
"properties": {
"can_edit_details": {
"type": "boolean"
},
"id": {
"type": "integer"
},
"active": {
"type": "boolean"
},
"account_id": {
"type": "integer"
},
"name": {
"type": "string"
},
"description": {
"type": [
"null",
"string"
]
},
"color": {
"type": "string",
"description": "hex code",
"minLength": 3,
"maxLength": 6,
"pattern": "^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"
},
"rate_type": {
"type": "string",
"enum": [
"project",
"user",
"non-billable"
]
},
"billable": {
"type": "boolean"
},
"created_at": {
"type": "integer"
},
"updated_at": {
"type": "integer"
},
"external_id": {
"type": [
"null",
"string"
]
},
"budget_scope": {
"type": [
"null",
"string"
],
"enum": [
"tag",
"project",
null
]
},
"client": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"active": {
"type": "boolean"
},
"external_id": {
"type": [
"null",
"string"
]
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"color": {
"type": "string"
},
"external_references": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"provider_type": {
"type": "string"
},
"provider_id": {
"type": "string"
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"connection_id": {
"type": "integer"
},
"url": {
"format": "uri",
"type": "string"
}
},
"required": [
"id",
"provider_type",
"provider_id",
"updated_at",
"connection_id",
"url"
]
}
},
"tic": {
"type": "object",
"properties": {
"uri": {
"type": "string"
},
"tool_id": {
"type": [
"null",
"string"
]
},
"external_url": {
"type": [
"null",
"string"
]
}
},
"required": [
"uri"
]
}
},
"required": [
"id",
"name",
"active",
"external_id",
"updated_at",
"color"
]
},
"required_notes": {
"type": "boolean"
},
"required_labels": {
"type": "boolean"
},
"budget_expired_on": {
"type": [
"null",
"string"
],
"format": "date-time"
},
"has_recurrence": {
"type": "boolean"
},
"enable_labels": {
"type": "string",
"enum": [
"all",
"none",
"custom"
]
},
"created_from": {
"type": "string"
},
"default_labels": {
"type": "boolean"
},
"allow_only_one_tag": {
"type": "boolean",
"description": "Whether only one tag is allowed per time entry"
},
"currency": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string",
"minLength": 1
},
"iso_code": {
"type": "string"
},
"symbol": {
"type": "string"
},
"symbol_first": {
"type": "boolean"
}
},
"required": [
"id",
"name",
"iso_code",
"symbol",
"symbol_first"
]
},
"team_ids": {
"type": "array",
"items": {
"type": "integer"
}
},
"update_hour_billable_state": {
"type": "boolean"
},
"budget": {
"type": "number"
},
"budget_type": {
"type": "string",
"enum": [
"H",
"M",
""
]
},
"budget_calculation": {
"type": "string",
"enum": [
"pending",
"completed"
]
},
"hour_rate": {
"type": "number"
},
"hour_rate_in_cents": {
"type": "number"
},
"budget_progress": {
"type": "number"
},
"budget_percent": {
"type": "number"
},
"invoice_by_budget": {
"type": "boolean"
},
"users": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"avatar": {
"type": "object",
"properties": {
"large_retina": {
"type": [
"null",
"string"
]
},
"medium_retina": {
"type": [
"null",
"string"
]
}
}
},
"user_id": {
"type": "integer"
},
"hour_rate": {
"type": "number"
},
"hour_rate_in_cents": {
"type": "number"
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"created_at": {
"type": "string",
"format": "date-time"
},
"deleted": {
"type": "boolean"
},
"internal_hour_rate": {
"type": "number"
},
"internal_hour_rate_in_cents": {
"type": "number"
}
},
"required": [
"user_id",
"hour_rate",
"hour_rate_in_cents",
"updated_at",
"created_at",
"deleted",
"internal_hour_rate",
"internal_hour_rate_in_cents"
]
}
},
"labels": {
"type": "array",
"items": {
"type": "object",
"properties": {
"project_id": {
"type": "integer"
},
"label_id": {
"type": "integer"
},
"budget": {
"type": "number"
},
"required": {
"type": "boolean"
},
"default": {
"type": "boolean"
},
"updated_at": {
"type": "string",
"format": "date-time"
}
},
"required": [
"project_id",
"label_id",
"budget",
"required",
"default",
"updated_at"
]
}
},
"label_ids": {
"type": "array",
"items": {
"type": "integer"
}
},
"required_label_ids": {
"type": "array",
"items": {
"type": "integer"
}
},
"default_label_ids": {
"type": "array",
"items": {
"type": "integer"
}
},
"first_logged_on": {
"type": [
"null",
"string"
],
"description": "The date in ISO 8601 format (YYYY-MM-DD)",
"format": "date",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"
},
"last_logged_on": {
"type": [
"null",
"string"
],
"description": "The date in ISO 8601 format (YYYY-MM-DD)",
"format": "date",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"
},
"locked_hours": {
"type": "boolean",
"description": "Whether the project has locked or billed or invoiced hours"
},
"tic": {
"type": "object",
"description": "Integration metadata (internal only). Present for synced projects.",
"x-internal": true,
"properties": {
"uri": {
"type": "string",
"description": "Canonical TIC identifier (e.g., tic://jira/workspace-id/projects/KEY). Immutable once set."
},
"tool_id": {
"type": [
"null",
"string"
],
"description": "Original external tool identifier (e.g., jira, trello, asana)."
},
"external_url": {
"type": [
"null",
"string"
],
"description": "Direct link to the project in the external tool."
}
},
"required": [
"uri"
]
},
"cost": {
"anyOf": [
{
"type": "object",
"properties": {
"fractional": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"amount": {
"type": "number"
},
"currency_code": {
"type": "string",
"minLength": 1
}
},
"required": [
"fractional",
"formatted",
"amount",
"currency_code"
]
},
{
"type": "object",
"properties": {}
}
],
"description": "V1::Cost schema or empty object"
},
"estimated_cost": {
"anyOf": [
{
"type": "object",
"properties": {
"fractional": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"amount": {
"type": "number"
},
"currency_code": {
"type": "string",
"minLength": 1
}
},
"required": [
"fractional",
"formatted",
"amount",
"currency_code"
]
},
{
"type": "object",
"properties": {}
}
],
"description": "V1::Cost schema or empty object"
},
"billed_cost": {
"anyOf": [
{
"type": "object",
"properties": {
"fractional": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"amount": {
"type": "number"
},
"currency_code": {
"type": "string",
"minLength": 1
}
},
"required": [
"fractional",
"formatted",
"amount",
"currency_code"
]
},
{
"type": "object",
"properties": {}
}
],
"description": "V1::Cost schema or empty object"
},
"unbilled_cost": {
"anyOf": [
{
"type": "object",
"properties": {
"fractional": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"amount": {
"type": "number"
},
"currency_code": {
"type": "string",
"minLength": 1
}
},
"required": [
"fractional",
"formatted",
"amount",
"currency_code"
]
},
{
"type": "object",
"properties": {}
}
],
"description": "V1::Cost schema or empty object"
},
"internal_cost": {
"anyOf": [
{
"type": "object",
"properties": {
"fractional": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"amount": {
"type": "number"
},
"currency_code": {
"type": "string",
"minLength": 1
}
},
"required": [
"fractional",
"formatted",
"amount",
"currency_code"
]
},
{
"type": "object",
"properties": {}
}
],
"description": "V1::Cost schema or empty object"
},
"profit": {
"anyOf": [
{
"type": "object",
"properties": {
"fractional": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"amount": {
"type": "number"
},
"currency_code": {
"type": "string",
"minLength": 1
}
},
"required": [
"fractional",
"formatted",
"amount",
"currency_code"
]
},
{
"type": "object",
"properties": {}
}
],
"description": "V1::Cost schema or empty object"
},
"duration": {
"type": "object",
"properties": {
"hours": {
"type": "integer"
},
"minutes": {
"type": "integer"
},
"seconds": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"total_hours": {
"type": "number"
},
"total_seconds": {
"type": "integer"
},
"total_minutes": {
"type": "integer"
}
},
"required": [
"hours",
"minutes",
"seconds",
"formatted",
"total_hours",
"total_seconds",
"total_minutes"
]
},
"estimated_duration": {
"type": "object",
"properties": {
"hours": {
"type": "integer"
},
"minutes": {
"type": "integer"
},
"seconds": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"total_hours": {
"type": "number"
},
"total_seconds": {
"type": "integer"
},
"total_minutes": {
"type": "integer"
}
},
"required": [
"hours",
"minutes",
"seconds",
"formatted",
"total_hours",
"total_seconds",
"total_minutes"
]
},
"billed_duration": {
"type": "object",
"properties": {
"hours": {
"type": "integer"
},
"minutes": {
"type": "integer"
},
"seconds": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"total_hours": {
"type": "number"
},
"total_seconds": {
"type": "integer"
},
"total_minutes": {
"type": "integer"
}
},
"required": [
"hours",
"minutes",
"seconds",
"formatted",
"total_hours",
"total_seconds",
"total_minutes"
]
},
"unbilled_duration": {
"type": "object",
"properties": {
"hours": {
"type": "integer"
},
"minutes": {
"type": "integer"
},
"seconds": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"total_hours": {
"type": "number"
},
"total_seconds": {
"type": "integer"
},
"total_minutes": {
"type": "integer"
}
},
"required": [
"hours",
"minutes",
"seconds",
"formatted",
"total_hours",
"total_seconds",
"total_minutes"
]
},
"billable_duration": {
"type": "object",
"properties": {
"hours": {
"type": "integer"
},
"minutes": {
"type": "integer"
},
"seconds": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"total_hours": {
"type": "number"
},
"total_seconds": {
"type": "integer"
},
"total_minutes": {
"type": "integer"
}
},
"required": [
"hours",
"minutes",
"seconds",
"formatted",
"total_hours",
"total_seconds",
"total_minutes"
]
},
"non_billable_duration": {
"type": "object",
"properties": {
"hours": {
"type": "integer"
},
"minutes": {
"type": "integer"
},
"seconds": {
"type": "integer"
},
"formatted": {
"type": "string",
"minLength": 1
},
"total_hours": {
"type": "number"
},
"total_seconds": {
"type": "integer"
},
"total_minutes": {
"type": "integer"
}
},
"required": [
"hours",
"minutes",
"seconds",
"formatted",
"total_hours",
"total_seconds",
"total_minutes"
]
},
"profitability": {
"type": "number"
}
},
"required": [
"id",
"active",
"account_id",
"name",
"description",
"rate_type",
"billable",
"created_at",
"updated_at",
"budget_scope",
"client",
"required_notes",
"required_labels",
"budget_expired_on",
"has_recurrence",
"enable_labels",
"created_from",
"default_labels",
"allow_only_one_tag",
"currency"
]
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/timely-v1-project"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.