@the-rfp-hub/standard 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARTIFACTS.md +85 -0
- package/CHANGELOG.md +264 -0
- package/LICENSE +121 -0
- package/NORMATIVE.md +77 -0
- package/PROCESS.md +239 -0
- package/README.md +83 -0
- package/conformance/README.md +52 -0
- package/conformance/v1.0.0/fail/deadline-fixed-date-null.json +22 -0
- package/conformance/v1.0.0/fail/deadline-fixed-without-date.json +21 -0
- package/conformance/v1.0.0/fail/eligibility-value-not-string.json +21 -0
- package/conformance/v1.0.0/fail/empty-sponsoring-organizations.json +11 -0
- package/conformance/v1.0.0/fail/missing-matching-type-block.json +14 -0
- package/conformance/v1.0.0/fail/missing-required-properties.json +5 -0
- package/conformance/v1.0.0/fail/missing-sponsoring-organizations.json +10 -0
- package/conformance/v1.0.0/fail/one-block-per-fundingtype.json +18 -0
- package/conformance/v1.0.0/fail/source-url-removed.json +17 -0
- package/conformance/v1.0.0/fail/status-not-in-enum.json +15 -0
- package/conformance/v1.0.0/fail/unknown-top-level-property.json +16 -0
- package/conformance/v1.0.0/fail/wrong-fundingtype-value.json +14 -0
- package/conformance/v1.0.0/fail/wrong-specversion.json +15 -0
- package/conformance/v1.0.0/pass/deadline-rolling-without-date.json +23 -0
- package/conformance/v1.0.0/pass/full-featured.json +137 -0
- package/conformance/v1.0.0/pass/grant-funding-mechanisms-array.json +27 -0
- package/conformance/v1.0.0/pass/grant.json +45 -0
- package/conformance/v1.0.0/pass/hackathon.json +67 -0
- package/conformance/v1.0.0/pass/minimal-required-only.json +15 -0
- package/conformance/v1.0.0/pass/self-identification.json +18 -0
- package/conformance/v1.0.0/pass/source-empty-object.json +30 -0
- package/dist/index.cjs +902 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +661 -0
- package/dist/index.d.ts +661 -0
- package/dist/index.js +896 -0
- package/dist/index.js.map +1 -0
- package/meta/rfphub-schema.meta.json +131 -0
- package/package.json +56 -0
- package/registries/deadline-labels.json +38 -0
- package/registries/eligibility-keys.json +46 -0
- package/registries/entry.schema.json +48 -0
- package/registries/index.json +44 -0
- package/registries/program-models.json +26 -0
- package/schemas/index.json +12 -0
- package/schemas/v1.0.0/BENCHMARK.md +160 -0
- package/schemas/v1.0.0/CROSSWALK.md +200 -0
- package/schemas/v1.0.0/FIELDS.md +530 -0
- package/schemas/v1.0.0/STATUS.md +81 -0
- package/schemas/v1.0.0/context.jsonld +86 -0
- package/schemas/v1.0.0/examples/01-hackathon-fundingmap_1200.json +181 -0
- package/schemas/v1.0.0/examples/02-hackathon-fundingmap_1197.json +122 -0
- package/schemas/v1.0.0/examples/03-hackathon-fundingmap_1095.json +114 -0
- package/schemas/v1.0.0/examples/04-grant-fundingmap_1459.json +67 -0
- package/schemas/v1.0.0/examples/05-hackathon-fundingmap_1210.json +97 -0
- package/schemas/v1.0.0/examples/06-hackathon-fundingmap_1340.json +91 -0
- package/schemas/v1.0.0/examples/07-hackathon-fundingmap_1093.json +89 -0
- package/schemas/v1.0.0/examples/08-hackathon-fundingmap_1091.json +89 -0
- package/schemas/v1.0.0/examples/09-hackathon-fundingmap_1094.json +89 -0
- package/schemas/v1.0.0/examples/10-grant-fundingmap_600.json +65 -0
- package/schemas/v1.0.0/examples/11-hackathon-fundingmap_1389.json +83 -0
- package/schemas/v1.0.0/examples/12-hackathon-fundingmap_1356.json +83 -0
- package/schemas/v1.0.0/examples/13-grant-fundingmap_1458.json +59 -0
- package/schemas/v1.0.0/examples/14-grant-fundingmap_1059.json +57 -0
- package/schemas/v1.0.0/examples/15-hackathon-fundingmap_1430.json +82 -0
- package/schemas/v1.0.0/examples/16-hackathon-fundingmap_1092.json +79 -0
- package/schemas/v1.0.0/examples/17-hackathon-fundingmap_1277.json +75 -0
- package/schemas/v1.0.0/examples/18-hackathon-fundingmap_1302.json +72 -0
- package/schemas/v1.0.0/examples/19-hackathon-fundingmap_1231.json +76 -0
- package/schemas/v1.0.0/examples/20-hackathon-fundingmap_1235.json +74 -0
- package/schemas/v1.0.0/examples/21-hackathon-fundingmap_1219.json +73 -0
- package/schemas/v1.0.0/examples/22-hackathon-fundingmap_1254.json +72 -0
- package/schemas/v1.0.0/examples/23-grant-fundingmap_491.json +57 -0
- package/schemas/v1.0.0/examples/24-hackathon-fundingmap_1358.json +73 -0
- package/schemas/v1.0.0/examples/25-grant-fundingmap_1021.json +57 -0
- package/schemas/v1.0.0/examples/26-bounty-fundingmap_1453.json +57 -0
- package/schemas/v1.0.0/examples/27-accelerator-fundingmap_1291.json +56 -0
- package/schemas/v1.0.0/examples/28-rfp-fundingmap_1242.json +43 -0
- package/schemas/v1.0.0/opportunity.schema.json +758 -0
- package/spec.config.json +11 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The canonical RFP Hub Standard JSON Schema (draft 2020-12) for a funding opportunity.
|
|
3
|
+
* This is the single source of truth; all types in this package are generated from it.
|
|
4
|
+
*/
|
|
5
|
+
declare const opportunitySchema: Readonly<Record<string, unknown>>;
|
|
6
|
+
/** The RFP Hub Standard version shipped by this package. */
|
|
7
|
+
declare const SPEC_VERSION: "1.0.0";
|
|
8
|
+
|
|
9
|
+
/** One registered value in an open vocabulary. */
|
|
10
|
+
interface RegistryEntry {
|
|
11
|
+
description: string;
|
|
12
|
+
status: "active" | "deprecated";
|
|
13
|
+
since: string;
|
|
14
|
+
replacedBy?: string | null;
|
|
15
|
+
reference?: string | null;
|
|
16
|
+
examples?: string[];
|
|
17
|
+
}
|
|
18
|
+
/** A whole registry: a flat map from the registered value to its entry. */
|
|
19
|
+
type Registry = Readonly<Record<string, RegistryEntry>>;
|
|
20
|
+
/**
|
|
21
|
+
* The open vocabularies the standard governs by registry rather than by enum.
|
|
22
|
+
*
|
|
23
|
+
* The schema keeps these fields free-text on purpose — a closed enum built from one
|
|
24
|
+
* publisher's vocabulary would force every other publisher into it. The registry is what
|
|
25
|
+
* keeps the values interoperable anyway: tooling warns on unregistered values without
|
|
26
|
+
* rejecting them, so a publisher is never blocked and drift is still visible.
|
|
27
|
+
*
|
|
28
|
+
* `ecosystems` and `networks` are open too but deliberately have **no** registry. A registry
|
|
29
|
+
* over a list of chain names reads as an allowed-values list no matter what the normative
|
|
30
|
+
* document says, and it would put a process in front of a newly launched chain for no gain.
|
|
31
|
+
*/
|
|
32
|
+
declare const registries: {
|
|
33
|
+
readonly "deadline-labels": Registry;
|
|
34
|
+
readonly "eligibility-keys": Registry;
|
|
35
|
+
readonly "program-models": Registry;
|
|
36
|
+
};
|
|
37
|
+
/** Name of one of the bundled registries. */
|
|
38
|
+
type RegistryName = keyof typeof registries;
|
|
39
|
+
/** Whether `value` is registered in `name` (any status). */
|
|
40
|
+
declare function isRegistered(name: RegistryName, value: string): boolean;
|
|
41
|
+
/** The values registered in `name` with `status: "active"`, sorted. */
|
|
42
|
+
declare function activeValues(name: RegistryName): string[];
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* RFP Hub Standard v1.0.0 — the normative definition of a funding opportunity in the Ethereum ecosystem. A document conforms to this version of the standard when it validates against this file. Covers six funding types: grant, hackathon, bounty, accelerator, vc_fund, rfp. Aligns conceptually with DAOIP-5 (Grants Metadata) and schema.org/Grant. Published under CC0 1.0 Universal. The field reference is FIELDS.md, the normative/informative split is NORMATIVE.md, and both ship alongside this file in the @rfp-hub/standard package and at https://github.com/The-RFP-Hub/the-rfp-hub.
|
|
46
|
+
*/
|
|
47
|
+
type RFPHubOpportunity = {
|
|
48
|
+
[k: string]: unknown;
|
|
49
|
+
} & {
|
|
50
|
+
/**
|
|
51
|
+
* Optional self-identification: the URL of the RFP Hub schema this document claims to conform to. Permitted so a generic validator can discover the contract from the instance alone. Ignored by validation — naming a different schema here does not change which schema the document is validated against.
|
|
52
|
+
*/
|
|
53
|
+
$schema?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Optional JSON-LD context: a URL, an inline context object, or an array of either. Permitted so an instance can be consumed as linked data. Ignored by validation — the standard makes no claim about its contents.
|
|
56
|
+
*/
|
|
57
|
+
"@context"?: string | {} | unknown[];
|
|
58
|
+
/**
|
|
59
|
+
* Optional JSON-LD type, or an array of types. Permitted so an instance can be consumed as linked data; ignored by validation.
|
|
60
|
+
*/
|
|
61
|
+
"@type"?: string | unknown[];
|
|
62
|
+
/**
|
|
63
|
+
* The RFP Hub Standard version this entry conforms to. Fixed at 1.0.0 for this schema. Consumers use it to select the correct validator.
|
|
64
|
+
*/
|
|
65
|
+
specVersion: "1.0.0";
|
|
66
|
+
/**
|
|
67
|
+
* Stable, unique identifier for the opportunity within the Hub. Immutable once assigned. A namespaced form is recommended but not required.
|
|
68
|
+
*/
|
|
69
|
+
id: string;
|
|
70
|
+
/**
|
|
71
|
+
* The kind of funding opportunity, and the structural discriminator of the standard. Every entry carries a type-specific object under a key equal to this value ('hackathon' → a 'hackathon' object, 'vc_fund' → a 'vc_fund' object), so consumers can always read `opportunity[opportunity.fundingType]`. The matching block is required and no other type block may be present; for grants the block may be empty.
|
|
72
|
+
*/
|
|
73
|
+
fundingType: "grant" | "hackathon" | "bounty" | "accelerator" | "vc_fund" | "rfp";
|
|
74
|
+
/**
|
|
75
|
+
* Human-readable name of the opportunity.
|
|
76
|
+
*/
|
|
77
|
+
title: string;
|
|
78
|
+
/**
|
|
79
|
+
* Full description of the opportunity. Markdown is permitted; consumers are advised to treat it as untrusted and sanitise before rendering.
|
|
80
|
+
*/
|
|
81
|
+
description: string;
|
|
82
|
+
/**
|
|
83
|
+
* Optional short teaser (roughly one or two sentences) for list and card views.
|
|
84
|
+
*/
|
|
85
|
+
summary?: string | null;
|
|
86
|
+
/**
|
|
87
|
+
* Lifecycle status of the opportunity. 'upcoming' = announced but not yet accepting applications, and also the value for a pre-open posting — there is no 'draft' status; 'open' = currently accepting; 'closed' = no longer accepting; 'archived' = withdrawn or retired. Editorial and review state (pending, rejected) is not represented here — it is server-side metadata.
|
|
88
|
+
*/
|
|
89
|
+
status: "upcoming" | "open" | "closed" | "archived";
|
|
90
|
+
/**
|
|
91
|
+
* The organisations issuing or backing the opportunity. Array order is semantic: entry 0 is the primary organisation and the one to display. This is the issuer or backer, not necessarily the source of funds — for donor-funded models the money's origin is deliberately not modelled, and the party running the process belongs in operatingOrganizations instead.
|
|
92
|
+
*
|
|
93
|
+
* @minItems 1
|
|
94
|
+
*/
|
|
95
|
+
sponsoringOrganizations: [Organization$1, ...Organization$1[]];
|
|
96
|
+
/**
|
|
97
|
+
* The organisations that actually run intake and process — for example an operator running the application funnel on a funder's behalf. May be absent or empty when the sponsor also operates.
|
|
98
|
+
*/
|
|
99
|
+
operatingOrganizations?: Organization$1[];
|
|
100
|
+
source: Provenance$1;
|
|
101
|
+
/**
|
|
102
|
+
* Ethereum-family ecosystems this opportunity targets. The RFP Hub is ETH-scoped, but this is an open, extensible list — not a closed enum, and deliberately not registry-governed either — so L2s and ETH-adjacent ecosystems are first-class and a newly launched one needs no process.
|
|
103
|
+
*/
|
|
104
|
+
ecosystems?: string[];
|
|
105
|
+
/**
|
|
106
|
+
* Specific networks or chains the funding is denominated on or deployed to. A plain open list, deliberately not registry-governed, so a newly launched chain is expressible immediately.
|
|
107
|
+
*/
|
|
108
|
+
networks?: string[];
|
|
109
|
+
/**
|
|
110
|
+
* Topical categories. Free text.
|
|
111
|
+
*/
|
|
112
|
+
categories?: string[];
|
|
113
|
+
/**
|
|
114
|
+
* Free-form tags for search and faceting.
|
|
115
|
+
*/
|
|
116
|
+
tags?: string[];
|
|
117
|
+
/**
|
|
118
|
+
* Open key-value map of eligibility criteria. Publishers choose their own keys and write plain-string values; there are no fixed or required keys. Conventional keys (stage, geography, jurisdiction, sector, entityType, compliance) are published in registries/eligibility-keys.json — using them keeps the field comparable across publishers, and unregistered keys stay valid.
|
|
119
|
+
*/
|
|
120
|
+
eligibility?: {
|
|
121
|
+
[k: string]: string;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Free text describing what a proposal must contain to be considered — track record, approach, milestone plan, disclosures. Distinct from rfp.requirements, which describes what the work must deliver.
|
|
125
|
+
*/
|
|
126
|
+
prerequisites?: string | null;
|
|
127
|
+
/**
|
|
128
|
+
* A single free-form string of supporting links and references — guidelines, past rounds, forum threads, original postings. Deliberately one string rather than an array of URIs, because publishers paste what they have.
|
|
129
|
+
*/
|
|
130
|
+
resourceLinks?: string | null;
|
|
131
|
+
/**
|
|
132
|
+
* Free text describing how a service-agreement arrangement works. Valid on any fundingType — an rfp or grant carrying it reads as a long-term service engagement. Presence of the field is the signal; duration and renewal live in the text if they matter. Not filterable or facetable, by design.
|
|
133
|
+
*/
|
|
134
|
+
serviceAgreement?: string | null;
|
|
135
|
+
/**
|
|
136
|
+
* URL where applicants submit or apply — the only URL that points at the opportunity itself, and therefore the only link-back target. It may carry whatever the submission channel is, including a forum thread when no portal exists; the URL's kind is not typed. Clarifications go in description.
|
|
137
|
+
*/
|
|
138
|
+
applicationUrl?: string | null;
|
|
139
|
+
/**
|
|
140
|
+
* Primary website for the opportunity or program.
|
|
141
|
+
*/
|
|
142
|
+
website?: string | null;
|
|
143
|
+
/**
|
|
144
|
+
* URL of the program or organisation logo image.
|
|
145
|
+
*/
|
|
146
|
+
logoUrl?: string | null;
|
|
147
|
+
/**
|
|
148
|
+
* URL of a banner or hero image.
|
|
149
|
+
*/
|
|
150
|
+
bannerUrl?: string | null;
|
|
151
|
+
socialLinks?: SocialLinks1;
|
|
152
|
+
funding?: FundingEnvelope;
|
|
153
|
+
/**
|
|
154
|
+
* Optional milestone sequence, valid on any fundingType. Array order is the milestone sequence — there is no order or index field. Milestone-based payment is expressed by this array together with grant.milestoneBased; there is no separate payment-schedule concept.
|
|
155
|
+
*/
|
|
156
|
+
milestones?: Milestone$1[];
|
|
157
|
+
/**
|
|
158
|
+
* RFC 3339 timestamp when applications open.
|
|
159
|
+
*/
|
|
160
|
+
opensAt?: string | null;
|
|
161
|
+
/**
|
|
162
|
+
* All deadlines and event boundaries for the opportunity, each either a fixed date or rolling, distinguished by label. Consumers should select by label rather than by array position: the first entry may be a hackathon's start date rather than its application deadline. Conventional labels are published in registries/deadline-labels.json. (Selection-by-label is a consumer convention, not schema-enforceable; see FIELDS.md.)
|
|
163
|
+
*/
|
|
164
|
+
deadlines?: Deadline$1[];
|
|
165
|
+
/**
|
|
166
|
+
* RFC 3339 timestamp when the opportunity was first publicly announced at the source.
|
|
167
|
+
*/
|
|
168
|
+
postedAt?: string | null;
|
|
169
|
+
/**
|
|
170
|
+
* RFC 3339 timestamp when this entry was created in the Hub.
|
|
171
|
+
*/
|
|
172
|
+
createdAt?: string | null;
|
|
173
|
+
/**
|
|
174
|
+
* RFC 3339 timestamp when this entry was last modified in the Hub.
|
|
175
|
+
*/
|
|
176
|
+
updatedAt?: string | null;
|
|
177
|
+
grant?: GrantDetails$1;
|
|
178
|
+
hackathon?: HackathonDetails$1;
|
|
179
|
+
bounty?: BountyDetails$1;
|
|
180
|
+
accelerator?: AcceleratorDetails$1;
|
|
181
|
+
vc_fund?: VCFundDetails;
|
|
182
|
+
rfp?: RFPDetails;
|
|
183
|
+
/**
|
|
184
|
+
* Namespace for publisher- or integrator-specific data not covered by the standard. Keys are conventionally namespaced, for example 'mysource.internalId'. Contents are not validated by this schema.
|
|
185
|
+
*/
|
|
186
|
+
extensions?: {
|
|
187
|
+
[k: string]: unknown;
|
|
188
|
+
};
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* An organisation sponsoring or operating the opportunity. Embedded on an opportunity as a descriptive summary; the same shape is the standalone Organization directory record.
|
|
192
|
+
*/
|
|
193
|
+
interface Organization$1 {
|
|
194
|
+
/**
|
|
195
|
+
* Display name of the organisation.
|
|
196
|
+
*/
|
|
197
|
+
name: string;
|
|
198
|
+
/**
|
|
199
|
+
* Lowercase URL-safe identifier, and also the organisation's namespace.
|
|
200
|
+
*/
|
|
201
|
+
slug?: string | null;
|
|
202
|
+
/**
|
|
203
|
+
* Kind of entity.
|
|
204
|
+
*/
|
|
205
|
+
type?: "foundation" | "dao" | "company" | "protocol" | "program" | "individual" | "other" | null;
|
|
206
|
+
/**
|
|
207
|
+
* Short description of the organisation.
|
|
208
|
+
*/
|
|
209
|
+
description?: string | null;
|
|
210
|
+
/**
|
|
211
|
+
* The organisation's primary website.
|
|
212
|
+
*/
|
|
213
|
+
website?: string | null;
|
|
214
|
+
/**
|
|
215
|
+
* URL of the organisation's logo image.
|
|
216
|
+
*/
|
|
217
|
+
logoUrl?: string | null;
|
|
218
|
+
/**
|
|
219
|
+
* URL of the organisation's banner or hero image.
|
|
220
|
+
*/
|
|
221
|
+
bannerUrl?: string | null;
|
|
222
|
+
socialLinks?: SocialLinks$1;
|
|
223
|
+
/**
|
|
224
|
+
* Ethereum-family ecosystems the organisation operates in. Same open list as the top-level field.
|
|
225
|
+
*/
|
|
226
|
+
ecosystems?: string[];
|
|
227
|
+
/**
|
|
228
|
+
* Named contact routes into the organisation. Optional, and every field of every entry is optional too.
|
|
229
|
+
*/
|
|
230
|
+
contacts?: Contact$1[];
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Social and community links for the organisation.
|
|
234
|
+
*/
|
|
235
|
+
interface SocialLinks$1 {
|
|
236
|
+
/**
|
|
237
|
+
* Link to the X/Twitter profile.
|
|
238
|
+
*/
|
|
239
|
+
twitter?: string | null;
|
|
240
|
+
/**
|
|
241
|
+
* Discord server invite or channel link.
|
|
242
|
+
*/
|
|
243
|
+
discord?: string | null;
|
|
244
|
+
/**
|
|
245
|
+
* Link to the GitHub organisation or repository.
|
|
246
|
+
*/
|
|
247
|
+
github?: string | null;
|
|
248
|
+
/**
|
|
249
|
+
* Link to the Telegram group or channel.
|
|
250
|
+
*/
|
|
251
|
+
telegram?: string | null;
|
|
252
|
+
/**
|
|
253
|
+
* Link to the Farcaster profile or channel.
|
|
254
|
+
*/
|
|
255
|
+
farcaster?: string | null;
|
|
256
|
+
/**
|
|
257
|
+
* Link to the governance or community forum.
|
|
258
|
+
*/
|
|
259
|
+
forum?: string | null;
|
|
260
|
+
/**
|
|
261
|
+
* Link to the blog or announcements feed.
|
|
262
|
+
*/
|
|
263
|
+
blog?: string | null;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* A named contact route into the organisation. Every property is optional and there is no minimum-one-identifier constraint, so `{}` validates — deliberately, because not every publisher can or will name a person.
|
|
267
|
+
*/
|
|
268
|
+
interface Contact$1 {
|
|
269
|
+
/**
|
|
270
|
+
* The person's name.
|
|
271
|
+
*/
|
|
272
|
+
name?: string | null;
|
|
273
|
+
/**
|
|
274
|
+
* Role in the program.
|
|
275
|
+
*/
|
|
276
|
+
role?: string | null;
|
|
277
|
+
/**
|
|
278
|
+
* Telegram handle. A handle rather than a URL — unlike socialLinks.telegram, which is a link.
|
|
279
|
+
*/
|
|
280
|
+
telegram?: string | null;
|
|
281
|
+
/**
|
|
282
|
+
* Email address.
|
|
283
|
+
*/
|
|
284
|
+
email?: string | null;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Provenance of this entry. Required as an object, but every field inside it is optional, so `"source": {}` validates. Provenance completeness is a data-quality and ingestion-policy concern rather than a schema constraint.
|
|
288
|
+
*/
|
|
289
|
+
interface Provenance$1 {
|
|
290
|
+
/**
|
|
291
|
+
* Namespace — an organisation slug — this entry was published under. Auto-approval requires the publishing account to be a member of this verified org. May differ from the sponsoring organisation.
|
|
292
|
+
*/
|
|
293
|
+
publisher?: string | null;
|
|
294
|
+
/**
|
|
295
|
+
* Who submitted or published this entry: a public handle, an organisation slug, or 'community' for anonymous community submissions. The internal account identity is never exposed. This is the attribution carrier for data-partner credit.
|
|
296
|
+
*/
|
|
297
|
+
submittedBy?: string | null;
|
|
298
|
+
/**
|
|
299
|
+
* RFC 3339 timestamp of when the entry was submitted or published to the Hub. Pairs with submittedBy.
|
|
300
|
+
*/
|
|
301
|
+
submittedAt?: string | null;
|
|
302
|
+
/**
|
|
303
|
+
* How this entry entered the Hub. 'outbox' is a one-way push from an upstream source system's outbox; 'import' is a backfill or seed import. Always set server-side by the ingestion layer.
|
|
304
|
+
*/
|
|
305
|
+
ingestedVia?: "publisher_api" | "submission" | "scrape" | "import" | "outbox" | null;
|
|
306
|
+
/**
|
|
307
|
+
* Identifier of this opportunity in the source system.
|
|
308
|
+
*/
|
|
309
|
+
originalId?: string | null;
|
|
310
|
+
/**
|
|
311
|
+
* Whether the entry's fields were verified against the live opportunity by the verification-assist job. null means not yet checked.
|
|
312
|
+
*/
|
|
313
|
+
verifiedAgainstSource?: boolean | null;
|
|
314
|
+
/**
|
|
315
|
+
* RFC 3339 timestamp of the last verification. Record-level only — there is no per-field freshness.
|
|
316
|
+
*/
|
|
317
|
+
verifiedAt?: string | null;
|
|
318
|
+
/**
|
|
319
|
+
* IPFS or archived snapshot of the opportunity taken at verification time.
|
|
320
|
+
*/
|
|
321
|
+
snapshotUrl?: string | null;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Social and community links for the opportunity or program.
|
|
325
|
+
*/
|
|
326
|
+
interface SocialLinks1 {
|
|
327
|
+
/**
|
|
328
|
+
* Link to the X/Twitter profile.
|
|
329
|
+
*/
|
|
330
|
+
twitter?: string | null;
|
|
331
|
+
/**
|
|
332
|
+
* Discord server invite or channel link.
|
|
333
|
+
*/
|
|
334
|
+
discord?: string | null;
|
|
335
|
+
/**
|
|
336
|
+
* Link to the GitHub organisation or repository.
|
|
337
|
+
*/
|
|
338
|
+
github?: string | null;
|
|
339
|
+
/**
|
|
340
|
+
* Link to the Telegram group or channel.
|
|
341
|
+
*/
|
|
342
|
+
telegram?: string | null;
|
|
343
|
+
/**
|
|
344
|
+
* Link to the Farcaster profile or channel.
|
|
345
|
+
*/
|
|
346
|
+
farcaster?: string | null;
|
|
347
|
+
/**
|
|
348
|
+
* Link to the governance or community forum.
|
|
349
|
+
*/
|
|
350
|
+
forum?: string | null;
|
|
351
|
+
/**
|
|
352
|
+
* Link to the blog or announcements feed.
|
|
353
|
+
*/
|
|
354
|
+
blog?: string | null;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Program-level funding envelope: single currency, total budget, amount committed to date, and the per-award range.
|
|
358
|
+
*/
|
|
359
|
+
interface FundingEnvelope {
|
|
360
|
+
/**
|
|
361
|
+
* ISO 4217 code or token symbol for the amounts below, and for milestones[].amount.
|
|
362
|
+
*/
|
|
363
|
+
currency?: string | null;
|
|
364
|
+
/**
|
|
365
|
+
* Total program budget in major units.
|
|
366
|
+
*/
|
|
367
|
+
budget?: number | null;
|
|
368
|
+
/**
|
|
369
|
+
* Amount committed to date in major units — committed, not necessarily disbursed. Disbursement and delivery are not modelled.
|
|
370
|
+
*/
|
|
371
|
+
allocated?: number | null;
|
|
372
|
+
/**
|
|
373
|
+
* Minimum individual award in major units.
|
|
374
|
+
*/
|
|
375
|
+
minAward?: number | null;
|
|
376
|
+
/**
|
|
377
|
+
* Maximum individual award in major units.
|
|
378
|
+
*/
|
|
379
|
+
maxAward?: number | null;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* One milestone in an opportunity's milestone sequence. Every property is optional — a publisher may list titles with no amounts, or amounts with no criteria. There is no date field: where a publisher has a due date, it goes into `criteria` as free text.
|
|
383
|
+
*/
|
|
384
|
+
interface Milestone$1 {
|
|
385
|
+
/**
|
|
386
|
+
* Short name of the milestone.
|
|
387
|
+
*/
|
|
388
|
+
title?: string | null;
|
|
389
|
+
/**
|
|
390
|
+
* Payment for this milestone in major units, denominated in the top-level funding.currency. That denomination rule is a requirement on publishers but crosses two objects, so it is not schema-enforceable; see FIELDS.md. The validator's advisory tier warns when this is present and funding.currency is absent.
|
|
391
|
+
*/
|
|
392
|
+
amount?: number | null;
|
|
393
|
+
/**
|
|
394
|
+
* Free-text acceptance criteria, including any due date.
|
|
395
|
+
*/
|
|
396
|
+
criteria?: string | null;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* A single deadline or event boundary. A 'fixed' entry carries a date; 'rolling' means applications are accepted continuously.
|
|
400
|
+
*/
|
|
401
|
+
interface Deadline$1 {
|
|
402
|
+
/**
|
|
403
|
+
* Whether this deadline is a fixed point in time or an open-ended rolling window.
|
|
404
|
+
*/
|
|
405
|
+
type: "fixed" | "rolling";
|
|
406
|
+
/**
|
|
407
|
+
* RFC 3339 timestamp. Required and non-null when type is 'fixed', enforced by the if/then below; meaningless, and normally omitted, when type is 'rolling'.
|
|
408
|
+
*/
|
|
409
|
+
date?: string | null;
|
|
410
|
+
/**
|
|
411
|
+
* What this deadline is for. Free text; conventional values are published in registries/deadline-labels.json. This is how a consumer tells an application deadline from an event boundary.
|
|
412
|
+
*/
|
|
413
|
+
label?: string | null;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Grant-specific fields. Required, possibly as an empty object, when fundingType is 'grant'; forbidden otherwise.
|
|
417
|
+
*/
|
|
418
|
+
interface GrantDetails$1 {
|
|
419
|
+
/**
|
|
420
|
+
* How funds are allocated. An array because mechanisms co-occur: a funder can offer a fixed grant and a matching grant in the same program.
|
|
421
|
+
*/
|
|
422
|
+
fundingMechanisms?: ("retroactive" | "proactive" | "streaming" | "quadratic" | "matching" | "other")[];
|
|
423
|
+
/**
|
|
424
|
+
* The operating model of the program, as distinct from the funding instrument. An open list rather than a closed enum — conventional values are published in registries/program-models.json, and a publisher's own vocabulary is valid without a schema change.
|
|
425
|
+
*/
|
|
426
|
+
programModel?: string | null;
|
|
427
|
+
/**
|
|
428
|
+
* Whether disbursement is tied to milestones. Pairs with the top-level milestones array.
|
|
429
|
+
*/
|
|
430
|
+
milestoneBased?: boolean | null;
|
|
431
|
+
/**
|
|
432
|
+
* Whether the program runs in recurring rounds or seasons.
|
|
433
|
+
*/
|
|
434
|
+
recurring?: boolean | null;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Hackathon-specific fields. Required when fundingType is 'hackathon'; forbidden otherwise.
|
|
438
|
+
*/
|
|
439
|
+
interface HackathonDetails$1 {
|
|
440
|
+
/**
|
|
441
|
+
* Physical location, or null for a fully online event.
|
|
442
|
+
*/
|
|
443
|
+
location?: string | null;
|
|
444
|
+
/**
|
|
445
|
+
* Whether the event is also, or only, held online.
|
|
446
|
+
*/
|
|
447
|
+
online?: boolean | null;
|
|
448
|
+
/**
|
|
449
|
+
* Named tracks or themes participants can build against.
|
|
450
|
+
*/
|
|
451
|
+
tracks?: string[];
|
|
452
|
+
/**
|
|
453
|
+
* The prize pool, one entry per prize. Each prize carries its own currency.
|
|
454
|
+
*/
|
|
455
|
+
prizes?: HackathonPrize[];
|
|
456
|
+
teamSize?: TeamSizeRange;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* A single hackathon prize, optionally attributed to a track.
|
|
460
|
+
*/
|
|
461
|
+
interface HackathonPrize {
|
|
462
|
+
/**
|
|
463
|
+
* Track this prize belongs to, where prizes are tracked separately.
|
|
464
|
+
*/
|
|
465
|
+
track?: string | null;
|
|
466
|
+
/**
|
|
467
|
+
* Prize amount in major units.
|
|
468
|
+
*/
|
|
469
|
+
amount: number;
|
|
470
|
+
/**
|
|
471
|
+
* ISO 4217 code or token symbol for this prize.
|
|
472
|
+
*/
|
|
473
|
+
currency: string;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Permitted team size range.
|
|
477
|
+
*/
|
|
478
|
+
interface TeamSizeRange {
|
|
479
|
+
/**
|
|
480
|
+
* Minimum number of team members.
|
|
481
|
+
*/
|
|
482
|
+
min?: number | null;
|
|
483
|
+
/**
|
|
484
|
+
* Maximum number of team members.
|
|
485
|
+
*/
|
|
486
|
+
max?: number | null;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Bounty-specific fields. Required when fundingType is 'bounty'; forbidden otherwise.
|
|
490
|
+
*/
|
|
491
|
+
interface BountyDetails$1 {
|
|
492
|
+
reward: MonetaryAmount$1;
|
|
493
|
+
/**
|
|
494
|
+
* Self-assessed difficulty, as a hint to applicants.
|
|
495
|
+
*/
|
|
496
|
+
difficulty?: "beginner" | "intermediate" | "advanced" | null;
|
|
497
|
+
/**
|
|
498
|
+
* Skills the task calls for. Free text.
|
|
499
|
+
*/
|
|
500
|
+
skills?: string[];
|
|
501
|
+
/**
|
|
502
|
+
* Platform hosting the bounty.
|
|
503
|
+
*/
|
|
504
|
+
platform?: string | null;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* The reward paid on completion. Carries its own currency.
|
|
508
|
+
*/
|
|
509
|
+
interface MonetaryAmount$1 {
|
|
510
|
+
/**
|
|
511
|
+
* Amount in major units of the currency, so 2000000 means 2,000,000 USD rather than cents.
|
|
512
|
+
*/
|
|
513
|
+
amount: number;
|
|
514
|
+
/**
|
|
515
|
+
* ISO 4217 fiat code such as USD or EUR, or a token symbol such as ETH, OP or USDC.
|
|
516
|
+
*/
|
|
517
|
+
currency: string;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Accelerator-specific fields. Required when fundingType is 'accelerator'; forbidden otherwise.
|
|
521
|
+
*/
|
|
522
|
+
interface AcceleratorDetails$1 {
|
|
523
|
+
/**
|
|
524
|
+
* Length of the program in weeks.
|
|
525
|
+
*/
|
|
526
|
+
programDurationWeeks?: number | null;
|
|
527
|
+
/**
|
|
528
|
+
* Number of teams accepted per cohort.
|
|
529
|
+
*/
|
|
530
|
+
batchSize?: number | null;
|
|
531
|
+
/**
|
|
532
|
+
* Equity taken, expressed as a string because programs state it in incomparable ways.
|
|
533
|
+
*/
|
|
534
|
+
equity?: string | null;
|
|
535
|
+
funding?: MonetaryAmount1;
|
|
536
|
+
/**
|
|
537
|
+
* Company stage the program targets.
|
|
538
|
+
*/
|
|
539
|
+
stage?: "pre-seed" | "seed" | "series-a" | null;
|
|
540
|
+
/**
|
|
541
|
+
* Physical location, or null for a fully remote program.
|
|
542
|
+
*/
|
|
543
|
+
location?: string | null;
|
|
544
|
+
/**
|
|
545
|
+
* Whether the program is also, or only, run remotely.
|
|
546
|
+
*/
|
|
547
|
+
online?: boolean | null;
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Investment or stipend offered per team. Carries its own currency.
|
|
551
|
+
*/
|
|
552
|
+
interface MonetaryAmount1 {
|
|
553
|
+
/**
|
|
554
|
+
* Amount in major units of the currency, so 2000000 means 2,000,000 USD rather than cents.
|
|
555
|
+
*/
|
|
556
|
+
amount: number;
|
|
557
|
+
/**
|
|
558
|
+
* ISO 4217 fiat code such as USD or EUR, or a token symbol such as ETH, OP or USDC.
|
|
559
|
+
*/
|
|
560
|
+
currency: string;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* VC-fund-specific fields. Required when fundingType is 'vc_fund'; forbidden otherwise.
|
|
564
|
+
*/
|
|
565
|
+
interface VCFundDetails {
|
|
566
|
+
checkSize?: AmountRange$1;
|
|
567
|
+
/**
|
|
568
|
+
* Investment stages the fund participates in.
|
|
569
|
+
*/
|
|
570
|
+
stages?: ("pre-seed" | "seed" | "series-a" | "series-b+" | "growth")[];
|
|
571
|
+
/**
|
|
572
|
+
* Investment thesis, in the fund's own words.
|
|
573
|
+
*/
|
|
574
|
+
thesis?: string | null;
|
|
575
|
+
/**
|
|
576
|
+
* Named portfolio companies, where the fund publishes them.
|
|
577
|
+
*/
|
|
578
|
+
portfolio?: string[];
|
|
579
|
+
/**
|
|
580
|
+
* How the fund prefers to be approached. 'intro-only' means a warm introduction is required.
|
|
581
|
+
*/
|
|
582
|
+
contactMethod?: "email" | "form" | "intro-only" | null;
|
|
583
|
+
/**
|
|
584
|
+
* Whether the fund is currently deploying capital.
|
|
585
|
+
*/
|
|
586
|
+
activelyInvesting?: boolean | null;
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Typical investment size, as a range.
|
|
590
|
+
*/
|
|
591
|
+
interface AmountRange$1 {
|
|
592
|
+
/**
|
|
593
|
+
* Lower bound in major units.
|
|
594
|
+
*/
|
|
595
|
+
min?: number | null;
|
|
596
|
+
/**
|
|
597
|
+
* Upper bound in major units.
|
|
598
|
+
*/
|
|
599
|
+
max?: number | null;
|
|
600
|
+
/**
|
|
601
|
+
* ISO 4217 code or token symbol for both bounds.
|
|
602
|
+
*/
|
|
603
|
+
currency?: string | null;
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* RFP-specific fields. Required when fundingType is 'rfp'; forbidden otherwise.
|
|
607
|
+
*/
|
|
608
|
+
interface RFPDetails {
|
|
609
|
+
/**
|
|
610
|
+
* Scope of work, as one free-text field. In-scope and out-of-scope prose both live here.
|
|
611
|
+
*/
|
|
612
|
+
scope?: string | null;
|
|
613
|
+
/**
|
|
614
|
+
* Free-text statements of what the work must deliver. RFP-only, and deliberately not split into hard and soft. What a proposal must contain goes in the top-level prerequisites instead.
|
|
615
|
+
*/
|
|
616
|
+
requirements?: string[];
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/** A funding opportunity conforming to the RFP Hub Standard. */
|
|
620
|
+
type Opportunity = RFPHubOpportunity;
|
|
621
|
+
/** The six funding types. The value is also the key of the opportunity's type block. */
|
|
622
|
+
type FundingType = Opportunity["fundingType"];
|
|
623
|
+
/** Public lifecycle status. */
|
|
624
|
+
type OpportunityStatus = Opportunity["status"];
|
|
625
|
+
/** How an entry entered the Hub. */
|
|
626
|
+
type IngestionMethod = NonNullable<Provenance$1["ingestedVia"]>;
|
|
627
|
+
/** Whether a deadline is a fixed point in time or an open-ended window. */
|
|
628
|
+
type DeadlineType = Deadline$1["type"];
|
|
629
|
+
type Organization = Organization$1;
|
|
630
|
+
type Contact = Contact$1;
|
|
631
|
+
type Provenance = Provenance$1;
|
|
632
|
+
type Funding = FundingEnvelope;
|
|
633
|
+
type SocialLinks = SocialLinks$1;
|
|
634
|
+
type MonetaryAmount = MonetaryAmount$1;
|
|
635
|
+
type AmountRange = AmountRange$1;
|
|
636
|
+
type Deadline = Deadline$1;
|
|
637
|
+
type Milestone = Milestone$1;
|
|
638
|
+
type GrantDetails = GrantDetails$1;
|
|
639
|
+
type HackathonDetails = HackathonDetails$1;
|
|
640
|
+
type Prize = HackathonPrize;
|
|
641
|
+
type TeamSize = TeamSizeRange;
|
|
642
|
+
type BountyDetails = BountyDetails$1;
|
|
643
|
+
type AcceleratorDetails = AcceleratorDetails$1;
|
|
644
|
+
type VcFundDetails = VCFundDetails;
|
|
645
|
+
type RfpDetails = RFPDetails;
|
|
646
|
+
/**
|
|
647
|
+
* Map from a `fundingType` to the shape of `opportunity[fundingType]`.
|
|
648
|
+
*
|
|
649
|
+
* The re-cut makes this a guarantee rather than an expectation: the matching block is
|
|
650
|
+
* required AND every non-matching block is forbidden, so a record can never carry two.
|
|
651
|
+
*/
|
|
652
|
+
interface DetailsByFundingType {
|
|
653
|
+
grant: GrantDetails;
|
|
654
|
+
hackathon: HackathonDetails;
|
|
655
|
+
bounty: BountyDetails;
|
|
656
|
+
accelerator: AcceleratorDetails;
|
|
657
|
+
vc_fund: VcFundDetails;
|
|
658
|
+
rfp: RfpDetails;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
export { type AcceleratorDetails, type AmountRange, type BountyDetails, type Contact, type Deadline, type DeadlineType, type DetailsByFundingType, type Funding, type FundingType, type GrantDetails, type HackathonDetails, type IngestionMethod, type Milestone, type MonetaryAmount, type Opportunity, type OpportunityStatus, type Organization, type Prize, type Provenance, type Registry, type RegistryEntry, type RegistryName, type RfpDetails, SPEC_VERSION, type SocialLinks, type TeamSize, type VcFundDetails, activeValues, isRegistered, opportunitySchema, registries };
|