ServiceChannel Proposals API

The Proposals API from ServiceChannel — 35 operation(s) for proposals.

Operations 35

GET /proposals/statistics Retrieve statistics on RFPs and proposals #
GET /proposals/{proposalId}/recipients Retrieve users who can be added to the list of email recipients to notify of a proposal approval or rejection #
GET /proposals/{proposalId}/validate Validate a proposal #
PUT /proposals/{proposalId}/reject Reject a proposal #
PUT /proposals/ProposalsReject Reject proposals #
GET /proposals/GetProposalsToReject Retrieve proposals that can be reject #
PUT /proposals/{proposalId}/onhold Put a proposal on hold #
PUT /proposals/{proposalId}/approve Approve a proposal #
PUT /proposals/{proposalId}/open Open a proposal #
PUT /proposals/{proposalId}/assignWO Attach a work order to a proposal #
PUT /proposals/{proposalId}/escalate Escalate a proposal #
PUT /proposals/{proposalId}/assignUser Assign a proposal to a user #
GET /proposals Retrieve proposals #
POST /proposals/GetProposals Get Proposals #
GET /proposals/{proposalId}/users Retrieve users who can be assigned a proposal #
GET /proposals/RejectionReasons Retrieve proposal rejection reasons #
GET /proposals/ApprovalReasons Retrieve proposal approval reasons #
GET /proposals/AssignReasons Retrieve the reasons for assigning a proposal #
GET /proposals/proposalIds Get proposal actions by ID #
GET /proposals/GetUsersByLevelName Get users by level name #
GET /proposals/GetMlpLevelsForSubscriber Get MLP levels for a subscriber #
PUT /proposals/AddUserToMlpLevel Add a user to an MLP level #
PUT /proposals/RemoveUserFromMlpLevel Remove a user from an MLP level #
PUT /proposals/AssignLocationToMlpUser Add a location to a user’s MLP level #
PUT /proposals/RemoveLocationFromMlpUser Remove a location from a user’s MLP level #
PUT /proposals/{rfpId} Delete Proposal and Rfp reference with projectId by rfpId #
GET /proposals/GetProposalsAssociatedWithWorkOderExceptRfp #
PUT /proposals/AssignProjectIdToProposalAndRfp Assign a ProjectId to a ProposalId and Rfp #
PUT /proposals/RemoveMlpUserValidationAsync Whether the user can be deleted from MLP level. #
GET /proposals/GetProposalsAssociatedWithWorkOrderAsync Get proposals linked to the work order #
GET /proposals/CheckProposalCreation Check the possibility of creating a proposal #
POST /proposals/CreateProposal Create a proposal #
GET /odata/proposals Retrieve Proposals #
GET /odata/rfps({rfpId})/proposals Retrieve Rfp Proposals #
GET /odata/proposals({proposalId})/Service.Categories() Retrieve proposal categories #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/servicechannel-proposals-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

servicechannel-proposals-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: bearer.v1
  title: Fixxbook.Bearer.Api.V1 AfterHours Proposals API
  isOdataApi: false
  relativePath: ''
  discoveryPath: docs/bearer.v1
  _isAuthorizedAccess: true
servers:
- url: https://sb2fixxbook.servicechannel.com:443/api
security:
- oauth2: []
tags:
- name: Proposals
paths:
  /proposals/statistics:
    get:
      tags:
      - Proposals
      summary: Retrieve statistics on RFPs and proposals
      description: "Returns statistics on requests for proposals (RFPs) and proposals for the specified time period for the current provider:\n             • RFPs awaiting response\n             • Open proposals\n             • Approved proposals\n             • Proposals in the _On Hold_ and _Reviewed_ statuses\n             • Rejected proposals"
      operationId: GETv3_proposals_statistics?daysPeriod={daysPeriod}
      parameters:
      - name: daysPeriod
        in: query
        description: Time period set as the number of days prior to the current date for which statistics on RFPs and proposals are returned. The default is 30.
        required: false
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: Statistics on RFPs and proposals for the requested time period are returned in the response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.ProposalStatisticsResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.ProposalStatisticsResponse'
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            503 — Only for providers usage"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Any
  /proposals/{proposalId}/recipients:
    get:
      tags:
      - Proposals
      summary: Retrieve users who can be added to the list of email recipients to notify of a proposal approval or rejection
      description: "Returns users who can be added to the list of email recipients to notify when the specified proposal is approved or rejected.\n            <br />***Note:*** This method is only available to subscriber users."
      operationId: GETv3_proposals_{proposalId}_recipients
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: Users who can be added to the list of email recipients to notify when a proposal is approved or rejected are in the response.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Notes.EmailRecipientResponse'
            text/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Notes.EmailRecipientResponse'
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            503 — Invalid proposal identifier\n            503 — Request is empty or null"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Any
  /proposals/{proposalId}/validate:
    get:
      tags:
      - Proposals
      summary: Validate a proposal
      description: Checks if the specified proposal exists for the current user.
      operationId: GETv3_proposals_{proposalId}_validate
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal to validate.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: The specified proposal exists for the current user.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            502 — Proposal not found"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Any
  /proposals/{proposalId}/reject:
    put:
      tags:
      - Proposals
      summary: Reject a proposal
      description: "Updates the status of the specified proposal to *Rejected*.\n            <br />You can send a proposal rejection notification to a specific user or to all users from the **Proposals/Proposal Alerts** list.\n             • `ProviderEmail` and `UserEmail`. Use these parameters to send a proposal rejection notification to a specific user. If passed, any of these parameters prevails over `useProposalAlertEmails`. In case you pass a value to the `ProviderEmail` or `UserEmail` parameter in the request body and set `useProposalAlertEmails` to `true`, a notification is sent to the specified email address, while users from the **Proposals/Proposal Alerts** list are not notified.\n             • `useProposalAlertEmails`. Set this parameter to `true` to send proposal rejection notifications to all users listed in the **Proposals/Proposal Alerts** section of **Dispatch Preferences**.\n            <br />***Note:*** This method is only available to subscriber users.\n            <br />**Example Request**\n            \n                PUT /proposals/{proposalId}/reject\n                {\n                   \"Comments\": \"The project is canceled\",\n                   \"ProviderEmail\": \"\",\n                   \"UserEmail\": \"\",\n                   \"RejectReasonCodeId\": 7,\n                   \"ActionSource\": \"Standard\",\n                   \"ReasonString\": \"\",\n                   \"PinNote\": false,\n                }"
      operationId: PUTv3_proposals_{proposalId}_reject?useProposalAlertEmails={useProposalAlertEmails}
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal to reject.
        required: true
        schema:
          type: integer
          format: int32
      - name: useProposalAlertEmails
        in: query
        description: "Defines if a proposal rejection notification is sent to all users listed in the **Proposals/Proposal Alerts** section of **Dispatch Preferences**.\n            If the parameter value is `true`, users from the **Proposals/Proposal Alerts** list get a notification if the `ProviderEmail` and `UserEmail` parameters are not passed. If set to `false` or not passed, this parameter is ignored."
        required: false
        schema:
          type: boolean
          default: false
      responses:
        '204':
          description: The proposal status is set to *Rejected*, users are notified based on the passed parameters, and the values of the specified parameters are updated.<br/>The response is intentionally blank.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            401 — Invalid subscriber id\n            502 — Proposal not found\n            503 — The proposal status is already Rejected\n            503 — The user is MLP user\n            503 — Request is empty or null"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Subscribers
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
        description: The request to update the proposal status to *Rejected*.
        required: true
  /proposals/ProposalsReject:
    put:
      tags:
      - Proposals
      summary: Reject proposals
      description: "Updates the status of the specified proposal to *Rejected*.\n            <br />***Note:*** This method is only available to subscriber users."
      operationId: PUTv3_proposals_ProposalsReject
      responses:
        '204':
          description: The proposal status is set to *Rejected*, users are notified based on the passed parameters, and the values of the specified parameters are updated.<br/>The response is intentionally blank.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes: \n            100 — Proposal was already rejected\n            100 — User has no rights to perform this action\n            401 — Invalid subscriber id\n            502 — Wrong Proposal Id\n            502 — Proposal not found\n            502 — Cannot find proposal data\n            502 — Cannot find assigned Work Order\n            502 — Proposal not has WO\n            502 — Proposals are linked to a different Work Order\n            502 — You don't have permissions to process Proposal\n            502 — Proposal is not MLP and cannot be rejected by an MLP user\n            502 — Proposal is already rejected\n            502 — Couldn’t find Proposals to Reject\n            502 — Couldn't find the Provider for Proposal\n            502 — Escalation can't be performed as all upper levels are empty\n            502 — Rule set not found\n            503 — Wrong Work Order Id\n            503 — More information Required\n            503 — Proposal requires a Reason for Rejection\n            503 — The request contains proposals with the same Proposal ID\n            503 — Request is empty or null"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Subscribers
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalsStatusRequest'
          text/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalsStatusRequest'
        required: true
  /proposals/GetProposalsToReject:
    get:
      tags:
      - Proposals
      summary: Retrieve proposals that can be reject
      description: "Returns list of the proposals that can be reject.\n            <br />***Note:*** This method is only available to subscriber users."
      operationId: GETv3_proposals_GetProposalsToReject?trackingNumber={trackingNumber}
      parameters:
      - name: trackingNumber
        in: query
        description: The unique numeric identifier of the WO.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: Users that can be added to the list of email recipients to notify when a proposal is approved or rejected are in the response.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Notes.EmailRecipientResponse'
            text/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Notes.EmailRecipientResponse'
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            502 — Proposals to Reject not found\n            502 — Cannot find proposal data\n            503 — Invalid WO identifier"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Any
  /proposals/{proposalId}/onhold:
    put:
      tags:
      - Proposals
      summary: Put a proposal on hold
      description: "Updates the status of the specified proposal to *On Hold*.\n            <br />***Note:*** This method is only available to subscriber users.\n            <br />**Example Request**\n            \n                PUT /proposals/{proposalId}/onhold\n                {\n                   \"Comments\": \"The proposal needs further review\",\n                   \"ProviderEmail\": \"\",\n                   \"UserEmail\": \"\",\n                   \"RejectReasonCodeId\": 0,\n                   \"ActionSource\": \"Standard\",\n                   \"ReasonString\": \"\",\n                   \"PinNote\": false,\n                }"
      operationId: PUTv3_proposals_{proposalId}_onhold
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal to put on hold.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '204':
          description: The proposal status is set to *On Hold*, users are notified based on the passed parameters, and the values of the specified parameters are updated.<br/>The response is intentionally blank.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            401 — Invalid subscriber id\n            502 — Proposal not found\n            503 — The proposal status is already On Hold\n            503 — The user is MLP user\n            503 — Request is empty or null"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Subscribers
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
        description: The request to update the proposal status to *On Hold*.
        required: true
  /proposals/{proposalId}/approve:
    put:
      tags:
      - Proposals
      summary: Approve a proposal
      description: "Updates the status of the specified proposal to *Approved*.\n            <br />***Note:*** This method is only available to subscriber users.\n            <br />**Example Request**\n            \n                PUT /proposals/{proposalId}/approve\n                {\n                   \"Comments\": \"The project starts earlier than expected\",\n                   \"ProviderEmail\": \"\",\n                   \"UserEmail\": \"\",\n                   \"RejectReasonCodeId\": 0,\n                   \"ActionSource\": \"Standard\",\n                   \"ReasonString\": \"Best fit for the job and scope\",\n                   \"AttachmentstoWO\": true,\n                   \"PinNote\": false,\n                }"
      operationId: PUTv3_proposals_{proposalId}_approve
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal to approve.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '204':
          description: The proposal status is set to *Approved*, users are notified based on the passed parameters, and the values of the specified parameters are updated.<br/>The response is intentionally blank.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            100 — Proposal amount exceeds user’s NTE limit\n            401 — Invalid subscriber id\n            502 — Proposal not found\n            503 — The proposal status is already Approved\n            503 — Cannot Approve Proposal that is not assigned to Work Order\n            503 — Cannot Approve Proposal. The Work Order this proposal is linked to has already been invoiced\n            503 — The user is MLP user\n            503 — Request is empty or null"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Subscribers
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
        description: The request to update the proposal status to *Approved*.
        required: true
  /proposals/{proposalId}/open:
    put:
      tags:
      - Proposals
      summary: Open a proposal
      description: "Updates the status of the specified proposal to *Open*.\n            <br />***Note:*** This method is only available to subscriber users.\n            <br />**Example Request**\n            \n                PUT /proposals/{proposalId}/open\n                {\n                   \"Comments\": \"The project is resumed\",\n                   \"ProviderEmail\": \"\",\n                   \"UserEmail\": \"\",\n                   \"RejectReasonCodeId\": 0,\n                   \"ActionSource\": \"Standard\",\n                   \"ReasonString\": \"\",\n                   \"PinNote\": false,\n                }"
      operationId: PUTv3_proposals_{proposalId}_open
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal to open.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '204':
          description: The proposal status is set to *Open*, users are notified based on the passed parameters, and the values of the specified parameters are updated.<br/>The response is intentionally blank.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            401 — Invalid subscriber id\n            502 — Proposal not found\n            503 — The proposal status is already Open\n            503 — The user is MLP user\n            503 — Request is empty or null"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Subscribers
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.UpdateProposalStatusRequest'
        description: The request to update the proposal status to *Open*.
        required: true
  /proposals/{proposalId}/assignWO:
    put:
      tags:
      - Proposals
      summary: Attach a work order to a proposal
      description: "Links the specified work order to the proposal. If the proposal already has a linked service request, the attached work order is updated. See [Link a WO to a Proposal](/guides/proposals/link-a-WO-to-a-proposal/) for more information.\n            <br />***Note:*** This method is only available to subscriber users."
      operationId: PUTv3_proposals_{proposalId}_assignWO?isFromProjectsModule={isFromProjectsModule}
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal to attach the work order to.
        required: true
        schema:
          type: integer
          format: int32
      - name: isFromProjectsModule
        in: query
        description: Is request from projects module.
        required: false
        schema:
          type: boolean
          default: false
      responses:
        '204':
          description: The specified work order is attached to the proposal, and the response is intentionally blank.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            401 — Invalid subscriber id\n            502 — Proposal not found\n            503 — Request is empty or null\n            503 — Proposal already approved\n            503 — Workorder doesn't match\n            503 — The user is MLP user\n            917 — Invalid WO Identifier"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Subscribers
      requestBody:
        content:
          application/json:
            schema:
              format: int32
              type: integer
          text/json:
            schema:
              format: int32
              type: integer
        description: The unique numeric identifier of the work order to link to the proposal.
        required: true
  /proposals/{proposalId}/escalate:
    put:
      tags:
      - Proposals
      summary: Escalate a proposal
      description: "Escalates the specified proposal to another user in the subscriber’s multi-level proposal (MLP) approval hierarchy. The proposal can be approved, rejected, put on hold, or returned upon escalation. You can attach an existing work order or create a new one while submitting the request.\n            <br />***Note:*** This method is only available to subscribers with the MLP setting enabled.\n            <br />MLP users can [escalate a proposal](/guides/proposals/assign-or-escalate-a-proposal/#escalate-a-proposal-for-mlp-users) if the following conditions are met:\n             • The user's approval level corresponds to the proposal level.\n             • The Override option is enabled for the user in case their level is higher than the proposal level.\n            <br />**Example Request**\n            \n                PUT /proposals/{proposalId}/escalate\n                {\n                   \"Action\": \"Approve\",\n                   \"WoType\": 2,\n                   \"TrackingNumber\": 140324907,\n                   \"PoNumber\": \"\",\n                   \"ExistingPoNumber\": \"\",\n                   \"Category\": \"\",\n                   \"CategoryId\": ,\n                   \"ApprovalCode\": \"\",\n                   \"Priority\": \"\",\n                   \"Comment\": \"Escalating proposal to the General Manager\",\n                   \"RejectReasonCodeId\": 0,\n                   \"ReasonString\": \"\",\n                   \"EmailsToNotify\": \"john.smith@domain.com\",\n                   \"EmailMyself\": false,\n                   \"MyEmail\": \"\",\n                   \"ProposalId\": 10010836\n                }"
      operationId: PUTv3_proposals_{proposalId}_escalate
      parameters:
      - name: proposalId
        in: path
        description: The unique numeric identifier of the proposal to escalate.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '204':
          description: The specified proposal is escalated and updated with the passed parameters. The response is intentionally blank.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            401 — Invalid subscriber id\n            502 — Proposal not found\n            503 — Request is empty or null\n            503 — The user is not MLP user\n            503 — Invalid WO Tracking Number\n            503 — Invalid WO Tracking Number in Proposal\n            503 — Invalid Wo Type\n            503 — There is no WO recommendation\n            503 — Action not found in rules\n            503 — User level less than Proposal level\n            503 — ForwardTo item is empty\n            503 — There is no the action in next rule\n            503 — Invalid Level\n            503 — Override flag is false\n            503 — EndStatus item is empty\n            503 — Invalid Action"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '401':
          description: "The request is not authorized.\n            <br/>Error codes:\n            504 — API call rejected by security permissions"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
      deprecated: false
      x-access: Subscribers
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Proposals.MlpWoRecommendationRequest'
          text/json:
            schema:
              $ref: '#/components/sche

# --- truncated at 32 KB (275 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/servicechannel/refs/heads/main/openapi/servicechannel-proposals-api-openapi.yml