> ## 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 startups

> Every startup in the portfolio with an active enrollment, plus graduated alumni. Roughly 120 rows today.



## OpenAPI

````yaml /openapi.json get /startups
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:
  /startups:
    get:
      tags:
        - Directories
      summary: List startups
      description: >-
        Every startup in the portfolio with an active enrollment, plus graduated
        alumni. Roughly 120 rows today.
      operationId: listStartups
      responses:
        '200':
          description: The startup portfolio.
          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/Startup'
components:
  schemas:
    Startup:
      type: object
      description: A startup in the Unicorn Factory Lisboa portfolio.
      properties:
        id:
          type: string
          format: uuid
        slug:
          type: string
          description: URL-safe identifier. Use this for your own detail-page routes.
          examples:
            - acceleratorapp
        name:
          type: string
          examples:
            - AcceleratorApp
        blurb:
          type:
            - string
            - 'null'
          description: One-line summary, suitable for a card.
          examples:
            - Software for startup communities around the world.
        description:
          type:
            - string
            - 'null'
          description: >-
            Long-form description, suitable for a detail page. The largest field
            in the payload.
        logo_url:
          type:
            - string
            - 'null'
          format: uri
          description: >-
            Hosted on Supabase Storage. Copy these into your own CDN if you
            would rather not hotlink.
        website_url:
          type:
            - string
            - 'null'
          description: Always includes a scheme, so it can be rendered as a link directly.
        linkedin_url:
          type:
            - string
            - 'null'
          format: uri
        industry:
          type: array
          items:
            type: string
          description: Zero or more industry tags.
          examples:
            - - Work Tech
        created_at:
          type: string
          format: date-time
        open_jobs_count:
          type: integer
          description: >-
            Published, unexpired jobs at this startup. Zero for every startup
            until the job board launches.
        enrollments:
          type: array
          description: >-
            Programs this startup has been part of. A startup may appear in more
            than one over time.
          items:
            $ref: '#/components/schemas/Enrollment'
      required:
        - id
        - slug
        - name
        - industry
        - created_at
        - open_jobs_count
        - enrollments
    Enrollment:
      type: object
      description: One startup's participation in one program.
      properties:
        status:
          type: string
          description: Enrollment state. Currently one of `active` or `exited`.
          examples:
            - active
        graduated:
          type: boolean
        accepted_date:
          type:
            - string
            - 'null'
          format: date
        ended_date:
          type:
            - string
            - 'null'
          format: date
        program_name:
          type: string
          examples:
            - Incubation Program
        cohort_name:
          type:
            - string
            - 'null'
          examples:
            - Winter 2020

````