Skip to main content
Documentation

API V1 Reference β€” No Authentication

The simplest API version. No login or tokens required β€” perfect for learning the basics of REST API testing.

Base URL

bash
https://api.testauto.app/api/v1

All endpoints listed below are relative to this base URL.

Task Endpoints

GET /tasks

Retrieve a paginated list of tasks with optional filtering and sorting. Search matches title, description, and labels.

Query Parameters

  • page (integer, optional) β€” Page number, 0-indexed. Default: 0
  • size (integer, optional) β€” Items per page. Default: 20, Max: 100
  • status (string, optional) β€” Filter: TODO | IN_PROGRESS | DONE
  • search (string, optional) β€” Search in title, description, and labels
  • sort (string, optional) β€” id | title | status | createdAt | updatedAt | dueDate | sortOrder
  • direction (string, optional) β€” asc | desc. Default: asc

createdAt and updatedAt are generated by the API. Every successful PUT update refreshes updatedAt.

Example

bash
curl "https://api.testauto.app/api/v1/tasks?page=0&size=10&status=TODO&search=api&sort=updatedAt&direction=desc"

Response 200 OK

json
{
  "content": [
    {
      "id": 1,
      "title": "Fix login bug",
      "description": "Users unable to login with special characters",
      "status": "TODO",
      "priority": "HIGH",
      "dueDate": "2026-02-05",
      "sortOrder": 0,
      "labels": ["backend", "login"],
      "checklistItems": [
        {
          "id": 201,
          "text": "Reproduce issue in production-like environment",
          "done": false
        }
      ],
      "comments": [],
      "attachments": [
        {
          "id": 401,
          "fileName": "release-notes.txt",
          "contentType": "text/plain",
          "fileSizeBytes": 128,
          "uploadedAt": "2026-02-01T10:35:00Z"
        }
      ],
      "createdAt": "2026-02-01T10:30:00Z",
      "updatedAt": "2026-02-01T10:30:00Z"
    }
  ],
  "totalElements": 42,
  "totalPages": 5,
  "currentPage": 0,
  "pageSize": 10
}

GET /tasks/{id}

Retrieve a single task by its ID.

Example

bash
curl "https://api.testauto.app/api/v1/tasks/1"

Response 200 OK

json
{
  "id": 1,
  "title": "Fix login bug",
  "description": "Users unable to login with special characters",
  "status": "TODO",
  "priority": "HIGH",
  "dueDate": "2026-02-05",
  "sortOrder": 0,
  "labels": ["backend", "login"],
  "checklistItems": [
    {
      "id": 201,
      "text": "Reproduce issue in production-like environment",
      "done": false
    },
    {
      "id": 202,
      "text": "Capture failing request payload",
      "done": true
    }
  ],
  "comments": [
    {
      "id": 7,
      "text": "Reproduced in production.",
      "createdAt": "2026-02-01T10:45:00Z",
      "updatedAt": "2026-02-01T10:45:00Z"
    }
  ],
  "attachments": [
    {
      "id": 401,
      "fileName": "release-notes.txt",
      "contentType": "text/plain",
      "fileSizeBytes": 128,
      "uploadedAt": "2026-02-01T10:35:00Z"
    }
  ],
  "createdAt": "2026-02-01T10:30:00Z",
  "updatedAt": "2026-02-01T10:30:00Z"
}

Response 404 Not Found

json
{
  "timestamp": "2026-02-02T14:30:00Z",
  "status": 404,
  "error": "Not Found",
  "message": "Task not found with id: 999",
  "path": "/api/v1/tasks/999"
}

POST /tasks

Create a new task. Direct API clients should send status; priority is optional and defaults to MEDIUM when omitted.

Request Body

json
{
  "title": "string (required, 1–100 chars)",
  "description": "string (optional, max 500 chars)",
  "status": "TODO | IN_PROGRESS | DONE  (required)",
  "priority": "LOW | MEDIUM | HIGH | URGENT  (optional, default: MEDIUM)",
  "dueDate": "YYYY-MM-DD (optional)",
  "labels": ["optional", "string", "array"],
  "checklistItems": [
    {
      "text": "string (required, 1–200 chars)",
      "done": false
    }
  ]
}

Example

bash
curl -X POST "https://api.testauto.app/api/v1/tasks" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Write API tests",
    "description": "Create comprehensive test suite",
    "status": "TODO",
    "priority": "URGENT",
    "dueDate": "2026-02-10",
    "labels": ["api", "reference"],
    "checklistItems": [
      { "text": "Cover checklist payloads", "done": false },
      { "text": "Add reorder smoke test", "done": true }
    ]
  }'

Response 201 Created

json
{
  "id": 43,
  "title": "Write API tests",
  "description": "Create comprehensive test suite",
  "status": "TODO",
  "priority": "URGENT",
  "dueDate": "2026-02-10",
  "sortOrder": 0,
  "labels": ["api", "reference"],
  "checklistItems": [
    {
      "id": 301,
      "text": "Cover checklist payloads",
      "done": false
    },
    {
      "id": 302,
      "text": "Add reorder smoke test",
      "done": true
    }
  ],
  "comments": [],
  "attachments": [],
  "createdAt": "2026-02-02T15:00:00Z",
  "updatedAt": "2026-02-02T15:00:00Z"
}

Response 400 Bad Request (validation error)

json
{
  "timestamp": "2026-02-02T15:00:00Z",
  "status": 400,
  "error": "Bad Request",
  "message": "Validation failed",
  "errors": {
    "title": "Title is required and must be between 1 and 100 characters"
  }
}

PUT /tasks/{id}

Replace a task completely. The API preserves createdAt and refreshes updatedAt.

Example

bash
curl -X PUT "https://api.testauto.app/api/v1/tasks/43" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Write API tests",
    "description": "Complete test suite with edge cases",
    "status": "IN_PROGRESS",
    "priority": "HIGH",
    "dueDate": "2026-02-12",
    "labels": ["api", "reference", "updated"],
    "checklistItems": [
      { "text": "Cover checklist payloads", "done": true },
      { "text": "Verify admin-only delete all", "done": false }
    ]
  }'

Response 200 OK

json
{
  "id": 43,
  "title": "Write API tests",
  "description": "Complete test suite with edge cases",
  "status": "IN_PROGRESS",
  "priority": "HIGH",
  "dueDate": "2026-02-12",
  "sortOrder": 1,
  "labels": ["api", "reference", "updated"],
  "checklistItems": [
    {
      "id": 301,
      "text": "Cover checklist payloads",
      "done": true
    },
    {
      "id": 303,
      "text": "Verify admin-only delete all",
      "done": false
    }
  ],
  "comments": [],
  "attachments": [
    {
      "id": 401,
      "fileName": "release-notes.txt",
      "contentType": "text/plain",
      "fileSizeBytes": 128,
      "uploadedAt": "2026-02-02T15:05:00Z"
    }
  ],
  "createdAt": "2026-02-02T15:00:00Z",
  "updatedAt": "2026-02-02T15:30:00Z"
}

POST /tasks/{id}/reorder

Move a task within the same board column or into a different status column.

Request Body

json
{
  "targetStatus": "TODO | IN_PROGRESS | DONE",
  "targetIndex": 0
}

Example

bash
curl -X POST "https://api.testauto.app/api/v1/tasks/43/reorder"   -H "Content-Type: application/json"   -d '{
    "targetStatus": "DONE",
    "targetIndex": 0
  }'

Response 200 OK

json
{
  "id": 43,
  "title": "Write API tests",
  "description": "Complete test suite with edge cases",
  "status": "DONE",
  "priority": "HIGH",
  "dueDate": "2026-02-12",
  "sortOrder": 0,
  "labels": ["api", "reference", "updated"],
  "checklistItems": [],
  "comments": [],
  "createdAt": "2026-02-02T15:00:00Z",
  "updatedAt": "2026-02-02T16:10:00Z"
}

Comment Sub-Resources

Comments are nested under tasks and use a text request field.

POST /tasks/{id}/comments

bash
curl -X POST "https://api.testauto.app/api/v1/tasks/43/comments" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Verified against V1 controller tests"
  }'

PUT /tasks/{id}/comments/{commentId}

bash
curl -X PUT "https://api.testauto.app/api/v1/tasks/43/comments/7" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Verified against V1 and V2 controller tests"
  }'

DELETE /tasks/{id}/comments/{commentId}

bash
curl -X DELETE "https://api.testauto.app/api/v1/tasks/43/comments/7"

Attachment Sub-Resources

Attachment binaries are uploaded separately from JSON task create/update payloads. Each task supports up to 3 files with a maximum size of 1 MB per file.

POST /tasks/{id}/attachments

bash
curl -X POST "https://api.testauto.app/api/v1/tasks/43/attachments" \
  -F "files=@./release-notes.txt" \
  -F "files=@./diagram.png"

Response 201 Created

json
[
  {
    "id": 401,
    "fileName": "release-notes.txt",
    "contentType": "text/plain",
    "fileSizeBytes": 128,
    "uploadedAt": "2026-02-02T16:20:00Z"
  },
  {
    "id": 402,
    "fileName": "diagram.png",
    "contentType": "image/png",
    "fileSizeBytes": 20480,
    "uploadedAt": "2026-02-02T16:20:01Z"
  }
]

Response 400 Bad Request (oversized file)

json
{
  "timestamp": "2026-02-02T16:20:00Z",
  "status": 400,
  "error": "Bad Request",
  "message": "File 'too-large.bin' exceeds the 1 MB limit",
  "path": "/api/v1/tasks/43/attachments"
}

DELETE /tasks/{id}/attachments/{attachmentId}

bash
curl -X DELETE "https://api.testauto.app/api/v1/tasks/43/attachments/401"

DELETE /tasks/{id}

Permanently delete a task.

Example

bash
curl -X DELETE "https://api.testauto.app/api/v1/tasks/43"

Response 204 No Content

Empty body on success.

Response 404 Not Found

json
{
  "status": 404,
  "error": "Not Found",
  "message": "Task not found with id: 43"
}

DELETE /tasks

Delete all tasks. This is useful for resetting the demo environment during testing.

Example

bash
curl -X DELETE "https://api.testauto.app/api/v1/tasks"

Response 204 No Content

Empty body on success.

GET /tasks/summary

Aggregate statistics about all tasks.

Example

bash
curl "https://api.testauto.app/api/v1/tasks/summary"

Response 200 OK

json
{
  "totalTasks": 42,
  "todoTasks": 15,
  "inProgressTasks": 12,
  "doneTasks": 15
}

Data Types & Enums

Status

  • TODO β€” Task not started
  • IN_PROGRESS β€” Currently being worked on
  • DONE β€” Completed

Priority

  • LOW
  • MEDIUM
  • HIGH
  • URGENT

Dates

dueDate uses the date-only format YYYY-MM-DD. createdAt and updatedAt are ISO 8601 timestamps and should be treated as read-only fields.

HTTP Status Codes

  • 200 OK β€” Request succeeded
  • 201 Created β€” Resource created
  • 204 No Content β€” Succeeded, no body
  • 400 Bad Request β€” Validation error
  • 404 Not Found β€” Resource does not exist
  • 500 Internal Server Error β€” Server error