Open data · DAOIP-5 schema · CC0

Not in one place.
On one layer.

Web3 funding doesn't need another portal. It needs a shared substrate — one signed schema that every aggregator, dashboard, and agent can read from. This site is a reference view. The layer is the product.

Grants indexed
Currently open
Funders
Last updated

What's open right now

Click a card for the full brief, deadline and contact.

Loading…

Why a layer

A sixth portal does not fix five portals. The fix is underneath — a shared schema, a signed log, and public projections anyone can read. Six properties that make this a substrate, not a site.

One vocabulary

A DAOIP-5 superset with the process fields the spec doesn't cover — submitter identity, verification state, dispute history. Same fields whether the grant comes from Gitcoin, Optimism, or Stellar. CC0, so it's not ours to keep.

One source, many surfaces

The same signed data is projected to DAOIP-5 JSON-LD, schema.org/MonetaryGrant, GraphQL, RSS, webhooks, nightly JSON, and IPFS mirrors. When upstream specs drift, the projection updates — not the source.

Signed by construction

Every mutation is a signed, ordered, append-only operation. You can audit who added what and replay the log from zero. Three layers of dedupe mean one round does not arrive three times from three sources.

No ranking, no gatekeeper

Results come back deterministically — by deadline, then timestamp. No featured slots, no recommendation engine, no hidden weights. If that ever changes, it takes a public RFC.

Forkable by design

Schema is CC0. Code is AGPL. Run your own hub, ship a different frontend, sit on top as an aggregator — the layer is meant to be built on, not owned.

Multiple hubs, one query

Every hub speaks the same schema, so an aggregator can hit ten of them and stitch the results. Ethereum first, but Solana and Cosmos funders fit without a schema change.

One source, many projections

These are not separate endpoints — they are projections of the same signed operation log. GraphQL for queries, JSON-LD for linked-data consumers, RSS for feeds, nightly JSON for archival. Pick the surface that fits.

# GraphQL — live, filtered, paginated
query OpenRFPs {
  rfps(filter: { status: OPEN }, pagination: { limit: 10 }) {
    items {
      id slug title funder
      categories deadline fundingAmount
      provenance { verificationStatus sourceHash }
    }
    nextCursor
    total
  }
}

# OR pull the full dataset
curl https://rfp-hub.example/snapshots/latest.json
curl https://rfp-hub.example/rss.xml
curl https://rfp-hub.example/rfps/<id>/daoip-5.jsonld
curl https://rfp-hub.example/rfps/<id>/schema-org.jsonld