ServiceChannel Rfps API

The Rfps API from ServiceChannel — 6 operation(s) for rfps.

Operations 6

POST /rfps Create an RFP #
PUT /rfps/{rfpId}/assign Assign an RFP to another provider #
DELETE /rfps/{id} Delete an RFP by ID #
DELETE /rfps/{number}/locations/{locationId} Delete an RFP by the RFP number and location ID #
GET /odata/rfps Retrieve Rfps #
GET /odata/rfps({rfpId}) Retrieve Rfp #

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-rfps-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-rfps-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: bearer.v1
  title: Fixxbook.Bearer.Api.V1 AfterHours Rfps API
  isOdataApi: false
  relativePath: ''
  discoveryPath: docs/bearer.v1
  _isAuthorizedAccess: true
servers:
- url: https://sb2fixxbook.servicechannel.com:443/api
security:
- oauth2: []
tags:
- name: Rfps
paths:
  /rfps:
    post:
      tags:
      - Rfps
      summary: Create an RFP
      description: "Creates a request for proposal (RFP). Returns a unique RFP ID for a successful request.\n            <br />***Note:*** Subscribers can create RFPs [using the API](/guides/proposals/create-and-manage-RFPs/#create-an-rfp) or via [Service Automation](https://servicechannel.atlassian.net/wiki/spaces/SCU/pages/560300086/Creating+an+RFP).\n            <br />**Example Request**\n            \n                POST /rfps\n                {\n                   \"Number\": \"\",\n                   \"PONumber\": \"\",\n                   \"WONumber\": \"\",\n                   \"TradeId\": 90480,\n                   \"Description\": \"New doors for the office\",\n                   \"Date\": \"\",\n                   \"DueHrs\": 48,\n                   \"DueDate\": \"\",\n                   \"Location\": {\n                      \"Id\": 2006071467,\n                      \"StoreId\": \"\"\n                   },\n                   \"ProviderId\": 2000090505,\n                   \"ResponseDate\": \"\",\n                   \"ProposalNotificationEmail\": \"LFAlways1776@gmail.com\",\n                   \"ProviderEmail\": \"\",\n                   \"ProposalTemplateId\": 0,\n                   \"WorkOrderId\": 0,\n                   \"ProjectId\": 0\n                }"
      operationId: POSTv3_rfps
      responses:
        '201':
          description: The RFP is created, and a unique RFP ID is returned in the response.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            503 — Request is empty or null\n            503 — Provider is not valid\n            503 — Empty E-Mail address ('ProposalNotificationEmail')\n            503 — TradeId is not valid\n            503 — Empty Description\n            503 — Empty Location or Store ID\n            503 — Invalid location Id for current user\n            503 — Active contract for current trade, provider, locationId not found\n            503 — Empty Provider E-Mail address ('ProviderEmail')"
          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\n            504 — User does not have Location or Trade access to perform this operation"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/ServiceChannel.Services.Messaging.ErrorResponse'
        '500':
          description: The server was unable to complete the request due to an internal error.
          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.Rfp.CreateRfpRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Rfp.CreateRfpRequest'
        description: The request to create an RFP.
        required: true
  /rfps/{rfpId}/assign:
    put:
      tags:
      - Rfps
      summary: Assign an RFP to another provider
      description: "Assigns the RFP to the specified provider. Returns a unique RFP ID for a successful request.\n            <br />***Note:*** The provider you want to assign the RFP to should have access to the location and trade for which the RFP was created.\n            <br />Learn more about [assigning an RFP to another provider](/guides/proposals/create-and-manage-RFPs/#assign-an-rfp-to-another-provider).\n            <br />**Example Request**\n            \n                PUT /rfps/{rfpId}/assign\n                {\n                   \"ProviderId\": 2000090505,\n                   \"ProviderEmail\": \"\"\n                }"
      operationId: PUTv3_rfps_{rfpId}_assign
      parameters:
      - name: rfpId
        in: path
        description: The unique numeric identifier of the RFP to assign to the specified provider.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: The RFP is assigned to the specified provider, and a unique RFP ID is returned in the response.
        '400':
          description: "The request is not accepted due to bad syntax, missing parameters, insufficient data, etc.\n            <br/>Error codes:\n            502 — RFP not found\n            503 — Request is empty or null\n            503 — Provider is not valid\n            503 — Empty Provider E-Mail address ('ProviderEmail')"
          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'
        '500':
          description: The server was unable to complete the request due to an internal error.
          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.Rfp.AssignRfpRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Rfp.AssignRfpRequest'
        description: The request to assign the RFP to another provider.
        required: true
  /rfps/{id}:
    delete:
      tags:
      - Rfps
      summary: Delete an RFP by ID
      description: Permanently deletes the specified RFP by its ID. It cannot be undone. Find out more about [deleting RFPs via the API](/guides/proposals/create-and-manage-RFPs/#delete-an-rfp).
      operationId: DELETEv3_rfps_{id}
      parameters:
      - name: id
        in: path
        description: The unique numeric identifier of the RFP to delete.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '204':
          description: The RFP is deleted, 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            502 — RFP not found\n            503 — RFP can only be deleted, if none of the proposals are approved"
          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'
        '404':
          description: The requested resource does not exist on the server.
      deprecated: false
      x-access: Subscribers
  /rfps/{number}/locations/{locationId}:
    delete:
      tags:
      - Rfps
      summary: Delete an RFP by the RFP number and location ID
      description: "Permanently deletes the RFP by the specified RFP number and location ID. It cannot be undone.\n            <br />***Note:*** The RFP number is not unique. If multiple RFPs with the same number were created for a location, all of them are deleted when you pass the request.\n            <br />Learn more about [deleting RFPs via the API](/guides/proposals/create-and-manage-RFPs/#delete-an-rfp)."
      operationId: DELETEv3_rfps_{number}_locations_{locationId}
      parameters:
      - name: number
        in: path
        description: The non-unique identifier of the RFP to delete.
        required: true
        schema:
          type: string
      - name: locationId
        in: path
        description: The unique numeric identifier of the location for which the RFP was created.
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '204':
          description: The RFP is deleted, 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            502 — RFP not found\n            503 — RFP can only be deleted, if none of the proposals are approved"
          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'
        '404':
          description: The requested resource does not exist on the server.
      deprecated: false
      x-access: Subscribers
  /odata/rfps:
    get:
      tags:
      - Rfps
      summary: Retrieve Rfps
      description: "Retrieve Rfps\n            <br /> Dates without 'Dto' endings return UTC date format.\n            <br /> Dates without 'Dto' endings are not recommended for using."
      operationId: Rfps_GetRfps
      parameters:
      - name: $expand
        in: query
        description: Expand a navigation property.
        required: false
        schema:
          type: string
      - name: $select
        in: query
        description: Select a set of properties to return.
        required: false
        schema:
          type: string
      - name: $filter
        in: query
        description: Filter a collection of resources addressed by a request URL.
        required: false
        schema:
          type: string
      - name: $orderby
        in: query
        description: Order resources by the specified property in the response.
        required: false
        schema:
          type: string
      - name: $top
        in: query
        description: Return the specified number of items in the response.
        required: false
        schema:
          type: integer
      - name: $skip
        in: query
        description: Skip the specified number of items in the response.
        required: false
        schema:
          type: integer
      - name: $count
        in: query
        description: Include the count of the matching resources in the response.
        required: false
        schema:
          type: boolean
      responses:
        '200':
          description: Indicates that the request succeeded and that the requested information is in the response.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Rfp.Rfp'
      deprecated: false
      x-access: Subscribers
  /odata/rfps({rfpId}):
    get:
      tags:
      - Rfps
      summary: Retrieve Rfp
      description: Retrieve Rfp
      operationId: Rfps_GetRfp
      parameters:
      - name: rfpId
        in: path
        description: ''
        required: true
        schema:
          type: integer
          format: int32
      - name: $expand
        in: query
        description: Expand a navigation property.
        required: false
        schema:
          type: string
      - name: $select
        in: query
        description: Select a set of properties to return.
        required: false
        schema:
          type: string
      - name: $filter
        in: query
        description: Filter a collection of resources addressed by a request URL.
        required: false
        schema:
          type: string
      - name: $orderby
        in: query
        description: Order resources by the specified property in the response.
        required: false
        schema:
          type: string
      - name: $top
        in: query
        description: Return the specified number of items in the response.
        required: false
        schema:
          type: integer
      - name: $skip
        in: query
        description: Skip the specified number of items in the response.
        required: false
        schema:
          type: integer
      - name: $count
        in: query
        description: Include the count of the matching resources in the response.
        required: false
        schema:
          type: boolean
      responses:
        '200':
          description: Indicates that the request succeeded and that the requested information is in the response.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Rfp.Rfp'
      deprecated: false
      x-access: Subscribers
components:
  schemas:
    ServiceChannel.Services.Messaging.Workorders.WorkorderStatusDescriptor:
      type: object
      properties:
        Primary:
          description: Primary work order status value, you can pass status id or its name here. To get all subscriber's statuses see [Statuses] in Statuses section
          type: string
        Extended:
          description: Extended status value
          type: string
        CanCreateInvoice:
          description: True if invoice creation is allowed
          default: false
          type: boolean
    ServiceChannel.Services.Messaging.ApprovalCodes.AdditionalApprovalCodeOption:
      type: object
      properties:
        Id:
          format: int32
          type: integer
        Value:
          type: string
    ServiceChannel.Services.Messaging.Invoices.InvoiceTaxesDetails:
      description: Object containing the list of taxes. You can add taxes as a fixed amount or as a percentage.
      type: object
      properties:
        LaborTaxPercent:
          format: double
          description: Amount of the labor tax in percentage (for countries other than USA and Canada).
          type: number
        MaterialTaxPercent:
          format: double
          description: Amount of the material tax in percentage (for countries other than USA and Canada).
          type: number
        TravelTaxPercent:
          format: double
          description: Amount of the travel tax in percentage (for countries other than USA and Canada).
          type: number
        FreightTaxPercent:
          format: double
          description: Amount of the freight tax in percentage (for countries other than USA and Canada).
          type: number
        OtherTaxPercent:
          format: double
          description: Amount of other taxes in percentage (for countries other than USA and Canada).
          type: number
        LaborTax:
          format: double
          description: Amount of the labor tax.
          type: number
        MaterialTax:
          format: double
          description: Amount of the material tax.
          type: number
        TravelTax:
          format: double
          description: Amount of the travel tax.
          type: number
        FreightTax:
          format: double
          description: Amount of the freight tax.
          type: number
        OtherTax:
          format: double
          description: Amount of other taxes.
          type: number
    ServiceChannel.Services.Messaging.Invoices.InvoiceCategoryMessaging:
      type: object
      properties:
        Id:
          format: int32
          type: integer
        Name:
          type: string
    ServiceChannel.Services.Messaging.Invoices.StatusHistoryShort:
      type: object
      properties:
        CreatedBy:
          type: string
        CreatedById:
          format: int32
          type: integer
        Status:
          type: string
        InvId:
          format: int32
          type: integer
        ActionDate:
          type: string
    ServiceChannel.Api.Model.Proposals.MlpRuleAction:
      type: object
      properties:
        Name:
          type: string
        Limit:
          format: double
          type: number
        ForwardTo:
          format: int32
          type: integer
        ForwardToLevelName:
          type: string
        EndStatus:
          type: string
        AutoEscalateInDays:
          format: int32
          type: integer
        EntryLevel:
          default: false
          type: boolean
        CodeChange:
          default: false
          type: boolean
        CategoryChange:
          default: false
          type: boolean
        LevelId:
          format: int32
          type: integer
        LevelName:
          type: string
        RuleNumber:
          format: int32
          type: integer
        RuleOrder:
          format: int32
          type: integer
        Id:
          format: int32
          type: integer
        RuleSetId:
          format: int32
          type: integer
        Override:
          default: false
          type: boolean
        SkipOverLimit:
          default: false
          type: boolean
        ActionNotification:
          default: false
          type: boolean
        LocationId:
          format: int32
          type: integer
        UserId:
          format: int32
          type: integer
    ServiceChannel.Services.Messaging.Assets.WarrantyExpiration:
      description: Object containing warranty expiration details.
      type: object
      properties:
        Type:
          description: 'Warranty expiration calculation type. **Possible values**: 0 - the expiration date is calculated starting from the asset purchase data; 1 - the expiration date is calculated starting from the asset installation date.'
          enum:
          - FromPurchaseDate
          - FromInstallDate
          type: string
        Period:
          format: int32
          description: Warranty period in months.
          type: integer
    System.Object:
      type: object
      properties: {}
    ServiceChannel.Services.Messaging.CountDescriptor:
      type: object
      properties:
        Total:
          format: int32
          type: integer
        Own:
          format: int32
          type: integer
    ServiceChannel.Services.Messaging.Invoices.InvoiceApprovalCode:
      type: object
      properties:
        Id:
          format: int32
          type: integer
        InvoiceId:
          format: int32
          type: integer
        InvoiceChargeId:
          format: int32
          type: integer
        ApprovalCodeType:
          enum:
          - Labor
          - Travel
          - Material
          - Freight
          - Other
          - Tax
          - Tax2
          - LineItem
          - FreightGenerated
          type: string
        ApprovalCode:
          type: string
        AdditionalApprovalCode:
          type: string
        ParentId:
          format: int32
          type: integer
        InternalId:
          format: int32
          type: integer
        InternalParentId:
          format: int32
          type: integer
        IsDefault:
          default: false
          type: boolean
    ServiceChannel.Services.Messaging.Workorders.AssigneeUser:
      type: object
      properties:
        UserId:
          format: int32
          type: integer
        UserName:
          type: string
    ServiceChannel.Services.Messaging.Invoices.Tax2Details:
      description: Information on the additional tax. Only invoices for Canadian locations can have Tax2Details.
      type: object
      properties:
        Tax2Amount:
          format: double
          description: Amount of the additional tax.
          type: number
        Tax2Name:
          description: Name of the additional tax, for example, *VAT*, *HST*, *PST*, or *QST*.
          type: string
    ServiceChannel.Services.Messaging.Users.User:
      description: User details object.
      type: object
      properties:
        Id:
          format: int32
          description: Unique user identifier.
          type: integer
        SubscriberId:
          format: int32
          description: Unique subscriber ID.
          type: integer
        UserName:
          description: Username of the user.<br /> • For subscriber users, the username appears as **User Id** on the "General Info" tab of the user profile page.<br /> • For provider users, the username is listed as **UserID** under "Access" on the "General" tab of the user profile page.
          pattern: ^$|(^\S+).(\S).(\S)$
          type: string
        FullName:
          description: Full name of the user.<br /> • For subscriber users, the full name appears as **User Name** on the "General Info" tab of the user profile page.<br /> • For provider users, you can see their first and last name under "Basic" on the "General" tab of the user profile page.
          type: string
        Email:
          description: User’s email address.
          type: string
        PsmEmail:
          description: Email address through which a user can reset their password.
          type: string
        Disabled:
          description: Defines if a user is deactivated.
          default: false
          type: boolean
        IsLocked:
          description: Defines if a user is locked.
          default: false
          type: boolean
        Roles:
          description: Secondary roles assigned to a subscriber user that determine their permissions and level of access to various Service Automation modules.
          type: array
          items:
            type: string
        Permissions:
          description: Permissions assigned to a subscriber user that determine whether they have full or read-only access to various Service Automation modules.
          type: array
          items:
            type: string
        UserType:
          description: Subscriber user type defining their level of access to ServiceChannel:<br /> • `Corporate` — a user can work in Service Automation.<br /> • `Dashboard` — a user can only access the dashboard assigned to them.<br />`0` is returned for provider users.
          enum:
          - Corporate
          - Dashboard
          - ServiceChannel
          type: string
        Dashboard:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.DashboardInfo'
          description: Dashboard a subscriber user has access to.
        Access:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.AccessOptions'
          description: List of locations, districts, regions, and trades a subscriber user has access to.
        Limits:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.LimitOptions'
          description: NTE, proposal, and invoice limits set for a subscriber user.
        FeedRole:
          type: string
        MliUserInfo:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.MliUserInfo'
          description: ''
        MlpUserInfo:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.MlpUserInfo'
    ServiceChannel.Services.Messaging.Invoices.InvoiceApprovalCodeChild:
      type: object
      properties:
        Amount:
          format: double
          type: number
        Id:
          format: int32
          type: integer
        InvoiceId:
          format: int32
          type: integer
        InvoiceChargeId:
          format: int32
          type: integer
        ApprovalCodeType:
          enum:
          - Labor
          - Travel
          - Material
          - Freight
          - Other
          - Tax
          - Tax2
          - LineItem
          - FreightGenerated
          type: string
        ApprovalCode:
          type: string
        AdditionalApprovalCode:
          type: string
        ParentId:
          format: int32
          type: integer
        InternalId:
          format: int32
          type: integer
        InternalParentId:
          format: int32
          type: integer
        IsDefault:
          default: false
          type: boolean
    ServiceChannel.Services.Messaging.Users.LimitOptions:
      description: Object for NTE, proposal, and invoice limits set for a subscriber user.
      type: object
      properties:
        NteLimit:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.Limit'
          description: Limit for the NTE amount that a user can not exceed upon editing work orders. If a user who has permission to edit work orders tries to enter the NTE amount above the set limit, an error message will appear.
        ProposalLimit:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.Limit'
          description: Limit for the proposal amount above which a user can not approve proposals — for users with the corresponding permission. The user can put on hold or reject proposals above their limit.
        InvoiceLimit:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Users.Limit'
          description: Limit for the invoice amount above which a user can not process invoices by changing their status. The user can view invoices above their limit if they have the corresponding permission.
    ServiceChannel.Services.Messaging.Currencies.Currency:
      type: object
      properties:
        Id:
          format: int32
          type: integer
        AlphabeticalCode:
          type: string
        DecimalCount:
          format: int32
          type: integer
        Entity:
          type: string
        CurrencyName:
          type: string
        NumericCode:
          type: string
        Rate:
          format: double
          type: number
    ServiceChannel.Services.Messaging.Notes.NotesDescriptor:
      type: object
      properties:
        WorkOrderId:
          format: int32
          type: integer
        Last:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.Notes.NoteInfo'
        Count:
          $ref: '#/components/schemas/ServiceChannel.Services.Messaging.CountDescriptor'
    ServiceChannel.Services.Messaging.Attachments.Attachment:
      description: Object containing information about an attachment.
      type: object
      properties:
        Id:
          format: int32
          description: Unique numeric identifier of the attachment.
          type: integer
        Description:
          description: Optional text that a user added when uploading the attachment. The maximum character count is 200.
          type: string
        Name:
          description: Attachment name.
          type: string
        TimeStamp:
          format: date-time
          description: Date and time when the attachment was uploaded. The format is `YYYY-MM-DDThh:mm:ss.sss±hh:mm`, where `±hh:mm` represents the time zone offset from UTC.
          type: string
        Uri:
          description: Link address to the attachment in the ServiceChannel system.
          type: string
        NoteId:
          format: int64
          description: Unique numeric identifier of the note to which a user added the attachment.
          type: integer
        Visibility:
          format: int32
          description: "Visibility status of the attachment. Defines which parties can view the attachment. The *PrivateProviderNotesAndAttachments* feature should be enabled. For subscribers who are using Universal Connector, the *PrivateClientNotesAndAttachments* feature should be enabled.\n            <br />Possible values:\n             • `0`: No restrictions on visibility. Visible to everyone.\n             • `1`: Not visible to the client. The subscriber deselected the “Visible to Client” checkmark when uploading an attachment or adding a note with an attachment. \n             • `2`: Not visible to the provider. The subscriber deselected the “Visible to Provider” checkmark when uploading an attachment or adding a note with an attachment. \n             • `3`: Visible to the subscriber only. The subscriber deselected the “Visible to Client” and “Visible to Provider” checkmarks when uploading an attachment or adding a note with an attachment."
          type: integer
        IsInvoiceDigitalCopy:
          description: "Defines if the attachment is a digital copy of the provider’s invoice. According to subscriber configurations, some providers should attach digital copies of invoices.\n            Possible values: \n             • `true`: The attachment is an invoice digital copy. \n             • `false`: The attachment is not an invoice digital copy. \n            <br />***Note:*** Subscribers can set the requirement of a digital invoice copy from providers when the *InvoiceRequireDigitalCopy* feature is turned on."
          default: false
          type: boolean
        UploadBy:
          description: User who uploaded the attachment.
          type: string
    ServiceChannel.Api.Model.Proposals.MlpRecommendation:
      type: object
      properties:
        Id:
          format: int32
          type: integer
        ProposalId:
          format: int32
          type: integer
        UserId:
          format: int32
          type: integer
        Status:
          type: string
        WoType:
          enum:
          - Origin
          - New
          - Existing
          type: string
        OriginalTrackingNumber:
          format: int32
          type: integer
        SelectedTrackingNumber:
          format: int32
          type: integer
        GeneratedTrackingNumber:
          format: int32
          type: integer
        PoNumber:
          type: string
        Category:
          type: string
        CategoryId:
          format: int32
          type: integer
        ApprovalCode:
          type: string
        Priority:
          type: string
        PriorityId:
          format: int32
          type: integer
        RejectCodeId:
          format: int32
          type: integer
        ApprovalReason:
          type: string
        EmailsToNotify:
          type: string
        Applied:
          default: false
          type: boolean
        AttachmentsToWO:
          defau

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