{"version":"products/3","sha256":"sha256:7b6614338fc4d7115a6f941db45a543f19c641e38d62d92efdd69c4edcfa55f2","record_type":"products","field_map":{"id":"id(sidecar:/record_id)","record_id":"id(sidecar:/record_id)","business_uuid":"id(sidecar:/business_uuid)","type":"string($type)","countries":"countries(/countries)","language":"string([\"/language\",\"sidecar:/language\"])","published_at":"timestamp(sidecar:/published_at)","ai_policy_version":"int(sidecar:/ai_policy_version)","adl_origin":"string($record_sha256)","adl_origin_cert":"string(sidecar:/cert_id)","adl_proj":"string($spec_hash)","product_name":"string(/product_name)","short_description":"string(/short_description)","tags":"strings(/tags)","brand":"string(/brand)","vertical":"string(/vertical)","category":"string(/category)","channel":"string(/channel)","availability":"string(/availability)","on_sale":"bool(/on_sale)","gtin":"string(/gtin)","business_product_id":"string(/business_product_id)","image_url":"string(/image_url)","product_url":"string(/product_url)","business_name":"string(sidecar:/business_name)","price_{CC}":"number(/prices/*/amount) per country","price_currency_{CC}":"string(/prices/*/currency) per country"},"rules":{"row":"One row per record (D-40). The row carries countries[] (the ISO 3166-1 alpha-2 codes the record is published for) and, for a product with prices, one price_{CC} (number) and one price_currency_{CC} (ISO 4217) per country on the same row. A field whose source is absent or null is omitted from the row.","canonical_form":"RFC 8785 (JSON Canonicalization Scheme) over the row with the unsigned fields removed.","signature":"ed25519 over DSSE PAE(application/vnd.masterdb.row.v1+json, canonical row bytes); unsigned: adl_row_sig, sponsored, sponsorship_id, excluded_groups, ai_policy_bits"},"definition":{"spec_version":3,"type":"products","version":3,"canonical_form":"RFC 8785 (JSON Canonicalization Scheme) over the row with the unsigned fields removed.","row_signature":{"algorithm":"ed25519","key":"MasterDB's projection key (design §4.7); its public key is in the signed JWK Set at /.well-known/keys with purpose 'projection'.","payload_type":"application/vnd.masterdb.row.v1+json","message":"DSSE PAE(payload_type, canonical row bytes)","added_fields":{"adl_key_id":"RFC 7638 thumbprint of the projection key; inside the signed bytes","adl_row_sig":"base64url (no padding) of the 64-byte Ed25519 signature; not inside the signed bytes"},"unsigned_fields":["adl_row_sig","sponsored","sponsorship_id","excluded_groups","ai_policy_bits"],"serve_time_fields":{"ai_policy_bits":"{ai_policy_version, ai_policy_schema, use, action, blocked}: the bits of the business's sealed AI policy record in force (B-05, D-52, D-55), stamped by the search API when it serves the row (§7.3 step 5); blocked bit n-1 is blocked context bc{n} (the key: GET /v1/ai-policy-key); never stored in the index, never signed — the sealed AI policy record a fetch returns is what proves them"},"verify":"Remove the unsigned fields (a served row's ai_policy_bits among them), canonicalise, PAE with payload_type, verify with the key adl_key_id names. To prove the row came from the record: fetch the record, check the business's seal, re-run this projection with the record's sidecar, set adl_key_id from the served row, and compare the canonical bytes."},"row_rule":"One row per record (D-40). The row carries countries[] (the ISO 3166-1 alpha-2 codes the record is published for) and, for a product with prices, one price_{CC} (number) and one price_currency_{CC} (ISO 4217) per country on the same row. A field whose source is absent or null is omitted from the row.","spine":[{"name":"id","from":"sidecar:/record_id","as":"id","required":true,"use":[],"typesense":null,"basis":"§5.5 spine: one row per record (D-40)"},{"name":"record_id","from":"sidecar:/record_id","as":"id","required":true,"use":["filter","return"],"typesense":{"type":"string","optional":true},"basis":"§5.5 spine"},{"name":"business_uuid","from":"sidecar:/business_uuid","as":"id","required":true,"use":["join","return"],"typesense":{"type":"string","reference":"businesses.business_uuid","async_reference":true,"optional":true},"basis":"§5.5 spine; the D-14 join"},{"name":"type","from":"$type","as":"string","required":true,"use":["filter","return"],"typesense":{"type":"string","facet":true,"optional":true},"basis":"§5.5 spine"},{"name":"countries","from":"countries_from","as":"countries","required":true,"use":["filter"],"typesense":{"type":"string[]","facet":true},"basis":"§5.5 spine, D-40; B-13 names it countries[] everywhere"},{"name":"language","from":["/language","sidecar:/language"],"as":"string","use":["filter","return"],"typesense":{"type":"string","facet":true,"optional":true},"basis":"§5.11, B-13"},{"name":"published_at","from":"sidecar:/published_at","as":"timestamp","required":true,"use":["filter","sort","return"],"typesense":{"type":"int64","optional":true},"basis":"§5.5 spine"},{"name":"ai_policy_version","from":"sidecar:/ai_policy_version","as":"int","use":["return"],"typesense":null,"basis":"§5.5 spine; D-55 (terms_version before v3); the bits are stamped at serve time (§7.3 step 5, B-05)"},{"name":"adl_origin","from":"$record_sha256","as":"string","required":true,"use":["return"],"typesense":null,"basis":"adl-technical-spec §9"},{"name":"adl_origin_cert","from":"sidecar:/cert_id","as":"string","use":["return"],"typesense":null,"basis":"adl-technical-spec §9"},{"name":"adl_proj","from":"$spec_hash","as":"string","required":true,"use":["return"],"typesense":null,"basis":"adl-technical-spec §9"}],"countries_from":["/countries"],"fields":[{"name":"product_name","from":"/product_name","as":"string","use":["search","return"],"typesense":{"type":"string","optional":true},"basis":"D-13"},{"name":"short_description","from":"/short_description","as":"string","use":["search","return"],"typesense":{"type":"string","optional":true},"basis":"D-13"},{"name":"tags","from":"/tags","as":"strings","use":["search","filter","return"],"typesense":{"type":"string[]","optional":true},"basis":"D-13; filter (proposed)"},{"name":"brand","from":"/brand","as":"string","use":["search","filter","return"],"typesense":{"type":"string","optional":true},"basis":"D-13; filter (proposed)"},{"name":"vertical","from":"/vertical","as":"string","use":["filter","return"],"typesense":{"type":"string","facet":true,"optional":true},"basis":"D-13"},{"name":"category","from":"/category","as":"string","use":["filter","return"],"typesense":{"type":"string","facet":true,"optional":true},"basis":"D-13"},{"name":"channel","from":"/channel","as":"string","use":["filter"],"typesense":{"type":"string","optional":true},"basis":"D-13"},{"name":"availability","from":"/availability","as":"string","use":["filter","return"],"typesense":{"type":"string","optional":true},"basis":"D-13"},{"name":"on_sale","from":"/on_sale","as":"bool","use":["filter","return"],"typesense":{"type":"bool","optional":true},"basis":"D-13"},{"name":"gtin","from":"/gtin","as":"string","use":["filter","return"],"typesense":{"type":"string","optional":true},"basis":"D-13"},{"name":"business_product_id","from":"/business_product_id","as":"string","use":["return"],"typesense":null,"basis":"(proposed)"},{"name":"image_url","from":"/image_url","as":"string","use":["return"],"typesense":null,"basis":"D-13"},{"name":"product_url","from":"/product_url","as":"string","use":["return"],"typesense":null,"basis":"D-13"},{"name":"business_name","from":"sidecar:/business_name","as":"string","use":["return"],"typesense":null,"basis":"D-13 (from trading_name)"}],"per_country":{"from":"/prices","country":"country","currency":"currency","amount":"amount","amount_field":"price_{CC}","currency_field":"price_currency_{CC}","rule":"one pair of fields per entry whose country is among the row's countries; the first entry for a country wins; the amount is a decimal string written as a number","typesense":[{"name":"price_[A-Z][A-Z].*","type":"float","optional":true},{"name":"price_currency_[A-Z][A-Z].*","type":"string","optional":true}],"basis":"D-40"}},"spec_version":3,"unsigned_fields":["adl_row_sig","sponsored","sponsorship_id","excluded_groups","ai_policy_bits"],"serve_time_fields":["freshness_expectation"]}