---
title: "Push a reviewed Vortex Desktop session as an audio report"
method: POST
path: "/api/vortex/audit/audio-bulk"
tags: ["Vortex"]
---

# Push a reviewed Vortex Desktop session as an audio report

`POST /api/vortex/audit/audio-bulk`

## Request

- Base URL: `https://api.sponsorunited.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.sponsorunited.com/api/vortex/audit/audio-bulk`
- Auth: API key in header `X-API-Key`
- TypeScript: <https://skmtc.dev/sponsorunited/apis/sponsorunited-api/docs/api/vortex/audit/audio-bulk/post.ts> (a function with typed inputs; its response is checked against the schema)

Files the brands and assets a Vortex Desktop session detected in its recordings as an audio report: the same report and rows POST /api/vortex/audit/bulk writes, except that the audits are recorded as by-audio audits (type 12), which is what the Pro Tool's Scout By Audio review screen lists and plays. Nothing is transcribed. Every item must name at least one recording by the id POST /api/vortex/upload-audio-from-url returned, with the clip it was heard in as fragments (seconds, fractional). Every company receives every item, so send one brand per request. With partial true, a missing brand or asset id is saved as the Unknown Brand or Unknown Asset, and description keeps what was heard. For the recording to be playable on the review screen it must also be attached to the report with POST /api/vortex/user-event-uploads, media_type audio. A report created here records user_id as Captured By; a report that already exists is found by its Captured By. Authenticated via X-API-Key.

## Request body

- VortexAudioBulkAddRequest: Same as VortexBulkAddRequest, except that items is never empty, every item carries at least one audio, an item may add description and detectionConfidence, and videos are not accepted: an item's videos must be missing, null or empty.
  - `user_id` integer, required: ID of the user who captured the scouting session. Recorded as the report's Captured By when the report is created here, and used as its first Assigned To.
  - `isQuickAdd` boolean: Whether this is a quick-add session (always true for vortex)
  - `partial` boolean: Marks the payload as partial rows. With it, companies and items may be empty and their id may be null: a missing brand is saved as the Unknown Brand and a missing asset as the Unknown Asset, one row per image. Without it, a missing id is rejected.
  - `companies` object[], required: Brands with resolved core-api IDs
    - `id` integer, nullable, required: Brand ID. May be null only when partial is true.
  - `properties` object[], required: Properties with their associated events
    - `id` integer, required: Property / team ID
    - `events` object[], required
      - `id` integer, required: Event ID (must pre-exist)
      - `season` integer, required: Season year
      - `event_type` 'season' | 'single' | 'multi' | 'social' | 'twitter_scan' | 'facebook_scan' | 'instagram_scan' | 'tiktok_scan', required
      - `scheduled` string, date-time, nullable, required
      - `startDate` string, date, nullable
      - `endDate` string, date, nullable
  - `items` object[], required: Placement items with counts
    - `id` integer, nullable, required: Item ID. May be null only when partial is true.
    - `frequency` integer: Occurrence count
    - `value` number, float, nullable
    - `audios` VortexBulkAddAudio[], required: The shape of POST /api/vortex/audit/bulk, for a report built from recordings: every item must name at least one recording, there is always at least one item, and an item may carry the detector's description and score the way Scout By Audio's rows do.
      - `id` integer, required: Audio id
      - `fragments` object[]: The clips of the recording the item was heard in.
        - `start` number, float, nullable: Seconds from the start of the recording; up to three decimals are kept. Missing means 0.
        - `end` number, float, nullable: Seconds from the start of the recording; up to three decimals are kept. Missing means 0.
        - `transcription` string, nullable: What was said in the clip. Missing or null is stored as an empty string.
    - `videos` integer[], nullable: Not accepted on this route: leave it out, or send null or an empty list. Any video id is a 422.
    - `description` string, nullable: What was heard, kept on the row. Useful when the brand or asset could not be resolved and the row is saved against the Unknown Brand or Unknown Asset.
    - `detectionConfidence` number, float, nullable: The detector's score for the row, 0 to 1. Leave it out when nothing scored the row.
  - `id` integer, required: Audio id
  - `fragments` object[]: The clips of the recording the item was heard in.
    - `start` number, float, nullable: Seconds from the start of the recording; up to three decimals are kept. Missing means 0.
    - `end` number, float, nullable: Seconds from the start of the recording; up to three decimals are kept. Missing means 0.
    - `transcription` string, nullable: What was said in the clip. Missing or null is stored as an empty string.

## Response `200`

Item values created

- object[]

## Other responses

- `401`: Missing or invalid API key
- `422`: Validation error

## Changes

- **2026-11-10** `cbf1ca5bff8f`: 2 info
  - added the new optional request property `allOf[#/components/schemas/VortexBulkAddRequest]/items/items/videos`
  - added the new optional request property `allOf[subschema #2]/items/items/videos`

[Operation history](https://skmtc.dev/sponsorunited/apis/sponsorunited-api/changes/api/vortex/audit/audio-bulk/post.md)

---

[API](https://skmtc.dev/sponsorunited/apis/sponsorunited-api.md) - [All operations](https://skmtc.dev/sponsorunited/apis/sponsorunited-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sponsorunited/apis/sponsorunited-api/revisions/cbf1ca5bff8f?raw)
