Skip to Documentation
ProfytAI

Delivery Channel

ZIP Downloads

A pack contains the data in three formats, the schema, the data dictionary, the licence, and a hash to verify what you ingested. No account and no client library are required.

Packs Published
2
Formats Each
3

Excel, JSON, CSV

Documents Each
6
Release
1.0.0

The free packs sit behind a short form and download from profyt.ai itself, same origin, with no third-party hosting in the path. Licensed products ship in the identical folder shape with the complete record set, so a pipeline built against a free pack keeps working when the licensed release replaces it.

Every pack carries the same six documents beside its data files. The documentation travels with the data on purpose. A colleague who receives the folder a year from now can read the contract without finding this page first.

File
README.md
What It Covers
What the pack is, what each file holds, and the figures for this release.
File
QUICK_START.md
What It Covers
Load, query, and verify the pack in about five minutes, in each shipped format.
File
SCHEMA.md
What It Covers
The record contract. The metadata envelope, the nested record shape, and the flat CSV columns.
File
DATA_DICTIONARY.md
What It Covers
Every field with its type, nullability, population count, and meaning.
File
LICENSE.md
What It Covers
The licence this pack carries, including the citation and reliance terms.
File
CHANGELOG.md
What It Covers
Release history for the product line.

The three data files hold the same records. JSON is nested and complete, wrapped in a versioned metadata envelope. The CSV is a flat table for spreadsheets, BI, and SQL. The Excel workbook is self-documenting, with cover, obligations, data dictionary, and change log sheets so a reviewer needs nothing else open.

Pack
Philippines · BSP
Data Files
free-sample.json · free-sample.csv · free-sample.xlsx
Pack
Singapore · MAS
Data Files
mas_free_sample.json · mas_free_sample.csv · mas_free_sample.xlsx
Pack
MORB Part IX Obligation Register, Free SampleManual of Regulations for Banks (2023), Part IX, sections 903 to 941
Obligations
20 of 278
CSV Columns
47
Evidence
20 source-page captures in evidence/
Release
1.0.02026-07-23
Pack
Singapore Regulatory Intelligence, Free SampleTRM Guidelines, Cyber Hygiene Notice, and Outsourcing Notice, drawn across all three
Obligations
20 of 380
CSV Columns
51
Evidence
Not included, pending MAS redistribution approval
Release
1.0.02026-07-23
Column Widths Differ by Product Line

The Philippine sample ships 47 flat columns and the Singapore sample 51. The difference is the layers each product line carries, not a missing field. Read DATA_DICTIONARY.md in the pack you hold, because it is generated from that release.

Nothing here needs a ProfytAI library. The examples below are starting points against the Philippine sample's file names. Substitute the file names from the pack you downloaded.

import json
import pandas as pd

doc = json.load(open("free-sample.json", encoding="utf-8"))
df = pd.json_normalize(doc["obligations"])

# every binding duty
mandatory = df[df["parsed_requirement.modal_strength"] == "mandatory"]
print(len(mandatory), "mandatory duties")

Excel Without Writing a Formula

Open the workbook and go to the Obligations sheet. Filter modal_strength to mandatory for every binding duty, or filter framework to isolate one instrument. The Data Dictionary sheet explains each column in place.

Verify before you ingest. The JSON envelope carries a SHA-256 of the canonicalized obligations payload and the record count, so a truncated download or an edited file fails loudly instead of silently entering a compliance record.

verify.py

import hashlib
import json

doc = json.load(open("free-sample.json", encoding="utf-8"))
meta = doc["metadata"]
integrity = meta["integrity"]

# confirm what you are holding
print(meta["product"], meta["dataset_version"], meta["release_date"])

# the hash covers the canonicalized obligations payload
payload = json.dumps(
    doc["obligations"], ensure_ascii=False, sort_keys=True
).encode("utf-8")

# Philippine packs name it records_sha256, Singapore packs obligations_sha256
expected = integrity.get("records_sha256") or integrity["obligations_sha256"]
assert hashlib.sha256(payload).hexdigest() == expected
assert len(doc["obligations"]) == integrity["record_count"]
print("verified", integrity["record_count"], "records")
Nulls Are Meaningful

A field is null when the source clause does not state or support a value. Absence is not a negative finding, and it is not missing data.

The Philippine packs include one source-page capture per record, the printed page with the obligation's exact span highlighted, named from each record's source.evidence_img_loc. Attach it to a workpaper and a reviewer sees the duty in the regulator's own layout without opening the source PDF.

The Singapore packs ship without captures. Redistribution of MAS source pages is pending the regulator's approval, so the official source URL and the full citation stay on every record instead. That is a licensing boundary, not an omission in the data.

Cite verbatim_textwith its citation. It is byte-exact to the regulator's publication. Derived and semantic fields are ProfytAI structuring, and a compliance decision should be confirmed against the official source rather than against a summary.

Each pack's LICENSE.md is the operative document for that release. Free packs carry a free evaluation licence, and licensed packs are single-organization commercial licences with versioned releases. The public terms are on the licensing page.

Prefer to query rather than ingest files? The same certified registers are shared into Snowflake. See the Snowflake channel.