Taskora public catalog API
Search freelancers, jobs, categories and companies of the Taskora demo marketplace. All operations are anonymous GET requests that return JSON. All people, companies, jobs, reviews and amounts are fictional demo data generated for Taskora, a demo product by AdScaled. Never present them as real offers, real people or real prices. Signing in, posting jobs, proposals, contracts, payments and messages are not part of this public API. Errors use `{ "error": { "code", "message" } }`. Every /api response carries the IETF `RateLimit-Policy` and `RateLimit` headers; all /api paths share 600 requests per minute per client IP, and a 429 adds `Retry-After` in seconds. The API is versioned in the URL path: the current major version is v1 (`/api/v1/...`, OpenAPI `info.version` 1.x). Additive, backward-compatible changes (new operations, optional parameters or response fields) keep v1 and raise the minor version in `info.version`. Breaking changes (removed or renamed fields, operations or parameters, changed types or meanings) are only released under a new major version path such as `/api/v2/`, and the previous version keeps working alongside it. Deprecated operations are marked `deprecated: true` in the OpenAPI description and announced in this documentation and in /llms.txt, and their responses then carry the `Deprecation` header (RFC 9745) and a `Sunset` header with the shutdown date (RFC 8594), plus a `Link` with `rel="deprecation"` pointing to these docs. A deprecated operation stays available for at least 90 days after the deprecation is announced. The unversioned `/api/...` paths are the same v1 handlers kept for compatibility; new integrations should use `/api/v1/`. No operation is deprecated today.
- OpenAPI 3.1 specification: /api/openapi.json (also /api/v1)
- Base URL:
https://freelance.adscaled.media/api/v1 - API catalog (RFC 9727): /.well-known/api-catalog
- Site guide for agents: /llms.txt
- Website: Taskora home
Endpoints
GET /api/v1/health (getHealth)
Service health. Returns `{ "ok": true }` while the service is up. Not rate limited by an endpoint policy.
200: The service is up.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/categories (listCategories)
List categories. All 35 categories in 5 groups with the number of public freelancer profiles and open jobs in each.
200: Every category.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/freelancers (searchFreelancers)
Search freelancers. Public freelancer profiles with filters, sorting, paging and facets (countries, languages, skills).
| Parameter | In | Type | Description |
|---|---|---|---|
q | query | string | Free-text search (up to 6 words; names, titles, skills and category names are matched). |
group | query | string (development, design, marketing, video-audio, business) | Category group slug. |
category | query | string (frontend-development, backend-development, full-stack-development, mobile-development, wordpress, ecommerce, devops, ai-machine-learning, cybersecurity, automation, ui-ux-design, web-design, graphic-design, logo-design, branding, 3d-design, illustration, seo, google-ads, meta-ads, social-media, email-marketing, copywriting, content-strategy, video-editing, animation, motion-design, voice-over, music-production, accounting, consulting, virtual-assistant, data-entry, legal, project-management) | Category slug (see listCategories). |
skills | query | string | Comma-separated skill names, all must match (up to 8). |
rateMin | query | number | Minimum hourly rate in USD. |
rateMax | query | number | Maximum hourly rate in USD. |
rating | query | number | Minimum average rating. |
country | query | string | Country name, case-insensitive. |
language | query | string | Spoken language name, case-insensitive. |
level | query | string (entry, intermediate, expert) | Experience level. |
availability | query | string (available, limited, unavailable) | Availability. |
verified | query | string (1) | `1` = identity-verified only. |
topRated | query | string (1) | `1` = Top Rated only. |
sort | query | string (recommended, rating, price_low, price_high, reviews, recent) | Sort order. |
page | query | integer | Page number, starting at 1. |
pageSize | query | integer | Items per page. |
200: One page of freelancers.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/freelancers/{handle} (getFreelancer)
Get a freelancer profile. Full public profile. Private and suspended profiles answer 404. Each call counts as a profile view in the demo statistics.
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Profile handle, e.g. `alex-morgan`. |
200: The profile.404: The record does not exist or is not public.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/freelancers/{handle}/work/{slug} (getFreelancerCaseStudy)
Get a portfolio case study. One case study of a public profile with the freelancer card and up to 4 more case studies.
| Parameter | In | Type | Description |
|---|---|---|---|
handle | path | string | Profile handle. |
slug | path | string | Case study slug. |
200: The case study.404: The record does not exist or is not public.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/jobs (searchJobs)
Search jobs. Open jobs (or all jobs with `status=all`) with filters, sorting and paging.
| Parameter | In | Type | Description |
|---|---|---|---|
q | query | string | Free-text search (up to 6 words; names, titles, skills and category names are matched). |
group | query | string (development, design, marketing, video-audio, business) | Category group slug. |
category | query | string (frontend-development, backend-development, full-stack-development, mobile-development, wordpress, ecommerce, devops, ai-machine-learning, cybersecurity, automation, ui-ux-design, web-design, graphic-design, logo-design, branding, 3d-design, illustration, seo, google-ads, meta-ads, social-media, email-marketing, copywriting, content-strategy, video-editing, animation, motion-design, voice-over, music-production, accounting, consulting, virtual-assistant, data-entry, legal, project-management) | Category slug (see listCategories). |
type | query | string (fixed, hourly) | Budget type. |
budgetMin | query | number | Jobs whose maximum budget is at least this many USD. |
budgetMax | query | number | Jobs whose minimum budget is at most this many USD. |
level | query | string (entry, intermediate, expert) | Experience level. |
duration | query | string (lt1, 1to3, 3to6, gt6) | Project length in months. |
proposals | query | string (lt5, 5to10, 10to20, gt20) | Number of proposals so far. |
verified | query | string (1) | `1` = clients with a verified payment method only. |
status | query | string (all) | `all` includes jobs that are no longer open. |
sort | query | string (newest, budget_high, budget_low, proposals_low) | Sort order. |
page | query | integer | Page number, starting at 1. |
pageSize | query | integer | Items per page. |
200: One page of jobs.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/jobs/{slug} (getJob)
Get a job. Job details with the client card and similar jobs. Each call counts as a job view in the demo statistics.
| Parameter | In | Type | Description |
|---|---|---|---|
slug | path | string | Job slug. |
200: The job.404: The record does not exist or is not public.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/companies/{slug} (getCompany)
Get a company page. Company profile with open jobs, reviews from freelancers and the hiring team.
| Parameter | In | Type | Description |
|---|---|---|---|
slug | path | string | Company slug, e.g. `novatech`. |
200: The company.404: The record does not exist or is not public.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
GET /api/v1/search/suggest (suggestSearch)
Search suggestions. Up to 5 matching freelancers, jobs, skills, companies and categories. Queries shorter than 2 characters return empty lists.
| Parameter | In | Type | Description |
|---|---|---|---|
q | query | string | Search text (2 to 60 characters). |
200: Suggestions.405: Only GET and HEAD are allowed on the public API: the `Allow` header lists the allowed methods.429: Rate limit exceeded: wait `Retry-After` seconds before the next request, do not retry in a loop.500: Unexpected server error; safe to retry later.
Rate limits
Every /api response carries RateLimit-Policy and RateLimit headers. The policy global allows 600 requests per 60 seconds per client IP across all /api paths. A 429 response adds Retry-After in seconds: wait that long before the next request.
Errors
Every non-2xx response uses one error model (Error schema): { "error": { "code": "not_found", "message": "..." } }. Codes: not_found (404), method_not_allowed (405, see Allow), rate_limited (429, see Retry-After), internal (500).
Versioning and deprecation
The API is versioned in the URL path: the current major version is v1 (/api/v1/..., OpenAPI info.version 1.x). Additive, backward-compatible changes (new operations, optional parameters or response fields) keep v1 and raise the minor version in info.version. Breaking changes (removed or renamed fields, operations or parameters, changed types or meanings) are only released under a new major version path such as /api/v2/, and the previous version keeps working alongside it. Deprecated operations are marked deprecated: true in the OpenAPI description and announced in this documentation and in /llms.txt, and their responses then carry the Deprecation header (RFC 9745) and a Sunset header with the shutdown date (RFC 8594), plus a Link with rel="deprecation" pointing to these docs. A deprecated operation stays available for at least 90 days after the deprecation is announced. The unversioned /api/... paths are the same v1 handlers kept for compatibility; new integrations should use /api/v1/. No operation is deprecated today.