| GET /api/v1/deal-loss-reasons | include_inactive [query]: boolean (default=false) | deal_loss_reasons:read | 200: array[LossReasonRead] |
| GET /api/v1/organizations/{org_id}/contacts | org_id [path обяз.]: string (uuid) | contractors:read | 200: array[ContactRead] |
| POST /api/v1/organizations/{org_id}/contacts | org_id [path обяз.]: string (uuid) | Тело: application/json: app__schemas__deal__ContactIn | contractors:update | 201: ContactRead |
| DELETE /api/v1/organizations/{org_id}/contacts/{contact_id} | org_id [path обяз.]: string (uuid); contact_id [path обяз.]: string (uuid) | contractors:update | 204 |
| GET /api/v1/deals | status [query]: string / null; manager_id [query]: string (uuid) / null; customer_id [query]: string (uuid) / null; search [query]: string / null; include_closed [query]: boolean (default=true) | deals:read | 200: array[DealListItem] |
| POST /api/v1/deals | Нет | Тело: application/json: DealCreate | deals:create | 201: DealRead |
| GET /api/v1/deals/board | Нет | deals:read | 200: object |
| GET /api/v1/deals/{deal_id} | deal_id [path обяз.]: string (uuid) | deals:read | 200: DealRead |
| PUT /api/v1/deals/{deal_id} | deal_id [path обяз.]: string (uuid) | Тело: application/json: DealUpdate | deals:update | 200: DealRead |
| POST /api/v1/deals/{deal_id}/status | deal_id [path обяз.]: string (uuid) | Тело: application/json: DealStatusChange | deals:change_status | 200: DealRead |
| GET /api/v1/deals/{deal_id}/feed | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| GET /api/v1/deals/{deal_id}/stats | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| GET /api/v1/deals/{deal_id}/documents | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| POST /api/v1/deals/{deal_id}/meeting | deal_id [path обяз.]: string (uuid) | Тело: application/json: MeetingIn | deals:update | 201: object |
| GET /api/v1/deals/{deal_id}/compose | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| GET /api/v1/deals/{deal_id}/stage-history | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| GET /api/v1/deals/{deal_id}/transfer-preview | deal_id [path обяз.]: string (uuid) | Только сессия | 200: object |
| POST /api/v1/deals/{deal_id}/transfer | deal_id [path обяз.]: string (uuid) | Тело: application/json: DealTransferIn | projects:create | 200: DealRead |
| POST /api/v1/deals/{deal_id}/folder | deal_id [path обяз.]: string (uuid) | drive:create | 200: object |
| GET /api/v1/deals/{deal_id}/messages | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| POST /api/v1/deals/{deal_id}/quote | deal_id [path обяз.]: string (uuid); valid_days [query]: integer (default=30, min=1, max=365) | deals:update | 200: object |
| GET /api/v1/deals/{deal_id}/contacts | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| POST /api/v1/deals/{deal_id}/contacts | deal_id [path обяз.]: string (uuid) | Тело: application/json: ContactRoleIn | deals:update | 201: object |
| DELETE /api/v1/deals/{deal_id}/contacts/{row_id} | deal_id [path обяз.]: string (uuid); row_id [path обяз.]: string (uuid) | deals:update | 204 |
| GET /api/v1/deals/{deal_id}/contracts | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| POST /api/v1/deals/{deal_id}/contracts | deal_id [path обяз.]: string (uuid) | Тело: application/json: ContractLinkIn | deals:update | 201: object |
| GET /api/v1/deals/{deal_id}/contracts/available | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| DELETE /api/v1/deals/{deal_id}/contracts/{contract_id} | deal_id [path обяз.]: string (uuid); contract_id [path обяз.]: string (uuid) | deals:update | 204 |
| POST /api/v1/deals/{deal_id}/team | deal_id [path обяз.]: string (uuid) | Тело: application/json: TeamMemberIn | deals:update | 201: object |
| PUT /api/v1/deals/{deal_id}/team/{member_id} | deal_id [path обяз.]: string (uuid); member_id [path обяз.]: string (uuid) | Тело: application/json: TeamMemberIn | deals:update | 200: object |
| DELETE /api/v1/deals/{deal_id}/team/{member_id} | deal_id [path обяз.]: string (uuid); member_id [path обяз.]: string (uuid) | deals:update | 204 |
| GET /api/v1/deals/{deal_id}/budget | deal_id [path обяз.]: string (uuid) | deals:read | 200: object |
| POST /api/v1/deals/{deal_id}/budget/lines | deal_id [path обяз.]: string (uuid) | Тело: application/json: BudgetLineIn | deals:update | 201: object |
| PUT /api/v1/deals/{deal_id}/budget/lines/{line_id} | deal_id [path обяз.]: string (uuid); line_id [path обяз.]: string (uuid) | Тело: application/json: BudgetLineIn | deals:update | 200: object |
| DELETE /api/v1/deals/{deal_id}/budget/lines/{line_id} | deal_id [path обяз.]: string (uuid); line_id [path обяз.]: string (uuid) | deals:update | 204 |
| PATCH /api/v1/deals/{deal_id}/budget/lines/{line_id}/actual | deal_id [path обяз.]: string (uuid); line_id [path обяз.]: string (uuid) | Тело: application/json: object | deals:update | 200: object |
| GET /api/v1/deals/{deal_id}/steps | deal_id [path обяз.]: string (uuid) | deals:read | 200: array[DealStageStepRead] |
| POST /api/v1/deals/{deal_id}/steps | deal_id [path обяз.]: string (uuid) | Тело: application/json: DealStageStepIn | deals:update | 201: DealStageStepRead |
| PATCH /api/v1/deal-steps/{step_id} | step_id [path обяз.]: string (uuid) | Тело: application/json: DealStageStepPatch | deals:update | 200: DealStageStepRead |
| DELETE /api/v1/deal-steps/{step_id} | step_id [path обяз.]: string (uuid) | deals:update | 204 |
| GET /api/v1/deal-step-templates | Нет | deals:read | 200: array[DealStepTemplateRead] |
| POST /api/v1/deal-step-templates | Нет | Тело: application/json: DealStepTemplateIn | deals:manage_settings | 201: DealStepTemplateRead |
| PATCH /api/v1/deal-step-templates/{tpl_id} | tpl_id [path обяз.]: string (uuid) | Тело: application/json: DealStepTemplatePatch | deals:manage_settings | 200: DealStepTemplateRead |
| DELETE /api/v1/deal-step-templates/{tpl_id} | tpl_id [path обяз.]: string (uuid) | deals:manage_settings | 204 |