openapi: 3.0.3
info:
  title: Bitcentral NRCS Plugin API
  description: |
    Internal On-Premise API for the Bitcentral NRCS Plugin (Oasis).
    All requests require an OAuth 2.0 JWT bearer token in the `Authorization` header.
  version: 1.0.0
  contact:
    name: Bitcentral, Inc.

servers:
  - url: https://{host}
    description: On-premise Bitcentral host
    variables:
      host:
        default: your-bitcentral-host
        description: Hostname of the on-premise Bitcentral server

security:
  - bearerAuth: []

tags:
  - name: Stories
    description: Search and retrieve story assets
  - name: Requests
    description: Create and monitor broadcast file export requests

paths:

  /Oasis/NrcsPlugin/Services/Stories/DoSearch:
    post:
      tags: [Stories]
      summary: Search for stories
      description: Returns a paginated list of stories matching the given search criteria.
      operationId: searchStories
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StorySearchRequest'
            example:
              SearchField: null
              TermAllWords: ""
              TermAtLeastOne: null
              TermExactPhrase: null
              TermWithout: null
              Rundown: null
              DateRangeFrom: "0001-01-01T08:00:00Z"
              DateRangeTo: "9999-12-31T23:59:59.9999999Z"
              DatePastHours: 0
              DatePastDays: 0
              SourceSystemIdentifier: "Oasis"
              SourceStationIdentifier: "XXXX-ST1-0000000000000001"
              CategoryHandles: []
              PageNumber: 0
              PageSize: 200
              SortBy: "AirdateUTC"
              SortOrder: 1
      responses:
        '200':
          description: Search results
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StorySearchResponse'
              example:
                hasMoreRecords: true
                isLimitReached: false
                results:
                  - handle: "DEV6-ST1-10000000000331f0"
                    dataProviderID: "DEV6-ST1-0000000000000001"
                    storyID: ""
                    isNrcsManaged: false
                    isSendToCreateAllowed: true
                    assets:
                      - objectID: "84d905d1-540d-4af4-a625-0f2137d2784c"
                        mosID: "videoserver.precis184.mos"
                        imageURL: "https://dev6.bitcentral.net/assets/thumbnail/84d905d1-540d-4af4-a625-0f2137d2784c.jpg"
                        proxyURL: "https://dev6.bitcentral.net/assets/proxy/84d905d1-540d-4af4-a625-0f2137d2784c.mp4"
                        broadcastLocation: "https://dev6.bitcentral.net/assets/fullres/84d905d1-540d-4af4-a625-0f2137d2784c.mp4"
                        startTimecode: null
                        lengthTimecode: "00:00:10:16"
                        framesPerSecond: 29.97
                        isPlaceholder: false
                        mediaStatus: 5
                        canAttach: true
                    metaData:
                      FormatIcon:
                        value: { type: 4, value: null, icon: 4, loggingNotes: null }
                        toolTip: "High Definition"
                      LocationIcon:
                        value: { type: 4, value: null, icon: 7, loggingNotes: null }
                        toolTip: "H264 HD NTSC (local)"
                      HasScriptIcon:
                        value: { type: 4, value: null, icon: 1, loggingNotes: null }
                        toolTip: ""
                      RestrictionIcon:
                        value: { type: 4, value: null, icon: 1, loggingNotes: null }
                        toolTip: ""
                      CategoiesAssignedIcon:
                        value: { type: 4, value: null, icon: 1, loggingNotes: null }
                        toolTip: ""
                      EmbargoIcon:
                        value: { type: 4, value: null, icon: 1, loggingNotes: null }
                        toolTip: ""
                      TransferStatusIcon:
                        value: { type: 4, value: null, icon: 1, loggingNotes: null }
                        toolTip: ""
                      Slug:
                        value: { type: 0, value: "NOVEMBER DEALS", icon: 0, loggingNotes: null }
                        toolTip: ""
                      Synopsis:
                        value: { type: 0, value: "", icon: 0, loggingNotes: null }
                        toolTip: ""
                      Script:
                        value: { type: 0, value: "<BcScript />", icon: 0, loggingNotes: null }
                        toolTip: ""
                      RundownName:
                        value: { type: 0, value: "PreAir processed by IngestFolderMon", icon: 0, loggingNotes: null }
                        toolTip: ""
                      PlayoutDuration:
                        value: { type: 0, value: "00:00:10:16", icon: 0, loggingNotes: null }
                        toolTip: ""
                      AirdateUTC:
                        value: { type: 3, value: "2024-06-11T23:39:00.0000000Z", icon: 0, loggingNotes: null }
                        toolTip: ""
                      SourceAffiliate:
                        value: { type: 0, value: "Station Dev", icon: 0, loggingNotes: null }
                        toolTip: ""
                      RestrictedText:
                        value: { type: 0, value: "", icon: 0, loggingNotes: null }
                        toolTip: ""
                      CategoryNames:
                        value: { type: 0, value: "", icon: 0, loggingNotes: null }
                        toolTip: ""
                      EmbargoRequest:
                        value: { type: 2, value: "False", icon: 0, loggingNotes: null }
                        toolTip: ""
                      ContentFormat:
                        value: { type: 0, value: "", icon: 0, loggingNotes: null }
                        toolTip: ""
                      Keywords:
                        value: { type: 0, value: "", icon: 0, loggingNotes: null }
                        toolTip: ""
                      AvailableFileFormats:
                        value: { type: 0, value: "H264 HD NTSC (local)", icon: 0, loggingNotes: null }
                        toolTip: ""
                      LoggingNotes:
                        value: { type: 5, value: null, icon: 0, loggingNotes: [] }
                        toolTip: ""
                      DigitalPublishIcon:
                        value: { type: 4, value: null, icon: 20, loggingNotes: null }
                        toolTip: ""
        '401':
          $ref: '#/components/responses/Unauthorized'

  /Oasis/NrcsPlugin/Services/Stories/GetSearchOptions:
    get:
      tags: [Stories]
      summary: Get search options
      description: Returns available sources, stations, and categories that can be used as search filters.
      operationId: getSearchOptions
      responses:
        '200':
          description: Available search options
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchOptionsResponse'
              example:
                parameter:
                  isSourcesAllowed: true
                  isFieldsAllowed: true
                  isCategoriesAllowed: true
                  isDatesAllowed: true
                  isAllDatesAllowed: true
                  isFromDateAllowed: true
                  isToDateAllowed: true
                  isAllWordsAllowed: true
                  isExactPhraseAllowed: true
                  isAnyWordsAllowed: true
                  isWithoutWordsAllowed: true
                  isRundowAllowed: true
                  isSearchSummaryAllowed: true
                  sources:
                    defaultSystemIdentifier: "All"
                    systems:
                      - displayName: "All"
                        identifier: "All"
                      - displayName: "CORE:media"
                        identifier: "Create"
                      - displayName: "Oasis"
                        identifier: "Oasis"
                    defaultStationIdentifier: "DEV6-ST1-0000000000000001"
                    stations:
                      - displayName: "-- All Locations --"
                        identifier: "All"
                      - displayName: "Station 6 Dev"
                        identifier: "DEV6-ST1-0000000000000001"
                  categories:
                    - name: "Business"
                      id: "CEDV-CE1-100000000000204b"
                      selected: false
                      subCategories: []
                    - name: "Sub Cats"
                      id: "CEDV-CE1-1000000000002048"
                      selected: false
                      subCategories:
                        - name: "Sub Cat 1"
                          id: "CEDV-CE1-1000000000002044"
                          selected: false
                          subCategories: []
                        - name: "Sub Cat 2"
                          id: "CEDV-CE1-1000000000002045"
                          selected: false
                          subCategories: []
        '401':
          $ref: '#/components/responses/Unauthorized'

  /Oasis/NrcsPlugin/Services/Request/CreateBroadcastTransferByStory:
    post:
      tags: [Requests]
      summary: Create broadcast file export request
      description: Creates an export request that places a broadcast file into a predefined SMB export location.
      operationId: createBroadcastTransfer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateBroadcastTransferRequest'
            example:
              items:
                - storyHandle: "DEV6-ST1-10000000000331f0"
              type: 1
              exportLocationHandle: "DEV6-ST1-100000000000200a"
      responses:
        '200':
          description: Export request created successfully
        '401':
          $ref: '#/components/responses/Unauthorized'

  /Oasis/NrcsPlugin/Services/Request/GetRequestOption:
    post:
      tags: [Requests]
      summary: Get request options
      description: Returns available export locations for a given story.
      operationId: getRequestOptions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetRequestOptionRequest'
            example:
              StoryHandle: "DEV1-ST1-1000000000002349"
      responses:
        '200':
          description: Available export locations for the story
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetRequestOptionResponse'
              example:
                allowRequest: true
                allowDownload: true
                defaultDownloadPath: "C:\\Downloads"
                isNotRequestable: false
                notRequestableMessage: ""
                exportLocations:
                  - handle: "DEV6-ST1-100000000000200a"
                    name: "Precis RVR"
                  - handle: "DEV6-ST1-100000000000217a"
                    name: "Metadata Xml"
                  - handle: "DEV6-ST1-10000000000332e5"
                    name: "Test1"
                  - handle: "DEV6-ST1-10000000000332e6"
                    name: "Test2"
        '401':
          $ref: '#/components/responses/Unauthorized'

  /Oasis/NrcsPlugin/Services/Request/GetRequests:
    get:
      tags: [Requests]
      summary: Get list of current requests
      description: Returns all pending and recently completed broadcast file export requests.
      operationId: getRequests
      responses:
        '200':
          description: List of current export requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetRequestsResponse'
              example:
                hasError: false
                errorMessage: ""
                requests:
                  - requestHandle: "DEV6-ST1-100000000003331f"
                    requestType: "Export"
                    currentStatus: "Request Complete"
                    targetLocation: "Precis RVR"
                    storyHandle: "DEV6-ST1-10000000000331f0"
                    storySlug: "NOVEMBER DEALS"
                    sourceStation: "Station 6 Dev"
                    requestingUserFullName: "admin"
                    startDate: "2026-02-17T17:20:22.443"
                    lastUpdated: "2026-02-17T17:20:33.87"
        '401':
          $ref: '#/components/responses/Unauthorized'

components:

  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: OAuth 2.0 JWT bearer token

  responses:
    Unauthorized:
      description: Missing or invalid bearer token

  schemas:

    # ─── Search ───────────────────────────────────────────────────────────────

    StorySearchRequest:
      type: object
      properties:
        SearchField:
          type: string
          nullable: true
          description: Name of the field to search in. Null searches all fields.
        TermAllWords:
          type: string
          nullable: true
          description: All specified words must appear in the story (AND).
        TermAtLeastOne:
          type: string
          nullable: true
          description: At least one of the specified words must appear (OR).
        TermExactPhrase:
          type: string
          nullable: true
          description: Exact phrase that must appear in the story.
        TermWithout:
          type: string
          nullable: true
          description: Words that must NOT appear in the story.
        Rundown:
          type: string
          nullable: true
          description: Name of the rundown the story belongs to.
        DateRangeFrom:
          type: string
          format: date-time
          description: Filter on AirDate — start of range (local time).
        DateRangeTo:
          type: string
          format: date-time
          description: Filter on AirDate — end of range (local time).
        DatePastHours:
          type: integer
          description: 0 = no limit. >0 = stories with AirDate in the past N hours.
          default: 0
        DatePastDays:
          type: integer
          description: 0 = no limit. >0 = stories with AirDate in the past N days.
          default: 0
        SourceSystemIdentifier:
          type: string
          description: |
            Filters results by source system.
            - `Oasis` — search Oasis for archived and non-archived content
            - `Create` — search CORE:media content only
            - `All` — search across all systems
          example: Oasis
        SourceStationIdentifier:
          type: string
          description: |
            Unique station identifier (e.g. DEV6-ST1-0000000000000001 where DEV6 is the
            station call letters). Use `All` to search across all stations.
          example: XXXX-ST1-0000000000000001
        CategoryHandles:
          type: array
          items:
            type: string
          description: List of unique category handle IDs. See GetSearchOptions.
        PageNumber:
          type: integer
          description: Zero-based page index.
          default: 0
        PageSize:
          type: integer
          description: Number of results per page.
          default: 200
        SortBy:
          type: string
          description: Field to sort results by.
          default: AirdateUTC
        SortOrder:
          type: integer
          description: 0 = Ascending, 1 = Descending.
          enum: [0, 1]
          default: 1

    StorySearchResponse:
      type: object
      properties:
        hasMoreRecords:
          type: boolean
          description: Additional pages of results are available.
        isLimitReached:
          type: boolean
          description: |
            True when Oasis will not return further pages. Oasis stops
            returning results after 1200 total items have been returned.
            For example, if PageSize is 200, the 6th page is the last page
            that will contain results — the 7th page will return an empty array.
        results:
          type: array
          items:
            $ref: '#/components/schemas/StoryResult'

    StoryResult:
      type: object
      properties:
        handle:
          type: string
          description: Unique ID for the story.
        dataProviderID:
          type: string
          description: Station handle.
        storyID:
          type: string
          description: Story ID in the source system (may be empty).
        isNrcsManaged:
          type: boolean
          description: |
            true = story originated from NRCS and is active in one or more rundowns.
            false = not active in any rundown.
        isSendToCreateAllowed:
          type: boolean
          description: Whether this story can be sent to CORE:media (Create).
        assets:
          type: array
          description: Always contains exactly one item.
          items:
            $ref: '#/components/schemas/Asset'
        metaData:
          $ref: '#/components/schemas/StoryMetadata'

    Asset:
      type: object
      properties:
        objectID:
          type: string
          description: Foreign media ID.
        mosID:
          type: string
          description: MOS ID in the NRCS, or empty for non-NRCS items.
        imageURL:
          type: string
          format: uri
          description: HTTPS URL to the thumbnail image.
        proxyURL:
          type: string
          format: uri
          description: HTTPS URL to the MP4 proxy (low-res preview).
        broadcastLocation:
          type: string
          format: uri
          description: HTTPS URL to the full-resolution broadcast file. Offline files return an error.
        startTimecode:
          type: string
          nullable: true
          description: Timecode of the video start (requires config flag).
          example: "00:00:00:00"
        lengthTimecode:
          type: string
          description: Duration of the video as a timecode.
          example: "00:00:10:16"
        framesPerSecond:
          type: number
          description: Always 29.97.
          example: 29.97
        isPlaceholder:
          type: boolean
          description: Always false.
        mediaStatus:
          type: integer
          description: |
            0 = Unknown
            1 = No media
            2 = Ingesting
            3 = Encoding in progress
            4 = Unrecognized media available
            5 = Available
          enum: [0, 1, 2, 3, 4, 5]
        canAttach:
          type: boolean
          description: Whether this story's media can be attached to an NRCS item (media is "Available").

    StoryMetadata:
      type: object
      description: |
        All fields are MetadataField objects wrapping a MetadataItemValue.
        Icon fields carry an integer icon value; text/date fields carry their value as a string.
      properties:
        FormatIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating the media format (SD 4x3, SD 16x9, HD, UHD, unrecognized, ingest error, etc.).
        LocationIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating the media location (Oasis local, CORE:media, remote, etc.).
        HasScriptIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating whether a script is attached to this story.
        RestrictionIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating whether this story is restricted.
        CategoiesAssignedIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating whether one or more categories are assigned to this story.
        EmbargoIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating the embargo status of this story.
        TransferStatusIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating the current broadcast file transfer status.
        DigitalPublishIcon:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Icon indicating the MultiPath (digital publish) status of this story.
        Slug:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: The story slug (short identifying title).
        Synopsis:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: A brief synopsis of the story.
        Script:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: The full script body in BCScript XML format (e.g. `<BcScript />`).
        RundownName:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Name of the rundown this story belongs to.
        PlayoutDuration:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Video playout duration expressed as a timecode string (HH:MM:SS:FF).
        AirdateUTC:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Scheduled air date/time of the story in UTC (ISO 8601).
        SourceAffiliate:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Display name of the station that owns this story.
        RestrictedText:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Human-readable description of any usage restrictions on this story.
        CategoryNames:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Comma-separated display names of categories assigned to this story.
        EmbargoRequest:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Boolean (as string "True"/"False") indicating whether the story is under embargo.
        ContentFormat:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Content format descriptor. Not currently in use.
        Keywords:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Keywords associated with this story. Not currently in use.
        AvailableFileFormats:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: Comma-separated list of user-friendly broadcast format names available to request (e.g. "H264 HD NTSC (local)").
        LoggingNotes:
          allOf:
            - $ref: '#/components/schemas/MetadataField'
          description: List of logging notes attached to this story (sourced from CORE:media Create items). MetadataItemValue.type will be 5.

    MetadataField:
      type: object
      properties:
        value:
          $ref: '#/components/schemas/MetadataItemValue'
        toolTip:
          type: string
          description: Tooltip text to display alongside this field in a UI.

    MetadataItemValue:
      type: object
      properties:
        type:
          type: integer
          description: |
            Discriminates the kind of value carried by this object:
            0 = string
            1 = int
            2 = bool
            3 = DateTime
            4 = Icon  (read the `icon` field, not `value`)
            5 = Logging Notes  (read the `loggingNotes` array)
          enum: [0, 1, 2, 3, 4, 5]
        value:
          type: string
          nullable: true
          description: |
            String representation of the value. Null when `type` is 4 (Icon) or
            5 (Logging Notes). For type 2 (bool) the value is "True" or "False".
        icon:
          type: integer
          nullable: true
          description: |
            Populated when `type` is 4. Contains one of the following icon values:
            0  = Unknown
            1  = Blank
            2  = Format 4x3
            3  = Format 16x9
            4  = Format HD
            5  = Format Unrecognized
            6  = Format Ingest Error
            7  = Location Local
            8  = Location Has Video
            9  = Has Script
            10 = Restricted
            11 = Categories Assigned
            12 = Embargoed
            13 = Transfer Initiated
            14 = Transfer Queued
            15 = Transfer In Progress
            16 = Transfer Completed
            17 = Transfer Error
            18 = NRCS Do Archive
            19 = NRCS Do Not Archive
            20 = Multipath Unknown
            21 = Multipath Posted
            22 = Multipath Published
            23 = Multipath Deleted
            24 = UHD Format
        loggingNotes:
          type: array
          nullable: true
          description: |
            Populated when `type` is 5. Contains logging note objects from
            CORE:media (Create). Null for all other types.
          items:
            type: object

    # ─── Search Options ───────────────────────────────────────────────────────

    SearchOptionsResponse:
      type: object
      properties:
        parameter:
          $ref: '#/components/schemas/SearchOptionsParameter'

    SearchOptionsParameter:
      type: object
      properties:
        isSourcesAllowed:
          type: boolean
          description: Whether source/station filtering is supported.
        isFieldsAllowed:
          type: boolean
          description: Whether field-specific searching is supported.
        isCategoriesAllowed:
          type: boolean
          description: Whether category filtering is supported.
        isDatesAllowed:
          type: boolean
          description: Whether date filtering is supported in general.
        isAllDatesAllowed:
          type: boolean
          description: Whether searching across all dates (no date filter) is allowed.
        isFromDateAllowed:
          type: boolean
          description: Whether a start-date lower bound is allowed.
        isToDateAllowed:
          type: boolean
          description: Whether an end-date upper bound is allowed.
        isAllWordsAllowed:
          type: boolean
          description: Whether AND (all-words) searching is supported.
        isExactPhraseAllowed:
          type: boolean
          description: Whether exact-phrase searching is supported.
        isAnyWordsAllowed:
          type: boolean
          description: Whether OR (any-words) searching is supported.
        isWithoutWordsAllowed:
          type: boolean
          description: Whether exclusion (without-words) searching is supported.
        isRundowAllowed:
          type: boolean
          description: Whether filtering by rundown name is supported.
        isSearchSummaryAllowed:
          type: boolean
          description: Whether a search summary is included in results.
        sources:
          $ref: '#/components/schemas/SourceOptions'
        categories:
          type: array
          description: Hierarchical list of categories available as search filters.
          items:
            $ref: '#/components/schemas/Category'

    SourceOptions:
      type: object
      properties:
        defaultSystemIdentifier:
          type: string
          description: |
            Identifier of the default system to search. Known values:
            `All`, `Oasis`, `Create` (CORE:media).
          example: All
        systems:
          type: array
          description: All searchable source systems.
          items:
            $ref: '#/components/schemas/NamedIdentifier'
        defaultStationIdentifier:
          type: string
          description: |
            Identifier of the default station to search. Use `All` to search
            across all stations.
          example: DEV6-ST1-0000000000000001
        stations:
          type: array
          description: All searchable stations.
          items:
            $ref: '#/components/schemas/NamedIdentifier'

    NamedIdentifier:
      type: object
      properties:
        displayName:
          type: string
          description: Human-readable label shown in the UI.
        identifier:
          type: string
          description: Machine identifier passed in search requests.

    Category:
      type: object
      properties:
        name:
          type: string
          description: Display name of the category.
        id:
          type: string
          description: Unique category handle. Pass in `CategoryHandles` when searching.
        selected:
          type: boolean
          description: Whether this category is pre-selected by default.
        subCategories:
          type: array
          description: Nested child categories (recursive). Empty array if none.
          items:
            $ref: '#/components/schemas/Category'

    # ─── Export Requests ──────────────────────────────────────────────────────

    CreateBroadcastTransferRequest:
      type: object
      required: [items, type, exportLocationHandle]
      properties:
        items:
          type: array
          description: Stories to export.
          items:
            type: object
            required: [storyHandle]
            properties:
              storyHandle:
                type: string
                description: Handle of the story to export.
        type:
          type: integer
          description: Transfer type. Currently only `1` (transfer to folder) is supported.
          enum: [1]
        exportLocationHandle:
          type: string
          description: Unique ID of the destination export location. See GetRequestOption.

    GetRequestOptionRequest:
      type: object
      required: [StoryHandle]
      properties:
        StoryHandle:
          type: string
          description: Handle of the story whose export options you want.

    GetRequestOptionResponse:
      type: object
      properties:
        allowRequest:
          type: boolean
          description: Whether a broadcast file export request can be created for this story.
        allowDownload:
          type: boolean
          description: Whether a direct download of the broadcast file is permitted.
        defaultDownloadPath:
          type: string
          description: Default local path suggested when downloading (e.g. "C:\\Downloads").
        isNotRequestable:
          type: boolean
          description: True if the story cannot currently be requested (see `notRequestableMessage`).
        notRequestableMessage:
          type: string
          description: Human-readable explanation of why the story is not requestable. Empty when `isNotRequestable` is false.
        exportLocations:
          type: array
          description: Available SMB export locations the broadcast file can be sent to.
          items:
            $ref: '#/components/schemas/ExportLocation'

    ExportLocation:
      type: object
      properties:
        handle:
          type: string
          description: Unique ID for this export location. Pass as `exportLocationHandle` when creating a request.
        name:
          type: string
          description: Display name of the export location.

    GetRequestsResponse:
      type: object
      properties:
        hasError:
          type: boolean
          description: Always false.
        errorMessage:
          type: string
          description: Always empty.
        requests:
          type: array
          description: All currently active and recently completed export requests.
          items:
            $ref: '#/components/schemas/RequestItem'

    RequestItem:
      type: object
      properties:
        requestHandle:
          type: string
          description: Unique ID for this request.
        requestType:
          type: string
          description: |
            Export   = file placed on a network share
            Download = file downloaded to the user's machine
          enum: [Export, Download]
        currentStatus:
          type: string
          description: Current status of the export request.
          enum:
            - Preparing Request
            - Request Queued
            - Request in Progress
            - Request Complete
            - Request Error
        targetLocation:
          type: string
          description: Name of the location the file was sent to.
        storyHandle:
          type: string
          description: Handle of the requested story.
        storySlug:
          type: string
          description: Slug of the requested story.
        sourceStation:
          type: string
          description: Name of the station that requested the file.
        requestingUserFullName:
          type: string
          description: Full name of the user who created the request.
        startDate:
          type: string
          format: date-time
          description: When the request was created.
        lastUpdated:
          type: string
          format: date-time
          description: When the request status was last updated.
