Dry-run validation of a document, or of the saved one when the body is empty; nothing is written (pricing.read)
curl --request POST \ --url https://example.com/api/admin/v1/marinas/example/price-lists/example/validate \ --header 'Content-Type: application/json' \ --header 'X-CSRF-Token: <X-CSRF-Token>' \ --cookie porto_session=<porto_session> \ --data '{ "code": "example", "name": { "it": "example", "en": "example" }, "valid_from": "2026-04-15", "valid_to": "2026-04-15", "contract_types": [ "annual" ], "settings": { "dimension_source": "vessel", "length_rounding": { "step_cm": 1, "mode": "up" }, "min_beam_ratio": { "num": 1, "den": 1 }, "split": { "additionalProperty": "pro_rata_daily" }, "rounding": { "additionalProperty": "none" }, "deposits": { "additionalProperty": { "percent_bp": 1, "amount_cents": 1 } }, "season_window": { "from": "2026-04-15", "to": "2026-04-15" }, "primary_items": { "additionalProperty": "example" }, "publish_matrix": true }, "periods": [ { "id": "example", "key": "example", "code": "example", "name": { "it": "example", "en": "example" }, "kind": "season", "color": "chart-1", "ranges": [ { "from": "2026-04-15", "to": "2026-04-15" } ] } ], "bands": [ { "id": "example", "key": "example", "code": "example", "max_cm": 1, "category": "example" } ], "rules": [ { "id": "example", "key": "example", "stage": "base", "name": "example", "active": true, "priority": 1, "stackable": true, "item_id": "example", "basis": "per_berth", "unit": "night", "amount_cents": 1, "unit_cents": 1, "amounts": { "additionalProperty": 1 }, "includes": [ { "item_id": "example", "qty_milli": 1 } ], "target_item_ids": [ "example" ], "target_item_types": [ "berth_fee" ], "conditions": { "hull_types": [ "monohull_motor" ], "overhang_min_cm": 1, "min_nights": 1, "max_nights": 1, "lead_min_days": 1, "lead_max_days": 1 }, "effect": { "percent_bp": 1, "amount_cents": 1 }, "discount_kind": "customer", "promo_code": "example", "scope": { "contract_types": [ "annual" ], "categories": [ "example" ], "group_ids": [ "example" ], "channels": [ "desk" ], "customer_categories": [ "member" ], "periods": [ "example" ], "time_bands": [ "example" ] } } ] }'Authorizations
Sezione intitolata “Authorizations”Parameters
Sezione intitolata “Parameters”Path Parameters
Sezione intitolata “Path Parameters”Request Body
Sezione intitolata “Request Body”The whole editable document of a draft; periods, bands and rules are replaced by the diff.
object
object
Calendar date YYYY-MM-DD in the marina timezone
Calendar date YYYY-MM-DD in the marina timezone
Engine settings (m2-plan §2.3). Map keys are contract types or “*” for the others.
object
object
object
object
object
Percent of the total or a fixed amount capped at the total (at most one)
object
Item id of the berth fee per contract type
object
Stored for the public transit matrix (M8); unused in M2
A season or an event of a price list. Saved rows carry id; new rows in a save carry key.
object
Client key of a new row of a price list document, unique in the request
object
Inclusive range of nights
object
Calendar date YYYY-MM-DD in the marina timezone
Calendar date YYYY-MM-DD in the marina timezone
Length band inclusive up to max_cm (absent = open, last band only); order is the array order.
object
Client key of a new row of a price list document, unique in the request
A base rule, modifier or discount (field set by stage, m2-plan §2.2): base rules use item_id, basis, unit, amount_cents/unit_cents/amounts and includes; modifiers and discounts use target_item_ids/types, conditions and effect; discounts also discount_kind and promo_code. seq is assigned by the server.
object
Client key of a new row of a price list document, unique in the request
Hour, half_day and day (and week) are accepted only on flat base rules of items with revenue class rental (M11, priced by RentalQuote, ignored by the mooring engine)
Length_band band code → cents; per_berth category → cents
object
object
object
Exactly one of the two
object
Empty or absent list = any value
object
Rate period codes
Rental half-day band codes (M11, honoured by the rental quote only)
Responses
Sezione intitolata “Responses”OK
object
object
Pricing.Validate issue code (m2-plan §4.8), e.g. period_overlap
object
Id of the row, or the client key of an unsaved one
Codes and integers as strings; never personal data
object
Example
{ "issues": [ { "severity": "error", "ref": { "kind": "list" } } ]}Malformed request or validation failure
object
object
Map validation issues (map_invalid)
object
ValidateMap rule (m1-plan §2.3), e.g. berth_overlap
Numbers only (cm, counts)
object
Price list validation issues (price_list_invalid)
object
Pricing.Validate issue code (m2-plan §4.8), e.g. period_overlap
object
Id of the row, or the client key of an unsaved one
Codes and integers as strings; never personal data
object
Machine-readable details: no_price {item_id, contract_type, night, unit, category, band, reason}; price_list_overlap {conflicts: [{id, code, valid_from, valid_to}]}; in_use {references}; resource_taken ConflictDetail; fit_blocked FitResult; placement_invalid {reason, allocation_id?}; invalid_transition {from, action}; closure_active {closure_id, from_date, to_date}; release_invalid {reason}; allocation_changed {current_resource_id, current_resource_code} (null when the allocation is gone); remote_pin_mismatch {expected_fingerprint, presented_fingerprint}; scenario_conflicts {conflicts: [StorageScenarioConflict]}; maintenance_conflicts {conflicts: [MaintenanceConflict]}; storage_no_space {area_id, from, to}. Ids, codes, dates and integers only.
object
Example
{ "type": "bad_request", "issues": [ { "severity": "error" } ], "price_list_issues": [ { "severity": "error", "ref": { "kind": "list" } } ]}Not authenticated, or invalid credentials
object
object
Map validation issues (map_invalid)
object
ValidateMap rule (m1-plan §2.3), e.g. berth_overlap
Numbers only (cm, counts)
object
Price list validation issues (price_list_invalid)
object
Pricing.Validate issue code (m2-plan §4.8), e.g. period_overlap
object
Id of the row, or the client key of an unsaved one
Codes and integers as strings; never personal data
object
Machine-readable details: no_price {item_id, contract_type, night, unit, category, band, reason}; price_list_overlap {conflicts: [{id, code, valid_from, valid_to}]}; in_use {references}; resource_taken ConflictDetail; fit_blocked FitResult; placement_invalid {reason, allocation_id?}; invalid_transition {from, action}; closure_active {closure_id, from_date, to_date}; release_invalid {reason}; allocation_changed {current_resource_id, current_resource_code} (null when the allocation is gone); remote_pin_mismatch {expected_fingerprint, presented_fingerprint}; scenario_conflicts {conflicts: [StorageScenarioConflict]}; maintenance_conflicts {conflicts: [MaintenanceConflict]}; storage_no_space {area_id, from, to}. Ids, codes, dates and integers only.
object
Example
{ "type": "bad_request", "issues": [ { "severity": "error" } ], "price_list_issues": [ { "severity": "error", "ref": { "kind": "list" } } ]}Authenticated but not allowed
object
object
Map validation issues (map_invalid)
object
ValidateMap rule (m1-plan §2.3), e.g. berth_overlap
Numbers only (cm, counts)
object
Price list validation issues (price_list_invalid)
object
Pricing.Validate issue code (m2-plan §4.8), e.g. period_overlap
object
Id of the row, or the client key of an unsaved one
Codes and integers as strings; never personal data
object
Machine-readable details: no_price {item_id, contract_type, night, unit, category, band, reason}; price_list_overlap {conflicts: [{id, code, valid_from, valid_to}]}; in_use {references}; resource_taken ConflictDetail; fit_blocked FitResult; placement_invalid {reason, allocation_id?}; invalid_transition {from, action}; closure_active {closure_id, from_date, to_date}; release_invalid {reason}; allocation_changed {current_resource_id, current_resource_code} (null when the allocation is gone); remote_pin_mismatch {expected_fingerprint, presented_fingerprint}; scenario_conflicts {conflicts: [StorageScenarioConflict]}; maintenance_conflicts {conflicts: [MaintenanceConflict]}; storage_no_space {area_id, from, to}. Ids, codes, dates and integers only.
object
Example
{ "type": "bad_request", "issues": [ { "severity": "error" } ], "price_list_issues": [ { "severity": "error", "ref": { "kind": "list" } } ]}Not found (or not visible to the principal)
object
object
Map validation issues (map_invalid)
object
ValidateMap rule (m1-plan §2.3), e.g. berth_overlap
Numbers only (cm, counts)
object
Price list validation issues (price_list_invalid)
object
Pricing.Validate issue code (m2-plan §4.8), e.g. period_overlap
object
Id of the row, or the client key of an unsaved one
Codes and integers as strings; never personal data
object
Machine-readable details: no_price {item_id, contract_type, night, unit, category, band, reason}; price_list_overlap {conflicts: [{id, code, valid_from, valid_to}]}; in_use {references}; resource_taken ConflictDetail; fit_blocked FitResult; placement_invalid {reason, allocation_id?}; invalid_transition {from, action}; closure_active {closure_id, from_date, to_date}; release_invalid {reason}; allocation_changed {current_resource_id, current_resource_code} (null when the allocation is gone); remote_pin_mismatch {expected_fingerprint, presented_fingerprint}; scenario_conflicts {conflicts: [StorageScenarioConflict]}; maintenance_conflicts {conflicts: [MaintenanceConflict]}; storage_no_space {area_id, from, to}. Ids, codes, dates and integers only.
object
Example
{ "type": "bad_request", "issues": [ { "severity": "error" } ], "price_list_issues": [ { "severity": "error", "ref": { "kind": "list" } } ]}Request body above the operation’s limit, or file above 15 MiB (file_too_large)
object
object
Map validation issues (map_invalid)
object
ValidateMap rule (m1-plan §2.3), e.g. berth_overlap
Numbers only (cm, counts)
object
Price list validation issues (price_list_invalid)
object
Pricing.Validate issue code (m2-plan §4.8), e.g. period_overlap
object
Id of the row, or the client key of an unsaved one
Codes and integers as strings; never personal data
object
Machine-readable details: no_price {item_id, contract_type, night, unit, category, band, reason}; price_list_overlap {conflicts: [{id, code, valid_from, valid_to}]}; in_use {references}; resource_taken ConflictDetail; fit_blocked FitResult; placement_invalid {reason, allocation_id?}; invalid_transition {from, action}; closure_active {closure_id, from_date, to_date}; release_invalid {reason}; allocation_changed {current_resource_id, current_resource_code} (null when the allocation is gone); remote_pin_mismatch {expected_fingerprint, presented_fingerprint}; scenario_conflicts {conflicts: [StorageScenarioConflict]}; maintenance_conflicts {conflicts: [MaintenanceConflict]}; storage_no_space {area_id, from, to}. Ids, codes, dates and integers only.
object
Example
{ "type": "bad_request", "issues": [ { "severity": "error" } ], "price_list_issues": [ { "severity": "error", "ref": { "kind": "list" } } ]}Porto è sviluppato da Coste360 SRL. Codice sorgente disponibile con licenza BSL 1.1; il marchio Porto è escluso dalla licenza.