---
title: "Browse open tasks"
method: GET
path: "/tasks/open"
tags: ["Tasks"]
---

# Browse open tasks

`GET /tasks/open`

## Request

- Base URL: `https://gigngo.org/api/v1`
- URL: `https://gigngo.org/api/v1/tasks/open`
- Auth: none declared

Returns currently open tasks (work requests) that workers can apply to. Filterable by category and state.

## Query parameters

- `category` string
- `state` string
- `limit` integer
- `page` integer
- `city` string
- `sort` 'newest' | 'oldest' | 'most_applicants' | 'fewest_applicants' | 'priority' | 'members'
- `prioritize` 'members'
- `expired` boolean
- `unanswered` boolean
- `maxAgeDays` integer
- `minAgeDays` integer
- `minApplicants` integer
- `poster` boolean

## Response `200`

Open tasks

- OpenTasksResponse
  - `ok` boolean
  - `data` object
    - `tasks` Task[]
      - `id` string
      - `title` string
      - `description` string
      - `category` string
      - `budget` string, nullable
      - `location` object
        - `state` string, nullable
        - `city` string, nullable
      - `postedAt` string, date-time, nullable
      - `status` 'open' | 'expired': expired once past expiresAt; the job stays listed unless ?expired=false
      - `offerCount` integer
      - `fill` FillChance: Fill chance for one job, as a range, never a percentage. Comes with poster=true or prioritize=members (partner key, members scope). Calibrated on the last 90 days of real outcomes; meta.fill.bands says what each band meant on that record and meta.fill.calibratedOn when. Nothing on the record reaches likely today, so nothing returns it yet. meta.fill.focus counts the live jobs on the board by where they are stuck (noLocalNearby, notSeenYet, waitingOnHomeowner, moving) and says which side to put effort on today (effortOn: locals | homeowners | both, localsShare and homeownersShare in tenths); it changes as the board does. meta.fill.towns (up to 100, town level only) gives the same four counts per town for its live jobs, plus last30 { jobs, offeredIn24h, answered }, a stage (working = a job there got an offer within a day AND an answer in the last 30 days; one_step = one of the two; not_yet) and missing (locals | seeing | homeowners | null: the side to fix first there). Sorted one_step first: the towns closest to working.
        - `offerIn24h` 'likely' | 'possible' | 'unlikely' | 'has_offer': Will a first offer come in the next 24 hours. has_offer once one came.
        - `reply` 'likely' | 'possible' | 'unlikely' | 'answered': Will the homeowner answer an offer on this job (for a job with no offer yet: one that came now). answered once they messaged a local or hired.
        - `localsInReach` '0' | '1-2' | '3-9' | '10+': Locals with alerts on who do this work and whose own radius reaches the job. A range, not a count.
        - `why` string[]: Short plain reasons for both bands.
  - `meta` PaginationMeta
    - `total` integer
    - `page` integer
    - `limit` integer
    - `pages` integer

## Other responses

- `429`: Rate limit exceeded (200 req/15min)
- `500`: Server error

---

[API](https://skmtc.dev/gigngo/apis/gigngo-public-api.md) · [All operations](https://skmtc.dev/gigngo/apis/gigngo-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gigngo/apis/gigngo-public-api/revisions/20ef5bb7d13c?raw)
