Importing results
Most blasting software runs on an engineer’s desk. Its predictions still belong beside the measurements, so they can be seen in context and scored like any other.
The import document
An import carries the same typed outputs as a live run, plus where they came from: the tool, its version, the method family and the file the results were exported from. It names the blast by its platform id when known, or by its reference in the source tool.
How an import will be processed
- Export predictions from your tool and write them as an import document, following the published schema.
- Validate against the published JSON Schema before sending.
- The platform attaches the outputs to the blast, keeping the source’s provenance.
- After the blast, imported predictions are scored against measurements exactly as a live run is.
Validating a document
The schema is standard JSON Schema (draft 2020-12), so any conforming validator works.
import Ajv2020 from 'ajv/dist/2020';
import addFormats from 'ajv-formats';
const schema = await fetch('https://app.shockai.co/developers/schemas/v0/ImportDocument.json').then((response) => response.json());
const ajv = new Ajv2020({ allErrors: true, strict: false });
addFormats(ajv);
const validate = ajv.compile(schema);
if (!validate(importDocument)) {
console.error(validate.errors);
}Example
Predictions from a desktop design package: PPV at one receiver and a flyrock range.
ImportDocument
{
"specVersion": "0.1",
"blast": {
"externalRef": "B12-0926"
},
"source": {
"tool": "Acme Blast Designer",
"version": "7.2.0",
"vendor": "Acme Mining Software",
"method": "empirical",
"file": {
"name": "B12-0926-predictions.csv",
"sha256": "sha256:5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e"
},
"producedAt": "2026-09-25T22:40:00Z"
},
"outputs": [
{
"kind": "receiver_ppv",
"receiverId": "R1",
"basis": "pvs",
"ppvMmS": {
"median": 14.2,
"percentiles": [
{
"p": 95,
"value": 23.1
}
]
},
"validity": {
"status": "within"
}
},
{
"kind": "flyrock_zone",
"maxThrowM": {
"median": 61
},
"mechanism": "combined",
"clearance": {
"personnelM": 500,
"equipmentM": 300
},
"validity": {
"status": "within"
}
}
],
"unavailable": [],
"warnings": []
}