changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$defs": {
+ "Links": {
+ "additionalProperties": false,
+ "description": "Addresses that go with the answer. `page`: the tool’s page on the site with the same inputs in its address, in the language asked (Chinese for a language the site does not publish yet), so a person can open the page that shows these numbers.",
+ "properties": {
+ "page": {
+ "description": "The tool’s page holding these inputs.",
+ "format": "uri",
+ "type": "string"
+ }
+ },
+ "required": [
+ "page"
+ ],
+ "type": "object"
+ },
+ "Normalized": {
+ "description": "What the API changed in the inputs before core saw them, so the caller sees what was understood: a JSON number as text, a thousands comma, full-width digits, a currency or unit name or a date written another way. Absent when nothing was changed.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "given": {
+ "description": "What was sent, as text.",
+ "type": "string"
+ },
+ "path": {
+ "description": "The input, like `cartons.0.length`.",
+ "type": "string"
+ },
+ "used": {
+ "description": "What core was given.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path",
+ "given",
+ "used"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "PlainValue": {
+ "description": "A figure, tagged so a reader knows how to write it: amounts and quantities are exact decimal strings, never floats.",
+ "oneOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "amount": {
+ "type": "string"
+ },
+ "currency": {
+ "description": "An ISO 4217 code.",
+ "type": "string"
+ },
+ "kind": {
+ "const": "money"
+ }
+ },
+ "required": [
+ "kind",
+ "amount",
+ "currency"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "quantity"
+ },
+ "places": {
+ "description": "How many decimal places the rounding rule keeps; pad to it, never round.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value",
+ "unit"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "ratio"
+ },
+ "value": {
+ "description": "A fraction: 0.13 is 13 %.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "base": {
+ "type": "string"
+ },
+ "kind": {
+ "const": "rate"
+ },
+ "per": {
+ "description": "`per` units of `base` cost `value` units of `quote`.",
+ "type": "string"
+ },
+ "quote": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value",
+ "base",
+ "quote",
+ "per"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "grouping": {
+ "const": false
+ },
+ "kind": {
+ "const": "count"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "code"
+ },
+ "value": {
+ "description": "A token from a fixed list the tool exports; the words for it are the copy key `<tool>.code.<value>`.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "const": "date"
+ },
+ "value": {
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "value"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "Provenance": {
+ "additionalProperties": false,
+ "description": "Where the figures in an answer come from. In every answer, errors included.",
+ "properties": {
+ "api": {
+ "const": "v1"
+ },
+ "datasets": {
+ "items": {
+ "$ref": "#/$defs/ProvenanceDataset"
+ },
+ "type": "array"
+ },
+ "generated_at": {
+ "description": "When the answer was made.",
+ "format": "date-time",
+ "type": "string"
+ },
+ "language": {
+ "description": "The language of the source lines.",
+ "enum": [
+ "zh-CN",
+ "en",
+ "ja",
+ "ko"
+ ]
+ },
+ "license": {
+ "additionalProperties": false,
+ "description": "The license as copy keys: which text applies. `status` was `draft` until the text was approved (2026-10-12) and is `approved` now.",
+ "properties": {
+ "ours": {
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "draft",
+ "approved"
+ ]
+ },
+ "underlying": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "status",
+ "ours",
+ "underlying"
+ ],
+ "type": "object"
+ },
+ "notice": {
+ "description": "本站非官方渠道的说明:引用本站数据时请和来源行一起转述。 / The site’s own line that it is not an official channel: pass it on with the source line when you quote us.",
+ "type": "string"
+ },
+ "site": {
+ "description": "The site the data is published by.",
+ "type": "string"
+ },
+ "source_line": {
+ "description": "来源行:回复用户时请原样引用它,让读者知道数据出自哪里、有多新。 / The credit line to quote as it is when you answer: who the figures come from and how fresh they are (the newest publisher’s day among the datasets used, or the day the answer was made).",
+ "type": "string"
+ }
+ },
+ "required": [
+ "api",
+ "site",
+ "generated_at",
+ "language",
+ "source_line",
+ "notice",
+ "datasets",
+ "license"
+ ],
+ "type": "object"
+ },
+ "ProvenanceDataset": {
+ "additionalProperties": false,
+ "description": "A dataset version an answer drew on. An origin the register does not let the site show is named nowhere.",
+ "properties": {
+ "id": {
+ "description": "The dataset.",
+ "type": "string"
+ },
+ "origin": {
+ "description": "The origin’s id in the register; null when the site may not show it.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "published_at": {
+ "description": "The publisher’s own date (and time, with its offset, when it gives one).",
+ "type": "string"
+ },
+ "source": {
+ "description": "The publisher’s own source line, in the answer’s language; null when there is none to show.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "source_url": {
+ "description": "The publisher’s page, only where the register lets the site link to it.",
+ "type": "string"
+ },
+ "version": {
+ "description": "Its version, named after the publisher’s date.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "version",
+ "published_at",
+ "origin",
+ "source"
+ ],
+ "type": "object"
+ },
+ "Step": {
+ "additionalProperties": false,
+ "description": "One line of the worked example: `id` is the copy key of its sentence, `values` fill it in.",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "message": {
+ "description": "这一步的一句话说明,数值已代入,用请求的语言。 / The step as one sentence in the language asked, its figures filled in. Absent when a sentence cannot be made whole.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "id",
+ "values"
+ ],
+ "type": "object"
+ },
+ "Warning": {
+ "additionalProperties": false,
+ "description": "Something a reader should know about a result; `code` is a copy key.",
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "level": {
+ "description": "Absent means a caution.",
+ "enum": [
+ "note",
+ "hint"
+ ]
+ },
+ "message": {
+ "description": "这条提醒的一句话说明,数值已代入,用请求的语言:回复时请用它,不要自己编数字。 / The warning as one sentence in the language asked, its figures filled in: use it, do not make up figures. Absent when a sentence cannot be made whole.",
+ "type": "string"
+ },
+ "next": {
+ "description": "For a hint: the slug of the tool it points to.",
+ "type": "string"
+ },
+ "values": {
+ "additionalProperties": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "code",
+ "values"
+ ],
+ "type": "object"
+ },
+ "cbmOutputs": {
+ "additionalProperties": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "description": "Each figure core returns, by id, as a tagged value. The ids listed are the ones the tool’s manifest names; a tool may return more (a figure that only its worked steps use), in the same form.",
+ "properties": {
+ "airBy": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "airChargeable": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "airVolumetric": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "chargeable": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "expressBy": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "expressChargeable": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "expressVolumetric": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "lclBy": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "lclChargeable": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "perCartonVolume": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "totalGrossWeight": {
+ "$ref": "#/$defs/PlainValue"
+ },
+ "totalVolume": {
+ "$ref": "#/$defs/PlainValue"
+ }
+ },
+ "required": [
+ "totalVolume",
+ "airVolumetric",
+ "expressVolumetric"
+ ],
+ "type": "object"
+ }
+ },
+ "additionalProperties": false,
+ "properties": {
+ "links": {
+ "$ref": "#/$defs/Links"
+ },
+ "normalized": {
+ "$ref": "#/$defs/Normalized"
+ },
+ "outputs": {
+ "$ref": "#/$defs/cbmOutputs"
+ },
+ "provenance": {
+ "$ref": "#/$defs/Provenance"
+ },
+ "steps": {
+ "items": {
+ "$ref": "#/$defs/Step"
+ },
+ "type": "array"
+ },
+ "tool": {
+ "const": "cbm"
+ },
+ "warnings": {
+ "items": {
+ "$ref": "#/$defs/Warning"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "tool",
+ "outputs",
+ "steps",
+ "warnings",
+ "links",
+ "provenance"
+ ],
+ "type": "object"
+}