@epilot/pricing-client 3.60.0 → 3.61.1

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.
package/dist/openapi.json CHANGED
@@ -595,11 +595,11 @@
595
595
  }
596
596
  },
597
597
  "400": {
598
- "description": "Invalid payload",
598
+ "description": "`CATALOG_REFERENCE_MISSING`, `CATALOG_REFERENCE_UNRESOLVABLE`: see\n`CatalogReferenceErrorCode`. References are not verified on this authenticated route.\nOther refusals carry no `code`.\n",
599
599
  "content": {
600
600
  "application/json": {
601
601
  "schema": {
602
- "$ref": "#/components/schemas/Error"
602
+ "$ref": "#/components/schemas/CatalogReferenceError"
603
603
  }
604
604
  }
605
605
  }
@@ -855,11 +855,11 @@
855
855
  }
856
856
  },
857
857
  "400": {
858
- "description": "Invalid payload",
858
+ "description": "`CATALOG_REFERENCE_MISSING`, `CATALOG_REFERENCE_UNRESOLVABLE`: see\n`CatalogReferenceErrorCode`. References are not verified on this authenticated route.\nOther refusals carry no `code`.\n",
859
859
  "content": {
860
860
  "application/json": {
861
861
  "schema": {
862
- "$ref": "#/components/schemas/Error"
862
+ "$ref": "#/components/schemas/CatalogReferenceError"
863
863
  }
864
864
  }
865
865
  }
@@ -984,11 +984,11 @@
984
984
  }
985
985
  },
986
986
  "400": {
987
- "description": "Invalid payload",
987
+ "description": "`CATALOG_REFERENCE_MISSING`, `CATALOG_REFERENCE_UNRESOLVABLE`: see\n`CatalogReferenceErrorCode`. References are not verified on this authenticated route.\nOther refusals carry no `code`.\n",
988
988
  "content": {
989
989
  "application/json": {
990
990
  "schema": {
991
- "$ref": "#/components/schemas/Error"
991
+ "$ref": "#/components/schemas/CatalogReferenceError"
992
992
  }
993
993
  }
994
994
  }
@@ -1053,11 +1053,11 @@
1053
1053
  }
1054
1054
  },
1055
1055
  "400": {
1056
- "description": "Invalid payload",
1056
+ "description": "`CATALOG_REFERENCE_MISSING`, `CATALOG_REFERENCE_SIGNATURE_INVALID`,\n`CATALOG_REFERENCE_UNRESOLVABLE`: see `CatalogReferenceErrorCode`. Every reference must\nverify on this public route. Other refusals carry no `code`.\n",
1057
1057
  "content": {
1058
1058
  "application/json": {
1059
1059
  "schema": {
1060
- "$ref": "#/components/schemas/Error"
1060
+ "$ref": "#/components/schemas/CatalogReferenceError"
1061
1061
  }
1062
1062
  }
1063
1063
  }
@@ -1174,6 +1174,211 @@
1174
1174
  }
1175
1175
  }
1176
1176
  },
1177
+ "/v2/public/catalog": {
1178
+ "post": {
1179
+ "description": "Returns the products and prices a journey block shows as catalog pairs, each member resolved\nfor its own entity type's context at `as_of`. A pair carries the product, one of its prices, the coupons that apply,\nand a signed `catalog_reference`. Line items carry that reference to checkout unchanged, and\ncheckout prices from it.\n\nConditional entities resolve as on `POST /v1/conditional-pricing:resolve`. An organization\nthat has not opted in gets base entities, not an error. A member matching several variants\nyields one pair per variant, and an entry without `price_id` yields one pair per price of\nthe product. Members that match nothing or are inactive are left out. Ids that find no\nentity, or an entity of another type than the entry asked for, are reported in `warnings`.\n",
1180
+ "operationId": "$resolveCatalog",
1181
+ "summary": "$resolveCatalog",
1182
+ "security": [
1183
+ {
1184
+ "EpilotPublicAuth": []
1185
+ }
1186
+ ],
1187
+ "tags": [
1188
+ "Catalog API"
1189
+ ],
1190
+ "requestBody": {
1191
+ "required": true,
1192
+ "content": {
1193
+ "application/json": {
1194
+ "schema": {
1195
+ "$ref": "#/components/schemas/ResolveCatalogRequest"
1196
+ },
1197
+ "examples": {
1198
+ "A block of three tiles at a delivery address": {
1199
+ "summary": "Two priced entries and one that lets the product name its prices",
1200
+ "value": {
1201
+ "entries": [
1202
+ {
1203
+ "product_id": "product-pv-2027",
1204
+ "price_id": "price-sp26d1yo"
1205
+ },
1206
+ {
1207
+ "product_id": "product-heatpump-2027",
1208
+ "price_id": "price-retired"
1209
+ },
1210
+ {
1211
+ "product_id": "product-wallbox-2027"
1212
+ }
1213
+ ],
1214
+ "context": {
1215
+ "product": {
1216
+ "postal_code": "46045",
1217
+ "channel": "direct"
1218
+ },
1219
+ "price": {
1220
+ "postal_code": "46045"
1221
+ }
1222
+ },
1223
+ "as_of": "2026-12-20T10:15:00Z"
1224
+ }
1225
+ }
1226
+ }
1227
+ }
1228
+ }
1229
+ },
1230
+ "responses": {
1231
+ "200": {
1232
+ "description": "The pairs to show, unordered, and the entries whose ids found nothing or the wrong\ntype. `warnings` is always present and empty in the ordinary case.\n",
1233
+ "content": {
1234
+ "application/json": {
1235
+ "schema": {
1236
+ "$ref": "#/components/schemas/ResolveCatalogResult"
1237
+ },
1238
+ "examples": {
1239
+ "A resolved price beside a classic product, and an entry that found nothing": {
1240
+ "summary": "The product served as stored, the price resolved to its variant, the reference signed, and a retired price reported rather than refused",
1241
+ "value": {
1242
+ "pairs": [
1243
+ {
1244
+ "product": {
1245
+ "_id": "product-pv-2027",
1246
+ "_schema": "product",
1247
+ "_title": "Solar Panel with Battery Storage",
1248
+ "name": "Solar Panel with Battery Storage",
1249
+ "active": true,
1250
+ "is_conditional": false,
1251
+ "price_options": [
1252
+ {
1253
+ "_id": "price-sp26d1yo",
1254
+ "_schema": "price",
1255
+ "_title": "Solar Panel Module",
1256
+ "active": true,
1257
+ "is_conditional": true,
1258
+ "is_composite_price": false,
1259
+ "type": "one_time",
1260
+ "pricing_model": "per_unit",
1261
+ "$relation": {
1262
+ "entity_id": "price-sp26d1yo",
1263
+ "attribute": "price_options"
1264
+ }
1265
+ }
1266
+ ]
1267
+ },
1268
+ "price": {
1269
+ "_id": "price-sp26d1yo",
1270
+ "_schema": "price",
1271
+ "_title": "Solar Panel Module",
1272
+ "_variant_id": "var-46045",
1273
+ "_version_valid_from": "2027-01-01T00:00:00.000Z",
1274
+ "_conditions": {
1275
+ "postal_code": "46045",
1276
+ "default": false
1277
+ },
1278
+ "_inert_overrides": [],
1279
+ "active": true,
1280
+ "is_conditional": true,
1281
+ "is_composite_price": false,
1282
+ "type": "one_time",
1283
+ "pricing_model": "per_unit",
1284
+ "unit_amount": 2499,
1285
+ "unit_amount_decimal": "24.99",
1286
+ "unit_amount_currency": "EUR"
1287
+ },
1288
+ "coupons": [
1289
+ {
1290
+ "_id": "0f8c4852-23fa-4a64-a2f3-88702335f094",
1291
+ "_schema": "coupon",
1292
+ "_org": "739224",
1293
+ "_title": "Winter discount",
1294
+ "_created_at": "2026-10-01T09:00:00.000Z",
1295
+ "_updated_at": "2026-10-01T09:00:00.000Z",
1296
+ "name": "Winter discount",
1297
+ "type": "percentage",
1298
+ "category": "discount",
1299
+ "percentage_value": "10",
1300
+ "active": true,
1301
+ "prices": {
1302
+ "$relation": [
1303
+ {
1304
+ "entity_id": "price-sp26d1yo",
1305
+ "_schema": "price"
1306
+ }
1307
+ ]
1308
+ }
1309
+ }
1310
+ ],
1311
+ "catalog_reference": {
1312
+ "product": {
1313
+ "id": "product-pv-2027"
1314
+ },
1315
+ "price": {
1316
+ "id": "price-sp26d1yo",
1317
+ "variant": "var-46045"
1318
+ },
1319
+ "coupons": [
1320
+ {
1321
+ "id": "0f8c4852-23fa-4a64-a2f3-88702335f094"
1322
+ }
1323
+ ],
1324
+ "as_of": "2026-12-20T10:15:00.000Z",
1325
+ "_meta": {
1326
+ "timestamp": 1797000000000,
1327
+ "signature": "c3ab8ff137"
1328
+ }
1329
+ }
1330
+ }
1331
+ ],
1332
+ "warnings": [
1333
+ {
1334
+ "code": "CATALOG_ENTRY_NOT_FOUND",
1335
+ "message": "The entry names a price that does not exist",
1336
+ "details": {
1337
+ "product_id": "product-heatpump-2027",
1338
+ "price_id": "price-retired",
1339
+ "missing": "price"
1340
+ }
1341
+ },
1342
+ {
1343
+ "code": "CATALOG_ENTRY_TYPE_MISMATCH",
1344
+ "message": "The entry's price id names a product",
1345
+ "details": {
1346
+ "product_id": "product-heatpump-2027",
1347
+ "price_id": "product-tariff-2027",
1348
+ "mismatched": "price",
1349
+ "actual_schema": "product"
1350
+ }
1351
+ }
1352
+ ]
1353
+ }
1354
+ }
1355
+ }
1356
+ }
1357
+ }
1358
+ },
1359
+ "400": {
1360
+ "description": "`CONDITION_UNDEFINED`, `OPERATOR_UNSUPPORTED`, `CONTEXT_FORMAT_INVALID`,\n`DEFAULT_MARKER_RESERVED`: an entity type's context is refused against that type's schema\nas the authenticated resolve refuses it.\n\n`TOO_MANY_MATCHES`: a member matches more variants than the authenticated resolve's cap\nof 100. The whole request is refused rather than serving a truncated block.\n\n`VALID_FROM_INVALID`: `as_of` is not an instant this operation can read.\n\nA body with no entries, more than 100, an entry without `product_id`, or a context keyed\nby anything but `product`, `price` or `coupon` fails validation and carries no `code`.\n",
1361
+ "content": {
1362
+ "application/json": {
1363
+ "schema": {
1364
+ "$ref": "#/components/schemas/ConditionalPricingError"
1365
+ }
1366
+ }
1367
+ }
1368
+ },
1369
+ "409": {
1370
+ "description": "`CONDITION_UNREADABLE`: a schema this request touches declares a condition in a way this\ndeploy cannot read. The whole request is refused rather than serving prices without\ntheir products.\n",
1371
+ "content": {
1372
+ "application/json": {
1373
+ "schema": {
1374
+ "$ref": "#/components/schemas/ConditionalPricingError"
1375
+ }
1376
+ }
1377
+ }
1378
+ }
1379
+ }
1380
+ }
1381
+ },
1177
1382
  "/v1/public/validate-promo-codes": {
1178
1383
  "post": {
1179
1384
  "description": "Validate a list of promo codes against a list of coupons",
@@ -5739,8 +5944,8 @@
5739
5944
  "type": "string",
5740
5945
  "description": "The value shape of a `location` condition. Absent for every other type.",
5741
5946
  "enum": [
5742
- "zipcode",
5743
- "zipcode_town"
5947
+ "postal_code",
5948
+ "postal_code_city"
5744
5949
  ]
5745
5950
  }
5746
5951
  }
@@ -5930,7 +6135,7 @@
5930
6135
  "ResolveContext": {
5931
6136
  "type": "object",
5932
6137
  "additionalProperties": true,
5933
- "description": "The situation to resolve for: a flat map keyed by condition name. A condition left out\nmatches only variants that leave it unpinned; an empty map therefore returns the `default`\nvariant.\n\nEach value is an exact value, typed by its condition, or a single-operator predicate:\n\n- `{ \"lt\": v }`, `{ \"lte\": v }`, `{ \"gt\": v }`, `{ \"gte\": v }` — order, against a `number`\n or `date` condition\n- `{ \"in\": [...] }` — membership, against a `string`, `select` or `number` condition\n- `{ \"between\": \"2026-03-01\" }` — `daterange` containment, which a plain date also means\n- `{ \"exists\": true }` — pinned to any value; `{ \"exists\": false }` — left unpinned\n\nAn `in` list carries at most 50,000 values. A `string` or `select` matches exactly and\ncase-sensitively. A `location` of format\n`zipcode` is the postal code itself; one of format `zipcode_town` is an object carrying\nboth, whose town is compared case- and whitespace-insensitively.\n\n`default` and names beginning with `_` are reserved and cannot be supplied.\n",
6138
+ "description": "The situation to resolve for: a flat map keyed by condition name. A condition left out\nmatches only variants that leave it unpinned; an empty map therefore returns the `default`\nvariant.\n\nEach value is an exact value, typed by its condition, or a single-operator predicate:\n\n- `{ \"lt\": v }`, `{ \"lte\": v }`, `{ \"gt\": v }`, `{ \"gte\": v }` — order, against a `number`\n or `date` condition\n- `{ \"in\": [...] }` — membership, against a `string`, `select` or `number` condition\n- `{ \"between\": \"2026-03-01\" }` — `daterange` containment, which a plain date also means\n- `{ \"exists\": true }` — pinned to any value; `{ \"exists\": false }` — left unpinned\n\nAn `in` list carries at most 50,000 values. A `string` or `select` matches exactly and\ncase-sensitively. A `location` of format\n`postal_code` is the postal code itself; one of format `postal_code_city` is an object carrying\n`postal_code` and `city`, named as an entity address names them, whose city is compared\ncase- and whitespace-insensitively.\n\n`default` and names beginning with `_` are reserved and cannot be supplied.\n",
5934
6139
  "example": {
5935
6140
  "postal_code": "46045",
5936
6141
  "consumption": {
@@ -6071,7 +6276,7 @@
6071
6276
  "PinnedConditions": {
6072
6277
  "type": "object",
6073
6278
  "additionalProperties": true,
6074
- "description": "The situation this variant applies to: a flat map keyed by condition name. A condition left\nout is a wildcard, which is what makes adding a condition to a schema non-breaking for\nexisting variants.\n\nExact values only; predicates belong to reads. Values are stored canonicalized for their\ntype: a `date` becomes millisecond-precision UTC, a `daterange` an object carrying `from`\nand `until` where an empty string is an open end, a `location` of format `zipcode` the\npostal code itself and one of format `zipcode_town` an object carrying both.\n\n`default` and names beginning with `_` are reserved; use the request's `default` flag.\n",
6279
+ "description": "The situation this variant applies to: a flat map keyed by condition name. A condition left\nout is a wildcard, which is what makes adding a condition to a schema non-breaking for\nexisting variants.\n\nExact values only; predicates belong to reads. Values are stored canonicalized for their\ntype: a `date` becomes millisecond-precision UTC, a `daterange` an object carrying `from`\nand `until` where an empty string is an open end, a `location` of format `postal_code` the\npostal code itself and one of format `postal_code_city` an object carrying `postal_code` and\n`city`.\n\n`default` and names beginning with `_` are reserved; use the request's `default` flag.\n",
6075
6280
  "example": {
6076
6281
  "postal_code": "46045"
6077
6282
  }
@@ -6282,7 +6487,7 @@
6282
6487
  {
6283
6488
  "type": "object",
6284
6489
  "additionalProperties": false,
6285
- "description": "The variant was stored, and its versions resolve once it is found, but its index entry was\nnot written. `:resolve`, `variants:list` and `variants:tree` do not find it until it is\nrepaired, within about a minute and a half. Inside that time a resolve its pins would\nmatch returns the entity's default variant. Retrying the write does not help, since it\nappends a version and does not repair anything.\n\nRaised by a write that creates a variant, when the index write failed.\n",
6490
+ "description": "The variant was stored but its index entry was not written. `:resolve`, `variants:list` and\n`variants:tree` miss it until it is repaired, within about a minute and a half; until then a\nresolve it would match returns the entity's default variant. Retrying the write does not help.\n",
6286
6491
  "required": [
6287
6492
  "code",
6288
6493
  "message",
@@ -7300,6 +7505,26 @@
7300
7505
  }
7301
7506
  }
7302
7507
  },
7508
+ "RefusedLineItem": {
7509
+ "type": "object",
7510
+ "additionalProperties": false,
7511
+ "description": "The line item a checkout refusal is about, named as the item names itself.",
7512
+ "required": [
7513
+ "price_id"
7514
+ ],
7515
+ "properties": {
7516
+ "price_id": {
7517
+ "type": "string",
7518
+ "description": "The item's price id.",
7519
+ "example": "price-sp26d1yo"
7520
+ },
7521
+ "product_id": {
7522
+ "type": "string",
7523
+ "description": "The item's product id, when the item names one.",
7524
+ "example": "product-pv-2027"
7525
+ }
7526
+ }
7527
+ },
7303
7528
  "ReportedError": {
7304
7529
  "description": "The `error` field of an error response: the message, or — where the request failed\nvalidation before any handler ran — the validation errors themselves.\n",
7305
7530
  "oneOf": [
@@ -8635,86 +8860,152 @@
8635
8860
  }
8636
8861
  ]
8637
8862
  },
8638
- "Product": {
8639
- "type": "object",
8640
- "description": "The product entity",
8641
- "readOnly": true,
8642
- "additionalProperties": true,
8643
- "example": {
8644
- "type": "product",
8645
- "_schema": "product",
8646
- "_title": "Solar Panel with Battery Storage",
8647
- "name": "Solar Panel with Battery Storage",
8648
- "code": "SOLAR-BATT",
8649
- "active": true,
8650
- "description": "Solar Panel with battery solution, optimized for max efficiency. ",
8651
- "feature": [
8652
- {
8653
- "_tags": [],
8654
- "feature": "Eco-Panels"
8655
- },
8656
- {
8657
- "_tags": [],
8658
- "feature": "Remote Management Platform"
8659
- },
8660
- {
8661
- "_tags": [],
8662
- "feature": "Battery Remote Control"
8663
- },
8664
- {
8665
- "_tags": [],
8666
- "feature": "Mobile App"
8667
- }
8668
- ],
8669
- "cross_sellable_products": {
8670
- "$relation": [
8671
- {
8672
- "entity_id": "068d0713-a650-4668-9ed2-eca7be31e337",
8673
- "_schema": "product",
8674
- "_tags": []
8675
- },
8676
- {
8677
- "entity_id": "c8402ee7-fba9-4f3d-bffd-6803ca655782",
8678
- "_tags": []
8679
- }
8680
- ]
8863
+ "CatalogReferenceErrorCode": {
8864
+ "type": "string",
8865
+ "description": "Why an order operation refused a catalog reference. Other refusals carry no `code`.\n\n- `CATALOG_REFERENCE_MISSING` (400): a line item whose product or price is conditional carries no `catalog_reference`, or one with no variant for that member\n- `CATALOG_REFERENCE_SIGNATURE_INVALID` (400): a `catalog_reference` on a public checkout is unsigned, or its signature does not verify\n- `CATALOG_REFERENCE_UNRESOLVABLE` (400): a member of a `catalog_reference` cannot be resolved at its `as_of` — its entity or variant no longer exists, the variant has no version in effect, or the entity's schema no longer lets the variant be read\n",
8866
+ "enum": [
8867
+ "CATALOG_REFERENCE_MISSING",
8868
+ "CATALOG_REFERENCE_SIGNATURE_INVALID",
8869
+ "CATALOG_REFERENCE_UNRESOLVABLE"
8870
+ ]
8871
+ },
8872
+ "CatalogReferenceError": {
8873
+ "description": "An error from an order operation that prices line items. A catalog-reference refusal carries\n`code` and `details`, typed per code. Every other refusal carries neither.\n",
8874
+ "allOf": [
8875
+ {
8876
+ "$ref": "#/components/schemas/Error"
8681
8877
  },
8682
- "product_images": {
8683
- "$relation": [
8684
- {
8685
- "entity_id": "37bdeaaa-65fe-403e-9894-65b01cd277f1"
8686
- },
8687
- {
8688
- "entity_id": "56dde657-795c-41bb-bf53-98fd586b7e6e"
8878
+ {
8879
+ "type": "object",
8880
+ "properties": {
8881
+ "error": {
8882
+ "allOf": [
8883
+ {
8884
+ "$ref": "#/components/schemas/ReportedError"
8885
+ }
8886
+ ],
8887
+ "description": "What went wrong. The same string as `message`, except on a request-validation\nfailure, which puts the list of validation errors here instead.\n"
8689
8888
  }
8690
- ]
8889
+ }
8691
8890
  },
8692
- "product_downloads": {
8693
- "$relation": [
8891
+ {
8892
+ "oneOf": [
8694
8893
  {
8695
- "entity_id": "64211361-8759-414b-81c0-afbf24f83aa9"
8696
- }
8697
- ]
8698
- },
8699
- "_id": "a7f4771a-6368-4d77-bb01-71f1e4902de5",
8700
- "_org": "728",
8701
- "_created_at": "2022-06-03T15: 52: 27.512Z",
8702
- "_updated_at": "2022-06-03T16: 05: 15.029Z",
8703
- "price_options": {
8704
- "$relation": [
8894
+ "type": "object",
8895
+ "description": "A conditional line item carries no `catalog_reference`, or one with no variant for\nthat member. Send the pair's reference unchanged.\n",
8896
+ "required": [
8897
+ "code",
8898
+ "details"
8899
+ ],
8900
+ "properties": {
8901
+ "code": {
8902
+ "type": "string",
8903
+ "enum": [
8904
+ "CATALOG_REFERENCE_MISSING"
8905
+ ]
8906
+ },
8907
+ "details": {
8908
+ "$ref": "#/components/schemas/RefusedLineItem"
8909
+ }
8910
+ }
8911
+ },
8705
8912
  {
8706
- "entity_id": "9c36c23b-1574-4193-beff-b1b5e1124bc7",
8707
- "_tags": []
8913
+ "type": "object",
8914
+ "description": "The `catalog_reference` of a line item on a public checkout carries no `_meta`, or a\nsignature that does not verify against the reference. The reference was altered or\ndid not come from the catalog; fetch the pair again and send it unchanged.\n",
8915
+ "required": [
8916
+ "code",
8917
+ "details"
8918
+ ],
8919
+ "properties": {
8920
+ "code": {
8921
+ "type": "string",
8922
+ "enum": [
8923
+ "CATALOG_REFERENCE_SIGNATURE_INVALID"
8924
+ ]
8925
+ },
8926
+ "details": {
8927
+ "$ref": "#/components/schemas/RefusedLineItem"
8928
+ }
8929
+ }
8708
8930
  },
8709
8931
  {
8710
- "entity_id": "146aa2cc-f267-4d5e-bda4-cbe2669b7741",
8711
- "_tags": []
8712
- }
8713
- ]
8714
- }
8715
- },
8716
- "properties": {
8717
- "description": {
8932
+ "type": "object",
8933
+ "description": "A member of the `catalog_reference` cannot be resolved at the reference's `as_of`:\nits entity or variant no longer exists, the variant has no version in effect at that\ninstant, or the entity's schema no longer lets the variant be read. Fetch the pair\nagain; the catalog answers with what is offered now.\n",
8934
+ "required": [
8935
+ "code",
8936
+ "details"
8937
+ ],
8938
+ "properties": {
8939
+ "code": {
8940
+ "type": "string",
8941
+ "enum": [
8942
+ "CATALOG_REFERENCE_UNRESOLVABLE"
8943
+ ]
8944
+ },
8945
+ "details": {
8946
+ "type": "object",
8947
+ "additionalProperties": false,
8948
+ "required": [
8949
+ "schema",
8950
+ "entity_id",
8951
+ "variant_id",
8952
+ "as_of"
8953
+ ],
8954
+ "properties": {
8955
+ "schema": {
8956
+ "$ref": "#/components/schemas/ConditionalEntitySlug"
8957
+ },
8958
+ "entity_id": {
8959
+ "type": "string",
8960
+ "description": "The entity the reference addressed.",
8961
+ "example": "price-sp26d1yo"
8962
+ },
8963
+ "variant_id": {
8964
+ "type": "string",
8965
+ "description": "The variant the reference addressed.",
8966
+ "example": "var-46045"
8967
+ },
8968
+ "as_of": {
8969
+ "type": "string",
8970
+ "description": "The instant the reference names.",
8971
+ "example": "2026-12-20T10:15:00.000Z"
8972
+ }
8973
+ }
8974
+ }
8975
+ }
8976
+ },
8977
+ {
8978
+ "type": "object",
8979
+ "description": "A refusal without a `code`, such as a request validation failure or a price that\ndoes not exist.\n",
8980
+ "additionalProperties": false,
8981
+ "required": [
8982
+ "message"
8983
+ ],
8984
+ "properties": {
8985
+ "message": {
8986
+ "type": "string"
8987
+ },
8988
+ "status": {
8989
+ "type": "number"
8990
+ },
8991
+ "cause": {
8992
+ "type": "string"
8993
+ },
8994
+ "error": {
8995
+ "$ref": "#/components/schemas/ReportedError"
8996
+ }
8997
+ }
8998
+ }
8999
+ ]
9000
+ }
9001
+ ]
9002
+ },
9003
+ "BaseProduct": {
9004
+ "type": "object",
9005
+ "description": "The product's own attributes — everything but the two relations whose shape depends on\nwhether the product was hydrated, which `Product` and `HydratedProduct` add.\n",
9006
+ "additionalProperties": true,
9007
+ "properties": {
9008
+ "description": {
8718
9009
  "type": "string",
8719
9010
  "description": "The description for the product"
8720
9011
  },
@@ -8759,18 +9050,6 @@
8759
9050
  }
8760
9051
  }
8761
9052
  },
8762
- "cross_sellable_products": {
8763
- "type": "object",
8764
- "description": "Stores references to products that can be cross sold with the current product.",
8765
- "properties": {
8766
- "$relation": {
8767
- "type": "array",
8768
- "items": {
8769
- "$ref": "#/components/schemas/EntityRelation"
8770
- }
8771
- }
8772
- }
8773
- },
8774
9053
  "product_images": {
8775
9054
  "description": "Stores references to a set of file images of the product",
8776
9055
  "oneOf": [
@@ -8815,20 +9094,8 @@
8815
9094
  }
8816
9095
  ]
8817
9096
  },
8818
- "price_options": {
8819
- "type": "object",
8820
- "description": "A set of [prices](/api/pricing#tag/simple_price_schema) or [composite prices](/api/pricing#tag/dynamic_price_schema) for the current product.",
8821
- "properties": {
8822
- "$relation": {
8823
- "type": "array",
8824
- "items": {
8825
- "$ref": "#/components/schemas/EntityRelation"
8826
- }
8827
- }
8828
- }
8829
- },
8830
9097
  "is_conditional": {
8831
- "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`.\n",
9098
+ "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`, or from a journey with `POST /v2/public/catalog`.\n",
8832
9099
  "type": "boolean"
8833
9100
  },
8834
9101
  "_availability_files": {
@@ -8862,6 +9129,150 @@
8862
9129
  }
8863
9130
  }
8864
9131
  },
9132
+ "Product": {
9133
+ "type": "object",
9134
+ "description": "The product entity, its relations as stored.",
9135
+ "readOnly": true,
9136
+ "additionalProperties": true,
9137
+ "example": {
9138
+ "type": "product",
9139
+ "_schema": "product",
9140
+ "_title": "Solar Panel with Battery Storage",
9141
+ "name": "Solar Panel with Battery Storage",
9142
+ "code": "SOLAR-BATT",
9143
+ "active": true,
9144
+ "description": "Solar Panel with battery solution, optimized for max efficiency. ",
9145
+ "feature": [
9146
+ {
9147
+ "_tags": [],
9148
+ "feature": "Eco-Panels"
9149
+ },
9150
+ {
9151
+ "_tags": [],
9152
+ "feature": "Remote Management Platform"
9153
+ },
9154
+ {
9155
+ "_tags": [],
9156
+ "feature": "Battery Remote Control"
9157
+ },
9158
+ {
9159
+ "_tags": [],
9160
+ "feature": "Mobile App"
9161
+ }
9162
+ ],
9163
+ "cross_sellable_products": {
9164
+ "$relation": [
9165
+ {
9166
+ "entity_id": "068d0713-a650-4668-9ed2-eca7be31e337",
9167
+ "_schema": "product",
9168
+ "_tags": []
9169
+ },
9170
+ {
9171
+ "entity_id": "c8402ee7-fba9-4f3d-bffd-6803ca655782",
9172
+ "_tags": []
9173
+ }
9174
+ ]
9175
+ },
9176
+ "product_images": {
9177
+ "$relation": [
9178
+ {
9179
+ "entity_id": "37bdeaaa-65fe-403e-9894-65b01cd277f1"
9180
+ },
9181
+ {
9182
+ "entity_id": "56dde657-795c-41bb-bf53-98fd586b7e6e"
9183
+ }
9184
+ ]
9185
+ },
9186
+ "product_downloads": {
9187
+ "$relation": [
9188
+ {
9189
+ "entity_id": "64211361-8759-414b-81c0-afbf24f83aa9"
9190
+ }
9191
+ ]
9192
+ },
9193
+ "_id": "a7f4771a-6368-4d77-bb01-71f1e4902de5",
9194
+ "_org": "728",
9195
+ "_created_at": "2022-06-03T15: 52: 27.512Z",
9196
+ "_updated_at": "2022-06-03T16: 05: 15.029Z",
9197
+ "price_options": {
9198
+ "$relation": [
9199
+ {
9200
+ "entity_id": "9c36c23b-1574-4193-beff-b1b5e1124bc7",
9201
+ "_tags": []
9202
+ },
9203
+ {
9204
+ "entity_id": "146aa2cc-f267-4d5e-bda4-cbe2669b7741",
9205
+ "_tags": []
9206
+ }
9207
+ ]
9208
+ }
9209
+ },
9210
+ "allOf": [
9211
+ {
9212
+ "$ref": "#/components/schemas/BaseProduct"
9213
+ }
9214
+ ],
9215
+ "properties": {
9216
+ "cross_sellable_products": {
9217
+ "type": "object",
9218
+ "description": "Stores references to products that can be cross sold with the current product.",
9219
+ "properties": {
9220
+ "$relation": {
9221
+ "type": "array",
9222
+ "items": {
9223
+ "$ref": "#/components/schemas/EntityRelation"
9224
+ }
9225
+ }
9226
+ }
9227
+ },
9228
+ "price_options": {
9229
+ "type": "object",
9230
+ "description": "A set of [prices](/api/pricing#tag/simple_price_schema) or [composite prices](/api/pricing#tag/dynamic_price_schema) for the current product.",
9231
+ "properties": {
9232
+ "$relation": {
9233
+ "type": "array",
9234
+ "items": {
9235
+ "$ref": "#/components/schemas/EntityRelation"
9236
+ }
9237
+ }
9238
+ }
9239
+ }
9240
+ }
9241
+ },
9242
+ "HydratedProduct": {
9243
+ "type": "object",
9244
+ "description": "The product entity hydrated one level deep, as the v2 public catalog serves it: each\nrelation holds the entities it referenced, sanitised, with their own relations as stored.\n",
9245
+ "readOnly": true,
9246
+ "additionalProperties": true,
9247
+ "allOf": [
9248
+ {
9249
+ "$ref": "#/components/schemas/BaseProduct"
9250
+ }
9251
+ ],
9252
+ "properties": {
9253
+ "cross_sellable_products": {
9254
+ "type": "array",
9255
+ "description": "The products that can be cross sold with the current product.",
9256
+ "items": {
9257
+ "$ref": "#/components/schemas/Product"
9258
+ }
9259
+ },
9260
+ "price_options": {
9261
+ "type": "array",
9262
+ "description": "The [prices](/api/pricing#tag/simple_price_schema) and [composite\nprices](/api/pricing#tag/dynamic_price_schema) of the current product, each as stored.\nA conditional one is its base entity: the pair's `price` is the resolved one.\n",
9263
+ "items": {
9264
+ "anyOf": [
9265
+ {
9266
+ "$ref": "#/components/schemas/Price"
9267
+ },
9268
+ {
9269
+ "$ref": "#/components/schemas/CompositePrice"
9270
+ }
9271
+ ]
9272
+ }
9273
+ }
9274
+ }
9275
+ },
8865
9276
  "Opportunity": {
8866
9277
  "type": "object",
8867
9278
  "description": "The opportunity entity",
@@ -9990,7 +10401,7 @@
9990
10401
  ]
9991
10402
  },
9992
10403
  "is_conditional": {
9993
- "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`.\n",
10404
+ "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`, or from a journey with `POST /v2/public/catalog`.\n",
9994
10405
  "type": "boolean"
9995
10406
  },
9996
10407
  "pricing_model": {
@@ -10314,7 +10725,7 @@
10314
10725
  ]
10315
10726
  },
10316
10727
  "is_conditional": {
10317
- "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`.\n",
10728
+ "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`, or from a journey with `POST /v2/public/catalog`.\n",
10318
10729
  "type": "boolean"
10319
10730
  },
10320
10731
  "_created_at": {
@@ -10834,29 +11245,431 @@
10834
11245
  ]
10835
11246
  }
10836
11247
  },
10837
- "SearchProvidersParams": {
10838
- "description": "A search providers payload",
11248
+ "ResolveCatalogRequest": {
10839
11249
  "type": "object",
11250
+ "additionalProperties": false,
11251
+ "description": "The entries of one journey block, and the situation to resolve them for. Every member of\nevery pair is resolved for its entity type's context at the same `as_of`.\n",
11252
+ "required": [
11253
+ "entries",
11254
+ "context"
11255
+ ],
10840
11256
  "properties": {
10841
- "type": {
10842
- "description": "The provider type (power or gas)",
10843
- "type": "string",
10844
- "enum": [
10845
- "power",
10846
- "gas"
10847
- ]
10848
- },
10849
- "postal_code": {
10850
- "description": "The postal code to search for providers",
10851
- "type": "string"
11257
+ "entries": {
11258
+ "type": "array",
11259
+ "description": "One entry per configured tile, answered independently — a duplicate is answered twice.\nAt most 100.\n",
11260
+ "minItems": 1,
11261
+ "maxItems": 100,
11262
+ "items": {
11263
+ "$ref": "#/components/schemas/CatalogEntry"
11264
+ }
10852
11265
  },
10853
- "city": {
10854
- "description": "The city to search for providers",
10855
- "type": "string",
10856
- "nullable": true
11266
+ "context": {
11267
+ "$ref": "#/components/schemas/CatalogContext"
10857
11268
  },
10858
- "street": {
10859
- "description": "The street to search for providers",
11269
+ "as_of": {
11270
+ "type": "string",
11271
+ "description": "The instant every member is resolved at. Defaults to now. It is written into every\ncatalog reference, and checkout prices at it. Accepts an RFC 3339 date (read as midnight\nUTC) or date-time, to millisecond precision.\n",
11272
+ "example": "2026-12-20T10:15:00Z"
11273
+ }
11274
+ }
11275
+ },
11276
+ "CatalogContext": {
11277
+ "type": "object",
11278
+ "additionalProperties": false,
11279
+ "description": "One context per entity type, each the authenticated resolve's context and checked against\nthat type's schema alone. A product resolves against `product`, a price and each of a\ncomposite's components against `price`, and a coupon against `coupon`. A type left out\nresolves against an empty context, which serves the `default` variant.\n",
11280
+ "properties": {
11281
+ "product": {
11282
+ "$ref": "#/components/schemas/ResolveContext"
11283
+ },
11284
+ "price": {
11285
+ "$ref": "#/components/schemas/ResolveContext"
11286
+ },
11287
+ "coupon": {
11288
+ "$ref": "#/components/schemas/ResolveContext"
11289
+ }
11290
+ },
11291
+ "example": {
11292
+ "product": {
11293
+ "postal_code": "46045",
11294
+ "channel": "direct"
11295
+ },
11296
+ "price": {
11297
+ "postal_code": "46045"
11298
+ }
11299
+ }
11300
+ },
11301
+ "CatalogEntry": {
11302
+ "type": "object",
11303
+ "additionalProperties": false,
11304
+ "description": "A product and, optionally, one of its prices. With `price_id` the entry is the author's\npair, served as named; without it the entry is served from the resolved product's\n`price_options`, one pair per price.\n",
11305
+ "required": [
11306
+ "product_id"
11307
+ ],
11308
+ "properties": {
11309
+ "product_id": {
11310
+ "type": "string",
11311
+ "description": "The product to show.",
11312
+ "example": "product-pv-2027"
11313
+ },
11314
+ "price_id": {
11315
+ "type": "string",
11316
+ "description": "The price to show it at. Absent, every price the resolved product offers.",
11317
+ "example": "price-sp26d1yo"
11318
+ }
11319
+ }
11320
+ },
11321
+ "ResolveCatalogResult": {
11322
+ "type": "object",
11323
+ "required": [
11324
+ "pairs",
11325
+ "warnings"
11326
+ ],
11327
+ "properties": {
11328
+ "pairs": {
11329
+ "type": "array",
11330
+ "description": "One pair per applicable combination, unordered. A member that matches several variants\nis several pairs; a composite whose components match several variants is one pair per\ncombination. An entry may yield none.\n",
11331
+ "items": {
11332
+ "$ref": "#/components/schemas/CatalogPair"
11333
+ }
11334
+ },
11335
+ "warnings": {
11336
+ "type": "array",
11337
+ "description": "The entries that could not be answered because an id found nothing. Always present, and\nempty in the ordinary case; an entry the catalog answers \"not offered\" is not in it.\n",
11338
+ "items": {
11339
+ "$ref": "#/components/schemas/CatalogWarning"
11340
+ }
11341
+ }
11342
+ }
11343
+ },
11344
+ "CatalogPair": {
11345
+ "type": "object",
11346
+ "description": "A product and one of its prices, resolved for the request's `context` at its `as_of`, with\nthe coupons that apply and the reference checkout prices from.\n",
11347
+ "required": [
11348
+ "product",
11349
+ "price",
11350
+ "coupons",
11351
+ "catalog_reference"
11352
+ ],
11353
+ "properties": {
11354
+ "product": {
11355
+ "description": "The product, hydrated one level deep and sanitised. A conditional product is the resolved\npayload — the entity as its variant leaves it, carrying `_variant_id`,\n`_version_valid_from`, `_conditions` and `_inert_overrides`. A classic product carries\nnone of them.\n",
11356
+ "anyOf": [
11357
+ {
11358
+ "allOf": [
11359
+ {
11360
+ "$ref": "#/components/schemas/HydratedProduct"
11361
+ },
11362
+ {
11363
+ "$ref": "#/components/schemas/ResolvedVariant"
11364
+ }
11365
+ ]
11366
+ },
11367
+ {
11368
+ "$ref": "#/components/schemas/HydratedProduct"
11369
+ }
11370
+ ]
11371
+ },
11372
+ "price": {
11373
+ "description": "The price, hydrated one level deep and sanitised, with the same discriminators when it is\nconditional. A composite price carries its components hydrated in place; a component that\nis itself conditional is resolved against the same context and carries the\ndiscriminators too.\n",
11374
+ "anyOf": [
11375
+ {
11376
+ "allOf": [
11377
+ {
11378
+ "$ref": "#/components/schemas/Price"
11379
+ },
11380
+ {
11381
+ "$ref": "#/components/schemas/ResolvedVariant"
11382
+ }
11383
+ ]
11384
+ },
11385
+ {
11386
+ "allOf": [
11387
+ {
11388
+ "$ref": "#/components/schemas/HydratedCompositePrice"
11389
+ },
11390
+ {
11391
+ "$ref": "#/components/schemas/ResolvedVariant"
11392
+ },
11393
+ {
11394
+ "$ref": "#/components/schemas/ResolvedPriceComponents"
11395
+ }
11396
+ ]
11397
+ },
11398
+ {
11399
+ "$ref": "#/components/schemas/Price"
11400
+ },
11401
+ {
11402
+ "allOf": [
11403
+ {
11404
+ "$ref": "#/components/schemas/HydratedCompositePrice"
11405
+ },
11406
+ {
11407
+ "$ref": "#/components/schemas/ResolvedPriceComponents"
11408
+ }
11409
+ ]
11410
+ }
11411
+ ]
11412
+ },
11413
+ "coupons": {
11414
+ "type": "array",
11415
+ "description": "The active coupons whose `prices` name this price — for a composite, its components —\nwith their promo codes and usage censored, as the v1 catalog serves them. Always present,\nand empty when none applies.\n",
11416
+ "items": {
11417
+ "$ref": "#/components/schemas/CouponWithoutPromoCodes"
11418
+ }
11419
+ },
11420
+ "catalog_reference": {
11421
+ "$ref": "#/components/schemas/CatalogReference"
11422
+ }
11423
+ }
11424
+ },
11425
+ "ResolvedPriceComponents": {
11426
+ "type": "object",
11427
+ "description": "The components of a composite price as the v2 catalog serves them: hydrated in place, and\na component that is itself conditional resolved against the same context, carrying the\ndiscriminators a resolved payload carries. A conditional component with no variant in\neffect — nothing matches and there is no default — is left out, as a deleted component is\n(ADR 0048).\n",
11428
+ "properties": {
11429
+ "price_components": {
11430
+ "type": "array",
11431
+ "items": {
11432
+ "anyOf": [
11433
+ {
11434
+ "allOf": [
11435
+ {
11436
+ "$ref": "#/components/schemas/Price"
11437
+ },
11438
+ {
11439
+ "$ref": "#/components/schemas/ResolvedVariant"
11440
+ }
11441
+ ]
11442
+ },
11443
+ {
11444
+ "$ref": "#/components/schemas/Price"
11445
+ }
11446
+ ]
11447
+ }
11448
+ }
11449
+ }
11450
+ },
11451
+ "CatalogWarning": {
11452
+ "description": "An entry the v2 catalog could not answer, and why. `details` is typed per `code`: narrow on\n`code` and the object under it declares exactly the fields that code sends.\n",
11453
+ "oneOf": [
11454
+ {
11455
+ "type": "object",
11456
+ "additionalProperties": false,
11457
+ "description": "An id in the entry finds no entity, or a deleted one. One warning per such id.\n",
11458
+ "required": [
11459
+ "code",
11460
+ "message",
11461
+ "details"
11462
+ ],
11463
+ "properties": {
11464
+ "code": {
11465
+ "type": "string",
11466
+ "enum": [
11467
+ "CATALOG_ENTRY_NOT_FOUND"
11468
+ ]
11469
+ },
11470
+ "message": {
11471
+ "type": "string"
11472
+ },
11473
+ "details": {
11474
+ "type": "object",
11475
+ "additionalProperties": false,
11476
+ "required": [
11477
+ "product_id",
11478
+ "missing"
11479
+ ],
11480
+ "properties": {
11481
+ "product_id": {
11482
+ "type": "string",
11483
+ "description": "The entry's product id, as sent.",
11484
+ "example": "product-heatpump-2027"
11485
+ },
11486
+ "price_id": {
11487
+ "type": "string",
11488
+ "description": "The entry's price id, as sent. Absent when the entry named none.",
11489
+ "example": "price-retired"
11490
+ },
11491
+ "missing": {
11492
+ "type": "string",
11493
+ "description": "Which of the entry's ids found nothing.",
11494
+ "enum": [
11495
+ "product",
11496
+ "price"
11497
+ ]
11498
+ }
11499
+ }
11500
+ }
11501
+ }
11502
+ },
11503
+ {
11504
+ "type": "object",
11505
+ "additionalProperties": false,
11506
+ "description": "An id in the entry names an entity of another type than the entry asked for: a price id\nwhere a product id was expected, or the reverse. One warning per such id.\n",
11507
+ "required": [
11508
+ "code",
11509
+ "message",
11510
+ "details"
11511
+ ],
11512
+ "properties": {
11513
+ "code": {
11514
+ "type": "string",
11515
+ "enum": [
11516
+ "CATALOG_ENTRY_TYPE_MISMATCH"
11517
+ ]
11518
+ },
11519
+ "message": {
11520
+ "type": "string"
11521
+ },
11522
+ "details": {
11523
+ "type": "object",
11524
+ "additionalProperties": false,
11525
+ "required": [
11526
+ "product_id",
11527
+ "mismatched",
11528
+ "actual_schema"
11529
+ ],
11530
+ "properties": {
11531
+ "product_id": {
11532
+ "type": "string",
11533
+ "description": "The entry's product id, as sent.",
11534
+ "example": "product-heatpump-2027"
11535
+ },
11536
+ "price_id": {
11537
+ "type": "string",
11538
+ "description": "The entry's price id, as sent. Absent when the entry named none.",
11539
+ "example": "product-tariff-2027"
11540
+ },
11541
+ "mismatched": {
11542
+ "type": "string",
11543
+ "description": "Which of the entry's ids names an entity of another type.",
11544
+ "enum": [
11545
+ "product",
11546
+ "price"
11547
+ ]
11548
+ },
11549
+ "actual_schema": {
11550
+ "type": "string",
11551
+ "description": "The type the entity turned out to be.",
11552
+ "example": "product"
11553
+ }
11554
+ }
11555
+ }
11556
+ }
11557
+ }
11558
+ ]
11559
+ },
11560
+ "CatalogReference": {
11561
+ "type": "object",
11562
+ "additionalProperties": false,
11563
+ "description": "Names the variant each member of a catalog pair was resolved from, and the instant `as_of`\nthey were resolved at. Checkout prices each conditional member from that variant, using the\nversion in effect at `as_of`.\n\nThe catalog signs every reference, classic pair or not: `_meta` signs the rest of the\nreference. Where the caller is public, a reference must verify. An authenticated caller may\nsend one without `_meta`. Signatures do not expire.\n",
11564
+ "required": [
11565
+ "product",
11566
+ "price",
11567
+ "as_of"
11568
+ ],
11569
+ "properties": {
11570
+ "product": {
11571
+ "$ref": "#/components/schemas/CatalogReferenceMember"
11572
+ },
11573
+ "price": {
11574
+ "$ref": "#/components/schemas/CatalogReferenceMember"
11575
+ },
11576
+ "price_components": {
11577
+ "type": "array",
11578
+ "description": "Present for a composite price that serves at least one component: the components this\npair is the combination of, each with its variant where one produced it. A conditional\ncomponent with no variant in effect is left out of the composite and is not named here\n(ADR 0048). A component line item carries no reference of its own.\n",
11579
+ "items": {
11580
+ "$ref": "#/components/schemas/CatalogReferenceMember"
11581
+ }
11582
+ },
11583
+ "coupons": {
11584
+ "type": "array",
11585
+ "description": "Present when coupons apply to the price. A coupon's `variant` exists only once coupons\ncan be conditional.\n",
11586
+ "items": {
11587
+ "$ref": "#/components/schemas/CatalogReferenceMember"
11588
+ }
11589
+ },
11590
+ "as_of": {
11591
+ "type": "string",
11592
+ "description": "The instant every member was resolved at, as an RFC 3339 date-time. Checkout selects\neach conditional member's version at this instant.\n",
11593
+ "example": "2026-12-20T10:15:00.000Z"
11594
+ },
11595
+ "_meta": {
11596
+ "$ref": "#/components/schemas/SignatureMeta"
11597
+ }
11598
+ },
11599
+ "example": {
11600
+ "product": {
11601
+ "id": "product-pv-2027",
11602
+ "variant": "var-46045"
11603
+ },
11604
+ "price": {
11605
+ "id": "price-composite-9f2",
11606
+ "variant": "var-46046"
11607
+ },
11608
+ "price_components": [
11609
+ {
11610
+ "id": "price-base-fee-46045",
11611
+ "variant": "var-46047"
11612
+ },
11613
+ {
11614
+ "id": "price-kwh-46045",
11615
+ "variant": "var-46048"
11616
+ }
11617
+ ],
11618
+ "coupons": [
11619
+ {
11620
+ "id": "0f8c4852-23fa-4a64-a2f3-88702335f094"
11621
+ }
11622
+ ],
11623
+ "as_of": "2026-12-20T10:15:00.000Z",
11624
+ "_meta": {
11625
+ "timestamp": 1797000000000,
11626
+ "signature": "c3ab8ff137"
11627
+ }
11628
+ }
11629
+ },
11630
+ "CatalogReferenceMember": {
11631
+ "type": "object",
11632
+ "additionalProperties": false,
11633
+ "description": "One member of a catalog reference: the entity, and the variant that produced it. `variant`\nis absent for a classic entity.\n",
11634
+ "required": [
11635
+ "id"
11636
+ ],
11637
+ "properties": {
11638
+ "id": {
11639
+ "type": "string",
11640
+ "description": "The entity's id.",
11641
+ "example": "price-sp26d1yo"
11642
+ },
11643
+ "variant": {
11644
+ "type": "string",
11645
+ "description": "The variant checkout prices this member from.",
11646
+ "example": "var-46045"
11647
+ }
11648
+ }
11649
+ },
11650
+ "SearchProvidersParams": {
11651
+ "description": "A search providers payload",
11652
+ "type": "object",
11653
+ "properties": {
11654
+ "type": {
11655
+ "description": "The provider type (power or gas)",
11656
+ "type": "string",
11657
+ "enum": [
11658
+ "power",
11659
+ "gas"
11660
+ ]
11661
+ },
11662
+ "postal_code": {
11663
+ "description": "The postal code to search for providers",
11664
+ "type": "string"
11665
+ },
11666
+ "city": {
11667
+ "description": "The city to search for providers",
11668
+ "type": "string",
11669
+ "nullable": true
11670
+ },
11671
+ "street": {
11672
+ "description": "The street to search for providers",
10860
11673
  "type": "string",
10861
11674
  "nullable": true
10862
11675
  },
@@ -11988,6 +12801,14 @@
11988
12801
  "$ref": "#/components/schemas/Product"
11989
12802
  }
11990
12803
  ]
12804
+ },
12805
+ "catalog_reference": {
12806
+ "description": "The `catalog_reference` of the pair this item came from, unchanged. Required when the\nitem's product or price is conditional. Component items carry none.\n",
12807
+ "allOf": [
12808
+ {
12809
+ "$ref": "#/components/schemas/CatalogReference"
12810
+ }
12811
+ ]
11991
12812
  }
11992
12813
  }
11993
12814
  },
@@ -12042,7 +12863,6 @@
12042
12863
  "coupon_ids": {
12043
12864
  "type": "array",
12044
12865
  "description": "The ids of the coupons applicable to the price item",
12045
- "readOnly": true,
12046
12866
  "items": {
12047
12867
  "type": "string",
12048
12868
  "description": "The id of the coupon"
@@ -12194,7 +13014,6 @@
12194
13014
  "price_component_coupon_ids": {
12195
13015
  "type": "object",
12196
13016
  "description": "The map of coupon ids applicable to the price components",
12197
- "readOnly": true,
12198
13017
  "additionalProperties": {
12199
13018
  "type": "array",
12200
13019
  "items": {
@@ -13862,7 +14681,7 @@
13862
14681
  "type": "boolean"
13863
14682
  },
13864
14683
  "is_conditional": {
13865
- "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`.\n",
14684
+ "description": "The flag for entities whose values vary by context. Resolve the values that apply with\n`POST /v1/conditional-pricing:resolve`, or from a journey with `POST /v2/public/catalog`.\n",
13866
14685
  "type": "boolean"
13867
14686
  },
13868
14687
  "requires_promo_code": {