solidtime
GitHubModern open-source time-tracking app
Laravel Specification
Located in openapi.json on branch HEAD
3.1.0
JSON
4 Endpoints
35.1 KB
Operations & Route Endpoints (9)
Raw JSON Specification
{
"openapi": "3.1.0",
"info": {
"title": "Laravel",
"version": "0.0.1"
},
"servers": [
{
"url": "https://app.solidtime.io/api",
"description": "Production"
},
{
"url": "https://app.staging.solidtime.io/api",
"description": "Staging"
},
{
"url": "https://soldtime.test/api",
"description": "Local"
}
],
"security": [
{
"oauth2": []
}
],
"paths": {
"/v1/organization/{organization}/projects": {
"get": {
"operationId": "getProjects",
"summary": "Get projects",
"tags": [
"Project"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "`ProjectCollection`",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/ProjectCollection"
}
},
"required": [
"data"
]
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
}
}
},
"post": {
"operationId": "createProject",
"summary": "Create project",
"tags": [
"Project"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"color": {
"type": "string"
}
},
"required": [
"name",
"color"
]
}
}
}
},
"responses": {
"200": {
"description": "`ProjectResource`",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/ProjectResource"
}
},
"required": [
"data"
]
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/v1/organization/{organization}/projects/{project}": {
"get": {
"operationId": "getProject",
"summary": "Get project",
"tags": [
"Project"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "project",
"in": "path",
"required": true,
"description": "The project ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "`ProjectResource`",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/ProjectResource"
}
},
"required": [
"data"
]
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
}
}
},
"put": {
"operationId": "updateProject",
"summary": "Update project",
"tags": [
"Project"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "project",
"in": "path",
"required": true,
"description": "The project ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"color": {
"type": "string"
}
},
"required": [
"name",
"color"
]
}
}
}
},
"responses": {
"200": {
"description": "`ProjectResource`",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/ProjectResource"
}
},
"required": [
"data"
]
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "v1.projects.destroy",
"summary": "Delete project",
"tags": [
"Project"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "project",
"in": "path",
"required": true,
"description": "The project ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"responses": {
"204": {
"description": "No content",
"content": {
"application/json": {
"schema": {
"type": "null"
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
}
}
}
},
"/v1/organization/{organization}/time-entries": {
"get": {
"operationId": "v1.time-entries.index",
"summary": "Get time entries",
"tags": [
"TimeEntry"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "user_id",
"in": "query",
"description": "Filter by user ID",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "before",
"in": "query",
"description": "Filter only time entries that have a start date before (not including) the given date (example: 2021-12-31)",
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "after",
"in": "query",
"description": "Filter only time entries that have a start date after (not including) the given date (example: 2021-12-31)",
"schema": {
"type": [
"string",
"null"
]
}
},
{
"name": "active",
"in": "query",
"description": "Filter only time entries that are active (have no end date, are still running)",
"schema": {
"type": "boolean"
}
},
{
"name": "limit",
"in": "query",
"description": "Limit the number of returned time entries",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
{
"name": "only_full_dates",
"in": "query",
"description": "Filter makes sure that only time entries of a whole date are returned",
"schema": {
"type": "boolean"
}
}
],
"responses": {
"200": {
"description": "`TimeEntryCollection`",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/TimeEntryCollection"
}
},
"required": [
"data"
]
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"post": {
"operationId": "v1.time-entries.store",
"summary": "Create time entry",
"tags": [
"TimeEntry"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"user_id": {
"type": "string",
"format": "uuid",
"description": "ID of the user that the time entry should belong to"
},
"task_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "ID of the task that the time entry should belong to"
},
"start": {
"type": "string",
"description": "Start of time entry (ISO 8601 format, UTC timezone)"
},
"end": {
"type": [
"string",
"null"
],
"description": "End of time entry (ISO 8601 format, UTC timezone)"
},
"description": {
"type": [
"string",
"null"
],
"description": "Description of time entry"
},
"tags": {
"type": [
"array",
"null"
],
"description": "List of tag IDs",
"items": {
"type": "string",
"format": "uuid"
}
}
},
"required": [
"user_id",
"start",
"end"
]
}
}
}
},
"responses": {
"200": {
"description": "`TimeEntryResource`",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/TimeEntryResource"
}
},
"required": [
"data"
]
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
}
},
"/v1/organization/{organization}/time-entries/{timeEntry}": {
"put": {
"operationId": "v1.time-entries.update",
"summary": "Update time entry",
"tags": [
"TimeEntry"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "timeEntry",
"in": "path",
"required": true,
"description": "The time entry ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"task_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "ID of the task that the time entry should belong to"
},
"start": {
"type": "string",
"description": "Start of time entry (ISO 8601 format, UTC timezone)"
},
"end": {
"type": [
"string",
"null"
],
"description": "End of time entry (ISO 8601 format, UTC timezone)"
},
"description": {
"type": [
"string",
"null"
],
"description": "Description of time entry"
},
"tags": {
"type": [
"array",
"null"
],
"description": "List of tag IDs",
"items": {
"type": "string",
"format": "uuid"
}
}
},
"required": [
"start",
"end"
]
}
}
}
},
"responses": {
"200": {
"description": "`TimeEntryResource`",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/TimeEntryResource"
}
},
"required": [
"data"
]
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
},
"422": {
"$ref": "#/components/responses/ValidationException"
}
}
},
"delete": {
"operationId": "v1.time-entries.destroy",
"summary": "Delete time entry",
"tags": [
"TimeEntry"
],
"parameters": [
{
"name": "organization",
"in": "path",
"required": true,
"description": "The organization ID",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "timeEntry",
"in": "path",
"required": true,
"description": "The time entry ID",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"responses": {
"204": {
"description": "No content",
"content": {
"application/json": {
"schema": {
"type": "null"
}
}
}
},
"403": {
"$ref": "#/components/responses/AuthorizationException"
},
"404": {
"$ref": "#/components/responses/ModelNotFoundException"
}
}
}
}
},
"components": {
"securitySchemes": {
"oauth2": {
"type": "oauth2",
"flows": {
"authorizationCode": {
"authorizationUrl": "https://solidtime.test/oauth/authorize"
}
}
}
},
"schemas": {
"ProjectCollection": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ProjectResource"
},
"title": "ProjectCollection"
},
"ProjectResource": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "ID of project"
},
"name": {
"type": "string",
"description": "Name of project"
},
"color": {
"type": "string",
"description": "Color of project"
},
"client_id": {
"type": [
"string",
"null"
],
"description": "ID of client"
}
},
"required": [
"id",
"name",
"color",
"client_id"
],
"title": "ProjectResource"
},
"TimeEntryCollection": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TimeEntryResource"
},
"title": "TimeEntryCollection"
},
"TimeEntryResource": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "ID of time entry"
},
"start": {
"type": "string",
"description": "Start of time entry (ISO 8601 format, UTC timezone, example: 2024-02-26T17:17:17Z)"
},
"end": {
"type": [
"string",
"null"
],
"description": "End of time entry (ISO 8601 format, UTC timezone, example: 2024-02-26T17:17:17Z)"
},
"duration": {
"type": "integer",
"description": "Duration of time entry in seconds"
},
"description": {
"type": [
"string",
"null"
],
"description": "Description of time entry"
},
"task_id": {
"type": [
"string",
"null"
],
"description": "ID of task"
},
"project_id": {
"type": [
"string",
"null"
],
"description": "ID of project"
},
"user_id": {
"type": "string",
"description": "ID of user"
},
"tags": {
"type": "array",
"description": "List of tag IDs",
"items": {
"type": "string"
}
}
},
"required": [
"id",
"start",
"end",
"duration",
"description",
"task_id",
"project_id",
"user_id",
"tags"
],
"title": "TimeEntryResource"
}
},
"responses": {
"AuthorizationException": {
"description": "Authorization error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview."
}
},
"required": [
"message"
]
}
}
}
},
"ModelNotFoundException": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Error overview."
}
},
"required": [
"message"
]
}
}
}
},
"ValidationException": {
"description": "Validation error",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Errors overview."
},
"errors": {
"type": "object",
"description": "A detailed description of each field that failed validation.",
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"required": [
"message",
"errors"
]
}
}
}
}
}
}
}