Testing
We don’t run a separate sandbox. Our pipeline is tightly integrated with Jira (Atlassian Cloud), which has no staging analog — a standalone sandbox wouldn’t faithfully mirror production. Instead, you test against production with the built-in test flag: set "is_test": true in the case JSON you send to POST /api/v1/partner/cases/create/.
curl -X POST https://api.redfolderresearch.com/api/v1/partner/cases/create/ \ -H "Authorization: Token <your_token>" \ -F 'case={"case_type":"pe","is_test":true,"plaintiff_name":"Jane Smith","date_of_loss":"2026-06-20","base_product":["personal_auto_policy_existence"],"search_reason":["defendant_insurance_unknown"],"is_incident_report_provided":false,"is_user_agreeing_to_all_terms_and_conditions":true,"should_exclude_other_insurance_from_search":false,"cc_emails":"paralegal@lawfirm.com","defendant_information":{"first_name":"John","last_name":"Doe","address":"123 Main St","city":"Boise","state_or_province":"ID","postal_or_zip_code":"83702"}}' \ -F "files=@police_report.pdf" \ -F "labels=incident_report"import json
import requests
case = { "case_type": "pe", "is_test": True, "plaintiff_name": "Jane Smith", "date_of_loss": "2026-06-20", "base_product": ["personal_auto_policy_existence"], "search_reason": ["defendant_insurance_unknown"], "is_incident_report_provided": False, "is_user_agreeing_to_all_terms_and_conditions": True, "should_exclude_other_insurance_from_search": False, "cc_emails": "paralegal@lawfirm.com", "defendant_information": { "first_name": "John", "last_name": "Doe", "address": "123 Main St", "city": "Boise", "state_or_province": "ID", "postal_or_zip_code": "83702", },}
with open("police_report.pdf", "rb") as file_handle: response = requests.post( "https://api.redfolderresearch.com/api/v1/partner/cases/create/", headers={"Authorization": "Token <your_token>"}, data={"case": json.dumps(case), "labels": "incident_report"}, files=[("files", file_handle)], )const casePayload = { case_type: "pe", is_test: true, plaintiff_name: "Jane Smith", date_of_loss: "2026-06-20", base_product: ["personal_auto_policy_existence"], search_reason: ["defendant_insurance_unknown"], is_incident_report_provided: false, is_user_agreeing_to_all_terms_and_conditions: true, should_exclude_other_insurance_from_search: false, cc_emails: "paralegal@lawfirm.com", defendant_information: { first_name: "John", last_name: "Doe", address: "123 Main St", city: "Boise", state_or_province: "ID", postal_or_zip_code: "83702", },};
// fileBlob: a File (from an <input>) or Blob holding police_report.pdfconst form = new FormData();form.append("case", JSON.stringify(casePayload));form.append("files", fileBlob, "police_report.pdf");form.append("labels", "incident_report");
const response = await fetch("https://api.redfolderresearch.com/api/v1/partner/cases/create/", { method: "POST", headers: { "Authorization": "Token <your_token>" }, body: form,});The flag — not a separate environment — decides behavior:
| A test case does NOT | A test case DOES |
|---|---|
| Get invoiced — invoice creation is blocked in code for test cases | Run the same validation and return the same 400 messages as a real case |
| Fire outbound webhooks — suppression is unconditional for test cases | Accept file uploads and support status polling with identical response shapes |
| Enter live research — it is tagged TEST and routed out of the live research workflow | Appear in our production systems (inert, but visible to our staff) |
When you’re ready to go live, drop the flag (or set it false) — the same payload becomes a real case.
Because webhook suppression is unconditional, is_test exercises submission, validation, upload, and polling — not webhook delivery. To validate your webhook handler, contact us: we can fire a sample webhook (synthetic payload, any event type you choose) at your endpoint. To validate your results handling, we can push a sample result onto a test case for you to fetch via GET /api/v1/partner/cases/{case_ref}/results/ — note the corresponding case.results_ready webhook stays suppressed, so poll for it.
Test cases are created in production systems: they’re inert, but they are real records our staff can see. Please use obviously-fake names (e.g. “Test Plaintiff”) in test payloads.