Exact check methodology
Each check is binary: it passes when the condition below is true. FAIR and resource scores are the percentage of their checks that pass. No semantic judgement, link request, or full-file inspection is performed unless explicitly stated.
Findable checks
Descriptive bilingual titlePasses when both English and French titles contain more than 8 characters.
Bilingual keywordsPasses when English and French each contain at least one keyword and both language lists contain the same number of keywords.
Description lengthPasses when both English and French descriptions contain between 50 and 5,000 characters, inclusive.
Descriptions use MarkdownPasses when both descriptions contain a recognized Markdown marker: heading, list, numbered list, blockquote, code fence, emphasis, link, image, or inline code.
Valid Markdown syntaxPasses when neither description has an unmatched triple-backtick code fence, unmatched single-backtick inline code span, or an unclosed Markdown link/image pattern.
Persistent catalogue identifierPasses when both package id and name are populated.
Accessible checks
Accessible resourcesPasses when the package contains at least one resource.
Clear licencePasses when either license_id or license_url is populated.
Working resource URLsPasses when there is at least one resource and every resource URL begins with https://. The app does not make a request to confirm HTTP status.
Contact routePasses when maintainer_email, maintainer_contact_form, or contact_information is populated.
Interoperable checks
Machine-readable open formatPasses when at least one resource declares CSV, JSON, JSONL, XML, GEOJSON, JSON-LD, RDF, TXT, TSV, KML, WMS, WFS, or API as its format. JSONL is treated at the same openness level as JSON.
Queryable accessPasses when any resource has datastore_active=true, or the package collection is API.
Bilingual resource metadataPasses when there is at least one resource and every resource language list includes both en and fr.
Subjects and classificationPasses when either subject or topic_category contains at least one entry.
Reusable checks
Publication and update datesPasses when both date_published and metadata_modified are populated.
Ownership and provenancePasses when an organization exists and at least one of author, creator, or maintainer_email is populated.
Documentation or data dictionaryPasses when any resource has resource type documentation, data_dictionary, or guide; or when at least one DataStore resource has at least one field with bilingual interface labels or bilingual column descriptions.
Documented reusable resourcesDocumentation, data-dictionary, and guide resources are excluded. Passes when at least one remaining resource exists and every remaining resource has a name, last-modified date, and format.
Integrity or validation evidencePasses when at least one non-documentation resource has a hash or validation_status=success.
Schema and resource-content checks
Schema completionThe app loads the live schema matching package type (dataset or info). A required field passes when it is not null, empty text, an empty array, or an empty object. Schema score is completed required fields divided by all required fields.
Recommended schema fieldsThe app additionally audits time_period_coverage_start, time_period_coverage_end, and program_page_url. Missing values create recommendations but do not reduce the required-field schema score.
Resource formatEach resource passes when its declared format is one of the machine-readable open formats listed above. A single consolidated XLSX dataset resource also passes when an open-format dataset resource exists in the same package.
Resource freshnessEach resource passes when last_modified is populated.
Resource integrityEach resource passes when it has a hash or validation_status=success.
Bilingual dataset resourceApplied only when resource_type=dataset. Passes when the resource language list includes both en and fr. A single bilingual table should use side-by-side English and French columns for text while sharing language-neutral values such as identifiers, measurements, and suitably formatted dates.
Consolidated XLSX alternate formatApplied only to XLSX dataset resources. Passes when the package also has an open-format dataset resource and contains exactly one XLSX dataset resource. XLSX workbooks can contain multiple tabs, so XLSX is treated as an alternate format that can consolidate multiple tables at a persistent resource ID.
CSV enabled in DataStoreApplied only to CSV dataset resources. Passes when datastore_active=true. DataStore enables browser views, API queries, searching, sorting, and filtering.
Some bilingual column names for the interfaceApplied to DataStore-enabled resources when datastore_info is available. Passes when at least one field has both info.label_en and info.label_fr.
All bilingual column names for the interfacePasses when every DataStore field has both info.label_en and info.label_fr.
Some bilingual column descriptionsPasses when at least one DataStore field has both info.notes_en and info.notes_fr.
All bilingual column descriptionsPasses when every DataStore field has both info.notes_en and info.notes_fr.
Correct DataStore data typesPasses when at least one DataStore field has a configured type other than text. This is a signal that structured dates, numbers, or other values can support correct searching, sorting, and filtering; it does not validate every field type.
Displaying other dataApplied when an uploaded resource can use a portal display view. XML, JSON, JSONL, NDJSON, TXT, YAML, Markdown, and other declared plain-text resources expect text_view; PNG, JPEG, JPG, and GIF expect image_view; API resources expect an OpenAPI view; and PBIX expects powerbiview. Passes when resource_view_list returns the expected view type.
Scores, sampling, and engagement
Overall quality scoreRounded result of FAIR score × 55% + schema score × 20% + resource-content score × 25%.
DataStore statisticsRows use datastore_info.meta.count, columns count the returned datastore_info.fields, and bytes use datastore_info.meta.size.
On time, Over timeCompares today with metadata_modified using the stated maintenance frequency. ISO durations are converted to their stated day, week, month, or year interval. A record is overdue after one full interval. as_needed, irregular, not_planned, and unknown return N/A because no scheduled maintenance commitment was communicated.
Blank-cell sampleFor up to 5 DataStore-active resources, the first 20 records are sampled. Blank rate is null or empty-string cells divided by all sampled cells, excluding the DataStore _id column. It does not affect the score.
User ratingAverage of all valid recorded ratings from 1 through 5 for the package UUID, up to the 500 records requested by the app. It does not affect the score.
Visits and rankTotal visits sum all returned monthly visit records for the package, up to 500 records. Latest-month rank compares the package against the first 1,000 records sorted by visits for the latest available portal month. It does not affect the score.