Raw schema
{
"type": "object",
"properties": {
"plan_name": {
"description": "Short human label shown in the approval card; fill it first, e.g. 40m 20min air+EANx50. Also titles the plan table and share link, which keep its first 24 characters (a longer name is cut, never refused).",
"type": "string"
},
"audience": {
"description": "Optional: who the answer is for, from the conversation. beginner: new to deco, plain words. recreational (default): some training. technical: trained deco or CCR diver, terms and tables. Shapes the wording only, never a number.",
"type": "string",
"enum": [
"beginner",
"recreational",
"technical"
]
},
"units": {
"description": "metric (m, bar, L, L/min, °C) or imperial (ft, psi, ft³, ft³/min, °F). Applies to every input and output value except PPO₂/setpoints (bar), mixes (%), density (g/L). Default metric.",
"type": "string",
"enum": [
"metric",
"imperial"
]
},
"response_format": {
"description": "concise: plan table, gas, warnings, scenario summary. detailed: adds every setting used, per-level NDL, full warning details and the bailout table. Default concise.",
"type": "string",
"enum": [
"concise",
"detailed"
]
},
"mode": {
"description": "oc (open circuit, default) or ccr (closed-circuit rebreather). Set ccr for every rebreather plan: the ccr, ccr_deco_schedule, ccr_dilout_switches and bailout fields need it. On ccr, `cylinders` are the open-circuit bailout gases; the rig itself is in `ccr`.",
"type": "string",
"enum": [
"oc",
"ccr"
]
},
"levels": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"depth": {
"type": "number",
"minimum": 0,
"maximum": 700,
"description": "Level depth (m or ft, per units). 1 to 200 m (3 to 650 ft). Required."
},
"bottom_time_min": {
"type": "number",
"minimum": 0,
"maximum": 360,
"description": "Minutes at this depth, excluding the descent to it (unless behavior.include_travel_in_level_time is true). 0 to 360. 0 = arrival only: passes through this depth on this gas, used for a no-stop check or a travel-gas leg. Required."
},
"gas": {
"description": "Cylinder id this level breathes, or \"auto\" (default): the richest gas legal at this depth by PPO₂ cap, hypoxic floor and density limit. On ccr, auto means the loop on the onboard diluent.",
"type": "string",
"maxLength": 12
},
"breathe": {
"description": "ccr only. loop (default) or oc: dive this level open circuit on `gas`.",
"type": "string",
"enum": [
"loop",
"oc"
]
},
"setpoint": {
"type": "number",
"minimum": 0.4,
"maximum": 1.6,
"description": "ccr only. Loop PPO₂ for this level in bar, 0.4 to 1.6. Default ccr.setpoints.bottom."
},
"diluent": {
"description": "ccr only. \"onboard\" (default) or a cylinder id to breathe through the loop as a dilout on this level.",
"type": "string",
"maxLength": 12
}
},
"required": [
"depth",
"bottom_time_min"
],
"additionalProperties": false
},
"description": "Dive levels in the order dived, 1 to 20. The first is level_number 1."
},
"descent_gas": {
"description": "oc only. Cylinder id of a travel gas for the descent, for a hypoxic bottom mix (e.g. 12/60) that cannot be breathed near the surface. When level 1 is deeper than that gas's MOD, a 0-minute level on it at its MOD (whole m or ft) is added before level 1, and the result numbers that level first. Default none.",
"type": "string",
"maxLength": 12
},
"cylinders": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 12,
"description": "Short name used by levels and contingencies, 1 to 12 letters, digits, _ or -, e.g. back, s50, o2. Unique."
},
"preset": {
"description": "A common cylinder instead of cylinder_size, rated_pressure, twinset and the fill (explicit fields win). al80/s80: aluminium 80, 11.1 L, 3000 psi. al40, al63: aluminium 40/63, 3000 psi. hp80, hp100, hp120: US high-pressure steel, 3442 psi. lp85: US low-pressure steel, 2640 psi. single_10l, single_12l, single_15l: one EU steel cylinder at 232 bar. twin_10l, twin_12l, twin_15l: back-mounted doubles, 232 bar each. stage_11l: aluminium stage (AL80 size), 200 bar. stage_7l: 7 L stage, 200 bar. o2_3l, dil_3l: 3 L rebreather cylinder, 232 bar.",
"type": "string",
"enum": [
"al80",
"al40",
"al63",
"hp80",
"hp100",
"hp120",
"lp85",
"s80",
"single_10l",
"single_12l",
"single_15l",
"twin_10l",
"twin_12l",
"twin_15l",
"stage_11l",
"stage_7l",
"o2_3l",
"dil_3l"
]
},
"oxygen_pct": {
"type": "number",
"minimum": 5,
"maximum": 100,
"description": "Oxygen percent, 5 to 100. Air is 21, EANx50 is 50, trimix 18/45 is 18."
},
"helium_pct": {
"type": "number",
"minimum": 0,
"maximum": 95,
"description": "Helium percent, 0 to 95, oxygen_pct + helium_pct at most 100. Trimix 18/45 is 45. Default 0."
},
"cylinder_size": {
"type": "number",
"minimum": 0,
"maximum": 400,
"description": "12 = one 12 L cylinder (metric). 77.4 = an AL80 in ft³ (imperial, with rated_pressure 3000). Metric: water volume of ONE cylinder in litres, the number stamped on the neck, 1 to 25.5. Imperial: rated capacity in ft³ from the spec sheet (an AL80 holds less than its name), 1 to 400. Or pass preset. Default with neither: an AL80 (11.1 L, 77.4 ft³ at 3000 psi)."
},
"rated_pressure": {
"type": "number",
"minimum": 0,
"maximum": 7252,
"description": "Imperial only: the working pressure the capacity is rated at, psi, 725 to 7252 (3000 for an AL80). Default: the preset's, else 3000. Ignored on metric."
},
"start_pressure": {
"type": "number",
"minimum": 0,
"maximum": 7252,
"description": "Pressure in the cylinder at the start of the dive (bar or psi, per units), 0 to 500 bar (0 to 7252 psi). Default: the preset's fill, else 206.84 bar (3000 psi)."
},
"twinset": {
"type": "boolean",
"description": "true for back-mounted doubles or a sidemount pair breathed as one supply: doubles the gas at the same pressure. Default: the preset's, else false."
},
"exclude_from_deco": {
"type": "boolean",
"description": "true keeps this cylinder out of automatic ascent switching (pony, buddy bottle). Still priced; a level can still name it. Default false."
},
"reserve_pressure": {
"type": "number",
"minimum": 0,
"maximum": 4351,
"description": "Custom reserve for this cylinder (bar or psi, per units), 5 to 300 bar (50 to 4351 psi). Default: the reserve rule. Moves warnings and find_max_bottom_time, never the stops."
}
},
"required": [
"id",
"oxygen_pct"
],
"additionalProperties": false
},
"description": "Every open-circuit cylinder carried: back gas, stages, deco gases; on ccr, bailout gases. 1 to 10. Give preset or cylinder_size and start_pressure when known; omitted ones default (an AL80, 11.1 L at 3000 psi) and the result marks them."
},
"gradient_factors": {
"description": "Gradient factors. Lower is more conservative. Default 50/80. If high cannot surface the plan, the engine raises it and warns.",
"type": "object",
"properties": {
"low": {
"type": "number",
"minimum": 10,
"maximum": 100,
"description": "GF low, percent, 10 to 100. Sets the first stop depth. Default 50."
},
"high": {
"type": "number",
"minimum": 10,
"maximum": 100,
"description": "GF high, percent, 10 to 100. Sets the shallow stops and surfacing margin. Default 80."
}
},
"additionalProperties": false
},
"stops": {
"description": "Stop grid and stop-time rounding.",
"type": "object",
"properties": {
"last_stop_depth": {
"type": "number",
"description": "Final stop depth: 3, 4.5 or 6 m; 10, 15 or 20 ft. Default 6 m (20 ft)."
},
"stop_spacing": {
"type": "number",
"description": "Distance between stops: 3, 6 or 9 m; 10, 20 or 30 ft. Default 3 m (10 ft)."
},
"time_rounding": {
"description": "1s, 30s or 1min. Applied inside the engine; a stop is never shorter than the obligation. Default 1min.",
"type": "string",
"enum": [
"1s",
"30s",
"1min"
]
}
},
"additionalProperties": false
},
"environment": {
"description": "Water and altitude.",
"type": "object",
"properties": {
"water": {
"type": "string",
"enum": [
"salt",
"fresh",
"en13319",
"red_sea"
],
"description": "Water type, from its density: en13319 (EN 13319, the dive computer standard) 10.00 m per bar, salt 9.95, fresh 10.20, red_sea 9.92. Default en13319."
},
"temperature": {
"type": "number",
"minimum": -2,
"maximum": 104,
"description": "Water temperature for gas density only, -2 to 40 °C (28 to 104 °F). Never moves stops. Default 15 °C (59 °F)."
},
"altitude": {
"type": "number",
"minimum": 0,
"maximum": 32800,
"description": "Surface altitude (m or ft, per units), 0 to 10000 m (0 to 32800 ft). Default 0."
}
},
"additionalProperties": false
},
"rates": {
"description": "Ascent and descent rates, per units.",
"type": "object",
"properties": {
"ascent_deep": {
"type": "number",
"minimum": 0,
"maximum": 330,
"description": "Ascent rate below rate_change_depth (m/min or ft/min), 1 to 100 m/min. Default 9 m/min (30 ft/min)."
},
"ascent_shallow": {
"type": "number",
"minimum": 0,
"maximum": 330,
"description": "Ascent rate from rate_change_depth to the surface (m/min or ft/min), 1 to 100 m/min. Default 3 m/min (10 ft/min)."
},
"rate_change_depth": {
"type": "number",
"minimum": 0,
"maximum": 660,
"description": "Depth where the ascent rate changes (m or ft), 3 to 200 m. Default 6 m (20 ft)."
},
"descent": {
"type": "number",
"minimum": 0,
"maximum": 330,
"description": "Descent rate (m/min or ft/min), 1 to 100 m/min. Default 20 m/min (66 ft/min)."
}
},
"additionalProperties": false
},
"ppo2": {
"description": "PPO₂ limits in bar.",
"type": "object",
"properties": {
"max_all": {
"type": "number",
"minimum": 1,
"maximum": 1.6,
"description": "One PPO₂ cap in bar for every gas, 1.0 to 1.6 (e.g. 1.4 for recreational nitrox). Sets all three bands; a band field given too wins for its band."
},
"max_under_28pct_o2": {
"type": "number",
"minimum": 1,
"maximum": 1.6,
"description": "PPO₂ cap in bar for gases under 28% O₂, 1.0 to 1.6. Sets their MOD and switch depth. Default 1.4."
},
"max_28_to_44pct_o2": {
"type": "number",
"minimum": 1,
"maximum": 1.6,
"description": "PPO₂ cap in bar for gases from 28% to under 45% O₂, 1.0 to 1.6. Default 1.5."
},
"max_45pct_o2_and_up": {
"type": "number",
"minimum": 1,
"maximum": 1.6,
"description": "PPO₂ cap in bar for gases of 45% O₂ and over, 1.0 to 1.6. Default 1.6."
},
"min": {
"type": "number",
"minimum": 0.16,
"maximum": 0.21,
"description": "Lowest PPO₂ in bar before a hypoxia warning, 0.16 to 0.21. Warnings only. Default 0.18."
}
},
"additionalProperties": false
},
"gas_consumption": {
"description": "Breathing rates.",
"type": "object",
"properties": {
"working_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "Surface air consumption (SAC, also called RMV) for descent, bottom and the deep ascent (L/min or ft³/min, per units), 1 to 200 L/min (0.05 to 7.1 ft³/min). Default 20 L/min (0.71 ft³/min). Gas figures only."
},
"deco_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "SAC from the first stop up (L/min or ft³/min). Default 15 L/min (0.53 ft³/min). Gas figures only."
},
"ccr_metabolic_o2": {
"type": "number",
"minimum": 0.4,
"maximum": 2,
"description": "ccr: oxygen the diver metabolises, L/min in both unit systems, 0.4 to 2.0. Default 0.85."
}
},
"additionalProperties": false
},
"reserve": {
"description": "Gas reserve rule. Moves the gas status and warnings, never the stops.",
"type": "object",
"properties": {
"rule": {
"description": "thirds, fourths, fifths, sixths or fixed. Default thirds. Below 50 bar (725 psi) is always critical.",
"type": "string",
"enum": [
"thirds",
"fourths",
"fifths",
"sixths",
"fixed"
]
},
"fixed_pressure": {
"type": "number",
"minimum": 0,
"maximum": 7252,
"description": "Reserve for rule fixed (bar or psi, per units). Default 50 bar (725 psi)."
}
},
"additionalProperties": false
},
"gas_switch": {
"description": "Gas switching.",
"type": "object",
"properties": {
"switch_at": {
"description": "mod: switch at the deco gas MOD (default). stop: at the next stop.",
"type": "string",
"enum": [
"mod",
"stop"
]
},
"switch_time_s": {
"type": "number",
"minimum": 0,
"maximum": 300,
"description": "Seconds held at each OC switch on the old gas, 0 to 300 in 30 s steps. Default 0."
},
"when_cylinder_empty": {
"description": "show_shortfall (default): stay on it and report how much more gas is needed. switch_gas: move to the richest safe gas left.",
"type": "string",
"enum": [
"show_shortfall",
"switch_gas"
]
}
},
"additionalProperties": false
},
"oxygen_breaks": {
"description": "Oxygen breaks.",
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Insert oxygen breaks on high-PPO₂ stops. Default false."
},
"o2_minutes": {
"type": "number",
"minimum": 5,
"maximum": 30,
"description": "Minutes on high PPO₂ before a break, 5 to 30. Default 20."
},
"break_minutes": {
"type": "number",
"minimum": 1,
"maximum": 10,
"description": "Break length in minutes, 1 to 10. Default 5."
},
"min_ppo2": {
"type": "number",
"minimum": 0.8,
"maximum": 1.8,
"description": "PPO₂ in bar at or above which a stop counts toward the break clock, 0.8 to 1.8. Default 1.4."
},
"apply_on_loop": {
"type": "boolean",
"description": "ccr: also break on the loop. Not carried in share links. Default false."
},
"loop_setpoint": {
"type": "number",
"minimum": 0.4,
"maximum": 1.6,
"description": "ccr: loop setpoint in bar during a break. Default 0.7."
}
},
"additionalProperties": false
},
"behavior": {
"description": "Profile and model switches.",
"type": "object",
"properties": {
"include_travel_in_level_time": {
"type": "boolean",
"description": "true: level time includes the descent to it (dive-computer runtime style). Default false."
},
"o2_narcotic": {
"type": "boolean",
"description": "Count oxygen in END. END and warnings only. Default false."
},
"stay_on_loop": {
"type": "boolean",
"description": "ccr: true (default) keeps the whole ascent on the loop; false lets an OC deco gas take over where its PPO₂ is higher. Not carried in share links."
}
},
"additionalProperties": false
},
"warning_thresholds": {
"description": "Warning thresholds. Warnings only, never the stops.",
"type": "object",
"properties": {
"density_warning": {
"type": "number",
"minimum": 3,
"maximum": 8,
"description": "Gas density warning in g/L, 3 to 8. Default 5.2."
},
"density_critical": {
"type": "number",
"minimum": 3,
"maximum": 8,
"description": "Gas density critical in g/L, 3 to 8; also vetoes a gas in auto. Default 6.2."
},
"end_max": {
"type": "number",
"minimum": 0,
"maximum": 330,
"description": "Highest END before a warning (m or ft, per units), 20 to 100 m. Default 30 m (100 ft)."
},
"cns_pct": {
"type": "number",
"minimum": 50,
"maximum": 100,
"description": "CNS percent warning, 50 to 100. Default 80."
},
"otu": {
"type": "number",
"minimum": 200,
"maximum": 500,
"description": "OTU warning, 200 to 500. Default 300."
}
},
"additionalProperties": false
},
"ccr": {
"description": "The rebreather (mode ccr only).",
"type": "object",
"properties": {
"diluent_oxygen_pct": {
"type": "number",
"minimum": 5,
"maximum": 100,
"description": "Onboard diluent oxygen percent. Default 21."
},
"diluent_helium_pct": {
"type": "number",
"minimum": 0,
"maximum": 95,
"description": "Onboard diluent helium percent. Default 0."
},
"diluent_size": {
"type": "number",
"minimum": 0,
"maximum": 400,
"description": "Diluent cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L."
},
"diluent_start_pressure": {
"type": "number",
"minimum": 0,
"maximum": 7252,
"description": "Diluent cylinder fill (bar or psi). Default 232 bar (3365 psi)."
},
"o2_size": {
"type": "number",
"minimum": 0,
"maximum": 400,
"description": "Oxygen cylinder: litres (metric) or ft³ rated at 3000 psi (imperial). Default 3 L."
},
"o2_start_pressure": {
"type": "number",
"minimum": 0,
"maximum": 7252,
"description": "Oxygen cylinder fill (bar or psi). Default 232 bar (3365 psi)."
},
"diluent_breathable_oc": {
"type": "boolean",
"description": "true if the BOV or a regulator can breathe the onboard diluent open circuit. It then joins the bailout pool last. Default false."
},
"loop_volume": {
"type": "number",
"minimum": 2,
"maximum": 15,
"description": "Loop volume, litres in both unit systems, 2 to 15. Default 6."
},
"setpoints": {
"description": "Loop setpoints in bar.",
"type": "object",
"properties": {
"descent": {
"type": "number",
"minimum": 0.4,
"maximum": 1.6,
"description": "Descent setpoint in bar. Default 0.7."
},
"bottom": {
"type": "number",
"minimum": 0.4,
"maximum": 1.6,
"description": "Bottom setpoint in bar, the level default. Default 1.0."
},
"deco": {
"type": "number",
"minimum": 0.4,
"maximum": 1.6,
"description": "Deco setpoint in bar, used where ccr_deco_schedule has no step. Default 1.4."
}
},
"additionalProperties": false
},
"descent_switch_depth": {
"type": "number",
"minimum": 0,
"maximum": 660,
"description": "Depth (m or ft) where the descent setpoint hands over to bottom, first descent only. Default 18 m (60 ft)."
}
},
"additionalProperties": false
},
"ccr_deco_schedule": {
"description": "ccr deco setpoint steps, up to 10. Default [40 m: 1.5, 23 m: 1.6]. Send [] for the single ccr.setpoints.deco.",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"depth": {
"type": "number",
"minimum": 0,
"maximum": 660,
"description": "Depth (m or ft): the step applies at this depth and shallower."
},
"setpoint": {
"type": "number",
"minimum": 0.4,
"maximum": 1.6,
"description": "Setpoint in bar."
}
},
"required": [
"depth",
"setpoint"
],
"additionalProperties": false
}
},
"ccr_dilout_switches": {
"description": "ccr: at each depth and shallower, the loop breathes that cylinder as diluent (a dilout). Up to 6. Default none.",
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"depth": {
"type": "number",
"minimum": 0,
"maximum": 660,
"description": "Depth (m or ft): the switch applies at this depth and shallower."
},
"cylinder": {
"type": "string",
"maxLength": 12,
"description": "Cylinder id breathed as diluent, or \"onboard\" to switch back."
}
},
"required": [
"depth",
"cylinder"
],
"additionalProperties": false
}
},
"bailout": {
"description": "ccr only: the bailout view.",
"type": "object",
"properties": {
"view": {
"description": "ccr: which ascent the table shows. loop (default), end_of_profile, after_level, at_run_time, on_ascent. The worst-case bailout check runs on every view.",
"type": "string",
"enum": [
"loop",
"end_of_profile",
"after_level",
"at_run_time",
"on_ascent"
]
},
"level_number": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "For after_level: the level (1-based) the diver bails at the end of."
},
"run_time_min": {
"type": "number",
"minimum": 0,
"maximum": 1000,
"description": "For at_run_time: minutes on the Run clock."
},
"depth": {
"type": "number",
"minimum": 0,
"maximum": 660,
"description": "For on_ascent: depth (m or ft) the diver leaves the loop on the final ascent."
}
},
"additionalProperties": false
},
"scenarios": {
"description": "Which plans to compute, default [\"base\"]. base; deeper_3m, deeper_5m (imperial: deeper_10ft, deeper_20ft), longer_3min, longer_5min, deeper_and_longer_3, deeper_and_longer_5 (applied to the deepest level); lost:<cylinder id> (that cylinder never carried); custom:<name> (defined in contingencies); gf:<low>/<high> (e.g. gf:40/85), last_stop:<depth> (3, 4.5, 6 m or 10, 15, 20 ft) and stop_rounding:<1s|30s|1min> (the base plan with that one setting changed, to compare settings in one call); all (not the variants). Each one returns its own table and a comparison row. Up to 10. Ask for more in a later call.",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"description": "One scenario key."
}
},
"contingencies": {
"description": "Custom contingencies, up to 6, each requested with scenarios \"custom:<name>\" (or \"all\").",
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 24,
"description": "Name of this contingency, 1 to 24 characters. Request it with scenarios \"custom:<name>\". Unique."
},
"lost_cylinders": {
"description": "Cylinder ids lost in this contingency, comma-separated, e.g. \"s50,o2\". Default none.",
"type": "string",
"maxLength": 130
},
"fails_after_level": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Level number (1-based) after which the lost cylinders are gone. Omit: they are never carried."
},
"level_number": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Level number (1-based) the depth and time changes apply to. Default the deepest (last on a tie)."
},
"depth_change": {
"type": "number",
"minimum": -100,
"maximum": 100,
"description": "Depth added to that level (m or ft, per units), -30 to 30 m (-100 to 100 ft). Default 0."
},
"time_change_min": {
"type": "number",
"minimum": -60,
"maximum": 60,
"description": "Minutes added to that level, -60 to 60. Default 0."
},
"working_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "Working SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.working_sac."
},
"deco_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "Deco SAC for this contingency only (L/min or ft³/min, per units). Default gas_consumption.deco_sac."
},
"stress_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent."
},
"stress_minutes": {
"type": "number",
"minimum": 1,
"maximum": 60,
"description": "Minutes the stress_sac burst lasts, 1 to 60."
},
"stress_whole_ascent": {
"type": "boolean",
"description": "true: the stress_sac burst lasts to the surface. Default false."
},
"delay_min": {
"type": "number",
"minimum": 0,
"maximum": 60,
"description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0."
}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"modifiers": {
"description": "Plan modifiers: a stress breathing burst (gas only) and a delay before the ascent (moves the schedule).",
"type": "object",
"properties": {
"stress_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "Hard-breathing surface rate, SAC (L/min or ft³/min, per units), from the end of the bottom (on bailout: from leaving the loop), gas only. Needs stress_minutes or stress_whole_ascent."
},
"stress_minutes": {
"type": "number",
"minimum": 1,
"maximum": 60,
"description": "Minutes the stress_sac burst lasts, 1 to 60."
},
"stress_whole_ascent": {
"type": "boolean",
"description": "true: the stress_sac burst lasts to the surface. Default false."
},
"delay_min": {
"type": "number",
"minimum": 0,
"maximum": 60,
"description": "A hold at depth before the ascent starts, 0 to 60 minutes. Moves the schedule. Default 0."
},
"working_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "Working SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.working_sac."
},
"deco_sac": {
"type": "number",
"minimum": 0,
"maximum": 200,
"description": "Deco SAC override for the whole plan (L/min or ft³/min). Default gas_consumption.deco_sac."
}
},
"additionalProperties": false
},
"repetitive": {
"description": "Repetitive dive: the previous dive and the surface interval.",
"type": "object",
"properties": {
"surface_interval_min": {
"type": "number",
"minimum": 15,
"maximum": 1440,
"description": "Surface interval since the previous dive, 15 to 1440 minutes."
},
"previous_share_url": {
"description": "The share link of the previous dive's plan_dive result. Its tissue loading seeds this dive.",
"type": "string",
"maxLength": 8000
}
},
"required": [
"surface_interval_min"
],
"additionalProperties": false
},
"table_columns": {
"description": "Extra table columns. PPO₂ is always shown.",
"type": "object",
"properties": {
"cns": {
"type": "boolean",
"description": "Add a running CNS column. Default false."
},
"gas_remaining": {
"type": "boolean",
"description": "Add a gas-remaining column (bar or psi). Default false."
}
},
"additionalProperties": false
}
},
"required": [
"levels",
"cylinders"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}