SnapReport
POST/api/v1/snapreport/analyze

Send auditor evidence (notes, transcripts, audio, images, PDFs) against a standard. SnapReport AI returns a structured list of grading suggestions, one per relevant clause. Stateless — no audit is persisted on our side.

Authentication

Requires snapreport:generate permission. See Authentication.

Request — JSON — text only

curl -X POST https://api.myqateam.com/api/v1/snapreport/analyze \
-H "Authorization: Bearer myqa_..." \
-H "Content-Type: application/json" \
-d '{
"standard_id": "<uuid>",
"language": "en",
"evidence": [
{ "type": "text", "content": "Observed cold-chain logs, no breaches." }
]
}'

Request — multipart — files

To include audio, images, or PDFs, send as multipart/form-data. Scalar fields are plain form fields; processes is a JSON-stringified array; notes is a JSON-stringified array of strings. Any form field whose value is a file is treated as binary evidence — field names don't matter.

curl -X POST https://api.myqateam.com/api/v1/snapreport/analyze \
-H "Authorization: Bearer myqa_..." \
-F 'standard_id=<uuid>' \
-F 'language=en' \
-F 'processes=["<chapter-id>","<chapter-id>"]' \
-F 'notes=["Observed cold-chain logs for Q1."]' \
-F 'file_1=@interview.mp3' \
-F 'file_2=@fridge-temp-log.jpg' \
-F 'file_3=@haccp-plan.pdf'

Fields

FieldTypeRequiredDescription
standard_iduuidYesWhich standard to grade against. List available IDs via GET /api/v1/standards.
processesuuid[]NoChapter IDs to scope grading to a subset of the standard. Discover IDs via GET /api/v1/standards/:id/clauses (use chapters[].id). Omit to scope to every chapter.
languageenumNoen, fr, de. Defaults to en.
evidencearrayYes (JSON)Array of { type, content }. Types: text, transcript, structured.
notesJSON stringNo (multipart)Inline text notes for multipart requests.
File fieldsFileNo (multipart)Any file field is treated as evidence. Type is inferred from MIME.
callback_urlstringNoHTTPS webhook. Switches the call to async mode. Must be HTTPS and must not target localhost / private (RFC1918) / link-local IPs, or cloud-metadata services.
callback_secretstringNoHMAC-SHA256 secret for webhook signing.

File size limits

  • Images: 20 MB each. JPEG, PNG, WebP, GIF.
  • PDFs: 20 MB each.
  • Audio: 200 MB each. MP3, WAV, AAC, FLAC, WebM, M4A, MP4, OGG.

Response — synchronous

json
{
"success": true,
"data": {
"standard": { "id": "...", "code": "ISO 9001", "name": "ISO 9001:2015" },
"language": "en",
"suggestions": [
{
"clause_id": "uuid",
"clause_code": "4.1",
"is_knockout": false,
"grade": "A",
"comment": "Context analysis is reviewed annually; documented record from 2026-Q1 aligns with the quality policy.",
"reasoning": "Note states 'context analysis reviewed annually — no deviations observed'."
}
],
"validation_status": "pending_validation",
"requires_human_validation": true,
"notes_processed": 2,
"clauses_scanned": 46,
"processing_time_ms": 38211,
"token_usage": { "input_tokens": 14200, "output_tokens": 3800 }
}
}

Response — async acknowledgement

json
{
"success": true,
"data": {
"job_id": "...",
"status": "processing",
"estimated_duration_sec": 60
}
}

Webhook payload

When the job completes we send an HTTP POST to your callback_url with Content-Type: application/json. The request body is the JSON object shown below — the same data object you would have received synchronously, wrapped with job_id and success. If callback_secret was supplied, the request carries an X-Webhook-Signature header containing an HMAC-SHA256 hex digest of the raw body. Deliveries are best-effort and not retried — every attempt is recorded with response status, duration, and any error.

We do not authenticate the call to your endpoint with a Bearer token. Either verify the X-Webhook-Signature header using callback_secret, or include a hard-to-guess token in the URL itself (e.g. https://example.com/webhooks/snapreport/<random-token>).

Successful job payload

json
{
"job_id": "…",
"success": true,
"data": {
"standard": { "id": "…", "code": "ISO 9001", "name": "ISO 9001:2015" },
"language": "en",
"suggestions": [ /* same shape as the sync response */ ],
"validation_status": "pending_validation",
"requires_human_validation": true,
"notes_processed": 2,
"clauses_scanned": 46,
"processing_time_ms": 38211,
"token_usage": { "input_tokens": 14200, "output_tokens": 3800 }
}
}

Failed job payload

json
{
"job_id": "…",
"success": false,
"error": { "code": "PROCESSING_ERROR", "message": "…" }
}

Your endpoint should respond with 2xx within ~10 seconds; non-2xx responses are recorded but not retried.

Errors

See the full error code reference on the authentication page.