Open Learning Feed vocabulary
An extension to schema.org for university program and tuition data. It adds 7 types, 36 properties and 9 enumerations, and reuses schema.org everywhere a term already exists.
Draft dated 2026-10-10. OLF stands for Open Learning Feed. Its terms use the olf: prefix and the namespace https://olfeed.org/ns#. Generated from tools/build_spec.py.
Conformance
A conforming feed is a JSON-LD document whose top-level node is a olf:InstitutionProgramFeed, served at /olf.json on the root of the domain named in its olf:ownerDomain. The file is JSON that follows schema.org (JSON-LD), served as application/json; it must include "@context". Consumers also accept the earlier name /olf.jsonld and the application/ld+json media type. That one file is all a school publishes.
Every new type subclasses a schema.org type, so a consumer that knows only schema.org still reads names, credits, modes and prices. Required and recommended fields are listed in the school guide, and the JSON Schema encodes the structural rules.
A conforming feed does not include salary, career, job or occupation data. The schema.org properties salaryUponCompletion, trainingSalary and occupationalCategory are excluded from program feeds.
A published term is never repurposed. Changes that would alter a term's meaning get a new term and a new version.
Two sources of terms
A feed is ordinary schema.org JSON-LD with a small set of additions. Anything schema.org already defines is used exactly as schema.org defines it. The olf terms fill only the gaps schema.org leaves for comparing programs.
| Source | Prefix in a feed | Count | Where to read the definitions |
|---|---|---|---|
| schema.org | none (it is the default vocabulary) | 61 types and properties | Terms we reuse, which links to schema.org's own pages |
| OLF extension | olf: | 7 types, 36 properties, 9 enumerations | This page, from New types down |
If a school already marks up its program pages with schema.org, that markup is the starting point. Adding the olf properties to the same objects produces the feed. See Already using schema.org? in the school guide.
New types
| Type | Subtype of | Gap it closes |
|---|---|---|
olf:InstitutionProgramFeed | DataFeed | Feed authority and change notices |
olf:TuitionPriceSpecification | UnitPriceSpecification | Price by audience; credit-hour unit |
olf:TuitionDiscount | PriceSpecification | Institutional grants and discounts |
olf:EligibilityAudience | PeopleAudience | Price by audience |
olf:TransferCreditPolicy | Intangible | Transfer credit |
olf:CompletionTimeEstimate | StructuredValue | Time to completion by enrollment pattern |
olf:ValueProvenance | StructuredValue | Value provenance |
olf:InstitutionProgramFeed
Thing › DataFeed › olf:InstitutionProgramFeed
The root of a school's feed. Published by the school at /olf.json on the root of its own domain.
| Property | Expects | Description |
|---|---|---|
olf:ownerDomain | URL | The https origin of the school that publishes the feed, with no path or trailing slash. Every price the school publishes must have its sourceUrl on this domain or one of its subdomains. |
olf:feedVersion | Date | Version of the feed, as a date. Changes on every publish; Open Learning Feed compares versions to find changes. |
olf:includesFeed | URL | Another feed from the same institution, such as a separate college or campus, listed from the main feed at /olf.json. |
olf:changeNotificationEndpoint | URL | Optional address where the school accepts subscription requests directly. |
Also accepts every property of DataFeed.
olf:TuitionPriceSpecification
Thing › UnitPriceSpecification › olf:TuitionPriceSpecification
A tuition price with its unit basis and, when it does not apply to everyone, the audience it applies to. Fees use the same type, told apart by priceComponentType.
| Property | Expects | Description |
|---|---|---|
olf:tuitionBasis | olf:TuitionBasisEnumeration | What one unit of the price buys: a credit hour, a course, a term, a year, the whole program or a subscription term. |
olf:eligibleAudience | olf:EligibilityAudience | Who the price or discount applies to. Omit it only on the one current tuition rate that applies to everyone; whenever more than one current rate applies, every other rate needs an audience. The proposed schema.org audience widening is accepted in its place. |
olf:appliesToLevel | DefinedTerm, Text | Credential level the price applies to when one price list covers several levels. |
Also accepts every property of UnitPriceSpecification.
olf:TuitionDiscount
Thing › PriceSpecification › olf:TuitionDiscount
An institutional grant or discount that reduces tuition for an eligible group, such as a 10% veteran grant.
| Property | Expects | Description |
|---|---|---|
olf:eligibleAudience | olf:EligibilityAudience | Who the price or discount applies to. Omit it only on the one current tuition rate that applies to everyone; whenever more than one current rate applies, every other rate needs an audience. The proposed schema.org audience widening is accepted in its place. |
olf:discountPercent | Number | Percentage taken off the price it applies to. Greater than 0, at most 100. |
olf:discountAmount | MonetaryAmount | Fixed amount taken off, for discounts not expressed as a percentage. A discount gives at least one of discountPercent and discountAmount. |
olf:appliesTo | olf:TuitionPriceSpecification | The price the discount reduces. Defaults to the program's general price. |
olf:combinableWithOthers | Boolean | Whether the discount can be stacked with other discounts or audience prices. |
Also accepts every property of PriceSpecification.
olf:EligibilityAudience
Thing › PeopleAudience › olf:EligibilityAudience
The group of people a price or discount applies to, named with EligibilityCategoryEnumeration members.
| Property | Expects | Description |
|---|---|---|
olf:eligibilityCategory | olf:EligibilityCategoryEnumeration | One or more groups that qualify. |
olf:verificationRequired | Text, URL | What proof of eligibility the school requires, or a page describing it. |
Also accepts every property of PeopleAudience.
olf:TransferCreditPolicy
Thing › Intangible › olf:TransferCreditPolicy
How many credits a student can transfer in and from which kinds of prior learning.
| Property | Expects | Description |
|---|---|---|
olf:maxTransferCredits | Integer | Most credits a student can transfer in. |
olf:acceptedCreditSource | olf:CreditSourceEnumeration | Kinds of prior learning the school accepts for credit. |
olf:policyUrl | URL | Page with the full transfer policy. |
Also accepts every property of Intangible.
olf:CompletionTimeEstimate
Thing › StructuredValue › olf:CompletionTimeEstimate
How long the program takes under one enrollment pattern, such as full time, part time or with transfer credits. A program lists one per pattern.
| Property | Expects | Description |
|---|---|---|
olf:enrollmentIntensity | olf:EnrollmentIntensityEnumeration | The enrollment pattern the estimate assumes. |
olf:typicalDuration | Duration | How long most students take under this pattern, as an ISO 8601 duration such as P18M. |
olf:minimumDuration | Duration | The fastest possible completion under this pattern. |
olf:creditsPerTerm | Number | Credits per term the estimate assumes. |
olf:assumedTransferCredits | Integer | Transfer credits the estimate assumes. Omit for students starting with none. |
Also accepts every property of StructuredValue.
olf:ValueProvenance
Thing › StructuredValue › olf:ValueProvenance
Where one value came from and when the school last confirmed it. Attached to individual values, not whole pages.
| Property | Expects | Description |
|---|---|---|
olf:sourceType | olf:SourceTypeEnumeration | Kind of source: federal reporting, the Common Data Set, the school's own pages, a statement the school attests to, or an independent audit. |
olf:reportedBy | Organization | Organization that produced the value when it is not the school, such as NCES for IPEDS figures. |
olf:sourceUrl | URL | Page where the value appears, as an https address. For values the school publishes it must be on the feed's ownerDomain or one of its subdomains; a value with sourceType FederalReported or ThirdPartyAudited may point to that source's page. |
olf:verifiedDate | Date | Date the school last confirmed the value. Values unconfirmed for over a year are flagged. |
olf:contextNote | Text | The school's explanation of how a value, often a federal figure, applies to its students. |
Also accepts every property of StructuredValue.
New properties on schema.org types
| Property | Used on | Expects | Description |
|---|---|---|---|
olf:programStatus | EducationalOccupationalProgram | olf:ProgramStatusEnumeration | Whether the program is taking students. Lets subscribers remove closed programs automatically. |
olf:transferCreditPolicy | EducationalOccupationalProgram, CollegeOrUniversity | olf:TransferCreditPolicy | Transfer rules. A program-level policy overrides the institution's. |
olf:provenance | PriceSpecification, PropertyValue | olf:ValueProvenance | Source and verified date for this one value. |
olf:admissionTestPolicy | EducationalOccupationalProgram | olf:AdmissionTestPolicyEnumeration | Whether applicants must submit a standardized test score such as the GMAT, GRE, SAT or ACT. |
olf:focusArea | EducationalOccupationalProgram | EducationalOccupationalProgram, DefinedTerm | A concentration, specialization, track, emphasis or option within the program, with its own name and credits. One neutral term, so schools that say concentration and schools that say specialization publish the same way. |
olf:focusAreaType | EducationalOccupationalProgram, DefinedTerm | olf:FocusAreaTypeEnumeration | What the school calls the focus area, so subscribers display it in the school's own words. |
olf:completionTime | EducationalOccupationalProgram | olf:CompletionTimeEstimate | Time to complete under each enrollment pattern the program supports. Put the headline full-time figure in schema.org timeToComplete as well. |
olf:classSchedule | EducationalOccupationalProgram | Schedule | When classes meet, or that coursework has no set meeting times. One Schedule per option the program offers, such as evenings and weekends. |
olf:scheduleType | Schedule | olf:ScheduleTypeEnumeration | The kind of schedule a Schedule describes: daytime, evening, weekend, live online or self-paced online. |
olf:programFeed | CollegeOrUniversity | olf:InstitutionProgramFeed, URL | Points from the school's homepage markup to its feed. |
Proposed widenings of schema.org properties
These change existing schema.org terms, so they belong upstream. Until schema.org adopts them, feeds may use them as shown and consumers should accept them.
| Property | Add to | Why |
|---|---|---|
audience | Offer, PriceSpecification | Core fix for audience-specific prices. Proposed upstream to schema.org. |
hasCertification | EducationalOccupationalProgram | Programmatic accreditation, separate from the institution's. Proposed upstream to schema.org. |
olf:TuitionBasisEnumeration
Units a tuition price can be quoted in.
olf:EligibilityCategoryEnumeration
Groups a price or discount can be limited to.
olf:ProgramStatusEnumeration
Whether a program is taking students.
olf:CreditSourceEnumeration
Kinds of prior learning that can earn transfer credit.
olf:FocusAreaTypeEnumeration
What a school calls a focus area within a program.
olf:EnrollmentIntensityEnumeration
Enrollment patterns a completion estimate can assume.
olf:ScheduleTypeEnumeration
Kinds of class schedule.
olf:AdmissionTestPolicyEnumeration
Whether a standardized test score is part of admission.
olf:SourceTypeEnumeration
Kinds of source a value can come from.
Price components
Proposed new members of schema.org's PriceComponentTypeEnumeration, used in priceComponentType to separate tuition from fees.
Terms we reuse from schema.org
These are defined by schema.org, not by this extension. A feed uses them exactly as schema.org defines them, so the definitions live on schema.org's pages. Status is as of schema.org 30.1: core terms are stable; pending terms are still under review at schema.org.
Types
| schema.org type | Status | How a feed uses it |
|---|---|---|
DataFeed | core | Parent of olf:InstitutionProgramFeed, the feed itself |
DataFeedItem | core | One entry per program, with its dateModified |
EducationalOccupationalProgram | core | A degree or certificate program |
CollegeOrUniversity | core | The school, as the program's provider |
EducationalOccupationalCredential | pending | The degree awarded |
Offer | core | Holds the program's prices |
PriceSpecification | core | Parent of olf:TuitionDiscount |
UnitPriceSpecification | core | Parent of olf:TuitionPriceSpecification |
Certification | core | Institutional and program accreditation |
Organization | core | The accreditor |
DefinedTerm | core | The CIP code in programType |
Schedule | core | When classes meet, in olf:classSchedule |
PeopleAudience | core | Parent of olf:EligibilityAudience |
StructuredValue | core | Parent of olf:ValueProvenance and olf:CompletionTimeEstimate |
MonetaryAmount | core | A fixed discount, in olf:discountAmount |
ContactPoint | core | Who to contact about the feed |
Properties
| schema.org property | Used on | Status | How a feed uses it |
|---|---|---|---|
name | Thing | core | Names of programs, schools, prices and focus areas |
url | Thing | core | The program's page and the school's site |
description | Thing | core | Short program description |
identifier | Thing | core | IPEDS UnitID and OPEID, as PropertyValue |
dataFeedElement | DataFeed | core | The list of programs |
publisher | CreativeWork | core | The school publishing the feed |
contactPoint | Organization | core | Who to contact about the feed |
contactType | ContactPoint | core | What the contact handles, such as program data |
email | ContactPoint | core | Contact email for the feed |
item | DataFeedItem | core | The program in each entry |
dateModified | DataFeedItem | core | When each entry last changed |
provider | EducationalOccupationalProgram | core | The school offering the program |
educationalCredentialAwarded | EducationalOccupationalProgram | core | The degree awarded |
educationalLevel | EducationalOccupationalCredential | pending | Required level: certificate to doctoral |
credentialCategory | EducationalOccupationalCredential | pending | Degree, certificate and so on |
educationalProgramMode | EducationalOccupationalProgram | core | Required: online, onsite or hybrid |
numberOfCredits | EducationalOccupationalProgram | core | Credits to complete |
timeToComplete | EducationalOccupationalProgram | core | Headline full-time duration |
termDuration | EducationalOccupationalProgram | core | Length of one term |
termsPerYear | EducationalOccupationalProgram | core | Terms per year |
typicalCreditsPerTerm | EducationalOccupationalProgram | core | Typical credits per term |
startDate | EducationalOccupationalProgram | core | Next start date |
applicationDeadline | EducationalOccupationalProgram | core | Deadline for the next start |
programPrerequisites | EducationalOccupationalProgram | core | Admission requirements |
programType | EducationalOccupationalProgram | core | CIP code as a DefinedTerm |
termCode | DefinedTerm | core | The CIP code itself |
inDefinedTermSet | DefinedTerm | core | Points to the CIP code list |
financialAidEligible | EducationalOccupationalProgram | core | Aid programs the program qualifies for |
offers | EducationalOccupationalProgram | core | The program's prices |
priceSpecification | Offer | core | Tuition, fees and discounts |
price | PriceSpecification | core | The amount |
priceCurrency | PriceSpecification | core | Three-letter currency code |
priceComponentType | UnitPriceSpecification | core | Tuition versus each kind of fee |
validFrom | PriceSpecification | core | When a price starts |
validThrough | PriceSpecification | core | When a price ends; kept as history |
hasCertification | Organization | core | The school's accreditation |
issuedBy | Certification | core | The accreditor |
certificationStatus | Certification | core | Whether accreditation is active |
byDay | Schedule | core | Days classes meet |
startTime | Schedule | core | Class start time |
endTime | Schedule | core | Class end time |
scheduleTimezone | Schedule | core | Time zone for class times |
repeatFrequency | Schedule | core | Weekly, every other week and so on |
value | MonetaryAmount | core | The amount of a fixed discount |
currency | MonetaryAmount | core | Three-letter currency code of a fixed discount |
schema.org terms not used in school feeds
These are valid schema.org, and a school may still use them elsewhere on its site, but they don't belong in a program feed. The validator rejects them.
| Property | Why |
|---|---|
salaryUponCompletion | Salary data is out of scope for school feeds |
trainingSalary | Salary data is out of scope for school feeds |
occupationalCategory | Career and occupation (BLS SOC) data is out of scope for school feeds |
Staying current with schema.org
schema.org publishes new releases several times a year. Every week, an automated check downloads the latest schema.org vocabulary and compares it with this extension. A person reviews anything it finds before the spec changes.
- A term we use is retired or superseded. We switch to schema.org's replacement and give schools a transition period, with a validator warning first.
- A property stops being allowed on a type we use it on. We follow schema.org's new structure.
- schema.org adds a term that covers something olf covers. We adopt schema.org's term and retire ours. Overlaps we decided to keep are listed below with the reason.
- schema.org adopts one of our proposed widenings. We drop the note that it's proposed.
The check is tools/schemaorg_sync.py in the project repository, and its latest result is published at /vocab/schemaorg-check.json.
Open issues from the latest check
- None. Every schema.org term the feed uses is current, and no olf name overlaps a schema.org term without a recorded decision.
Proposed widenings
| Property | Proposed for | Status at schema.org |
|---|---|---|
audience | Offer | Proposed, not yet adopted |
audience | PriceSpecification | Proposed, not yet adopted |
hasCertification | EducationalOccupationalProgram | Proposed, not yet adopted |
Reviewed name overlaps
| olf term | Decision |
|---|---|
olf:Discontinued | schema.org's Discontinued is an ItemAvailability value for products. Program status also needs Paused and TeachOut, so olf keeps ProgramStatusEnumeration. |
Downloads
Machine-readable files, laid out the way schema.org publishes its own. All are regenerated from the same source whenever the vocabulary changes.
| File | Format | What it is |
|---|---|---|
/vocab/olf.jsonld | JSON-LD | The OLF vocabulary as RDFS, in the same shape as schema.org's schemaorg-current-https.jsonld |
/vocab/context.jsonld | JSON-LD context | Maps schema.org as the default vocabulary and olf: to this extension. Reference it from a feed's @context. |
/vocab/olf-terms.csv | CSV | Every olf type, property and enumeration member, one per row |
/vocab/schemaorg-terms.csv | CSV | Every schema.org term a feed uses, with its schema.org status and the release it was checked against |
/vocab/schemaorg-check.json | JSON | The latest compatibility check against schema.org, with any open issues |
/schema/olf-1.0.json | JSON Schema | Structural rules for validating a feed in a build pipeline |
/examples/example.json | JSON | A complete, valid feed for Example University, a fictional school |
/examples/example-mba.json | JSON | The same school's MBA on its own |