@authorizedretailers/spec 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +66 -47
  2. package/dist/constants.d.ts +25 -6
  3. package/dist/constants.js +41 -7
  4. package/dist/identity.d.ts +29 -14
  5. package/dist/identity.js +79 -39
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +2 -0
  8. package/dist/jws.d.ts +36 -5
  9. package/dist/jws.js +48 -14
  10. package/dist/match.d.ts +21 -0
  11. package/dist/match.js +89 -0
  12. package/dist/product.d.ts +34 -0
  13. package/dist/product.js +75 -0
  14. package/dist/published.d.ts +14 -8
  15. package/dist/published.js +32 -10
  16. package/dist/schemas.d.ts +366 -88
  17. package/dist/schemas.js +802 -178
  18. package/dist/types.d.ts +121 -47
  19. package/dist/types.js +2 -2
  20. package/dist/validate.d.ts +24 -10
  21. package/dist/validate.js +302 -82
  22. package/fixtures/list/invalid/list-all-mixed.json +53 -0
  23. package/fixtures/list/invalid/list-amazon-missing-seller-id.json +51 -0
  24. package/fixtures/list/invalid/list-amazon-on-walmart-domain.json +52 -0
  25. package/fixtures/{file/invalid/full-attached-jws.json → list/invalid/list-attached-jws.json} +14 -12
  26. package/fixtures/list/invalid/list-bad-asin.json +102 -0
  27. package/fixtures/list/invalid/list-bad-gtin.json +102 -0
  28. package/fixtures/list/invalid/list-brand-exclusion-no-catalog.json +57 -0
  29. package/fixtures/list/invalid/list-duplicate-asin.json +102 -0
  30. package/fixtures/{file/invalid/full-duplicate-authorization-id.json → list/invalid/list-duplicate-authorization-id.json} +23 -18
  31. package/fixtures/list/invalid/list-duplicate-gtin.json +102 -0
  32. package/fixtures/list/invalid/list-duplicate-product-id.json +102 -0
  33. package/fixtures/{file/invalid/full-empty-territories.json → list/invalid/list-empty-territories.json} +17 -10
  34. package/fixtures/list/invalid/list-exclude-unknown-product.json +105 -0
  35. package/fixtures/list/invalid/list-expires-field.json +53 -0
  36. package/fixtures/list/invalid/list-extra-property.json +53 -0
  37. package/fixtures/list/invalid/list-generic-web-no-territories.json +39 -0
  38. package/fixtures/list/invalid/list-gtin-11-digits.json +102 -0
  39. package/fixtures/list/invalid/list-impossible-date.json +53 -0
  40. package/fixtures/list/invalid/list-lowercase-territory.json +52 -0
  41. package/fixtures/{file/invalid/full-signature-missing-kid.json → list/invalid/list-marketplace-field.json} +14 -11
  42. package/fixtures/list/invalid/list-marketplace-territory-mismatch.json +52 -0
  43. package/fixtures/list/invalid/list-missing-revocation-id.json +51 -0
  44. package/fixtures/list/invalid/list-missing-scope.json +44 -0
  45. package/fixtures/list/invalid/list-missing-stale-until.json +51 -0
  46. package/fixtures/list/invalid/list-name-only-retailer.json +36 -0
  47. package/fixtures/list/invalid/list-no-channels.json +37 -0
  48. package/fixtures/list/invalid/list-non-utc-timestamp.json +52 -0
  49. package/fixtures/list/invalid/list-not-public-with-authorizations.json +18 -0
  50. package/fixtures/list/invalid/list-not-public-with-catalog.json +18 -0
  51. package/fixtures/list/invalid/list-physical.json +43 -0
  52. package/fixtures/list/invalid/list-product-no-identifier.json +98 -0
  53. package/fixtures/list/invalid/list-scope-no-products.json +49 -0
  54. package/fixtures/{file/valid/full-signed.json → list/invalid/list-single-domain.json} +12 -12
  55. package/fixtures/list/invalid/list-stale-over-24-hours.json +52 -0
  56. package/fixtures/list/invalid/list-territory-uk.json +52 -0
  57. package/fixtures/{file/invalid/full-unknown-channel-type.json → list/invalid/list-unknown-channel-type.json} +18 -12
  58. package/fixtures/list/invalid/list-unknown-line.json +102 -0
  59. package/fixtures/list/invalid/list-unknown-product.json +105 -0
  60. package/fixtures/{file/invalid/full-missing-authorization-expires.json → list/invalid/list-unsigned.json} +12 -9
  61. package/fixtures/list/invalid/list-valid-over-15-minutes.json +52 -0
  62. package/fixtures/{file/invalid/full-web-domain-is-url.json → list/invalid/list-web-domain-is-url.json} +18 -12
  63. package/fixtures/list/invalid/list-web-on-marketplace-domain.json +52 -0
  64. package/fixtures/{file/invalid/full-wildcard-mixed.json → list/invalid/list-wildcard-mixed.json} +17 -10
  65. package/fixtures/list/valid/list-catalog-line-scope.json +102 -0
  66. package/fixtures/list/valid/list-cctld-web.json +39 -0
  67. package/fixtures/list/valid/list-fractional-seconds.json +52 -0
  68. package/fixtures/{file/invalid/full-amazon-missing-seller-id.json → list/valid/list-generic-web-territories.json} +15 -17
  69. package/fixtures/list/valid/list-marketplace-no-territories.json +40 -0
  70. package/fixtures/list/valid/list-no-authorizations.json +18 -0
  71. package/fixtures/list/valid/list-no-catalog.json +52 -0
  72. package/fixtures/list/valid/list-no-expires.json +52 -0
  73. package/fixtures/list/valid/list-not-public.json +17 -0
  74. package/fixtures/list/valid/list-product-scope.json +103 -0
  75. package/fixtures/list/valid/list-proposed-by.json +55 -0
  76. package/fixtures/list/valid/list-with-expires.json +53 -0
  77. package/fixtures/list/valid/list-worldwide.json +52 -0
  78. package/fixtures/manifest.json +609 -154
  79. package/fixtures/match/all-scope-excluded-line.json +194 -0
  80. package/fixtures/match/all-scope-not-in-catalog.json +194 -0
  81. package/fixtures/match/as-of-before-end-date.json +194 -0
  82. package/fixtures/match/brand-exclusion-beats-named-product.json +194 -0
  83. package/fixtures/match/duplicate-asin-authorized-seller.json +192 -0
  84. package/fixtures/match/duplicate-asin-unauthorized-seller.json +191 -0
  85. package/fixtures/match/expired-end-date.json +193 -0
  86. package/fixtures/match/marketplace-territory-default.json +186 -0
  87. package/fixtures/match/marketplace-territory-mismatch.json +187 -0
  88. package/fixtures/match/match-by-channel-key.json +186 -0
  89. package/fixtures/match/product-excluded-by-authorization.json +194 -0
  90. package/fixtures/match/product-line-request.json +186 -0
  91. package/fixtures/match/product-not-in-scope.json +194 -0
  92. package/fixtures/match/seller-authorized-by-gtin.json +194 -0
  93. package/fixtures/match/seller-authorized-for-line.json +194 -0
  94. package/fixtures/match/worldwide-web.json +186 -0
  95. package/fixtures/pointer/invalid/full-form.json +11 -0
  96. package/fixtures/pointer/invalid/pointer-domain-mismatch.json +10 -0
  97. package/fixtures/{file → pointer}/invalid/pointer-http-url.json +2 -1
  98. package/fixtures/pointer/invalid/pointer-missing-verify-token.json +9 -0
  99. package/fixtures/pointer/invalid/pointer-other-host.json +10 -0
  100. package/fixtures/{file/valid/pointer.json → pointer/invalid/pointer-wrong-spec.json} +1 -0
  101. package/fixtures/pointer/invalid/private-form.json +10 -0
  102. package/fixtures/pointer/invalid/unknown-form.json +10 -0
  103. package/fixtures/pointer/valid/pointer-fetched-via-www.json +10 -0
  104. package/fixtures/pointer/valid/pointer.json +10 -0
  105. package/fixtures/revocation-feed/invalid/feed-hashed-entry.json +17 -0
  106. package/fixtures/revocation-feed/invalid/feed-valid-over-15-minutes.json +17 -0
  107. package/fixtures/revocation-feed/valid/feed-empty.json +12 -0
  108. package/fixtures/revocation-feed/valid/feed.json +17 -0
  109. package/fixtures/verify-request/invalid/bad-as-of.json +9 -0
  110. package/fixtures/verify-request/invalid/bad-gtin.json +11 -0
  111. package/fixtures/verify-request/invalid/domain-with-scheme.json +2 -4
  112. package/fixtures/verify-request/{valid/web-no-product-line.json → invalid/generic-web-no-territory.json} +1 -2
  113. package/fixtures/verify-request/invalid/gtin-and-asin.json +12 -0
  114. package/fixtures/verify-request/{valid/amazon.json → invalid/marketplace-field.json} +1 -3
  115. package/fixtures/verify-request/invalid/missing-channel.json +1 -3
  116. package/fixtures/verify-request/invalid/physical-channel.json +1 -3
  117. package/fixtures/verify-request/invalid/retailer-name-only.json +0 -2
  118. package/fixtures/verify-request/invalid/territory-uk.json +9 -0
  119. package/fixtures/verify-request/invalid/wildcard-territory.json +2 -3
  120. package/fixtures/verify-request/valid/as-of-datetime.json +9 -0
  121. package/fixtures/verify-request/valid/full.json +13 -0
  122. package/fixtures/verify-request/valid/gtin.json +11 -0
  123. package/fixtures/verify-request/valid/minimal-marketplace.json +8 -0
  124. package/fixtures/verify-request/valid/web-cctld-no-territory.json +7 -0
  125. package/fixtures/verify-request/valid/web-generic-with-territory.json +9 -0
  126. package/fixtures/verify-response/invalid/authorized-missing-revocation-id.json +18 -0
  127. package/fixtures/verify-response/invalid/authorized-with-reason.json +20 -0
  128. package/fixtures/verify-response/invalid/brand-unverified.json +13 -0
  129. package/fixtures/verify-response/invalid/expired-without-expires.json +18 -0
  130. package/fixtures/verify-response/invalid/missing-observed.json +11 -5
  131. package/fixtures/verify-response/invalid/missing-signature.json +9 -3
  132. package/fixtures/verify-response/invalid/missing-stale-until.json +18 -0
  133. package/fixtures/verify-response/invalid/not-in-catalog-with-id.json +17 -0
  134. package/fixtures/verify-response/invalid/not-registered-with-unlisted-reason.json +13 -0
  135. package/fixtures/verify-response/invalid/stale-until-over-24-hours.json +19 -0
  136. package/fixtures/verify-response/invalid/unlisted-observed.json +5 -4
  137. package/fixtures/verify-response/invalid/unlisted-with-authorization-id.json +5 -4
  138. package/fixtures/verify-response/invalid/unlisted-with-not-registered-reason.json +13 -0
  139. package/fixtures/verify-response/invalid/unlisted-with-revocation-id.json +13 -0
  140. package/fixtures/verify-response/invalid/valid-until-before-checked.json +11 -5
  141. package/fixtures/verify-response/invalid/valid-until-over-15-minutes.json +19 -0
  142. package/fixtures/verify-response/invalid/with-stale-flag.json +20 -0
  143. package/fixtures/verify-response/invalid/with-tier.json +11 -5
  144. package/fixtures/verify-response/valid/authorized-no-product.json +14 -0
  145. package/fixtures/verify-response/valid/authorized-not-in-catalog.json +22 -0
  146. package/fixtures/verify-response/valid/authorized-observed.json +11 -5
  147. package/fixtures/verify-response/valid/authorized-private-product.json +17 -0
  148. package/fixtures/verify-response/valid/authorized-with-end-date.json +20 -0
  149. package/fixtures/verify-response/valid/authorized.json +11 -5
  150. package/fixtures/verify-response/valid/disputed.json +10 -5
  151. package/fixtures/verify-response/valid/expired.json +12 -6
  152. package/fixtures/verify-response/valid/not-registered-no-reason.json +12 -0
  153. package/fixtures/verify-response/valid/not-registered-reason.json +13 -0
  154. package/fixtures/verify-response/valid/unlisted-product-excluded.json +18 -0
  155. package/fixtures/verify-response/valid/unlisted-product-not-in-catalog.json +16 -0
  156. package/fixtures/verify-response/valid/unlisted-territory-mismatch.json +13 -0
  157. package/fixtures/verify-response/valid/unlisted.json +5 -4
  158. package/fixtures/verify-response/valid/with-as-of.json +20 -0
  159. package/fixtures/verify-response/valid/with-signal.json +11 -5
  160. package/package.json +5 -4
  161. package/schemas/{common.json → 0.1/common.json} +3 -2
  162. package/schemas/0.2/common.json +761 -0
  163. package/schemas/0.2/list.json +87 -0
  164. package/schemas/0.2/pointer.json +33 -0
  165. package/schemas/0.2/revocation-feed.json +55 -0
  166. package/schemas/0.2/verify-request.json +65 -0
  167. package/schemas/0.2/verify-response.json +284 -0
  168. package/spec/spec-v0.1.md +11 -3
  169. package/spec/spec-v0.2.md +531 -0
  170. package/fixtures/file/invalid/full-all-mixed.json +0 -47
  171. package/fixtures/file/invalid/full-authorization-expires-after-file.json +0 -46
  172. package/fixtures/file/invalid/full-expires-before-issued.json +0 -46
  173. package/fixtures/file/invalid/full-expiry-over-180-days.json +0 -46
  174. package/fixtures/file/invalid/full-extra-property.json +0 -47
  175. package/fixtures/file/invalid/full-impossible-date.json +0 -46
  176. package/fixtures/file/invalid/full-lowercase-territory.json +0 -45
  177. package/fixtures/file/invalid/full-missing-file-expires.json +0 -45
  178. package/fixtures/file/invalid/full-missing-product-lines.json +0 -43
  179. package/fixtures/file/invalid/full-missing-scope.json +0 -37
  180. package/fixtures/file/invalid/full-missing-territories.json +0 -42
  181. package/fixtures/file/invalid/full-name-only-retailer.json +0 -30
  182. package/fixtures/file/invalid/full-no-channels.json +0 -31
  183. package/fixtures/file/invalid/full-non-utc-timestamp.json +0 -46
  184. package/fixtures/file/invalid/full-physical-missing-country.json +0 -50
  185. package/fixtures/file/invalid/full-web-missing-domain.json +0 -45
  186. package/fixtures/file/invalid/full-wrong-spec.json +0 -46
  187. package/fixtures/file/invalid/private-missing-verify.json +0 -8
  188. package/fixtures/file/invalid/private-with-authorizations.json +0 -45
  189. package/fixtures/file/invalid/unknown-form.json +0 -9
  190. package/fixtures/file/valid/full-fractional-seconds.json +0 -46
  191. package/fixtures/file/valid/full-max-expiry.json +0 -46
  192. package/fixtures/file/valid/full-no-authorizations.json +0 -11
  193. package/fixtures/file/valid/full-unsigned-handwritten.json +0 -46
  194. package/fixtures/file/valid/full-worldwide-physical-proposed.json +0 -82
  195. package/fixtures/file/valid/private.json +0 -9
  196. package/fixtures/verify-response/invalid/authorized-missing-authorization-id.json +0 -12
  197. package/fixtures/verify-response/invalid/missing-valid-until.json +0 -12
  198. package/fixtures/verify-response/invalid/observed-without-last-seen.json +0 -13
  199. package/fixtures/verify-response/invalid/unknown-status.json +0 -13
  200. package/fixtures/verify-response/invalid/unlisted-with-reason.json +0 -12
  201. package/fixtures/verify-response/invalid/valid-until-over-24h.json +0 -13
  202. package/fixtures/verify-response/valid/brand-unverified-no-reason.json +0 -11
  203. package/fixtures/verify-response/valid/brand-unverified-reason.json +0 -12
  204. /package/schemas/{file-full.json → 0.1/file-full.json} +0 -0
  205. /package/schemas/{file-pointer.json → 0.1/file-pointer.json} +0 -0
  206. /package/schemas/{file-private.json → 0.1/file-private.json} +0 -0
  207. /package/schemas/{file.json → 0.1/file.json} +0 -0
  208. /package/schemas/{verify-request.json → 0.1/verify-request.json} +0 -0
  209. /package/schemas/{verify-response.json → 0.1/verify-response.json} +0 -0
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "status": "authorized",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-12-22T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-24T14:02:11Z",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
7
13
  "observed": null,
8
14
  "signals": []
9
15
  }
@@ -0,0 +1,18 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "product": {
8
+ "in_catalog": true,
9
+ "id": "EB-TEE-BLK-M",
10
+ "product_line": "Classic Tee"
11
+ },
12
+ "observed": null,
13
+ "signals": [],
14
+ "signature": {
15
+ "kid": "ar-20260928-6e37",
16
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "status": "unlisted",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
6
+ "observed": null,
7
+ "signals": [],
8
+ "signature": {
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ },
12
+ "reason": "product_not_in_catalog",
13
+ "product": {
14
+ "in_catalog": false,
15
+ "id": "X"
16
+ }
17
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "brand_not_registered",
3
+ "reason": "product_excluded",
4
+ "checked": "2026-09-28T14:02:11Z",
5
+ "valid_until": "2026-09-28T14:17:11Z",
6
+ "stale_until": "2026-09-29T14:02:11Z",
7
+ "observed": null,
8
+ "signals": [],
9
+ "signature": {
10
+ "kid": "ar-20260928-6e37",
11
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
+ }
13
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:12Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
13
+ "observed": null,
14
+ "signals": [],
15
+ "signature": {
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
18
+ }
19
+ }
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "status": "unlisted",
3
- "checked": "2026-09-23T14:02:11Z",
4
- "valid_until": "2026-09-24T14:02:11Z",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
5
6
  "observed": {
6
7
  "last_seen": "2026-09-20T00:00:00Z"
7
8
  },
8
9
  "signals": [],
9
10
  "signature": {
10
- "kid": "ar-2026-09",
11
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ "kid": "ar-20260928-6e37",
12
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
13
  }
13
14
  }
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "status": "unlisted",
3
- "checked": "2026-09-23T14:02:11Z",
4
- "valid_until": "2026-09-24T14:02:11Z",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
5
6
  "observed": null,
6
7
  "signals": [],
7
8
  "signature": {
8
- "kid": "ar-2026-09",
9
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
10
11
  },
11
12
  "authorization_id": "auth_01J9X2"
12
13
  }
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "unlisted",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
6
+ "observed": null,
7
+ "signals": [],
8
+ "signature": {
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ },
12
+ "reason": "domain_unlinked"
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "unlisted",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
6
+ "observed": null,
7
+ "signals": [],
8
+ "signature": {
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ },
12
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw"
13
+ }
@@ -1,13 +1,19 @@
1
1
  {
2
2
  "status": "authorized",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-12-22T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-23T14:02:11Z",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:02:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
7
13
  "observed": null,
8
14
  "signals": [],
9
15
  "signature": {
10
- "kid": "ar-2026-09",
11
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
18
  }
13
19
  }
@@ -0,0 +1,19 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:12Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
13
+ "observed": null,
14
+ "signals": [],
15
+ "signature": {
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
18
+ }
19
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
13
+ "observed": null,
14
+ "signals": [],
15
+ "signature": {
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
18
+ },
19
+ "stale": true
20
+ }
@@ -1,14 +1,20 @@
1
1
  {
2
2
  "status": "authorized",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-12-22T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-24T14:02:11Z",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
7
13
  "observed": null,
8
14
  "signals": [],
9
15
  "signature": {
10
- "kid": "ar-2026-09",
11
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
18
  },
13
19
  "tier": "brand_attested"
14
20
  }
@@ -0,0 +1,14 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "observed": null,
9
+ "signals": [],
10
+ "signature": {
11
+ "kid": "ar-20260928-6e37",
12
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
13
+ }
14
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": false
10
+ },
11
+ "observed": null,
12
+ "signals": [
13
+ {
14
+ "type": "product_not_in_catalog",
15
+ "observed": "2026-09-28T14:02:11Z"
16
+ }
17
+ ],
18
+ "signature": {
19
+ "kid": "ar-20260928-6e37",
20
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
21
+ }
22
+ }
@@ -1,15 +1,21 @@
1
1
  {
2
2
  "status": "authorized",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-12-22T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-24T14:02:11Z",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
7
13
  "observed": {
8
14
  "last_seen": "2026-09-20T00:00:00Z"
9
15
  },
10
16
  "signals": [],
11
17
  "signature": {
12
- "kid": "ar-2026-09",
13
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
18
+ "kid": "ar-20260928-6e37",
19
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
14
20
  }
15
21
  }
@@ -0,0 +1,17 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true
10
+ },
11
+ "observed": null,
12
+ "signals": [],
13
+ "signature": {
14
+ "kid": "ar-20260928-6e37",
15
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
16
+ }
17
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
13
+ "observed": null,
14
+ "signals": [],
15
+ "signature": {
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
18
+ },
19
+ "expires": "2027-09-28T00:00:00Z"
20
+ }
@@ -1,13 +1,19 @@
1
1
  {
2
2
  "status": "authorized",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-12-22T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-24T14:02:11Z",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
7
13
  "observed": null,
8
14
  "signals": [],
9
15
  "signature": {
10
- "kid": "ar-2026-09",
11
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
18
  }
13
19
  }
@@ -1,13 +1,18 @@
1
1
  {
2
2
  "status": "disputed",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-12-22T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-24T14:02:11Z",
4
+ "checked": "2026-09-28T14:02:11Z",
5
+ "valid_until": "2026-09-28T14:17:11Z",
6
+ "stale_until": "2026-09-29T14:02:11Z",
7
+ "product": {
8
+ "in_catalog": true,
9
+ "id": "EB-TEE-BLK-M",
10
+ "product_line": "Classic Tee"
11
+ },
7
12
  "observed": null,
8
13
  "signals": [],
9
14
  "signature": {
10
- "kid": "ar-2026-09",
11
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
15
+ "kid": "ar-20260928-6e37",
16
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
17
  }
13
18
  }
@@ -1,13 +1,19 @@
1
1
  {
2
2
  "status": "expired",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-09-01T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-24T14:02:11Z",
4
+ "checked": "2026-09-28T14:02:11Z",
5
+ "valid_until": "2026-09-28T14:17:11Z",
6
+ "stale_until": "2026-09-29T14:02:11Z",
7
+ "product": {
8
+ "in_catalog": true,
9
+ "id": "EB-TEE-BLK-M",
10
+ "product_line": "Classic Tee"
11
+ },
7
12
  "observed": null,
8
13
  "signals": [],
9
14
  "signature": {
10
- "kid": "ar-2026-09",
11
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
- }
15
+ "kid": "ar-20260928-6e37",
16
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
17
+ },
18
+ "expires": "2026-09-01T00:00:00Z"
13
19
  }
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "brand_not_registered",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
6
+ "observed": null,
7
+ "signals": [],
8
+ "signature": {
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ }
12
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "brand_not_registered",
3
+ "reason": "domain_unlinked",
4
+ "checked": "2026-09-28T14:02:11Z",
5
+ "valid_until": "2026-09-28T14:17:11Z",
6
+ "stale_until": "2026-09-29T14:02:11Z",
7
+ "observed": null,
8
+ "signals": [],
9
+ "signature": {
10
+ "kid": "ar-20260928-6e37",
11
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
12
+ }
13
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "status": "unlisted",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
6
+ "observed": null,
7
+ "signals": [],
8
+ "signature": {
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ },
12
+ "reason": "product_excluded",
13
+ "product": {
14
+ "in_catalog": true,
15
+ "id": "EB-DTC-1",
16
+ "product_line": "Limited"
17
+ }
18
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "status": "unlisted",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
6
+ "observed": null,
7
+ "signals": [],
8
+ "signature": {
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ },
12
+ "reason": "product_not_in_catalog",
13
+ "product": {
14
+ "in_catalog": false
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "unlisted",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
6
+ "observed": null,
7
+ "signals": [],
8
+ "signature": {
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
11
+ },
12
+ "reason": "territory_mismatch"
13
+ }
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "status": "unlisted",
3
- "checked": "2026-09-23T14:02:11Z",
4
- "valid_until": "2026-09-24T14:02:11Z",
3
+ "checked": "2026-09-28T14:02:11Z",
4
+ "valid_until": "2026-09-28T14:17:11Z",
5
+ "stale_until": "2026-09-29T14:02:11Z",
5
6
  "observed": null,
6
7
  "signals": [],
7
8
  "signature": {
8
- "kid": "ar-2026-09",
9
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
9
+ "kid": "ar-20260928-6e37",
10
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
10
11
  }
11
12
  }
@@ -0,0 +1,20 @@
1
+ {
2
+ "status": "authorized",
3
+ "authorization_id": "auth_01J9X2",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
13
+ "observed": null,
14
+ "signals": [],
15
+ "signature": {
16
+ "kid": "ar-20260928-6e37",
17
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
18
+ },
19
+ "as_of": "2026-09-28T00:00:00Z"
20
+ }
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "status": "authorized",
3
3
  "authorization_id": "auth_01J9X2",
4
- "expires": "2026-12-22T00:00:00Z",
5
- "checked": "2026-09-23T14:02:11Z",
6
- "valid_until": "2026-09-24T14:02:11Z",
4
+ "revocation_id": "rv_Q2l8dX4bT0aN5kPw",
5
+ "checked": "2026-09-28T14:02:11Z",
6
+ "valid_until": "2026-09-28T14:17:11Z",
7
+ "stale_until": "2026-09-29T14:02:11Z",
8
+ "product": {
9
+ "in_catalog": true,
10
+ "id": "EB-TEE-BLK-M",
11
+ "product_line": "Classic Tee"
12
+ },
7
13
  "observed": null,
8
14
  "signals": [
9
15
  {
@@ -13,7 +19,7 @@
13
19
  }
14
20
  ],
15
21
  "signature": {
16
- "kid": "ar-2026-09",
17
- "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYtMDkifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
22
+ "kid": "ar-20260928-6e37",
23
+ "jws": "eyJhbGciOiJFZERTQSIsImtpZCI6ImFyLTIwMjYwOTI4LTZlMzcifQ..c2lnbmF0dXJlLXBsYWNlaG9sZGVy"
18
24
  }
19
25
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@authorizedretailers/spec",
3
- "version": "0.1.0",
4
- "description": "Authorized Retailers v0.1: JSON Schemas, types, validator, identifier matching, RFC 8785 canonicalization and detached-JWS reference verifier",
3
+ "version": "0.2.0",
4
+ "description": "authorized-retailers.json v0.2, an open format with a single registry: JSON Schemas, types, validator, identifier and product matching, RFC 8785 canonicalization and detached-JWS reference verifier",
5
5
  "license": "Apache-2.0 AND CC-BY-4.0",
6
6
  "author": "Authorized Retailers",
7
7
  "homepage": "https://authorizedretailers.ai/spec",
@@ -40,8 +40,9 @@
40
40
  },
41
41
  "./schemas/*": "./schemas/*",
42
42
  "./fixtures/*": "./fixtures/*",
43
- "./spec.md": "./spec/spec-v0.1.md",
44
- "./package.json": "./package.json"
43
+ "./spec.md": "./spec/spec-v0.2.md",
44
+ "./package.json": "./package.json",
45
+ "./spec/*": "./spec/*"
45
46
  },
46
47
  "files": [
47
48
  "dist",
@@ -140,10 +140,11 @@
140
140
  "id": { "$ref": "#/$defs/id" },
141
141
  "retailer": { "$ref": "#/$defs/party" },
142
142
  "channels": {
143
- "description": "Section 6: every authorization MUST name at least one channel identifier.",
143
+ "description": "Section 6: every authorization MUST name at least one online channel identifier (amazon, walmart, ebay or web). A physical identifier alone does not authorize anything.",
144
144
  "type": "array",
145
145
  "minItems": 1,
146
- "items": { "$ref": "#/$defs/channel" }
146
+ "items": { "$ref": "#/$defs/channel" },
147
+ "contains": { "$ref": "#/$defs/verifiableChannel" }
147
148
  },
148
149
  "scope": { "$ref": "#/$defs/scope" },
149
150
  "proposed_by": {