Skip to main content

Verification Testing Shortcuts

In non-production environments, several approve/reject endpoints accept a force_status parameter that bypasses normal preconditions and transitions the entity to the specified status. This lets testers move through the full workflow without setting up verifier organizations and completing checklists.

Production safety

The force_status parameter is rejected with a 400 Validation Error in production environments. It is structurally impossible to force a status change in production.

How it works​

Add "force_status": "<target>" to the JSON body of any supported endpoint, where <target> is the desired status value (e.g., "approved", "rejected", "in_review"). When force_status is set:

  • Status preconditions are skipped — you can approve an entity from any status (e.g., approve a draft LCA without submitting it first)
  • Dependency gates are skipped — you can approve an EPD without an approved LCA, or a submittal package without all items approved
  • Checklist gates are skipped — verification assignments can be approved without the checklist being signed off
  • Constraint validation is skipped — variant EPDs can be auto-approved even if error-severity constraints would normally block
  • The entity transitions to the exact status you specify — e.g., "force_status": "approved" sets the entity to approved

All other behavior is preserved: timestamps are written, status transitions happen, and PDF generation is triggered where applicable.

Supported endpoints​

LCA versions​

# Force approve from any status — through SUBMIT, not /approve/
POST /api/v2/projects/{project_id}/lca/submit/
{"force_status": "approved"}
# (or the version-scoped equivalent)
POST /api/v2/lca-versions/{id}/submit/
{"force_status": "approved"}

# Force reject from any status
POST /api/v2/lca-versions/{id}/reject/
{"force_status": "rejected", "review_notes": "Testing rejection flow"}

What is bypassed: submit's editable-status precondition (you can go straight from draft), and reject's submitted / in_review precondition.

POST /api/v2/lca-versions/{id}/approve/ does not accept force_status. It approves only once the verification report letter and the ISO 14071 independence declaration have been signed for that version.

EPD verification assignments​

# Force approve (skips checklist sign-off + non-conformant item check)
POST /api/v2/verification/{assignment_id}/approve/
{"force_status": "approved"}

# Force flag
POST /api/v2/verification/{assignment_id}/flag/
{"force_status": "flagged", "review_notes": "Testing flag flow"}

What is bypassed: Checklist must be signed off, no non-conformant (N) items, a reference EPD's constraint rows must each carry a determination, assignment must be active, downstream EPD/PCF/LCA status checks.

What still happens: force-approving a reference EPD locks its model, exactly as a verifier's approval does, so variants created afterwards are compared with it (see Submission snapshots and the model lock).

Variant EPDs​

# Force auto-approve (skips constraints)
POST /api/v2/epds/{epd_id}/variants/{variant_id}/auto-approve/
{"force_status": "auto_approved"}

# Force manual approve (skips constraints + status)
POST /api/v2/epds/{epd_id}/variants/{variant_id}/approve/
{"force_status": "approved"}

# Force reject (skips status check)
POST /api/v2/epds/{epd_id}/variants/{variant_id}/reject/
{"force_status": "rejected"}

What is bypassed: Variant must be in correct status, error-severity constraint violations block.

Submittal packages​

# Force approve package (skips all-items-approved gate)
POST /api/v2/submittals/{package_id}/approve/
{"force_status": "approved", "review_notes": "Testing"}

# Force reject package
POST /api/v2/submittals/{package_id}/reject/
{"force_status": "rejected", "review_notes": "Testing"}

What is bypassed: Package must be in_review, all items must be individually approved.

Submittal items​

# Force approve item (skips dependency gates)
POST /api/v2/submittals/{package_id}/items/{item_id}/approve/
{"force_status": "approved"}

What is bypassed: Item must be in_review/flagged/needs_revision, LCA-before-EPD gate, reference-before-variant gate.

For the fastest path through the workflow:

  1. Create workspace, category, project, EPD (all normal API calls)
  2. Morph EPD to reference: POST /epds/{id}/morph-to-reference/
  3. Upload LCA docs: POST /projects/{id}/lca/documents/
  4. Force-approve LCA: POST /projects/{id}/lca/submit/ with {"force_status": "approved"}
  5. Submit EPD: POST /epds/{id}/submit/. force_status does not bypass submission, so if the template enforces its constraints, first save the reference EPD's own values with PUT /epds/{id}/reference-inputs/. Missing values block submission, and failing error-severity constraints block it unless you add ?acknowledge_constraint_failures=true. See Submitting a reference EPD.
  6. Force-approve EPD verification: POST /verification/{assignment_id}/approve/ with {"force_status": "approved"}
  7. Create variant: POST /epds/{id}/variants/
  8. Force auto-approve variant: POST /epds/{id}/variants/{vid}/auto-approve/ with {"force_status": "auto_approved"}

This gets you from zero to approved variant EPDs in under a minute.