Wefunder Explore API

The Explore API from Wefunder — 2 operation(s) for explore.

OpenAPI Specification

wefunder-explore-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Wefunder API v2 Activity Explore API
  description: 'OAuth 2.0 API for accessing Wefunder data programmatically.


    ## Authentication


    This API uses OAuth 2.0 for authentication. To get started:


    1. Create an OAuth application at `/oauth/applications`

    2. Get your Client ID and Client Secret

    3. Implement the OAuth 2.0 Authorization Code flow

    4. Use the access token to make API requests


    ## Rate Limits


    - Standard API: 1,000 requests/hour per token

    - Admin API: 10,000 requests/hour per token


    ## Base URL


    All API requests should be made to: `https://api.wefunder.com/api/v2`

    '
  version: '2.0'
  contact:
    name: Wefunder API Support
    email: api@wefunder.com
servers:
- url: https://{environment}.wefunder.com/api/v2
  variables:
    environment:
      default: api
      enum:
      - api
      - staging
tags:
- name: Explore
paths:
  /explore:
    get:
      tags:
      - Explore
      summary: List public offerings
      description: 'Returns the offerings shown on wefunder.com/explore — the curated set of companies that

        meet Wefunder''s discoverability bar (a soft-confirmed traction threshold plus approval),

        **one offering per company**. An "offering" is a fundraise, addressed by its `ofr_`

        external id.


        This is a public, read-only endpoint backed by the `read:public` scope. It is reachable

        with either a server-side (client_credentials) token or a user access token carrying

        `read:public`. Private rounds (e.g. Reg D 506(b)) are never listed, and low-traction or

        unapproved companies are excluded — exactly as they are on the website.


        Order with `sort` (default: most raised); paginate with `cursor`. `meta.total_count` is

        the number of offerings across all pages.


        Use this endpoint to:

        - Discover and monitor active deals

        - Build deal aggregators and public listings

        '
      operationId: listOfferings
      security:
      - bearerAuth:
        - read:public
      parameters:
      - $ref: '#/components/parameters/cursor'
      - name: sort
        in: query
        description: 'Result ordering:

          - `most_raised` (default) — highest amount raised first

          - `closing_soon` — soonest funding close first

          - `newest` — most recently launched first

          - `most_investors` — highest investor count first

          '
        schema:
          type: string
          enum:
          - most_raised
          - closing_soon
          - newest
          - most_investors
          default: most_raised
        example: most_raised
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferingListEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /offerings/{external_id}:
    get:
      tags:
      - Explore
      summary: Get a public offering
      description: 'Retrieves a single public offering by its `ofr_` external id.


        A valid id for a non-public offering (e.g. a private Reg D 506(b) round) returns `404` —

        having an id does not make an offering publicly resolvable.

        '
      operationId: getOffering
      security:
      - bearerAuth:
        - read:public
      parameters:
      - name: external_id
        in: path
        required: true
        description: The offering's `ofr_` external id.
        schema:
          type: string
        example: ofr_yw3OhusvpfJP4Pk3wRYV1F2R
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferingEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
components:
  schemas:
    OfferingEnvelope:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Offering'
    Offering:
      type: object
      description: 'A public offering (a fundraise), addressed by its `ofr_` external id. Returned by the

        Explore endpoints. Monetary fields are USD decimal strings — parse them as decimals, not

        floats.

        '
      properties:
        id:
          type: string
          description: The offering's stable external id.
          example: ofr_yw3OhusvpfJP4Pk3wRYV1F2R
        type:
          type: string
          example: offering
        attributes:
          type: object
          properties:
            company_name:
              type: string
              example: ZeroBorder Self-Banking Centers
            tagline:
              type: string
              nullable: true
              example: Example tagline
            url:
              type: string
              description: The company's Wefunder profile URL.
              example: https://wefunder.com/zeroborder
            card_image_url:
              type: string
              nullable: true
              description: Absolute URL of the explore card image, or null if the company has none.
              example: https://uploads.wefunder.com/uploads/company/custom_card_photo/189517/large_card.jpg
            logo_url:
              type: string
              nullable: true
              description: Absolute URL of the company logo, or null if the company has none.
              example: https://uploads.wefunder.com/uploads/company/logo/189517/large_logo.png
            exemption:
              $ref: '#/components/schemas/Exemption'
            security_type:
              type: string
              description: The financial instrument (e.g. safe, convertible_note, equity, priced_round, fund).
              example: safe
            state:
              type: string
              example: open
            testing_the_waters:
              type: boolean
              description: 'True for Testing-the-Waters rounds, which collect non-binding **reservations**, not

                investments. Use "reserve"/"reservation" copy for these, "invest"/"investment" otherwise.

                '
              example: false
            funding_target:
              type: string
              nullable: true
              description: Funding target in USD, as a decimal string.
              example: '1000000'
            min_investment:
              type: string
              nullable: true
              description: Minimum investment in USD, as a decimal string.
              example: '100'
            amount_raised:
              type: string
              nullable: true
              description: Amount raised so far in USD, as a decimal string (hellbanned investors excluded).
              example: '642300'
            investor_count:
              type: integer
              nullable: true
              description: Distinct investor count (hellbanned investors excluded).
              example: 1203
            started_at:
              type: string
              format: date-time
              nullable: true
              example: '2025-03-01T12:00:00Z'
            closed_at:
              type: string
              format: date-time
              nullable: true
              example: '2025-03-01T12:00:00Z'
        company:
          type: object
          description: Reference to the parent company.
          properties:
            id:
              type: string
              description: The company's `co_` external id.
              example: co_8Kd0aB3xQ9k2vF8mNp1zT5wY
            type:
              type: string
              example: company
        etag:
          type: string
          description: 'Content digest of this offering''s public payload, for client-side change detection

            when polling.

            '
          example: a1b2c3d4e5f6
    Exemption:
      type: object
      description: The offering's SEC exemption, in market vocabulary.
      properties:
        family:
          type: string
          enum:
          - reg_cf
          - reg_d
          - reg_a
          - reg_s
          - ecsp
          example: reg_cf
        subtype:
          type: string
          nullable: true
          description: Sub-type/flavor — `506b` or `506c` for the `reg_d` family, otherwise null.
          example: null
        label:
          type: string
          description: Human-readable label in normal market language.
          example: Reg CF
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              example: unauthorized
            message:
              type: string
              example: Invalid or expired token
            details:
              type: object
              additionalProperties: true
            request_id:
              type: string
              description: Unique identifier for this request. Quote it in support tickets.
              example: req_abc123
            remediation:
              type: string
              description: When present, a hint on how to resolve the error.
              example: Obtain a new access token using the OAuth 2.0 flow.
    OfferingListEnvelope:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Offering'
        meta:
          type: object
          properties:
            total_count:
              type: integer
              description: Total number of offerings across all pages.
              example: 119
            page_count:
              type: integer
              description: Number of offerings on this page (at most 25).
              example: 25
            has_more:
              type: boolean
              example: true
            sort:
              type: string
              description: The sort applied to this response.
              example: most_raised
            next_cursor:
              type: integer
              nullable: true
              description: Opaque pagination cursor — pass as `cursor` to fetch the next page. Present only when `has_more` is true.
              example: 25
  responses:
    Unauthorized:
      description: 'Authentication required or token is invalid/expired. This error occurs when:

        - No Authorization header is provided

        - The access token is invalid or malformed

        - The access token has expired

        - The access token has been revoked


        To resolve: Obtain a new access token using the OAuth 2.0 flow.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource does not exist or is not visible to this token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimitExceeded:
      description: 'Too many requests in a short time period. The API enforces rate limits to ensure

        fair usage and system stability. When you exceed the limit, you''ll receive this

        error along with headers indicating when you can retry.


        Check the `X-RateLimit-Reset` header to know when your limit will reset.

        Consider implementing exponential backoff in your application.

        '
      headers:
        X-RateLimit-Limit:
          schema:
            type: integer
          description: Request limit per hour
        X-RateLimit-Remaining:
          schema:
            type: integer
          description: Remaining requests
        X-RateLimit-Reset:
          schema:
            type: integer
          description: UTC timestamp when the limit resets
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    cursor:
      name: cursor
      in: query
      description: 'Cursor-based pagination token. Use the `next_cursor` value from the previous response''s

        `meta` object to retrieve the next page of results. Omit this parameter to retrieve the

        first page.

        '
      schema:
        type: integer
      example: 12345
  securitySchemes:
    bearerAuth:
      type: oauth2
      description: OAuth 2.0 authorization with access tokens
      flows:
        authorizationCode:
          authorizationUrl: https://wefunder.com/oauth/authorize
          tokenUrl: https://wefunder.com/oauth/token
          scopes:
            read:public: Read public deal data (explore offerings); requires no user context
            read:profile: Read user profile information
            read:investments: Read user investment data
            read:campaigns: Read campaign information for companies you founded
            read:attribution:aggregate: Read aggregate attribution statistics (Tier 0)
            read:attribution:anonymized: Read anonymized attribution data (Tier 1 - requires approval)
            read:attribution:full: Read full attribution data with investor PII (Tier 2 - founders only)
            admin:attribution: Administrative access to attribution system (Tier 3 - Wefunder admins only)
            read:syndicates: View syndicates, members, deals, and portfolio
            write:syndicates: Manage members, update settings, operate on deals
            read:spvs: View partner SPVs, their invites, sessions, and investments
            write:spvs: Create and manage partner SPVs, invites, and investment sessions
            read:webhooks: View webhook subscriptions
            write:webhooks: Create, update, and delete webhook subscriptions
        clientCredentials:
          tokenUrl: https://wefunder.com/oauth/token
          scopes:
            read:public: Read public deal data. The only scope a server-side (client_credentials) key may hold — it acts as the app, with no user, so it can never read user-scoped data.