[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"$schema":"https://json-schema.org/draft/2019-09/schema","title":"Open Data Contract Standard (ODCS)","description":"An open data contract specification to establish agreement between data producers and consumers.","type":"object","properties":{"version":{"type":"string","description":"Current version of the data contract."},"kind":{"type":"string","default":"DataContract","description":"The kind of file this is. Valid value is `DataContract`.","enum":["DataContract"]},"apiVersion":{"type":"string","default":"v3.0.2","description":"Version of the standard used to build data contract. Default value is v3.0.2.","enum":["v3.0.2","v3.0.1","v3.0.0","v2.2.2","v2.2.1","v2.2.0"]},"id":{"type":"string","description":"A unique identifier used to reduce the risk of dataset name collisions, such as a UUID."},"name":{"type":"string","description":"Name of the data contract."},"tenant":{"type":"string","description":"Indicates the property the data is primarily associated with. Value is case insensitive."},"tags":{"$ref":"#/$defs/Tags"},"status":{"type":"string","description":"Current status of the dataset.","examples":["proposed","draft","active","deprecated","retired"]},"servers":{"type":"array","description":"List of servers where the datasets reside.","items":{"$ref":"#/$defs/Server"}},"dataProduct":{"type":"string","description":"The name of the data product."},"description":{"type":"object","description":"High level description of the dataset.","properties":{"usage":{"type":"string","description":"Intended usage of the dataset."},"purpose":{"type":"string","description":"Purpose of the dataset."},"limitations":{"type":"string","description":"Limitations of the dataset."},"authoritativeDefinitions":{"$ref":"#/$defs/AuthoritativeDefinitions"},"customProperties":{"$ref":"#/$defs/CustomProperties"}}},"domain":{"type":"string","description":"Name of the logical data domain.","examples":["imdb_ds_aggregate","receiver_profile_out","transaction_profile_out"]},"schema":{"type":"array","description":"A list of elements within the schema to be cataloged.","items":{"$ref":"#/$defs/SchemaObject"}},"support":{"$ref":"#/$defs/Support"},"price":{"$ref":"#/$defs/Pricing"},"team":{"type":"array","items":{"$ref":"#/$defs/Team"}},"roles":{"type":"array","description":"A list of roles that will provide user access to the dataset.","items":{"$ref":"#/$defs/Role"}},"slaDefaultElement":{"type":"string","description":"Element (using the element path notation) to do the checks on."},"slaProperties":{"type":"array","description":"A list of key/value pairs for SLA specific properties. There is no limit on the type of properties (more details to come).","items":{"$ref":"#/$defs/ServiceLevelAgreementProperty"}},"authoritativeDefinitions":{"$ref":"#/$defs/AuthoritativeDefinitions"},"customProperties":{"$ref":"#/$defs/CustomProperties"},"contractCreatedTs":{"type":"string","format":"date-time","description":"Timestamp in UTC of when the data contract was created."}},"required":["version","apiVersion","kind","id","status"],"additionalProperties":false,"$defs":{"Server":{"type":"object","description":"Data source details of where data is physically stored.","properties":{"server":{"type":"string","description":"Identifier of the server."},"type":{"type":"string","description":"Type of the server.","enum":["api","athena","azure","bigquery","clickhouse","databricks","denodo","dremio","duckdb","glue","cloudsql","db2","informix","kafka","kinesis","local","mysql","oracle","postgresql","postgres","presto","pubsub","redshift","s3","sftp","snowflake","sqlserver","synapse","trino","vertica","custom"]},"description":{"type":"string","description":"Description of the server."},"environment":{"type":"string","description":"Environment of the server.","examples":["prod","preprod","dev","uat"]},"roles":{"type":"array","description":"List of roles that have access to the server.","items":{"$ref":"#/$defs/Role"}},"customProperties":{"$ref":"#/$defs/CustomProperties"}},"allOf":[{"if":{"properties":{"type":{"const":"api"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/ApiServer"}},{"if":{"properties":{"type":{"const":"athena"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/AthenaServer"}},{"if":{"properties":{"type":{"const":"azure"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/AzureServer"}},{"if":{"properties":{"type":{"const":"bigquery"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/BigQueryServer"}},{"if":{"properties":{"type":{"const":"clickhouse"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/ClickHouseServer"}},{"if":{"properties":{"type":{"const":"databricks"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/DatabricksServer"}},{"if":{"properties":{"type":{"const":"denodo"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/DenodoServer"}},{"if":{"properties":{"type":{"const":"dremio"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/DremioServer"}},{"if":{"properties":{"type":{"const":"duckdb"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/DuckdbServer"}},{"if":{"properties":{"type":{"const":"glue"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/GlueServer"}},{"if":{"properties":{"type":{"const":"cloudsql"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/GoogleCloudSqlServer"}},{"if":{"properties":{"type":{"const":"db2"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/IBMDB2Server"}},{"if":{"properties":{"type":{"const":"informix"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/InformixServer"}},{"if":{"properties":{"type":{"const":"custom"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/CustomServer"}},{"if":{"properties":{"type":{"const":"kafka"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/KafkaServer"}},{"if":{"properties":{"type":{"const":"kinesis"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/KinesisServer"}},{"if":{"properties":{"type":{"const":"local"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/LocalServer"}},{"if":{"properties":{"type":{"const":"mysql"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/MySqlServer"}},{"if":{"properties":{"type":{"const":"oracle"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/OracleServer"}},{"if":{"properties":{"type":{"const":"postgresql"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/PostgresServer"}},{"if":{"properties":{"type":{"const":"postgres"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/PostgresServer"}},{"if":{"properties":{"type":{"const":"presto"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/PrestoServer"}},{"if":{"properties":{"type":{"const":"pubsub"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/PubSubServer"}},{"if":{"properties":{"type":{"const":"redshift"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/RedshiftServer"}},{"if":{"properties":{"type":{"const":"s3"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/S3Server"}},{"if":{"properties":{"type":{"const":"sftp"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/SftpServer"}},{"if":{"properties":{"type":{"const":"snowflake"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/SnowflakeServer"}},{"if":{"properties":{"type":{"const":"sqlserver"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/SqlserverServer"}},{"if":{"properties":{"type":{"const":"synapse"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/SynapseServer"}},{"if":{"properties":{"type":{"const":"trino"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/TrinoServer"}},{"if":{"properties":{"type":{"const":"vertica"}},"required":["type"]},"then":{"$ref":"#/$defs/ServerSource/VerticaServer"}}],"required":["server","type"]},"ServerSource":{"ApiServer":{"type":"object","title":"AthenaServer","properties":{"location":{"type":"string","format":"uri","description":"The url to the API.","examples":["https://api.example.com/v1"]}},"required":["location"]},"AthenaServer":{"type":"object","title":"AthenaServer","properties":{"stagingDir":{"type":"string","format":"uri","description":"Amazon Athena automatically stores query results and metadata information for each query that runs in a query result location that you can specify in Amazon S3.","examples":["s3://my_storage_account_name/my_container/path"]},"schema":{"type":"string","description":"Identify the schema in the data source in which your tables exist."},"catalog":{"type":"string","description":"Identify the name of the Data Source, also referred to as a Catalog.","default":"awsdatacatalog"},"regionName":{"type":"string","description":"The region your AWS account uses.","examples":["eu-west-1"]}},"required":["stagingDir","schema"]},"AzureServer":{"type":"object","title":"AzureServer","properties":{"location":{"type":"string","format":"uri","description":"Fully qualified path to Azure Blob Storage or Azure Data Lake Storage (ADLS), supports globs.","examples":["az://my_storage_account_name.blob.core.windows.net/my_container/path/*.parquet","abfss://my_storage_account_name.dfs.core.windows.net/my_container_name/path/*.parquet"]},"format":{"type":"string","enum":["parquet","delta","json","csv"],"description":"File format."},"delimiter":{"type":"string","enum":["new_line","array"],"description":"Only for format = json. How multiple json documents are delimited within one file"}},"required":["location","format"]},"BigQueryServer":{"type":"object","title":"BigQueryServer","properties":{"project":{"type":"string","description":"The GCP project name."},"dataset":{"type":"string","description":"The GCP dataset name."}},"required":["project","dataset"]},"ClickHouseServer":{"type":"object","title":"ClickHouseServer","properties":{"host":{"type":"string","description":"The host of the ClickHouse server."},"port":{"type":"integer","description":"The port to the ClickHouse server."},"database":{"type":"string","description":"The name of the database."}},"required":["host","port","database"]},"DatabricksServer":{"type":"object","title":"DatabricksServer","properties":{"host":{"type":"string","description":"The Databricks host","examples":["dbc-abcdefgh-1234.cloud.databricks.com"]},"catalog":{"type":"string","description":"The name of the Hive or Unity catalog"},"schema":{"type":"string","description":"The schema name in the catalog"}},"required":["catalog","schema"]},"DenodoServer":{"type":"object","title":"DenodoServer","properties":{"host":{"type":"string","description":"The host of the Denodo server."},"port":{"type":"integer","description":"The port of the Denodo server."},"database":{"type":"string","description":"The name of the database."}},"required":["host","port"]},"DremioServer":{"type":"object","title":"DremioServer","properties":{"host":{"type":"string","description":"The host of the Dremio server."},"port":{"type":"integer","description":"The port of the Dremio server."},"schema":{"type":"string","description":"The name of the schema."}},"required":["host","port"]},"DuckdbServer":{"type":"object","title":"DuckdbServer","properties":{"database":{"type":"string","description":"Path to duckdb database file."},"schema":{"type":"integer","description":"The name of the schema."}},"required":["database"]},"GlueServer":{"type":"object","title":"GlueServer","properties":{"account":{"type":"string","description":"The AWS Glue account","examples":["1234-5678-9012"]},"database":{"type":"string","description":"The AWS Glue database name","examples":["my_database"]},"location":{"type":"string","format":"uri","description":"The AWS S3 path. Must be in the form of a URL.","examples":["s3://datacontract-example-orders-latest/data/{model}"]},"format":{"type":"string","description":"The format of the files","examples":["parquet","csv","json","delta"]}},"required":["account","database"]},"GoogleCloudSqlServer":{"type":"object","title":"GoogleCloudSqlServer","properties":{"host":{"type":"string","description":"The host of the Google Cloud Sql server."},"port":{"type":"integer","description":"The port of the Google Cloud Sql server."},"database":{"type":"string","description":"The name of the database."},"schema":{"type":"string","description":"The name of the schema."}},"required":["host","port","database","schema"]},"IBMDB2Server":{"type":"object","title":"IBMDB2Server","properties":{"host":{"type":"string","description":"The host of the IBM DB2 server."},"port":{"type":"integer","description":"The port of the IBM DB2 server."},"database":{"type":"string","description":"The name of the database."},"schema":{"type":"string","description":"The name of the schema."}},"required":["host","port","database"]},"InformixServer":{"type":"object","title":"InformixServer","properties":{"host":{"type":"string","description":"The host to the Informix server. "},"port":{"type":"integer","description":"The port to the Informix server. Defaults to 9088."},"database":{"type":"string","description":"The name of the database."}},"required":["host","database"]},"CustomServer":{"type":"object","title":"CustomServer","properties":{"account":{"type":"string","description":"Account used by the server."},"catalog":{"type":"string","description":"Name of the catalog."},"database":{"type":"string","description":"Name of the database."},"dataset":{"type":"string","description":"Name of the dataset."},"delimiter":{"type":"string","description":"Delimiter."},"endpointUrl":{"type":"string","description":"Server endpoint.","format":"uri"},"format":{"type":"string","description":"File format."},"host":{"type":"string","description":"Host name or IP address."},"location":{"type":"string","description":"A URL to a location.","format":"uri"},"path":{"type":"string","description":"Relative or absolute path to the data file(s)."},"port":{"type":"integer","description":"Port to the server. No default value is assumed for custom servers."},"project":{"type":"string","description":"Project name."},"region":{"type":"string","description":"Cloud region."},"regionName":{"type":"string","description":"Region name."},"schema":{"type":"string","description":"Name of the schema."},"serviceName":{"type":"string","description":"Name of the service."},"stagingDir":{"type":"string","description":"Staging directory."},"warehouse":{"type":"string","description":"Name of the cluster or warehouse."}}},"KafkaServer":{"type":"object","title":"KafkaServer","description":"Kafka Server","properties":{"host":{"type":"string","description":"The bootstrap server of the kafka cluster."},"format":{"type":"string","description":"The format of the messages.","examples":["json","avro","protobuf","xml"],"default":"json"}},"required":["host"]},"KinesisServer":{"type":"object","title":"KinesisDataStreamsServer","description":"Kinesis Data Streams Server","properties":{"region":{"type":"string","description":"AWS region.","examples":["eu-west-1"]},"format":{"type":"string","description":"The format of the record","examples":["json","avro","protobuf"]}}},"LocalServer":{"type":"object","title":"LocalServer","properties":{"path":{"type":"string","description":"The relative or absolute path to the data file(s).","examples":["./folder/data.parquet","./folder/*.parquet"]},"format":{"type":"string","description":"The format of the file(s)","examples":["json","parquet","delta","csv"]}},"required":["path","format"]},"MySqlServer":{"type":"object","title":"MySqlServer","properties":{"host":{"type":"string","description":"The host of the MySql server."},"port":{"type":"integer","description":"The port of the MySql server."},"database":{"type":"string","description":"The name of the database."}},"required":["host","port","database"]},"OracleServer":{"type":"object","title":"OracleServer","properties":{"host":{"type":"string","description":"The host to the oracle server","examples":["localhost"]},"port":{"type":"integer","description":"The port to the oracle server.","examples":[1523]},"serviceName":{"type":"string","description":"The name of the service.","examples":["service"]}},"required":["host","port","serviceName"]},"PostgresServer":{"type":"object","title":"PostgresServer","properties":{"host":{"type":"string","description":"The host to the Postgres server"},"port":{"type":"integer","description":"The port to the Postgres server."},"database":{"type":"string","description":"The name of the database."},"schema":{"type":"string","description":"The name of the schema in the database."}},"required":["host","port","database","schema"]},"PrestoServer":{"type":"object","title":"PrestoServer","properties":{"host":{"type":"string","description":"The host to the Presto server","examples":["localhost:8080"]},"catalog":{"type":"string","description":"The name of the catalog.","examples":["postgres"]},"schema":{"type":"string","description":"The name of the schema.","examples":["public"]}},"required":["host"]},"PubSubServer":{"type":"object","title":"PubSubServer","properties":{"project":{"type":"string","description":"The GCP project name."}},"required":["project"]},"RedshiftServer":{"type":"object","title":"RedshiftServer","properties":{"host":{"type":"string","description":"An optional string describing the server."},"database":{"type":"string","description":"The name of the database."},"schema":{"type":"string","description":"The name of the schema."},"region":{"type":"string","description":"AWS region of Redshift server.","examples":["us-east-1"]},"account":{"type":"string","description":"The account used by the server."}},"required":["database","schema"]},"S3Server":{"type":"object","title":"S3Server","properties":{"location":{"type":"string","format":"uri","description":"S3 URL, starting with `s3://`","examples":["s3://datacontract-example-orders-latest/data/{model}/*.json"]},"endpointUrl":{"type":"string","format":"uri","description":"The server endpoint for S3-compatible servers.","examples":["https://minio.example.com"]},"format":{"type":"string","enum":["parquet","delta","json","csv"],"description":"File format."},"delimiter":{"type":"string","enum":["new_line","array"],"description":"Only for format = json. How multiple json documents are delimited within one file"}},"required":["location"]},"SftpServer":{"type":"object","title":"SftpServer","properties":{"location":{"type":"string","format":"uri","pattern":"^sftp://.*","description":"SFTP URL, starting with `sftp://`","examples":["sftp://123.123.12.123/{model}/*.json"]},"format":{"type":"string","enum":["parquet","delta","json","csv"],"description":"File format."},"delimiter":{"type":"string","enum":["new_line","array"],"description":"Only for format = json. How multiple json documents are delimited within one file"}},"required":["location"]},"SnowflakeServer":{"type":"object","title":"SnowflakeServer","properties":{"host":{"type":"string","description":"The host to the Snowflake server"},"port":{"type":"integer","description":"The port to the Snowflake server."},"account":{"type":"string","description":"The Snowflake account used by the server."},"database":{"type":"string","description":"The name of the database."},"schema":{"type":"string","description":"The name of the schema."},"warehouse":{"type":"string","description":"The name of the cluster of resources that is a Snowflake virtual warehouse."}},"required":["account","database","schema"]},"SqlserverServer":{"type":"object","title":"SqlserverServer","properties":{"host":{"type":"string","description":"The host to the database server","examples":["localhost"]},"port":{"type":"integer","description":"The port to the database server.","default":1433,"examples":[1433]},"database":{"type":"string","description":"The name of the database.","examples":["database"]},"schema":{"type":"string","description":"The name of the schema in the database.","examples":["dbo"]}},"required":["host","database","schema"]},"SynapseServer":{"type":"object","title":"SynapseServer","properties":{"host":{"type":"string","description":"The host of the Synapse server."},"port":{"type":"integer","description":"The port of the Synapse server."},"database":{"type":"string","description":"The name of the database."}},"required":["host","port","database"]},"TrinoServer":{"type":"object","title":"TrinoServer","properties":{"host":{"type":"string","description":"The Trino host URL.","examples":["localhost"]},"port":{"type":"integer","description":"The Trino port."},"catalog":{"type":"string","description":"The name of the catalog.","examples":["hive"]},"schema":{"type":"string","description":"The name of the schema in the database.","examples":["my_schema"]}},"required":["host","port","catalog","schema"]},"VerticaServer":{"type":"object","title":"VerticaServer","properties":{"host":{"type":"string","description":"The host of the Vertica server."},"port":{"type":"integer","description":"The port of the Vertica server."},"database":{"type":"string","description":"The name of the database."},"schema":{"type":"string","description":"The name of the schema."}},"required":["host","port","database","schema"]}},"SchemaElement":{"type":"object","properties":{"name":{"type":"string","description":"Name of the element."},"physicalType":{"type":"string","description":"The physical element data type in the data source.","examples":["table","view","topic","file"]},"description":{"type":"string","description":"Description of the element."},"businessName":{"type":"string","description":"The business name of the element."},"authoritativeDefinitions":{"$ref":"#/$defs/AuthoritativeDefinitions"},"tags":{"$ref":"#/$defs/Tags"},"customProperties":{"$ref":"#/$defs/CustomProperties"}}},"SchemaObject":{"type":"object","properties":{"logicalType":{"type":"string","description":"The logical element data type.","enum":["object"]},"physicalName":{"type":"string","description":"Physical name.","examples":["table_1_2_0"]},"dataGranularityDescription":{"type":"string","description":"Granular level of the data in the object.","examples":["Aggregation by country"]},"properties":{"type":"array","description":"A list of properties for the object.","items":{"$ref":"#/$defs/SchemaProperty"}},"quality":{"$ref":"#/$defs/DataQualityChecks"}},"allOf":[{"$ref":"#/$defs/SchemaElement"}],"required":["name"],"unevaluatedProperties":false},"SchemaBaseProperty":{"type":"object","properties":{"primaryKey":{"type":"boolean","description":"Boolean value specifying whether the element is primary or not. Default is false."},"primaryKeyPosition":{"type":"integer","default":-1,"description":"If element is a primary key, the position of the primary key element. Starts from 1. Example of `account_id, name` being primary key columns, `account_id` has primaryKeyPosition 1 and `name` primaryKeyPosition 2. Default to -1."},"logicalType":{"type":"string","description":"The logical element data type.","enum":["string","date","number","integer","object","array","boolean"]},"logicalTypeOptions":{"type":"object","description":"Additional optional metadata to describe the logical type."},"physicalType":{"type":"string","description":"The physical element data type in the data source. For example, VARCHAR(2), DOUBLE, INT."},"physicalName":{"type":"string","description":"Physical name.","examples":["col_str_a"]},"required":{"type":"boolean","default":false,"description":"Indicates if the element may contain Null values; possible values are true and false. Default is false."},"unique":{"type":"boolean","default":false,"description":"Indicates if the element contains unique values; possible values are true and false. Default is false."},"partitioned":{"type":"boolean","default":false,"description":"Indicates if the element is partitioned; possible values are true and false."},"partitionKeyPosition":{"type":"integer","default":-1,"description":"If element is used for partitioning, the position of the partition element. Starts from 1. Example of `country, year` being partition columns, `country` has partitionKeyPosition 1 and `year` partitionKeyPosition 2. Default to -1."},"classification":{"type":"string","description":"Can be anything, like confidential, restricted, and public to more advanced categorization. Some companies like PayPal, use data classification indicating the class of data in the element; expected values are 1, 2, 3, 4, or 5.","examples":["confidential","restricted","public"]},"encryptedName":{"type":"string","description":"The element name within the dataset that contains the encrypted element value. For example, unencrypted element `email_address` might have an encryptedName of `email_address_encrypt`."},"transformSourceObjects":{"type":"array","description":"List of objects in the data source used in the transformation.","items":{"type":"string"}},"transformLogic":{"type":"string","description":"Logic used in the element transformation."},"transformDescription":{"type":"string","description":"Describes the transform logic in very simple terms."},"examples":{"type":"array","description":"List of sample element values.","items":{"$ref":"#/$defs/AnyType"}},"criticalDataElement":{"type":"boolean","default":false,"description":"True or false indicator; If element is considered a critical data element (CDE) then true else false."},"quality":{"$ref":"#/$defs/DataQualityChecks"}},"allOf":[{"$ref":"#/$defs/SchemaElement"},{"if":{"properties":{"logicalType":{"const":"string"}}},"then":{"properties":{"logicalTypeOptions":{"type":"object","properties":{"minLength":{"type":"integer","minimum":0,"description":"Minimum length of the string."},"maxLength":{"type":"integer","minimum":0,"description":"Maximum length of the string."},"pattern":{"type":"string","description":"Regular expression pattern to define valid value. Follows regular expression syntax from ECMA-262 (https://262.ecma-international.org/5.1/#sec-15.10.1)."},"format":{"type":"string","examples":["password","byte","binary","email","uuid","uri","hostname","ipv4","ipv6"],"description":"Provides extra context about what format the string follows."}},"additionalProperties":false}}}},{"if":{"properties":{"logicalType":{"const":"date"}}},"then":{"properties":{"logicalTypeOptions":{"type":"object","properties":{"format":{"type":"string","examples":["yyyy-MM-dd","yyyy-MM-dd HH:mm:ss","HH:mm:ss"],"description":"Format of the date. Follows the format as prescribed by [JDK DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html). For example, format 'yyyy-MM-dd'."},"exclusiveMaximum":{"type":"boolean","default":false,"description":"If set to true, all values are strictly less than the maximum value (values < maximum). Otherwise, less than or equal to the maximum value (values <= maximum)."},"maximum":{"type":"string","description":"All date values are less than or equal to this value (values <= maximum)."},"exclusiveMinimum":{"type":"boolean","default":false,"description":"If set to true, all values are strictly greater than the minimum value (values > minimum). Otherwise, greater than or equal to the minimum value (values >= minimum)."},"minimum":{"type":"string","description":"All date values are greater than or equal to this value (values >= minimum)."}},"additionalProperties":false}}}},{"if":{"anyOf":[{"properties":{"logicalType":{"const":"integer"}}}]},"then":{"properties":{"logicalTypeOptions":{"type":"object","properties":{"multipleOf":{"type":"number","exclusiveMinimum":0,"description":"Values must be multiples of this number. For example, multiple of 5 has valid values 0, 5, 10, -5."},"maximum":{"type":"number","description":"All values are less than or equal to this value (values <= maximum)."},"exclusiveMaximum":{"type":"boolean","default":false,"description":"If set to true, all values are strictly less than the maximum value (values < maximum). Otherwise, less than or equal to the maximum value (values <= maximum)."},"minimum":{"type":"number","description":"All values are greater than or equal to this value (values >= minimum)."},"exclusiveMinimum":{"type":"boolean","default":false,"description":"If set to true, all values are strictly greater than the minimum value (values > minimum). Otherwise, greater than or equal to the minimum value (values >= minimum)."},"format":{"type":"string","default":"i32","description":"Format of the value in terms of how many bits of space it can use and whether it is signed or unsigned (follows the Rust integer types).","enum":["i8","i16","i32","i64","i128","u8","u16","u32","u64","u128"]}},"additionalProperties":false}}}},{"if":{"anyOf":[{"properties":{"logicalType":{"const":"number"}}}]},"then":{"properties":{"logicalTypeOptions":{"type":"object","properties":{"multipleOf":{"type":"number","exclusiveMinimum":0,"description":"Values must be multiples of this number. For example, multiple of 5 has valid values 0, 5, 10, -5."},"maximum":{"type":"number","description":"All values are less than or equal to this value (values <= maximum)."},"exclusiveMaximum":{"type":"boolean","default":false,"description":"If set to true, all values are strictly less than the maximum value (values < maximum). Otherwise, less than or equal to the maximum value (values <= maximum)."},"minimum":{"type":"number","description":"All values are greater than or equal to this value (values >= minimum)."},"exclusiveMinimum":{"type":"boolean","default":false,"description":"If set to true, all values are strictly greater than the minimum value (values > minimum). Otherwise, greater than or equal to the minimum value (values >= minimum)."},"format":{"type":"string","default":"i32","description":"Format of the value in terms of how many bits of space it can use (follows the Rust float types).","enum":["f32","f64"]}},"additionalProperties":false}}}},{"if":{"properties":{"logicalType":{"const":"object"}}},"then":{"properties":{"logicalTypeOptions":{"type":"object","properties":{"maxProperties":{"type":"integer","minimum":0,"description":"Maximum number of properties."},"minProperties":{"type":"integer","minimum":0,"default":0,"description":"Minimum number of properties."},"required":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true,"description":"Property names that are required to exist in the object."}},"additionalProperties":false},"properties":{"type":"array","description":"A list of properties for the object.","items":{"$ref":"#/$defs/SchemaProperty"}}}}},{"if":{"properties":{"logicalType":{"const":"array"}}},"then":{"properties":{"logicalTypeOptions":{"type":"object","properties":{"maxItems":{"type":"integer","minimum":0,"description":"Maximum number of items."},"minItems":{"type":"integer","minimum":0,"default":0,"description":"Minimum number of items"},"uniqueItems":{"type":"boolean","default":false,"description":"If set to true, all items in the array are unique."}},"additionalProperties":false},"items":{"$ref":"#/$defs/SchemaItemProperty","description":"List of items in an array (only applicable when `logicalType: array`)."}}}}]},"SchemaProperty":{"type":"object","$ref":"#/$defs/SchemaBaseProperty","required":["name"],"unevaluatedProperties":false},"SchemaItemProperty":{"type":"object","$ref":"#/$defs/SchemaBaseProperty","properties":{"properties":{"type":"array","description":"A list of properties for the object.","items":{"$ref":"#/$defs/SchemaProperty"}}},"unevaluatedProperties":false},"Tags":{"type":"array","description":"A list of tags that may be assigned to the elements (object or property); the tags keyword may appear at any level. Tags may be used to better categorize an element. For example, `finance`, `sensitive`, `employee_record`.","examples":["finance","sensitive","employee_record"],"items":{"type":"string"}},"DataQuality":{"type":"object","properties":{"authoritativeDefinitions":{"$ref":"#/$defs/AuthoritativeDefinitions"},"businessImpact":{"type":"string","description":"Consequences of the rule failure.","examples":["operational","regulatory"]},"customProperties":{"type":"array","description":"Additional properties required for rule execution.","items":{"$ref":"#/$defs/CustomProperty"}},"description":{"type":"string","description":"Describe the quality check to be completed."},"dimension":{"type":"string","description":"The key performance indicator (KPI) or dimension for data quality.","enum":["accuracy","completeness","conformity","consistency","coverage","timeliness","uniqueness"]},"method":{"type":"string","examples":["reconciliation"]},"name":{"type":"string","description":"Name of the data quality check."},"schedule":{"type":"string","description":"Rule execution schedule details.","examples":["0 20 * * *"]},"scheduler":{"type":"string","description":"The name or type of scheduler used to start the data quality check.","examples":["cron"]},"severity":{"type":"string","description":"The severance of the quality rule.","examples":["info","warning","error"]},"tags":{"$ref":"#/$defs/Tags"},"type":{"type":"string","description":"The type of quality check. 'text' is human-readable text that describes the quality of the data. 'library' is a set of maintained predefined quality attributes such as row count or unique. 'sql' is an individual SQL query that returns a value that can be compared. 'custom' is quality attributes that are vendor-specific, such as Soda or Great Expectations.","enum":["text","library","sql","custom"],"default":"library"},"unit":{"type":"string","description":"Unit the rule is using, popular values are `rows` or `percent`, but any value is allowed.","examples":["rows","percent"]}},"allOf":[{"if":{"properties":{"type":{"const":"library"}}},"then":{"$ref":"#/$defs/DataQualityLibrary"}},{"if":{"properties":{"type":{"const":"sql"}},"required":["type"]},"then":{"$ref":"#/$defs/DataQualitySql"}},{"if":{"properties":{"type":{"const":"custom"}},"required":["type"]},"then":{"$ref":"#/$defs/DataQualityCustom"}}]},"DataQualityChecks":{"type":"array","description":"Data quality rules with all the relevant information for rule setup and execution.","items":{"$ref":"#/$defs/DataQuality"}},"DataQualityLibrary":{"type":"object","properties":{"rule":{"type":"string","description":"Define a data quality check based on the predefined rules as per ODCS.","examples":["duplicateCount","validValues","rowCount"]},"mustBe":{"description":"Must be equal to the value to be valid. When using numbers, it is equivalent to '='."},"mustNotBe":{"description":"Must not be equal to the value to be valid. When using numbers, it is equivalent to '!='."},"mustBeGreaterThan":{"type":"number","description":"Must be greater than the value to be valid. It is equivalent to '>'."},"mustBeGreaterOrEqualTo":{"type":"number","description":"Must be greater than or equal to the value to be valid. It is equivalent to '>='."},"mustBeLessThan":{"type":"number","description":"Must be less than the value to be valid. It is equivalent to '<'."},"mustBeLessOrEqualTo":{"type":"number","description":"Must be less than or equal to the value to be valid. It is equivalent to '<='."},"mustBeBetween":{"type":"array","description":"Must be between the two numbers to be valid. Smallest number first in the array.","minItems":2,"maxItems":2,"uniqueItems":true,"items":{"type":"number"}},"mustNotBeBetween":{"type":"array","description":"Must not be between the two numbers to be valid. Smallest number first in the array.","minItems":2,"maxItems":2,"uniqueItems":true,"items":{"type":"number"}}},"required":["rule"]},"DataQualitySql":{"type":"object","properties":{"query":{"type":"string","description":"Query string that adheres to the dialect of the provided server.","examples":["SELECT COUNT(*) FROM ${table} WHERE ${column} IS NOT NULL"]}},"required":["query"]},"DataQualityCustom":{"type":"object","properties":{"engine":{"type":"string","description":"Name of the engine which executes the data quality checks.","examples":["soda","great-expectations","monte-carlo","dbt"]},"implementation":{"oneOf":[{"type":"string"},{"type":"object"}]}},"required":["engine","implementation"]},"AuthoritativeDefinitions":{"type":"array","description":"List of links to sources that provide more details on the dataset; examples would be a link to an external definition, a training video, a git repo, data catalog, or another tool. Authoritative definitions follow the same structure in the standard.","items":{"type":"object","properties":{"url":{"type":"string","description":"URL to the authority."},"type":{"type":"string","description":"Type of definition for authority: v2.3 adds standard values: `businessDefinition`, `transformationImplementation`, `videoTutorial`, `tutorial`, and `implementation`.","examples":["businessDefinition","transformationImplementation","videoTutorial","tutorial","implementation"]}},"required":["url","type"]}},"Support":{"type":"array","description":"Top level for support channels.","items":{"$ref":"#/$defs/SupportItem"}},"SupportItem":{"type":"object","properties":{"channel":{"type":"string","description":"Channel name or identifier."},"url":{"type":"string","description":"Access URL using normal [URL scheme](https://en.wikipedia.org/wiki/URL#Syntax) (https, mailto, etc.)."},"description":{"type":"string","description":"Description of the channel, free text."},"tool":{"type":"string","description":"Name of the tool, value can be `email`, `slack`, `teams`, `discord`, `ticket`, or `other`.","examples":["email","slack","teams","discord","ticket","other"]},"scope":{"type":"string","description":"Scope can be: `interactive`, `announcements`, `issues`.","examples":["interactive","announcements","issues"]},"invitationUrl":{"type":"string","description":"Some tools uses invitation URL for requesting or subscribing. Follows the [URL scheme](https://en.wikipedia.org/wiki/URL#Syntax)."}},"required":["channel","url"]},"Pricing":{"type":"object","properties":{"priceAmount":{"type":"number","description":"Subscription price per unit of measure in `priceUnit`."},"priceCurrency":{"type":"string","description":"Currency of the subscription price in `price.priceAmount`."},"priceUnit":{"type":"string","description":"The unit of measure for calculating cost. Examples megabyte, gigabyte."}}},"Team":{"type":"object","properties":{"username":{"type":"string","description":"The user's username or email.","examples":["mail@example.com","uid12345678"]},"name":{"type":"string","description":"The user's name.","examples":["Jane Doe"]},"description":{"type":"string","description":"The user's description."},"role":{"type":"string","description":"The user's job role; Examples might be owner, data steward. There is no limit on the role."},"dateIn":{"type":"string","format":"date","description":"The date when the user joined the team."},"dateOut":{"type":"string","format":"date","description":"The date when the user ceased to be part of the team."},"replacedByUsername":{"type":"string","description":"The username of the user who replaced the previous user."}}},"Role":{"type":"object","properties":{"role":{"type":"string","description":"Name of the IAM role that provides access to the dataset."},"description":{"type":"string","description":"Description of the IAM role and its permissions."},"access":{"type":"string","description":"The type of access provided by the IAM role."},"firstLevelApprovers":{"type":"string","description":"The name(s) of the first-level approver(s) of the role."},"secondLevelApprovers":{"type":"string","description":"The name(s) of the second-level approver(s) of the role."},"customProperties":{"$ref":"#/$defs/CustomProperties"}},"required":["role"]},"ServiceLevelAgreementProperty":{"type":"object","properties":{"property":{"type":"string","description":"Specific property in SLA, check the periodic table. May requires units (more details to come)."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"null"}],"description":"Agreement value. The label will change based on the property itself."},"valueExt":{"$ref":"#/$defs/AnyNonCollectionType","description":"Extended agreement value. The label will change based on the property itself."},"unit":{"type":"string","description":"**d**, day, days for days; **y**, yr, years for years, etc. Units use the ISO standard."},"element":{"type":"string","description":"Element(s) to check on. Multiple elements should be extremely rare and, if so, separated by commas."},"driver":{"type":"string","description":"Describes the importance of the SLA from the list of: `regulatory`, `analytics`, or `operational`.","examples":["regulatory","analytics","operational"]}},"required":["property","value"]},"CustomProperties":{"type":"array","description":"A list of key/value pairs for custom properties.","items":{"$ref":"#/$defs/CustomProperty"}},"CustomProperty":{"type":"object","properties":{"property":{"type":"string","description":"The name of the key. Names should be in camel case\u2013the same as if they were permanent properties in the contract."},"value":{"$ref":"#/$defs/AnyType","description":"The value of the key."}}},"AnyType":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"null"},{"type":"array"},{"type":"object"}]},"AnyNonCollectionType":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"null"}]}}}
</schema>

[User] Provide a JSON object that satisfies the schema "Open Data Contract Standard (ODCS)". Here are the required top‑level fields: version, apiVersion, kind, id, status. Return only the valid JSON object.

Open Data Contract Standard (ODCS)

An open data contract specification to establish agreement between data producers and consumers.

Current version of the data contract.

The kind of file this is. Valid value is `DataContract`.

Version of the standard used to build data contract. Default value is v3.0.2.

A unique identifier used to reduce the risk of dataset name collisions, such as a UUID.

Name of the data contract.

Indicates the property the data is primarily associated with. Value is case insensitive.

Current status of the dataset.

proposed draft active deprecated retired

List of servers where the datasets reside.

The name of the data product.

High level description of the dataset.

Intended usage of the dataset.

Purpose of the dataset.

Limitations of the dataset.

Name of the logical data domain.

A list of elements within the schema to be cataloged.

A list of roles that will provide user access to the dataset.

Element (using the element path notation) to do the checks on.

A list of key/value pairs for SLA specific properties. There is no limit on the type of properties (more details to come).

Timestamp in UTC of when the data contract was created.

Data source details of where data is physically stored.

Identifier of the server.

Type of the server.

api athena azure bigquery clickhouse databricks denodo dremio duckdb glue cloudsql db2 informix kafka kinesis local mysql oracle postgresql postgres presto pubsub redshift s3 sftp snowflake sqlserver synapse trino vertica custom

Description of the server.

Environment of the server.

List of roles that have access to the server.

AthenaServer

The url to the API.

AthenaServer

Amazon Athena automatically stores query results and metadata information for each query that runs in a query result location that you can specify in Amazon S3.

Identify the schema in the data source in which your tables exist.

Identify the name of the Data Source, also referred to as a Catalog.

The region your AWS account uses.

AzureServer

Fully qualified path to Azure Blob Storage or Azure Data Lake Storage (ADLS), supports globs.

File format.

Only for format = json. How multiple json documents are delimited within one file

BigQueryServer

The GCP project name.

The GCP dataset name.

ClickHouseServer

The host of the ClickHouse server.

The port to the ClickHouse server.

The name of the database.

DatabricksServer

The Databricks host

The name of the Hive or Unity catalog

The schema name in the catalog

DenodoServer

The host of the Denodo server.

The port of the Denodo server.

The name of the database.

DremioServer

The host of the Dremio server.

The port of the Dremio server.

The name of the schema.

DuckdbServer

Path to duckdb database file.

The name of the schema.

GlueServer

The AWS Glue account

The AWS Glue database name

The AWS S3 path. Must be in the form of a URL.

The format of the files

GoogleCloudSqlServer

The host of the Google Cloud Sql server.

The port of the Google Cloud Sql server.

The name of the database.

The name of the schema.

IBMDB2Server

The host of the IBM DB2 server.

The port of the IBM DB2 server.

The name of the database.

The name of the schema.

InformixServer

The host to the Informix server.

The port to the Informix server. Defaults to 9088.

The name of the database.

CustomServer

Account used by the server.

Name of the catalog.

Name of the database.

Name of the dataset.

Delimiter.

Server endpoint.

File format.

Host name or IP address.

A URL to a location.

Relative or absolute path to the data file(s).

Port to the server. No default value is assumed for custom servers.

Project name.

Cloud region.

Region name.

Name of the schema.

Name of the service.

Staging directory.

Name of the cluster or warehouse.

KafkaServer

Kafka Server

The bootstrap server of the kafka cluster.

The format of the messages.

KinesisDataStreamsServer

Kinesis Data Streams Server

AWS region.

The format of the record

LocalServer

The relative or absolute path to the data file(s).

The format of the file(s)

MySqlServer

The host of the MySql server.

The port of the MySql server.

The name of the database.

OracleServer

The host to the oracle server

The port to the oracle server.

The name of the service.

PostgresServer

The host to the Postgres server

The port to the Postgres server.

The name of the database.

The name of the schema in the database.

PrestoServer

The host to the Presto server

The name of the catalog.

The name of the schema.

PubSubServer

The GCP project name.

RedshiftServer

An optional string describing the server.

The name of the database.

The name of the schema.

AWS region of Redshift server.

The account used by the server.

S3Server

S3 URL, starting with `s3://`

The server endpoint for S3-compatible servers.

File format.

SftpServer

SFTP URL, starting with `sftp://`

File format.

SnowflakeServer

The host to the Snowflake server

The port to the Snowflake server.

The Snowflake account used by the server.

The name of the database.

The name of the schema.

The name of the cluster of resources that is a Snowflake virtual warehouse.

SqlserverServer

The host to the database server

The port to the database server.

The name of the database.

The name of the schema in the database.

SynapseServer

The host of the Synapse server.

The port of the Synapse server.

The name of the database.

TrinoServer

The Trino host URL.

The Trino port.

The name of the catalog.

The name of the schema in the database.

VerticaServer

The host of the Vertica server.

The port of the Vertica server.

The name of the database.

The name of the schema.

Name of the element.

The physical element data type in the data source.

Description of the element.

The business name of the element.

The logical element data type.

Physical name.

Granular level of the data in the object.

A list of properties for the object.

Boolean value specifying whether the element is primary or not. Default is false.

If element is a primary key, the position of the primary key element. Starts from 1. Example of `account_id, name` being primary key columns, `account_id` has primaryKeyPosition 1 and `name` primaryKeyPosition 2. Default to -1.

The logical element data type.

string date number integer object array boolean

Additional optional metadata to describe the logical type.

The physical element data type in the data source. For example, VARCHAR(2), DOUBLE, INT.

Physical name.

Indicates if the element may contain Null values; possible values are true and false. Default is false.

Indicates if the element contains unique values; possible values are true and false. Default is false.

Indicates if the element is partitioned; possible values are true and false.

If element is used for partitioning, the position of the partition element. Starts from 1. Example of `country, year` being partition columns, `country` has partitionKeyPosition 1 and `year` partitionKeyPosition 2. Default to -1.

Can be anything, like confidential, restricted, and public to more advanced categorization. Some companies like PayPal, use data classification indicating the class of data in the element; expected values are 1, 2, 3, 4, or 5.

The element name within the dataset that contains the encrypted element value. For example, unencrypted element `email_address` might have an encryptedName of `email_address_encrypt`.

List of objects in the data source used in the transformation.

Logic used in the element transformation.

Describes the transform logic in very simple terms.

List of sample element values.

True or false indicator; If element is considered a critical data element (CDE) then true else false.

Minimum length of the string.

Maximum length of the string.

Regular expression pattern to define valid value. Follows regular expression syntax from ECMA-262 (https://262.ecma-international.org/5.1/#sec-15.10.1).

password byte binary email uuid uri hostname ipv4 ipv6

Provides extra context about what format the string follows.

Format of the date. Follows the format as prescribed by [JDK DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html). For example, format 'yyyy-MM-dd'.

If set to true, all values are strictly less than the maximum value (values < maximum). Otherwise, less than or equal to the maximum value (values <= maximum).

All date values are less than or equal to this value (values <= maximum).

If set to true, all values are strictly greater than the minimum value (values > minimum). Otherwise, greater than or equal to the minimum value (values >= minimum).

All date values are greater than or equal to this value (values >= minimum).

Values must be multiples of this number. For example, multiple of 5 has valid values 0, 5, 10, -5.

All values are less than or equal to this value (values <= maximum).

All values are greater than or equal to this value (values >= minimum).

Format of the value in terms of how many bits of space it can use and whether it is signed or unsigned (follows the Rust integer types).

Format of the value in terms of how many bits of space it can use (follows the Rust float types).

Maximum number of properties.

Minimum number of properties.

Property names that are required to exist in the object.

A list of properties for the object.

Maximum number of items.

Minimum number of items

If set to true, all items in the array are unique.

List of items in an array (only applicable when `logicalType: array`).

A list of properties for the object.

A list of tags that may be assigned to the elements (object or property); the tags keyword may appear at any level. Tags may be used to better categorize an element. For example, `finance`, `sensitive`, `employee_record`.

Consequences of the rule failure.

Additional properties required for rule execution.

Describe the quality check to be completed.

The key performance indicator (KPI) or dimension for data quality.

accuracy completeness conformity consistency coverage timeliness uniqueness

Name of the data quality check.

Rule execution schedule details.

The name or type of scheduler used to start the data quality check.

The severance of the quality rule.

The type of quality check. 'text' is human-readable text that describes the quality of the data. 'library' is a set of maintained predefined quality attributes such as row count or unique. 'sql' is an individual SQL query that returns a value that can be compared. 'custom' is quality attributes that are vendor-specific, such as Soda or Great Expectations.

Unit the rule is using, popular values are `rows` or `percent`, but any value is allowed.

Data quality rules with all the relevant information for rule setup and execution.

Define a data quality check based on the predefined rules as per ODCS.

Must be equal to the value to be valid. When using numbers, it is equivalent to '='.

Must not be equal to the value to be valid. When using numbers, it is equivalent to '!='.

Must be greater than the value to be valid. It is equivalent to '>'.

Must be greater than or equal to the value to be valid. It is equivalent to '>='.

Must be less than the value to be valid. It is equivalent to '<'.

Must be less than or equal to the value to be valid. It is equivalent to '<='.

Must be between the two numbers to be valid. Smallest number first in the array.

Must not be between the two numbers to be valid. Smallest number first in the array.

Query string that adheres to the dialect of the provided server.

SELECT COUNT(*) FROM ${table} WHERE ${column} IS NOT NULL

Name of the engine which executes the data quality checks.

List of links to sources that provide more details on the dataset; examples would be a link to an external definition, a training video, a git repo, data catalog, or another tool. Authoritative definitions follow the same structure in the standard.

URL to the authority.

Type of definition for authority: v2.3 adds standard values: `businessDefinition`, `transformationImplementation`, `videoTutorial`, `tutorial`, and `implementation`.

businessDefinition transformationImplementation videoTutorial tutorial implementation

Top level for support channels.

Channel name or identifier.

Access URL using normal [URL scheme](https://en.wikipedia.org/wiki/URL#Syntax) (https, mailto, etc.).

Description of the channel, free text.

Name of the tool, value can be `email`, `slack`, `teams`, `discord`, `ticket`, or `other`.

Scope can be: `interactive`, `announcements`, `issues`.

Some tools uses invitation URL for requesting or subscribing. Follows the [URL scheme](https://en.wikipedia.org/wiki/URL#Syntax).

Subscription price per unit of measure in `priceUnit`.

Currency of the subscription price in `price.priceAmount`.

The unit of measure for calculating cost. Examples megabyte, gigabyte.

The user's username or email.

The user's name.

The user's description.

The user's job role; Examples might be owner, data steward. There is no limit on the role.

The date when the user joined the team.

The date when the user ceased to be part of the team.

The username of the user who replaced the previous user.

Name of the IAM role that provides access to the dataset.

Description of the IAM role and its permissions.

The type of access provided by the IAM role.

The name(s) of the first-level approver(s) of the role.

The name(s) of the second-level approver(s) of the role.

Specific property in SLA, check the periodic table. May requires units (more details to come).

Agreement value. The label will change based on the property itself.

Extended agreement value. The label will change based on the property itself.

**d**, day, days for days; **y**, yr, years for years, etc. Units use the ISO standard.

Element(s) to check on. Multiple elements should be extremely rare and, if so, separated by commas.

Describes the importance of the SLA from the list of: `regulatory`, `analytics`, or `operational`.

A list of key/value pairs for custom properties.

The name of the key. Names should be in camel case–the same as if they were permanent properties in the contract.

The value of the key.

Provide a JSON object that satisfies the schema "Open Data Contract Standard (ODCS)". Here are the required top‑level fields: version, apiVersion, kind, id, status. Return only the valid JSON object.


[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://raw.githubusercontent.com/OPEN-NEXT/OKH-LOSH/master/okh-losh.schema.json","$comment":"NOTE: The properties 'ui-hidden' and 'ui-recommended' used in this schema, are non-standardized, and currently unused. They could be used to create a form, and are here for consistency with <https://git.iostud.io/makernet/iop-cdb/-/blob/dev/server/assets/okh.okhdf>.","$defs":{"agent":{"description":"A person or organization","anyOf":[{"$ref":"#/$defs/person"},{"$ref":"#/$defs/organization"}]},"auxiliary":{"description":"relative or absolute path to files that are neither source files nor their exports, but still useful in the repository (e.g. KiCAD library files);\\\nmultiple inputs possible (with one entry each)","examples":["lib/lib1.lib",".mdlrc",["lib/lib1.lib",".mdlrc"]],"anyOf":[{"$ref":"#/$defs/relPathOrWebUrl"},{"type":"array","items":{"$ref":"#/$defs/relPathOrWebUrl"}}]},"bom":{"$ref":"#/$defs/relPathOrWebUrl","description":"URL or repo-relative path to the bill of materials","examples":["sBoM.csv","BOM.csv","bom.csv"]},"cpcId":{"$comment":"Get a CPC-ID from here <https://worldwide.espacenet.com/classification>","examples":["A01B33/00","A41G","A01","A","B23K","B25J9/026","B62K","B63C","D03D 35/00","D03D 5/00","D06B","F16M 11/2078","F16M11/2078","G01N","G05B","G06C 7/02","H01H","H01Q","H02J","H02J 1/00","H04","H04W","H05K","Y02P","H02J 1/00","H02J 1/12","H02J 1/123","H02J 1/1234","H02J 1/12345","H02J 1/123456",["D03D 35/00","D03D 5/00"]],"anyOf":[{"type":"string","pattern":"^[A-HY][0-9]{2}[A-HJ-NP-Z]( ?[12]?[0-9]{1,3}[/][0-9]{2,6})?$"},{"type":"array","items":{"type":"string","pattern":"^[A-HY][0-9]{2}[A-HJ-NP-Z]( ?[12]?[0-9]{1,3}[/][0-9]{2,6})?$"}}]},"date":{"examples":["2000-04-06","0001-0-0","1984-10-1"],"type":"string","format":"date"},"email":{"examples":["jane.doe@email.com","john.doe@email.com","ester.something@good.org"],"type":"string","format":"email"},"export":{"description":"relative or absolute path to export file (e.g. STEP export of 3D model or PDF export of drawing);\\\nmultiple inputs possible (with one entry each)","examples":["3D-parts/assembly.stp","public/user-manual.pdf",["3D-parts/assembly.stp","public/user-manual.pdf"]],"anyOf":[{"$ref":"#/$defs/relPathOrWebUrl"},{"type":"array","items":{"$ref":"#/$defs/relPathOrWebUrl"}}]},"lang-text":{"description":"a text and the language it is written in","type":"object","additionalProperties":false,"required":["text","language"],"properties":{"text":{"description":"the text content","type":"string"},"language":{"$ref":"#/$defs/language","description":"The BCP 47 language tag the content is written in"}}},"image":{"description":"a single image reference (project relative path or absolute URL), optionally with additional meta-data","type":"object","additionalProperties":false,"examples":[{"location":"res/media/img/logo.svg","depicts":"This OSH projects logo"},{"location":"res/media/img/liquid-flow.svg","depicts":"A diagram depicting the flow of the different liquids through the machine in an abstract manner"},{"location":"res/media/img/liquid-flow.svg","depicts":"A photo of the finished hardware, taken with a white background."},{"location":"res/media/img/liquid-flow.svg","depicts":{"text":"A photo of the finished hardware, taken with a white background.","language":"en"}},{"location":"res/media/img/liquid-flow.svg","depicts":[{"text":"A photo of the finished hardware, taken with a white background.","language":"en"},{"text":"Ein Foto der fertigen Maschiene, aufgenommen vor einem weissen Hintergrund.","language":"de"}]}],"required":["location"],"properties":{"location":{"$ref":"#/$defs/relPathOrWebUrl","description":"Project relative path or absolute URL linking to the image file"},"depicts":{"description":"Human oriented description of what is visible in the image.\nThis matters for example:\n- for visually impaired or blind people\n- in case the image is for some reason not available\n- to put as a caption next to the image","anyOf":[{"type":"string"},{"$ref":"#/$defs/lang-text"},{"type":"array","items":{"$ref":"#/$defs/lang-text"}}]},"slots":{"description":"Denotes the slot the image fills within the subject it belongs to.\nYou may also think of it as the 'role' the image plays for its parent.\nThe available slots are predefined,\nsee the [OKH image slots](http://w3id.org/oseg/ont/okhimg#slots);\nthere you will also read about the ability to define custom ones,\nthough you might also consider proposing a new common tag\n[in an issue](https://github.com/iop-alliance/OpenKnowHow/issues/new).\nAn image can fill multiple slots,\nbut each slot can be filled at most once.\nThis is useful for things like the projects icon,\nor the left-side view of the 3D model.","type":"array","items":{"type":"string","oneOf":[{"pattern":"^c_[0-9a-z._-]+$"},{"enum":["icon-main","icon-main-bw","logo","logo-bw","model-3d","model-from-back","model-from-below","model-from-front","model-from-left","model-from-right","model-from-above","model-main","organization-logo","organization-logo-bw","photo-packaging","photo-thing-main","social","symbol"]}]}},"tags":{"description":"Links to a tag fit to describe the image.\nThe available tags are predefined,\nsee the [OKH image tags](http://w3id.org/oseg/ont/okhimg#tags);\nthere you will also read about the ability to define custom ones,\nthough you might also consider proposing a new common tag\n[in an issue](https://github.com/iop-alliance/OpenKnowHow/issues/new).\nAn image can have multiple tags\nand each tag can be used by multiple images\neven within a single project.","type":"array","items":{"type":"string","oneOf":[{"pattern":"^c_[0-9a-z._-]+$"},{"enum":["art","bw","color","diagram","drawing","gray","icon","logo","model","photo","screenshot"]}]}}}},"images":{"description":"one or more image references, with or without additional meta-data","examples":["res/media/img/logo.svg","res/media/img/liquid-flow.svg","res/assets/media/img/hw-photo.png","https://image-hoster-xzy.net/accounts/our-user/our-project/our-image.png",["res/media/img/logo.svg","res/media/img/liquid-flow.svg","res/assets/media/img/hw-photo.png","https://image-hoster-xzy.net/accounts/our-user/our-project/our-image.png"],{"location":"res/media/img/logo.svg","depicts":"This OSH projects logo"},{"location":"res/media/img/liquid-flow.svg","depicts":"A diagram depicting the flow of the different liquids through the machine in an abstract manner"},{"location":"res/media/img/liquid-flow.svg","depicts":"A photo of the finished hardware, taken with a white background"},{"location":"https://image-hoster-xzy.net/accounts/our-user/our-project/our-image.png","depicts":"Community supplied photo of the underbelly of our machine"},[{"location":"res/media/img/logo.svg","depicts":"This OSH projects logo"},{"location":"res/media/img/liquid-flow.svg","depicts":"A diagram depicting the flow of the different liquids through the machine in an abstract manner"},{"location":"res/media/img/liquid-flow.svg","depicts":"A photo of the finished hardware, taken with a white background."},{"location":"https://image-hoster-xzy.net/accounts/our-user/our-project/our-image.png","depicts":"Community supplied photo of the underbelly of our machine"}]],"anyOf":[{"$ref":"#/$defs/relPathOrWebUrl"},{"$ref":"#/$defs/image"},{"type":"array","items":{"$ref":"#/$defs/relPathOrWebUrl"}},{"type":"array","items":{"$ref":"#/$defs/image"}}]},"language":{"$comment":"autocomplete","description":"Language as a BCP 47 language tag","examples":["en","de","es","zh"],"type":"string","pattern":"^(((en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((([A-Za-z]{2,3}(-([A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-([A-Za-z]{4}))?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-([0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(x(-[A-Za-z0-9]{1,8})+))?)|(x(-[A-Za-z0-9]{1,8})+))$"},"mass":{"description":"Mass of the part in g (grams).","type":"number","exclusiveMinimum":0},"name":{"description":"working title of the OSH Module or Part","type":"string"},"organization":{"description":"An organization such as a school, NGO, corporation, club, etc.","type":"object","properties":{"email":{"$ref":"#/$defs/email","description":"E-Mail of the organization"},"name":{"description":"Name of the organization","type":"string"},"url":{"$ref":"#/$defs/webUrl","description":"Home-page of the organization"}}},"outerDimensions":{"description":"Outer dimensions of the OSH module or part in mm (millimeters), which completely encompass the product.","type":"object","additionalProperties":false,"required":["width","depth","height"],"properties":{"depth":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0},"width":{"type":"number","exclusiveMinimum":0}}},"person":{"description":"A person (alive, dead, undead, or fictional)","type":"object","properties":{"email":{"$ref":"#/$defs/email","description":"E-Mail of the person"},"name":{"description":"Full name of the person","type":"string"},"url":{"$ref":"#/$defs/webUrl","description":"Home-page of the person"}}},"relPath":{"$comment":"A relative file-path to a dir or file below the root - as much as one can check for that with a regex","type":"string","not":{"anyOf":[{"$comment":"no protocol","pattern":"^[a-z]*:"},{"$comment":"no URL-absolute path without protocol","pattern":"^//"},{"$comment":"no parent-dir-references","pattern":"(?:.*/)?\\.\\.(?:/.*)?"}]}},"relPathOrWebUrl":{"type":"string","anyOf":[{"$ref":"#/$defs/webUrl"},{"$ref":"#/$defs/relPath"}]},"source":{"description":"relative or absolute path to source file (e.g. native CAD file);\\\nmultiple inputs possible (with one entry each)","examples":["3D-parts/assembly.asm","pcb/main.pro","pcb/main.kicad_pcb","cad/part-x/model.fcstd",["pcb/main.kicad_pcb","cad/part-x/model.fcstd"]],"anyOf":[{"$ref":"#/$defs/relPathOrWebUrl"},{"type":"array","items":{"$ref":"#/$defs/relPathOrWebUrl"}}]},"spdxLicenseExpression":{"$comment":"TODO We would have to define this in an extra schema, generated -> do it in the SPDX-Identifiers-generator repo! -> NOPE -> already exists! see https://github.com/spdx/spdx-spec/issues/484#issuecomment-720817111    .. sounds like it needs to be improved, though -> .. ahh nope, it does not solve our issue, but checks SPDX documents for validity","description":"A valid SPDX license expression","type":"string"},"tsdc":{"$comment":"autocomplete","description":"identifier of the applying Technology-specific Documentation Criteria (TsDC) according to DIN SPEC 3105-1 - get it from: <https://w3id.org/oseg/ont/tsdc/core> - multiple inputs possible (with one entry each)","examples":["ASM","MEC","CIR","PCB","WEL","3DP","LAS","CNC",["ASM","MEC","CIR"]],"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"webUrl":{"$comment":"A full web URL","type":"string","pattern":"^https?://","format":"uri"}},"title":"Manifest","description":"This is a JSON-Schema which can validate an 'okh.toml' file, which holds an Open Source Hardware (OSH) projects Open Know-How (OKH) meta-data.","type":"object","additionalProperties":false,"allOf":[{"if":{"required":["tsdc"],"properties":{"tsdc":{"type":"array","contains":{"const":"3DP"}}}},"then":{"properties":{"material":{"type":"string"},"printing-process":{"enum":["FDM","SLA","SLS","MJF","DMLS"]}}}},{"if":{"required":["tsdc"],"properties":{"tsdc":{"type":"array","contains":{"const":"PCB"}}}},"then":{"properties":{"component-sides":{"type":"number"},"2d-size-mm":{"type":"array","maxItems":2,"minItems":2,"items":{"type":"number"}}}}}],"required":["okhv","name","repo","license","licensor","function"],"properties":{"$schema":{"description":"Link to OKH JSON-Schema","type":"string","enum":["https://www.schemastore.org/okh.json","https://w3id.org/oseg/schema/okh.json"]},"attestation":{"description":"reference to one or multiple valid attestation(s) that the documentation is complete and fully qualifies as open source hardware;\\\nissuing conformity assessment bodies according to DIN SPEC 3105-2:\\\n- [Open Hardware Observatory](https://en.oho.wiki/wiki/Request_certification_for_your_project)\\\n- [Open Source Ecology Germany](https://gitlab.opensourceecology.de/verein/projekte/cab/CAB)\\\n- [OSHWA certification programme](https://certification.oshwa.org/)","anyOf":[{"$ref":"#/$defs/relPathOrWebUrl"},{"type":"array","items":{"$ref":"#/$defs/relPathOrWebUrl"}}]},"auxiliary":{"$ref":"#/$defs/auxiliary"},"bom":{"$ref":"#/$defs/bom"},"contribution-guide":{"$ref":"#/$defs/relPathOrWebUrl","description":"repo-relative path to the contribution guide","examples":["CONTRIBUTING.md","CONTRIB.md","CONTRIBUTING","CONTRIB"]},"cpc-patent-class":{"$ref":"#/$defs/cpcId","description":"patent class identifier of the Cooperative Patent Classification that describes best the field of technology of the OSH module.\\\nGet it from here: <https://worldwide.espacenet.com/classification>"},"documentation-language":{"description":"IETF BCP 47 language tag for the language in which the documentation is written","anyOf":[{"type":"array","items":{"$ref":"#/$defs/language"}},{"$ref":"#/$defs/language"}]},"documentation-readiness-level":{"description":"ODRL-ID representing the development stage of the documentation; get it from: <https://w3id.org/oseg/ont/otrl>","default":"ODRL-1","oneOf":[{"title":"Documentation process commenced","description":"Published information under free open source license","const":"ODRL-1"},{"title":"Collaborative documentation in progress","description":"Provision of documentation files and in editable formats enabling collaboration development","const":"ODRL-2"},{"title":"Full documentation published","description":"Complete documentation as per DIN SPEC 3105-1","const":"ODRL-3"},{"title":"Full documentation published & audited","description":"Public evidence of documentation maturity","const":"ODRL-3*"},{"title":"Full documentation for product qualification","description":"Product qualification documents published enabling decentralized commercial distribution","const":"ODRL-4"}]},"export":{"$ref":"#/$defs/export"},"forkOf":{"$ref":"#/$defs/webUrl"},"function":{"description":"functional description, e.g. what it actually does, what problem it solves, for whom, under which conditions etc.\\\nSo if you wish that someone finds & uses your OSH specifically e.g. for COVID-19-crisis response, include relevant keywords in this field","examples":["A fully programmable, impeccably built, open source, split mechanical keyboard designed for extreme productivity and ergonomics.","A Handibot tool is a new kind of portable, digitally-controlled power tool for cutting, drilling, carving, and many other machining operations - the first Universal Digital Power Tool (UDPT) - or just, a Smart Tool. If you're familiar with industrial CNC (computer numerically controlled) equipment, think of the Handibot tool as a portable version of CNC. ","A tandem bicycle, with practically the same size, weight, and cost of a standard bicycle.","CARLA is a resistant bicycle trailer, which can be coupled with any regular bike and can transport easily 150 kg load. CARLA distinguishes itself for the outstanding agility and a very small turning circle. CARLA bicycle trailer is very well in tune with e-bikes for example, with a mid-motor.","FarmBot Genesis is top-of-the-line FarmBot model designed with the most features and flexibility. It is suitable for growing food with the highest level of precision, running complex experiments, and capable of being easily modified and extended to do more.","Flipper Zero is a multi tool device for geeks with a curious personality of a cyber-dolphin who really loves to hack. It can interact with digital systems in real life and grow while you are hacking. The idea of Flipper Zero is to combine all the phreaking hardware tools you'd need for hacking on the go.","GEK Gasifier comes as an assemble-yourself kit that provides stand-alone wood gas for a variety of end uses.","Inkplate 6 is a powerful, Wi-Fi enabled ESP32 based six-inch e-paper display - recycled from a Kindle e-reader.","KORUZA innovates the design of a free-space optical communication system reusing mass produced Small Form-factor Pluggable (SFP) electro-optical transceivers, combining the latest advances in low-cost 3D printing using the Fused Deposition Modelling (F DM) method with bare-minimum custom electronics design.","LittleRP is an Open Source Resin 3D Printer ","mechanical setup for the COSI Measure","MNT Reform is the radical, ultimate open hardware laptop, designed and assembled in Berlin.","OpenEVSE supplies open source charging station hardware and software solutions to manufactures and individuals. ","OpenROV is a DIY telerobotics community centered around underwater exploration & adventure.","Opentrons makes robots for biologists. The robots automate experiments that would otherwise be done by hand, allowing our users to spend more time pursuing answers to the 21st century's most important questions, and less time pipetting.","The AXIOM Beta is an open source, open hardware, professional-grade digital film camera made by apertus\u00b0. It is designed to be modular e.g. interchangeable sensor front end etc. and supports recording at 4K resolution.","The Corne is a 40% split mechanical USB general purpose keyboard. It is made up of two halves with 3x6 column staggered keys and 3 thumb keys. It has full RGB back-lighting, and is fully programmable using the popular Open Source QMK firmware. The basic design principles are, to have a minimal, ergonomically arranged set of keys that are all reachable by moving a finger by at most a distance of one key in diagonal.","The Corne keyboard is a split keyboard with 3x6 column staggered keys and 3 thumb keys, based on Helix. Crkbd stands for Corne Keyboard.","The Electric Eel Wheel is an affordable electric spinning wheel that is revolutionizing the fiber world!  The uptake is controlled with a unique scotch tension design and the yarn flows through a clever flyer assembly. It is an extremely light and portable design.","The goal of GliaX-Faceshield is to create a low cost, high quality, reusable face shield that can be quickly deployed.","The Lasersaur is a beautiful laser cutter with an outstanding price-performance ratio. We designed it to fill the need of makers, designers, architects and researchers who want a safe and highly-capable machine. Unlike others it's open source and comes fully loaded with knowledge to run, maintain, and modify.","The robot having functional characteristics of animal such as Run, Walk, Crawl, Walk and run in different heights and take push ups operated autonomously and via android app.","This charge controller is a so-called maximum power point tracker (MPPT), which automatically adapts its input voltage to the connected solar panel to extracts as much power as possible. The MPPT function can only be achieved using a DC/DC converter, which is the core part of the charge controller PCB. It can be recognized by the large inductor and the large electrolytic input and output filter capacitors."],"type":"string"},"image":{"$ref":"#/$defs/images"},"license":{"$comment":"NOTE: When no SPDX key is found by the crawler, metadata might not be indexed on the server until the alternative license has been whitelisted by maintainers. At OKH, we need to make sure that all results indexed by our own server instance are actually open source.","$ref":"#/$defs/spdxLicenseExpression","description":"An SPDX license _expression\n(see: <https://spdx.github.io/spdx-spec/v2-draft/SPDX-license-expressions/>),\nusually a single SPDX license ID\n(see complete list: <https://spdx.org/licenses/>),\nor a combination of those,\ncombined with AND or OR.\nIf your license is not SPDX registered (yet),\nuse a custom string prefixed with 'LicenseRef-',\nfor example 'LicenseRef-MyVeryOwnLicense-1.3';\nplease use the 'SPDX identifier' from\n<https://scancode-licensedb.aboutcode.org/>,\nif your license is there but not SPDX registered.\nUse 'LicenseRef-NOASSERTION' if no license is specified,\n'LicenseRef-NONE' if no license is specified\n(which usually means: all rights reserved),\nor 'LicenseRef-AllRightsReserved' or similar\nfor projects clearly indicating that they are proprietary.","examples":["GPL-3.0-or-later","AGPL-3.0-or-later","GPL-3.0-only","AGPL-3.0-only","0BSD","CC0-1.0","CC-BY-SA-4.0","CC-BY-4.0","Unlicense","LicenseRef-NOASSERTION","LicenseRef-NONE","LicenseRef-AllRightsReserved","LicenseRef-RandomNonSpdxRegisteredLicense","LicenseRef-MyVeryOwnLicense"]},"licensor":{"description":"organization/individual behind the hardware design (holder of intellectual property)","examples":["John Doe <john.doe@email.com>","Jane Doe (FSF) <jane.doe@email.com>","Michael Mueller <mm@email.com>","Jinz Jixxer (OSI) <jj@email.com>","Pru Ner (GNU) <abc@email.com>",["John Doe <john.doe@email.com>","Jane Doe (FSF) <jane.doe@email.com>"],{"email":"john.doe@email.com","name":"John Doe"},{"email":"jane.doe@email.com","memberOf":"FSF","name":"Jane Doe"},[{"email":"john.doe@email.com","name":"John Doe"},{"email":"jane.doe@email.com","memberOf":"FSF","name":"Jane Doe"}]],"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"array","items":{"$ref":"#/$defs/agent"}},{"$ref":"#/$defs/agent"}]},"manufacturing-instructions":{"description":"URL or repo-relative path to manufacturing instructions; multiple inputs possible (with one entry each)","examples":["Documentation/Assembly_Guide/AssemblyGuide.md"],"anyOf":[{"$ref":"#/$defs/relPathOrWebUrl"},{"type":"array","items":{"$ref":"#/$defs/relPathOrWebUrl"}}]},"mass":{"$ref":"#/$defs/mass"},"name":{"$ref":"#/$defs/name","description":"Working title of the OSH component"},"okhv":{"$comment":"ui-hidden","description":"version of OKH specification the OSH projects metadata follows (different version \u2192 different data fields in this file)","const":"OKH-LOSHv1.0"},"organization":{"description":"organization of the licensor or that represents (some of) the contributors of to project","examples":["Free Software Foundation","Open Source Initiative","Open Source Hardware Association","Open Source Ecology","Open Source Ecology Germany",["Free Software Foundation","Open Source Initiative"],{"name":"Free Software Foundation","url":"https://www.fsf.org"},[{"name":"Free Software Foundation","url":"https://www.fsf.org"},{"name":"Open Source Ecology Germany","url":"https://ose-germany.de"}]],"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"$ref":"#/$defs/organization"},{"type":"array","items":{"$ref":"#/$defs/organization"}}]},"outer-dimensions":{"$ref":"#/$defs/outerDimensions"},"part":{"description":"physical component of this open source hardware module, for which technical documentation (design files etc.) is available under a free/open license","type":"array","items":{"type":"object","additionalProperties":false,"required":["name"],"oneOf":[{"required":["source"],"properties":{"source":{}}},{"required":["export"],"properties":{"export":{}}}],"properties":{"auxiliary":{"$ref":"#/$defs/auxiliary"},"export":{"$ref":"#/$defs/export"},"image":{"$ref":"#/$defs/images"},"mass":{"$ref":"#/$defs/mass"},"name":{"$ref":"#/$defs/name"},"outer-dimensions":{"$ref":"#/$defs/outerDimensions"},"source":{"$ref":"#/$defs/source"},"tsdc":{"$ref":"#/$defs/tsdc"}}}},"rdf":{"description":"repo-relative path (or absolute HTTP(S) URL) to to the corresponding ReadMe, which is the (human) entry-point into (the sources of) an OSH project","type":"object","additionalProperties":false,"required":["namespace"],"properties":{"namespace":{"type":"string","examples":["http://w3id.org/my-org/projects/proj-x#","http://w3id.org/my-comp/projects/proj-x#"]},"prefix":{"type":"string","examples":["prjx","myorg-prjx","mycomp-prjx"]}}},"readme":{"$ref":"#/$defs/relPathOrWebUrl","description":"repo-relative path (or absolute HTTP(S) URL) to to the corresponding ReadMe, which is the (human) entry-point into (the sources of) an OSH project","examples":["README.md","README.txt","README","README-JP.md","README-JP"]},"release":{"$ref":"#/$defs/relPathOrWebUrl","description":"URL or repo local path to the release package of this version of the OSH module"},"repo":{"$ref":"#/$defs/webUrl","description":"URL to the (human browsable) place where development happens;\ntypically a (git) repository or Wiki page.\nFollowing this link, people should be able to contribute to the development:\nreporting issues, suggesting changes, connecting to the team etc."},"software":{"description":"associated software package used to operate this piece of open source hardware","type":"array","items":{"type":"object","additionalProperties":false,"required":["release"],"properties":{"installation-guide":{"$ref":"#/$defs/relPathOrWebUrl","description":"unambiguous reference to the installation guide for the corresponding software release","examples":["https://github.com/arduino/ArduinoCore-mbed/blob/a2c06d768f5ebb6821ae6505b2032ee58f4ef70d/README.md"]},"release":{"$ref":"#/$defs/relPathOrWebUrl","description":"unambiguous reference to the software release used for this version of the OSH module","examples":["https://github.com/arduino/ArduinoCore-mbed/releases/tag/1.3.2"]}}}},"source":{"$ref":"#/$defs/source"},"standard-compliance":{"description":"document-number of the official standard the OSH module complies;\\\nmultiple inputs possible (with one entry each)","examples":["DIN SPEC 3105","DIN EN 1335","ISO 1337",["DIN SPEC 3105","ISO 1337"]],"type":"array","items":{"type":"string"}},"technology-readiness-level":{"description":"OTRL-ID representing the development stage of the OSH module; get it from: <https://w3id.org/oseg/ont/otrl>","default":"OTRL-1","oneOf":[{"title":"Ideation","description":"Product idea; needs are identified and initial specifications are defined","const":"OTRL-1"},{"title":"Conception","description":"Mature product concept has been formulated","const":"OTRL-2"},{"title":"Development","description":"Product model is developed","const":"OTRL-3"},{"title":"Prototyping and testing","description":"Full functional prototype is built and tested","const":"OTRL-4"},{"title":"Manufacturing development","description":"Fairly reliable processes identified and characterized","const":"OTRL-5"},{"title":"Product qualification","description":"Certificate marking conformity assessment or comparable","const":"OTRL-6"}]},"tsdc":{"$ref":"#/$defs/tsdc"},"user-manual":{"$ref":"#/$defs/relPathOrWebUrl","description":"URL or repo-relative path to user manual","examples":["Documentation/User_Guide/UserGuide.md"]},"version":{"description":"version of this Module, preferably following the [semantic versioning-scheme v2.0.0](https://semver.org/#semantic-versioning-200)","examples":["2.3.4","1.0.0-alpha","1.0.0-alpha.1","1.0.0-alpha.beta","1.0.0-beta","1.0.0-beta.2","1.0.0-beta.11","1.0.0-rc.1","1.0.0","0.0.1-24-g6a8a3a7","v0.3.1","6a8a3a7","baf0e65d8d93e1b64e883dfd2ffc5b838a22ca25"],"type":"string"}}}
</schema>

[User] Provide a JSON object that satisfies the schema "Manifest". Here are the required top‑level fields: okhv, name, repo, license, licensor, function. Return only the valid JSON object.

NOTE: The properties 'ui-hidden' and 'ui-recommended' used in this schema, are non-standardized, and currently unused. They could be used to create a form, and are here for consistency with <https://git.iostud.io/makernet/iop-cdb/-/blob/dev/server/assets/okh.okhdf>.

A person or organization

relative or absolute path to files that are neither source files nor their exports, but still useful in the repository (e.g. KiCAD library files);\
multiple inputs possible (with one entry each)

URL or repo-relative path to the bill of materials

Get a CPC-ID from here <https://worldwide.espacenet.com/classification>

relative or absolute path to export file (e.g. STEP export of 3D model or PDF export of drawing);\
multiple inputs possible (with one entry each)

a text and the language it is written in

the text content

The BCP 47 language tag the content is written in

a single image reference (project relative path or absolute URL), optionally with additional meta-data

A diagram depicting the flow of the different liquids through the machine in an abstract manner

A photo of the finished hardware, taken with a white background.

A photo of the finished hardware, taken with a white background.

Ein Foto der fertigen Maschiene, aufgenommen vor einem weissen Hintergrund.

Project relative path or absolute URL linking to the image file

Human oriented description of what is visible in the image.
This matters for example:
- for visually impaired or blind people
- in case the image is for some reason not available
- to put as a caption next to the image

Denotes the slot the image fills within the subject it belongs to.
You may also think of it as the 'role' the image plays for its parent.
The available slots are predefined,
see the [OKH image slots](http://w3id.org/oseg/ont/okhimg#slots);
there you will also read about the ability to define custom ones,
though you might also consider proposing a new common tag
[in an issue](https://github.com/iop-alliance/OpenKnowHow/issues/new).
An image can fill multiple slots,
but each slot can be filled at most once.
This is useful for things like the projects icon,
or the left-side view of the 3D model.

icon-main icon-main-bw logo logo-bw model-3d model-from-back model-from-below model-from-front model-from-left model-from-right model-from-above model-main organization-logo organization-logo-bw photo-packaging photo-thing-main social symbol

Links to a tag fit to describe the image.
The available tags are predefined,
see the [OKH image tags](http://w3id.org/oseg/ont/okhimg#tags);
there you will also read about the ability to define custom ones,
though you might also consider proposing a new common tag
[in an issue](https://github.com/iop-alliance/OpenKnowHow/issues/new).
An image can have multiple tags
and each tag can be used by multiple images
even within a single project.

art bw color diagram drawing gray icon logo model photo screenshot

one or more image references, with or without additional meta-data

A photo of the finished hardware, taken with a white background

Community supplied photo of the underbelly of our machine

Language as a BCP 47 language tag

Mass of the part in g (grams).

working title of the OSH Module or Part

An organization such as a school, NGO, corporation, club, etc.

E-Mail of the organization

Name of the organization

Home-page of the organization

Outer dimensions of the OSH module or part in mm (millimeters), which completely encompass the product.

A person (alive, dead, undead, or fictional)

E-Mail of the person

Full name of the person

Home-page of the person

A relative file-path to a dir or file below the root - as much as one can check for that with a regex

relative or absolute path to source file (e.g. native CAD file);\
multiple inputs possible (with one entry each)

TODO We would have to define this in an extra schema, generated -> do it in the SPDX-Identifiers-generator repo! -> NOPE -> already exists! see https://github.com/spdx/spdx-spec/issues/484#issuecomment-720817111    .. sounds like it needs to be improved, though -> .. ahh nope, it does not solve our issue, but checks SPDX documents for validity

A valid SPDX license expression

identifier of the applying Technology-specific Documentation Criteria (TsDC) according to DIN SPEC 3105-1 - get it from: <https://w3id.org/oseg/ont/tsdc/core> - multiple inputs possible (with one entry each)

Manifest

This is a JSON-Schema which can validate an 'okh.toml' file, which holds an Open Source Hardware (OSH) projects Open Know-How (OKH) meta-data.

okhv name repo license licensor function

Link to OKH JSON-Schema

reference to one or multiple valid attestation(s) that the documentation is complete and fully qualifies as open source hardware;\
issuing conformity assessment bodies according to DIN SPEC 3105-2:\
- [Open Hardware Observatory](https://en.oho.wiki/wiki/Request_certification_for_your_project)\
- [Open Source Ecology Germany](https://gitlab.opensourceecology.de/verein/projekte/cab/CAB)\
- [OSHWA certification programme](https://certification.oshwa.org/)

repo-relative path to the contribution guide

patent class identifier of the Cooperative Patent Classification that describes best the field of technology of the OSH module.\
Get it from here: <https://worldwide.espacenet.com/classification>

IETF BCP 47 language tag for the language in which the documentation is written

ODRL-ID representing the development stage of the documentation; get it from: <https://w3id.org/oseg/ont/otrl>

Documentation process commenced

Published information under free open source license

Collaborative documentation in progress

Provision of documentation files and in editable formats enabling collaboration development

Full documentation published

Complete documentation as per DIN SPEC 3105-1

Full documentation published & audited

Public evidence of documentation maturity

Full documentation for product qualification

Product qualification documents published enabling decentralized commercial distribution

functional description, e.g. what it actually does, what problem it solves, for whom, under which conditions etc.\
So if you wish that someone finds & uses your OSH specifically e.g. for COVID-19-crisis response, include relevant keywords in this field

A fully programmable, impeccably built, open source, split mechanical keyboard designed for extreme productivity and ergonomics.

A Handibot tool is a new kind of portable, digitally-controlled power tool for cutting, drilling, carving, and many other machining operations - the first Universal Digital Power Tool (UDPT) - or just, a Smart Tool. If you're familiar with industrial CNC (computer numerically controlled) equipment, think of the Handibot tool as a portable version of CNC.

A tandem bicycle, with practically the same size, weight, and cost of a standard bicycle.

CARLA is a resistant bicycle trailer, which can be coupled with any regular bike and can transport easily 150 kg load. CARLA distinguishes itself for the outstanding agility and a very small turning circle. CARLA bicycle trailer is very well in tune with e-bikes for example, with a mid-motor.

FarmBot Genesis is top-of-the-line FarmBot model designed with the most features and flexibility. It is suitable for growing food with the highest level of precision, running complex experiments, and capable of being easily modified and extended to do more.

Flipper Zero is a multi tool device for geeks with a curious personality of a cyber-dolphin who really loves to hack. It can interact with digital systems in real life and grow while you are hacking. The idea of Flipper Zero is to combine all the phreaking hardware tools you'd need for hacking on the go.

GEK Gasifier comes as an assemble-yourself kit that provides stand-alone wood gas for a variety of end uses.

Inkplate 6 is a powerful, Wi-Fi enabled ESP32 based six-inch e-paper display - recycled from a Kindle e-reader.

KORUZA innovates the design of a free-space optical communication system reusing mass produced Small Form-factor Pluggable (SFP) electro-optical transceivers, combining the latest advances in low-cost 3D printing using the Fused Deposition Modelling (F DM) method with bare-minimum custom electronics design.

LittleRP is an Open Source Resin 3D Printer

MNT Reform is the radical, ultimate open hardware laptop, designed and assembled in Berlin.

OpenEVSE supplies open source charging station hardware and software solutions to manufactures and individuals.

OpenROV is a DIY telerobotics community centered around underwater exploration & adventure.

Opentrons makes robots for biologists. The robots automate experiments that would otherwise be done by hand, allowing our users to spend more time pursuing answers to the 21st century's most important questions, and less time pipetting.

The AXIOM Beta is an open source, open hardware, professional-grade digital film camera made by apertus°. It is designed to be modular e.g. interchangeable sensor front end etc. and supports recording at 4K resolution.

The Corne is a 40% split mechanical USB general purpose keyboard. It is made up of two halves with 3x6 column staggered keys and 3 thumb keys. It has full RGB back-lighting, and is fully programmable using the popular Open Source QMK firmware. The basic design principles are, to have a minimal, ergonomically arranged set of keys that are all reachable by moving a finger by at most a distance of one key in diagonal.

The Corne keyboard is a split keyboard with 3x6 column staggered keys and 3 thumb keys, based on Helix. Crkbd stands for Corne Keyboard.

The Electric Eel Wheel is an affordable electric spinning wheel that is revolutionizing the fiber world!  The uptake is controlled with a unique scotch tension design and the yarn flows through a clever flyer assembly. It is an extremely light and portable design.

The goal of GliaX-Faceshield is to create a low cost, high quality, reusable face shield that can be quickly deployed.

The Lasersaur is a beautiful laser cutter with an outstanding price-performance ratio. We designed it to fill the need of makers, designers, architects and researchers who want a safe and highly-capable machine. Unlike others it's open source and comes fully loaded with knowledge to run, maintain, and modify.

The robot having functional characteristics of animal such as Run, Walk, Crawl, Walk and run in different heights and take push ups operated autonomously and via android app.

This charge controller is a so-called maximum power point tracker (MPPT), which automatically adapts its input voltage to the connected solar panel to extracts as much power as possible. The MPPT function can only be achieved using a DC/DC converter, which is the core part of the charge controller PCB. It can be recognized by the large inductor and the large electrolytic input and output filter capacitors.

NOTE: When no SPDX key is found by the crawler, metadata might not be indexed on the server until the alternative license has been whitelisted by maintainers. At OKH, we need to make sure that all results indexed by our own server instance are actually open source.

An SPDX license _expression
(see: <https://spdx.github.io/spdx-spec/v2-draft/SPDX-license-expressions/>),
usually a single SPDX license ID
(see complete list: <https://spdx.org/licenses/>),
or a combination of those,
combined with AND or OR.
If your license is not SPDX registered (yet),
use a custom string prefixed with 'LicenseRef-',
for example 'LicenseRef-MyVeryOwnLicense-1.3';
please use the 'SPDX identifier' from
<https://scancode-licensedb.aboutcode.org/>,
if your license is there but not SPDX registered.
Use 'LicenseRef-NOASSERTION' if no license is specified,
'LicenseRef-NONE' if no license is specified
(which usually means: all rights reserved),
or 'LicenseRef-AllRightsReserved' or similar
for projects clearly indicating that they are proprietary.

organization/individual behind the hardware design (holder of intellectual property)

John Doe <john.doe@email.com>
Jane Doe (FSF) <jane.doe@email.com>

URL or repo-relative path to manufacturing instructions; multiple inputs possible (with one entry each)

Working title of the OSH component

version of OKH specification the OSH projects metadata follows (different version → different data fields in this file)

organization of the licensor or that represents (some of) the contributors of to project

Free Software Foundation
Open Source Initiative

physical component of this open source hardware module, for which technical documentation (design files etc.) is available under a free/open license

repo-relative path (or absolute HTTP(S) URL) to to the corresponding ReadMe, which is the (human) entry-point into (the sources of) an OSH project

URL or repo local path to the release package of this version of the OSH module

URL to the (human browsable) place where development happens;
typically a (git) repository or Wiki page.
Following this link, people should be able to contribute to the development:
reporting issues, suggesting changes, connecting to the team etc.

associated software package used to operate this piece of open source hardware

unambiguous reference to the installation guide for the corresponding software release

unambiguous reference to the software release used for this version of the OSH module

document-number of the official standard the OSH module complies;\
multiple inputs possible (with one entry each)

OTRL-ID representing the development stage of the OSH module; get it from: <https://w3id.org/oseg/ont/otrl>

Ideation

Product idea; needs are identified and initial specifications are defined

Conception

Mature product concept has been formulated

Development

Product model is developed

Prototyping and testing

Full functional prototype is built and tested

Manufacturing development

Fairly reliable processes identified and characterized

Product qualification

Certificate marking conformity assessment or comparable

URL or repo-relative path to user manual

version of this Module, preferably following the [semantic versioning-scheme v2.0.0](https://semver.org/#semantic-versioning-200)

Provide a JSON object that satisfies the schema "Manifest". Here are the required top‑level fields: okhv, name, repo, license, licensor, function. Return only the valid JSON object.