> ## Documentation Index
> Fetch the complete documentation index at: https://docs.unicornfactorylisboa.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List open jobs

> Every published, unexpired job at an active startup.

**This endpoint currently returns an empty array.** It is live and correct, but the portal's job board has not launched yet, so there is no published job data. Build against it now; it will fill in without any change on your side.

Applications happen off-platform — send users to `external_url`.



## OpenAPI

````yaml /openapi.json get /jobs
openapi: 3.1.0
info:
  title: Unicorn Factory Lisboa Public API
  version: 1.0.0
  description: >-
    Read-only access to our startup portfolio, founder directory, and job board
    — the same data that powers the public pages of the member portal.


    **No API key. No authentication. `GET` only. Open to every origin.**


    ## Quick start


    ```js

    const BASE = 'https://api.unicornfactorylisboa.com/v1';


    const startups = await fetch(`${BASE}/startups`).then((r) => r.json());

    const founders = await fetch(`${BASE}/founders`).then((r) => r.json());

    const jobs     = await fetch(`${BASE}/jobs`).then((r) => r.json());

    ```


    ## Fetching the whole list is the intended usage


    There is no pagination, no filtering and no fetch-one-by-id endpoint, and
    that is deliberate. The lists are small — a few hundred KB gzipped even at
    several times our current size. Fetch a directory once, hold it, and filter
    client-side. A detail page such as `/startups/acme-ai` is then a `slug`
    match against data you already have, costing no extra request.


    ## Caching and freshness


    Responses are cached for one hour at our CDN and via `Cache-Control`. **An
    edit made in the portal can take up to an hour to appear here.** The
    `X-Cached-At` response header tells you when the data was last read from the
    database.


    Please let your CDN or framework honour the cache header rather than
    re-fetching per visitor. If our database is briefly unavailable we serve the
    last good copy rather than an error — a stale answer is always preferable to
    a broken page.


    ## Images


    `logo_url` and `avatar_url` point at our storage. You are welcome to hotlink
    them, but copying them into your own CDN at build time will be faster for
    your visitors. Tell us if you do, so we know not to break those URLs.


    ## Stability


    The `/v1` prefix is a promise: we will add fields, but we will not remove or
    rename one without shipping a `/v2`. Treat any field not documented here as
    unsupported and liable to disappear. If you need something that is not here,
    ask — whether we can publish it is usually a policy question rather than a
    technical one.
  contact:
    name: Unicorn Factory Lisboa
    url: https://unicornfactorylisboa.com/
servers:
  - url: https://api.unicornfactorylisboa.com/v1
    description: Production
  - url: https://btmkmdfnpsllqvkuknqj.supabase.co/functions/v1/public-api/v1
    description: Staging — test data only, contents are not real
security: []
tags:
  - name: Directories
    description: The three public directories.
paths:
  /jobs:
    get:
      tags:
        - Directories
      summary: List open jobs
      description: >-
        Every published, unexpired job at an active startup.


        **This endpoint currently returns an empty array.** It is live and
        correct, but the portal's job board has not launched yet, so there is no
        published job data. Build against it now; it will fill in without any
        change on your side.


        Applications happen off-platform — send users to `external_url`.
      operationId: listJobs
      responses:
        '200':
          description: Open jobs. Currently always an empty array — see the description.
          headers:
            X-Cached-At:
              description: When this data was read from the database (ISO 8601).
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Job'
components:
  schemas:
    Job:
      type: object
      description: A published, unexpired job opening.
      properties:
        id:
          type: string
          format: uuid
        startup_id:
          type: string
          format: uuid
        title:
          type: string
        job_type:
          type:
            - string
            - 'null'
        role_category:
          type:
            - string
            - 'null'
        work_arrangement:
          type:
            - string
            - 'null'
        experience_level:
          type:
            - string
            - 'null'
        external_url:
          type:
            - string
            - 'null'
          description: >-
            Where to send applicants. Applications are not handled on the
            portal.
        location_regions:
          type: array
          items:
            type: string
        location_cities:
          type: array
          items:
            type: string
        expires_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        startup_name:
          type:
            - string
            - 'null'
        startup_logo_url:
          type:
            - string
            - 'null'
          format: uri
        startup_blurb:
          type:
            - string
            - 'null'
        startup_industry:
          type: array
          items:
            type: string
        startup_team_size:
          type:
            - integer
            - 'null'
        startup_product_stage:
          type:
            - string
            - 'null'
      required:
        - id
        - startup_id
        - title

````