API Documentation WS24.dev

WS24/API Docs
[api · v1]

REST API for programmatic task management.

The WS24 Dev API lets authenticated clients list, create, update and comment on tasks. All requests are authenticated via the X-API-Key header and rate-limited at 500 req/min.

// base urlhttps://ws24.dev/api/v1
[01] Authentication

One key per user, sent on every request.

All API requests must include a valid key in the X-API-Key header. Keys are issued through your profile and rotate at your discretion.

API Key Format

Keys are 32-character random strings, prefixed with ws24_live_:

ws24_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Sending the key

Include your API key in the X-API-Key header for every request:

$ curl -H "X-API-Key: ws24_live_your_key_here" https://ws24.dev/api/v1/tasks

Managing API keys

Open your Profile → API Keys section to:

  1. Click Create API Key and give it a name.
  2. Copy the full key — it's shown once and cannot be retrieved again.
  3. Revoke a key with the delete button when it's no longer needed.

Limit: only one active key per user at a time.

[02] Rate Limiting

500 requests per minute per key.

Limits are enforced per API key. When you hit the cap, you'll get a 429 with a retryAfter hint — implement exponential backoff in your client.
500/min
// hard limit
429
// status on overrun
retryAfter
// in response body
// 429 response
{
  "error": "Rate limit exceeded",
  "message": "Too many requests. Rate limit: 500 requests per minute",
  "retryAfter": 45
}
[03] Endpoints

Tasks · v1.

All endpoints return application/json. Errors share a common shape — see Error Responses below.
GET /api/v1/tasks

List tasks

Returns a paginated list of tasks visible to the authenticated user.

// query parameters (all optional)
status, page, limit, sort, order
// request
$ curl -H "X-API-Key: ws24_live_..." \
       "https://ws24.dev/api/v1/tasks?status=in_progress&page=1&limit=10&sort=created_at&order=desc"
// response · 200 OK
{
  "tasks": [
    {
      "id": 123,
      "title": "Website redesign",
      "description": "Update homepage with new branding",
      "status": "in_progress",
      "budget": "1000",
      "deadline": "2025-12-31",
      "createdAt": "2025-11-01T10:00:00Z",
      "updatedAt": "2025-11-10T15:30:00Z"
    }
  ],
  "pagination": {
    "page": 1, "limit": 10, "total": 45, "totalPages": 5
  }
}
GET /api/v1/tasks/:id

Get task by ID

// request
$ curl -H "X-API-Key: ws24_live_..." https://ws24.dev/api/v1/tasks/123
// response · 200 OK
{
  "task": {
    "id": 123,
    "title": "Website redesign",
    "status": "in_progress",
    "clientId": "user_123",
    "specialistId": "specialist_456",
    "createdAt": "2025-11-01T10:00:00Z",
    "updatedAt": "2025-11-10T15:30:00Z"
  }
}
POST /api/v1/tasks

Create a task

Requires Content-Type: application/json. Returns the created task with its assigned ID.

// request body fields
title       // string, required
description // string, required
budget      // numeric string, optional
deadline    // ISO date, optional
// request
$ curl -X POST -H "X-API-Key: ws24_live_..." -H "Content-Type: application/json" \
       -d '{
         "title": "Mobile app development",
         "description": "Develop iOS app for our service",
         "budget": "5000",
         "deadline": "2025-12-31"
       }' https://ws24.dev/api/v1/tasks
// response · 201 Created
{
  "message": "Task created successfully",
  "task": { "id": 124, "status": "created", ... }
}
PUT /api/v1/tasks/:id

Update a task

// request
$ curl -X PUT -H "X-API-Key: ws24_live_..." -H "Content-Type: application/json" \
       -d '{ "status": "completed", "description": "Task completed successfully" }' \
       https://ws24.dev/api/v1/tasks/123
// response · 200 OK
{
  "message": "Task updated successfully",
  "task": { "id": 123, "status": "completed", "updatedAt": "..." }
}
POST /api/v1/tasks/:id/updates

Add comment / update

// request
$ curl -X POST -H "X-API-Key: ws24_live_..." -H "Content-Type: application/json" \
       -d '{ "content": "Work in progress, 50% completed", "type": "comment" }' \
       https://ws24.dev/api/v1/tasks/123/updates
// response · 201 Created
{
  "message": "Update added successfully",
  "update": { "id": 456, "taskId": 123, "type": "comment", ... }
}
[04] Error Responses

Same envelope, mapped to HTTP status.

All errors return JSON with error, message, and optional details array.
{
  "error": "Error type",
  "message": "Human-readable error message",
  "details": []
}
200OK — request successful
201Created — resource created successfully
400Bad Request — invalid request parameters
401Unauthorized — invalid or missing API key
403Forbidden — insufficient permissions
404Not Found — resource not found
429Too Many Requests — rate limit exceeded
500Internal Server Error — server-side fault
[05] Best Practices

Five things that ship resilient integrations.

Same advice we give every client building against a third-party API — keys safe, retries gentle, lists paginated.

Secure your API key

Never expose the key in client-side code or public repositories. Treat it like a password.

Handle rate limits

Implement exponential backoff with jitter when you receive 429 responses. Honour the retryAfter hint.

Use pagination

Always paginate list endpoints — the default limit is sized for browsers, not bulk loads.

Handle errors gracefully

Match on error and message fields rather than parsing free-text strings.

Rotate keys periodically

Create a new key, switch your client, then revoke the old one. Aim for quarterly rotation.

[06] Code Examples

Copy/paste in your language.

Three runnable starters — Python (requests), Node.js (axios), and a plain bash script.
Pythonrequests Node.jsaxios cURLbash
import requests

API_KEY = "ws24_live_your_key_here"
BASE_URL = "https://ws24.dev/api/v1"

headers = {
    "X-API-Key": API_KEY,
    "Content-Type": "application/json",
}

# Get tasks
response = requests.get(f"{BASE_URL}/tasks", headers=headers)
tasks = response.json()

# Create a task
new_task = {
    "title": "New project",
    "description": "Project description",
    "budget": "2000",
}
created = requests.post(f"{BASE_URL}/tasks", headers=headers, json=new_task).json()
const axios = require('axios');

const API_KEY = 'ws24_live_your_key_here';
const BASE_URL = 'https://ws24.dev/api/v1';

const headers = {
  'X-API-Key': API_KEY,
  'Content-Type': 'application/json',
};

async function getTasks() {
  const { data } = await axios.get(`${BASE_URL}/tasks`, { headers });
  console.log(data);
}

async function createTask() {
  const { data } = await axios.post(`${BASE_URL}/tasks`, {
    title: 'New project',
    description: 'Project description',
    budget: '2000',
  }, { headers });
  console.log(data);
}
#!/bin/bash

API_KEY="ws24_live_your_key_here"
BASE_URL="https://ws24.dev/api/v1"

# List tasks
curl -H "X-API-Key: $API_KEY" "$BASE_URL/tasks"

# Create a task
curl -X POST \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "New project",
    "description": "Project description",
    "budget": "2000"
  }' \
  "$BASE_URL/tasks"
[07] Support & Changelog

Stuck or hitting a wall? Reach the team.

Email is fastest for integration questions; the dashboard ticket form is best for billing/scope work.

Support

Email [email protected] — typically < 4h response.

For scope/billing: open a ticket from your dashboard.

Changelog · v1.0 (Nov 2025)

  • Initial API release
  • Tasks endpoints (list, get, create, update)
  • Comment / update endpoint
  • API-key authentication
  • Rate limiting (500 req/min)