Panel Roles Reference

What every actor role can see and do — endpoints, responsibilities, and process steps. Super-admin excluded.

Roles covered
  1. Insurer (COMPANY) — the insurance-company tenant admin
  2. Blame Expert (EXPERT) — disagreement review queue
  3. Damage Expert (DAMAGE_EXPERT) — claim pricing
  4. Field Expert (FIELD_EXPERT) — on-scene in-person filing
  5. File Maker (FILE_MAKER) — V4/V5 party narrative
  6. File Reviewer (FILE_REVIEWER) — V4/V5 damage assessment
  7. Registrar (REGISTRAR) — office-based filing
  8. Call Center (CALL_CENTER) — V6 phone-initiated filing

Role Overview

Role enum Login panel Scope Primary job
company Insurer portal Tenant-wide View all files; manage branches, experts; run reports; rate experts
expert Blame expert panel Tenant DISAGREEMENT queue Lock blame cases, review party submissions, submit verdict or request resend
damage_expert Claim/damage panel Tenant claim queue Lock claims, price damage, validate repair factors, request resend/visit
field_expert Field expert panel Own created files V2/V3 in-person blame + claim filing; also sees blame/claim review panels
file_maker FileMaker panel Own created files V4/V5 party narrative (OTPs, inquiries, details, signatures); V5 claim approval
file_reviewer FileReviewer panel Assigned files V4/V5 damage assessment (accident fields, parts, captures; mixed-factor priced-line acceptance when needed)
registrar Registrar panel Own created files Office-based in-person blame + claim filing on behalf of parties
call_center Call-center panel Own created files V6 phone-initiated blame: run inquiry, send link; user completes the rest

1 — Insurer company

One company actor per insurance-company tenant. The insurer portal is the management layer: it can see everything under its tenant, manage the expert roster, manage branches, configure per-tenant media settings, and pull statistical reports. The insurer never touches blame/claim steps directly — it only observes and rates.

File management — expert-insurer/

MethodRouteWhat it does
GETexpert-insurer/filesList all blame + claim files for the tenant (merged by publicId). Filterable by status, file type, search, sort, page.
GETexpert-insurer/files/:publicIdFull detail for one file by publicId.
GETexpert-insurer/files/:publicId/timelineChronological activity timeline (all history events: source, type, actor, metadata).
GETexpert-insurer/files/:publicId/reportStructured report data for PDF generation (owner, driver, insurance, vehicle, accident sections).
PUTexpert-insurer/files/:publicId/ratingRate the experts on a file (1–5 per dimension: collision method, timeliness, cause accuracy, guilty-ID accuracy, bot rating).
GETexpert-insurer/report/unified-file-statusesUnified status catalog + per-status counts for the whole tenant portfolio. Filterable by fileType and date range.
GETexpert-insurer/report/status-countsDeprecated — prefer unified-file-statuses.

Branch management — expert-insurer/branches

MethodRouteWhat it does
GETexpert-insurer/branchesList all branches for this insurer. Query: search, from/to date, isActive filter.
POSTexpert-insurer/branchesAdd a new branch (name, code, address, city, phone, etc.).
PUTexpert-insurer/branches/:branchId/statusActivate or deactivate a branch.

Expert roster management — expert-insurer/experts

MethodRouteWhat it does
POSTexpert-insurer/experts/blameCreate a new blame-expert account under this insurer.
POSTexpert-insurer/experts/claimCreate a new damage-expert (claim) account under this insurer.
POSTexpert-insurer/experts/file-makerCreate a new FileMaker account under this insurer.
POSTexpert-insurer/experts/file-reviewerCreate a new FileReviewer account under this insurer.
GETexpert-insurer/experts/listPaginated list of all expert accounts on this tenant.
GETexpert-insurer/experts/topTop blame vs claim experts ranked by overall average rating (up to 10 each).
GETexpert-insurer/top-expertsAlias for experts/top (frontend compat).
GETexpert-insurer/:expertIdFiles handled by one expert (slim summary rows — blame or claim depending on expert type).

Statistics & reports

MethodRouteWhat it does
GETexpert-insurer/statisticsKPI cards: totalFilesReviewed, averageUserRating, inPersonCount, filesThisMonth, objectionPercentage, etc. Filterable by date range.
GETexpert-insurer/top-filesTop 10 highest-rated claim files (combined insurer + user score).
GETexpert-insurer/expert-work-logPer-expert work log: totalHandled, currentlyChecking, distinctFilesCheckedInPeriod. Filterable by expertKind and date range.
GETreports/report/insurer/requestsClaim + blame status bucket counts + unified file count for the tenant.
GETreports/report/insurer/per-month-requestsSame summary, broken down by the last 5 calendar months.
GETreports/report/insurer/checked-requestsSame summary filtered by optional createdAt date range.
GETreports/report/insurer/expert-work-logExpert work log (blame + damage expert collections, not field experts).
GETreports/report/insurer/expert-work-log/per-monthSame work log per calendar month (last 5).

Tenant settings — client-panel/

MethodRouteWhat it does
GETclient-panel/settingsGet per-tenant media limits (video/image/voice maxBytes) and CAR_BODY accident window (days).
PATCHclient-panel/settingsUpdate those settings (partial). Cannot exceed system-level route ceilings.

2 — Blame Expert expert

Reviews blame files in the DISAGREEMENT queue — cases where the two parties do not agree on who is at fault. After reviewing submitted documents and party statements the expert locks the case, then either submits a verdict, asks the parties to resend documents, or records an in-person visit outcome. All endpoints are under v2/expert-blame/.

Process

1 Browse list → 2 Assign (lock) the case → 3 Review party evidence (videos, voices, documents) → 4a Submit verdict or 4b Request document resend or 4c Record in-person visit.

Endpoints — v2/expert-blame/

MethodRouteWhat it does
GETv2/expert-blame/List blame cases in the DISAGREEMENT queue (available, locked by me, or decided by me). Query: search, sortBy, sortOrder, page, limit, unifiedStatus, fileType.
GETv2/expert-blame/:idFull detail for one blame case (party statements, photos, voices, videos).
POSTv2/expert-blame/:id/assignCheck availability and lock the case to this expert. Returns assigned, already_assigned_to_you, or 409 if someone else holds it.
PUTv2/expert-blame/reply/submit/:idSubmit verdict (accidentWay, accidentReason, accidentType, guilty party decision). Unlocks the case and moves it to COMPLETED.
PUTv2/expert-blame/reply/resend/:idRequest parties to re-upload documents. Sets blame to WAITING_FOR_RESEND. One resend request per lifecycle.
PUTv2/expert-blame/reply/inPerson/:idRecord that an in-person visit was made and submit verdict.
GETv2/expert-blame/report/unified-file-statusesStatus catalog + per-status counts for this expert's portfolio.
GETv2/expert-blame/report/status-countsDeprecated — prefer unified-file-statuses.
PUTv2/expert-blame/lock/:idDeprecated lock endpoint — use POST assign.

3 — Damage Expert damage_expert

Reviews claim files after the user has submitted their damage evidence. The expert prices each damaged part, optionally calculates a price-drop (depreciation), and can ask the user to resend documents, come in person, or upload repair factor invoices when workshop pricing is needed. All endpoints are under v2/expert-claim/.

Process

1 Browse list → 2 Assign (lock) the claim → 3 Review damage photos and documents → 4 Optionally edit selected parts or calculate price-drop → 5a Submit priced reply or 5b Request resend or 5c Request in-person visit → 6 If factor parts present: validate uploaded factor invoices.

Endpoints — v2/expert-claim/

MethodRouteWhat it does
GETv2/expert-claim/requestsList claims in WAITING_FOR_DAMAGE_EXPERT queue + factor-validation queue. Query: search, sortBy, page, limit, unifiedStatus, fileType.
GETv2/expert-claim/request/:claimRequestIdFull claim detail: damaged parts, captured images, documents, priceDrop, blameCase party data, video URLs. Completed claims include Fanavaran claimNo / claimId when available.
POSTv2/expert-claim/assign/:claimRequestIdLock claim to this expert. Returns assigned, already_assigned_to_you, or 409.
GETv2/expert-claim/request/:claimRequestId/price-dropPrice-drop context: severity labels, coefficient catalog, damaged parts + mapping, suggested car year from blame inquiry.
PUTv2/expert-claim/request/:claimRequestId/price-dropCalculate and persist price-drop: carPrice × yearCoeff × sumOfCoeffs ÷ 400.
PUTv2/expert-claim/reply/submit/:claimRequestIdSubmit damage assessment reply (priced parts list and daghi). daghi.branchId is used only with the تحویل داغی option. Cap: total ≤ 53 000 000 Toman. A priced-only claim completes immediately; factor claims continue through factor collection/validation. No final owner signature or automatic Fanavaran submission.
PUTv2/expert-claim/reply/resend/:claimRequestIdRequest user to resend documents/photos. One resend per claim lifecycle; returns 422 if already fulfilled.
PATCHv2/expert-claim/:claimRequestId/visitAsk user to come in person. Unlocks claim, sets claimStatus to NEEDS_REVISION.
PATCHv2/expert-claim/validate-factors/:claimRequestIdValidate uploaded repair factor invoices. Approve or reject each factor line with totalPayment. Cap applies across all lines (≤ 53 000 000 Toman). Auto-completes when all lines are decided.
PATCHv2/expert-claim/request/:claimRequestId/damaged-partsEdit selected damaged parts while the claim is locked by this expert (EXPERT_REVIEWING).
GETv2/expert-claim/outer-parts-catalogFanavaran outer car-components catalog (shared with user flow).
GETv2/expert-claim/inner-parts-catalogStatic inner car-parts catalog JSON.
GETv2/expert-claim/branchesInsurer branches for this expert's tenant (for daghi/branch selection in reply payload).
GETv2/expert-claim/stream/:id/videoStream claim video (car-capture walk-around or accident video). Query: query=car-capture|accident.
GETv2/expert-claim/report/unified-file-statusesStatus catalog + counts for this expert's claim portfolio.
GETv2/expert-claim/report/status-countsDeprecated — prefer unified-file-statuses.
PUTv2/expert-claim/lock/:claimRequestIdDeprecated lock endpoint — use POST assign.

4 — Field Expert field_expert

Goes to the accident scene and fills both parties' forms in-person (V2 mirror / V3 flows). The field expert also has read access to the expert-blame and expert-claim panels (scoped to their own files). They are the only role that spans both blame filing and claim filing in the same session.

Blame filing — v2/expert-initiated/blame-request-management/

Mirror of the user blame API. Frontend reuses same pages by swapping prefix only.

MethodRouteWhat it does
POSTPOST /Create IN_PERSON blame file.
POSTsend-party-otp/:idSend OTP to one party by phone number (no invite link).
POSTverify-party-otp/:idVerify one party's OTP and bind their account.
POSTblame-confession/:idRecord party's blame confession.
POSTcar-body-form/:id[CAR_BODY only] Accident type form.
POSTrun-inquiries/:id / run-inquiries-vin/:idInitial form / plate or VIN inquiry for current party.
POSTupload-video/:idUpload first-party video.
POSTadd-detail-location/:idAdd GPS location for current party.
POSTupload-voice/:idUpload voice recording for current party.
POSTadd-detail-description/:idAdd description for current party.
POSTadd-second-party/:phone/:id/Advance to second party (no SMS link sent).
PUTsign/:idUpload party signature (FIRST then SECOND, partyRole param).
POSTaccident-fields/:idSave accident fields and complete blame immediately (no expert queue).

V3 blame + claim filing — v3/expert-initiated/blame-request-management/

Reorganised step order: all party narrative first, then damage assessment. Blame and claim both handled in this single controller.

MethodRouteWhat it does
POSTPOST / → send-party-otp → verify-party-otp → run-inquiries → add-detail-* → sign (×2)Party narrative phase (steps 1–8) — identical endpoints to mirror, same contract.
POSTaccident-fields/:idStep 9: save accident fields after both parties have signed.
GETclaim-id/:requestIdStep 10: get auto-created claim ID.
POSTupload-document/:claimIdStep 11: upload licence / car card documents.
PATCHselect-outer-parts/:claimId / select-other-parts/:claimIdSteps 12–13: select damaged parts.
POSTcapture-part/:claimIdStep 14: capture part photos + angles.
PATCHcar-capture/:claimIdStep 15: walk-around video.
POSTupload-video/:requestIdStep 16: blame accident video (final) → WAITING_FOR_EXPERT (THIRD_PARTY) or COMPLETED (CAR_BODY).

Expert-blame + expert-claim panel (read + action on own files)

FIELD_EXPERT sees v2/expert-blame/ scoped to their own created files (not the disagreement queue). They also see v2/expert-claim/ for claims linked to their blame files. Same endpoints as blame-expert and damage-expert panels above.

5 — File Maker file_maker

The first actor in the V4/V5 split. FileMaker handles the party narrative on-site: OTPs, inquiries, location/description/voice, and signatures for both parties. They also upload the initial claim documents (licences, car cards). After the second signature the file is "sealed" for FileReviewer pickup. In V5, FileMaker comes back at the end to approve or reject the completed claim. After approval, an expert submits the case to Fanavaran manually.

Blame filing — v4/file-maker/blame-request-management/ and v5/…

V4 and V5 endpoints are identical — only the prefix changes. V5 sets requiresFileMakerApproval=true at creation.

MethodRouteWhat it does
POSTPOST /Create IN_PERSON blame file.
GETmy-filesList all blame files created by this FileMaker.
GETmy-files/:requestIdFull detail for one file (parties, workflow, linked claim ID).
GETclaim-id/:requestIdGet the auto-created claim ID after guilty-party run-inquiries.
POSTsend-party-otp/:id / verify-party-otp/:idSend + verify OTP for one party at a time (guilty first, then damaged).
POSTcar-body-form/:id[CAR_BODY only] Accident type form.
POSTrun-inquiries/:id / run-inquiries-vin/:idRun plate or VIN inquiry. First call = guilty (+ auto-creates claim). Second call = damaged (THIRD_PARTY only).
POSTadd-detail-location/:id / add-detail-description/:id / upload-voice/:idAdd location, description, and voice for current party (partyRole param selects FIRST/SECOND).
PUTsign/:idUpload party signature (partyRole=FIRST then SECOND). After second signature, file is sealed.
POSTupload-document/:claimIdUpload licences / car cards against the auto-created claim.
GETcapture-requirements/:claimIdStep-aware capture requirements (phases: pre-capture docs vs damaged parts + chassis/engine).

V5 claim approval — v5/file-maker/claim-approval/

Used only in V5. After damage expert review and any required factor validation, claim enters WAITING_FOR_FILE_MAKER_APPROVAL; no final owner signature is needed.

MethodRouteWhat it does
POSTapprove/:claimIdApprove the completed claim → claim becomes COMPLETED. An expert submits to Fanavaran manually when ready.
POSTreject/:claimIdReject back to FileReviewer → claim returns to WAITING_FOR_DAMAGE_EXPERT. Limit: max 2 rejections per claim; 3rd attempt returns 422 FILE_MAKER_REJECTION_LIMIT_EXCEEDED.

6 — File Reviewer file_reviewer

The second actor in the V4/V5 split. FileReviewer picks up sealed files (after FileMaker is done) and performs the full damage assessment pass: accident fields, capture requirements lookup, document upload (chassis/engine), part selection, part photos and walk-around video. The blame is marked COMPLETED by car-capture. FileReviewer also has read access to the expert-claim panel for claims they are reviewing.

Damage assessment — v4/file-reviewer/blame-request-management/ and v5/…

V4 and V5 endpoints are identical — only the prefix changes.

MethodRouteWhat it does
GETmy-filesList FileMaker-sealed files available to claim in this reviewer’s insurer, plus files already assigned to this FileReviewer.
GETmy-files/:requestIdFull detail for one available or assigned file in this reviewer’s insurer (parties, workflow, expert fields, linked claim ID).
GETclaim-id/:requestIdGet the auto-created claim ID (from FileMaker's guilty-party inquiry).
POSTaccident-fields/:requestIdStep 1 (FileReviewer): save accident fields (accidentWay, accidentReason, accidentType).
GETcapture-requirements/:claimIdStep-aware capture requirements (pre-capture docs phase vs capture-parts phase).
POSTupload-document/:claimIdUpload chassis / engine / metal-plate documents.
PATCHselect-outer-parts/:claimIdSelect outer (body) damaged parts.
PATCHselect-other-parts/:claimIdSelect other (non-body) damaged parts.
POSTcapture-part/:claimIdCapture part photos + angles for each selected damaged part.
PATCHcar-capture/:claimIdWalk-around video (final FileReviewer capture step). Claim → WAITING_FOR_DAMAGE_EXPERT, blame → COMPLETED.
PUTclaim-sign/:claimIdFor mixed priced/factor claims only: record acceptance of priced lines before factor uploads. A final owner signature is no longer required.
POSTupload-video/:requestIdNo-op in V4/V5 — blame already COMPLETED by car-capture. Returns idempotent success.

Expert-claim panel access

FILE_REVIEWER is in the allowed roles for v2/expert-claim/. They can view claim details and run the assign/lock flow for claims associated with their files. They cannot initiate a damage-expert resend independently.

7 — Registrar registrar

Office-based role that files in-person blame and claim on behalf of parties. Uses a bulk-OTP flow (both parties' OTPs sent and verified in one call each) rather than the one-at-a-time OTP used by field experts. After blame, the registrar mirrors the user claim API to fill part selection, documents, and captures. The file then enters the normal damage-expert review lifecycle.

Blame filing — registrar-initiated-blame/

Note: @ApiExcludeController — routes exist but not surfaced in Swagger docs.

MethodRouteWhat it does
POSTregistrar-initiated-blame/createCreate IN_PERSON blame file.
GETregistrar-initiated-blame/my-filesList all blame files created by this registrar.
GETregistrar-initiated-blame/blame/:requestIdFull detail for one blame file.
POSTregistrar-initiated-blame/send-party-otps/:idSend OTPs to both parties simultaneously.
POSTregistrar-initiated-blame/verify-party-otps/:idVerify both parties' OTPs in one call.
POSTregistrar-initiated-blame/complete-blame-data/:idSubmit all blame form data for both parties in one payload.
POSTregistrar-initiated-blame/upload-video/:idUpload blame video.
POSTregistrar-initiated-blame/upload-voice/:idUpload voice recording.
POSTregistrar-initiated-blame/add-accident-fields/:idSave accident fields and complete blame.
POSTregistrar-initiated-blame/upload-party-signature/:idUpload a party's signature (partyRole=FIRST/SECOND).

Claim filing — v2/registrar/claim-request-management/

Mirror of the user claim API. Frontend reuses same claim pages by swapping prefix only.

MethodRouteWhat it does
POSTcreate-from-blame/:blameIdCreate claim from a completed blame file.
GETouter-parts-catalog / car-other-partParts catalogs (outer body parts + other parts JSON).
GETbranches/:insuranceIdInsurer branch list for daghi.branchId when the expert selects the تحویل داغی option.
PATCHselect-outer-parts/:claimIdSelect outer damaged parts.
PATCHselect-other-parts/:claimIdSelect other damaged parts + bank info.
POSTupload-document/:claimIdUpload claim documents (licences, car card).
POSTcapture-part/:claimIdCapture part photos + angles.
PATCHcar-capture/:claimIdWalk-around video (final step) → WAITING_FOR_DAMAGE_EXPERT.

8 — Call Center call_center

Handles V6 phone-initiated blame filing. The agent collects the guilty party's data over the phone, runs the insurance inquiry, and sends the blame link via SMS. The user then completes the rest of the form through the standard V2 flow (with the initial-form/inquiry step skipped). The call-center agent's job ends after send-link; they can monitor progress via the read endpoints.

Endpoints — v6/call-center-blame/

MethodRouteWhat it does
POSTcreateCreate a LINK blame file. Body: { type: "THIRD_PARTY" | "CAR_BODY" }.
POSTrun-inquiry/:requestIdRun plate + national-code insurance inquiry for the guilty party. Stores result on blame document.
POSTrun-inquiry-vin/:requestIdVIN/chassis alternative to run-inquiry. Uses ESG chassis lookup.
POSTsend-link/:requestIdRegister user if needed, store as first party, send blame invite link via SMS. Body: { phoneNumber }.
GETmy-filesList all blame files started by this agent.
GETblame/:requestIdCurrent status and workflow step for one file (to check if user has opened the link and progressed).

After send-link the user completes the form via v2/blame-request-management/ (standard V2 flow). The initial-form / inquiry step is automatically skipped (skipInitialFormStep=true). Downstream claim flow is the standard V2 claim flow.

Shared: Actor Authentication

All panel actors (every role except user) authenticate through the same POST actor/login endpoint with captcha. Password reset is via email OTP. Profile reads and edits are also shared.

Endpoints — actor/

MethodRouteWhat it does
GETactor/captchaIssue a new login captcha challenge (returns captchaId + SVG image).
POSTactor/loginAuthenticate any actor role. Body: role, username/email/nationalCode, password, captchaId, captcha. Returns JWT access + refresh tokens.
POSTactor/forget-passwordSend password-reset OTP to email.
POSTactor/forget-password-verifyVerify OTP and set new password.
GETactor/profileGet current actor's profile.
PATCHactor/profileUpdate current actor's profile.