openapi: 3.0.3 info: title: Kits AI Stem Splitter Voice Conversion API version: v1 description: 'The Kits AI API (operated by Arpeggi Labs) provides studio-quality AI music and audio tools as asynchronous inference jobs: voice conversion, vocal separation, stem splitting, and voice-model blending, plus a catalog of royalty-free artist voice models. All create endpoints enqueue a job and return its status; poll the corresponding fetch endpoint for the signed output file URLs. This specification was generated by API Evangelist from the published Kits AI documentation (https://docs.kits.ai/); the provider lists an openapi.json in its llms.txt but the file was not retrievable at generation time.' contact: name: Kits AI Support url: https://help.kits.ai/ x-generated-by: api-evangelist-enrichment x-source: https://docs.kits.ai/api-reference servers: - url: https://arpeggi.io/api/kits/v1 description: Production security: - bearerAuth: [] tags: - name: Voice Conversion description: Convert an input performance to a target voice model. paths: /voice-conversions: post: tags: - Voice Conversion operationId: createVoiceConversion summary: Create a new voice conversion job description: Creates a voice conversion inference job and adds it to the inference queue. All requests must be made as multipart form requests. The response contains the job status. requestBody: required: true content: multipart/form-data: schema: type: object required: - voiceModelId - soundFile properties: voiceModelId: type: integer description: ID of the voice model. soundFile: type: string format: binary description: Input audio. Supports wav, mp3, or flac. Max 100MB. conversionStrength: type: number minimum: 0 maximum: 1 description: Amount of accent from the voice model (0 to 1). modelVolumeMix: type: number minimum: 0 maximum: 1 description: Mix between input volume and model volume (0 to 1). pitchShift: type: number minimum: -24 maximum: 24 description: Semitones to shift the input audio (-24 to 24). pre: $ref: '#/components/schemas/PreProcessingEffects' post: $ref: '#/components/schemas/PostProcessingEffects' responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/InferenceJob' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/TooManyRequests' get: tags: - Voice Conversion operationId: listVoiceConversions summary: Fetch voice conversions description: Returns a paginated list of voice conversion inference jobs. parameters: - $ref: '#/components/parameters/Order' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PerPage' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/PaginatedInferenceJobs' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/TooManyRequests' /voice-conversions/{id}: get: tags: - Voice Conversion operationId: getVoiceConversion summary: Fetch a voice conversion by ID description: Returns a single voice conversion inference job by id. parameters: - $ref: '#/components/parameters/JobId' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/InferenceJob' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '429': $ref: '#/components/responses/TooManyRequests' components: parameters: JobId: name: id in: path required: true schema: type: integer PerPage: name: perPage in: query description: Page size (default 10). schema: type: integer default: 10 Page: name: page in: query description: Page offset (default 1). schema: type: integer default: 1 Order: name: order in: query description: Sort order, asc (default) or desc. schema: type: string enum: - asc - desc default: asc schemas: PaginatedInferenceJobs: type: object properties: data: type: array items: $ref: '#/components/schemas/InferenceJob' meta: $ref: '#/components/schemas/PaginationMeta' InferenceJob: type: object description: An inference job created through the API. properties: id: type: integer createdAt: type: string type: type: string enum: - infer - tts status: type: string enum: - running - success - error - cancelled jobStartTime: type: string nullable: true jobEndTime: type: string nullable: true outputFileUrl: type: string nullable: true description: Signed URL for the output file (expires in 4 hours). lossyOutputFileUrl: type: string nullable: true recombinedAudioFileUrl: type: string nullable: true voiceModelId: type: integer nullable: true model: allOf: - $ref: '#/components/schemas/VoiceModel' nullable: true PostProcessingEffects: type: object description: Effects run on the output file after conversion. properties: Chorus: type: object properties: rate_hz: type: number minimum: 0 maximum: 100 depth: type: number centre_delay_ms: type: number feedback: type: number mix: type: number Reverb: type: object properties: room_size: type: number minimum: 0 maximum: 1 damping: type: number minimum: 0 maximum: 1 wet_level: type: number minimum: 0 maximum: 1 dry_level: type: number minimum: 0 maximum: 1 width: type: number freeze_mode: type: number Compressor: type: object properties: threshold_db: type: number ratio: type: number attack_ms: type: number release_ms: type: number Delay: type: object properties: delay_seconds: type: number feedback: type: number mix: type: number minimum: 0 maximum: 1 PreProcessingEffects: type: object description: Effects run on the input file before conversion. properties: NoiseGate: type: object properties: threshold_db: type: number ratio: type: number attack_ms: type: number release_ms: type: number HighPassFilter: type: object properties: cutoff_frequency_hz: type: number minimum: 0 maximum: 99999 LowPassFilter: type: object properties: cutoff_frequency_hz: type: number minimum: 0 maximum: 99999 Compressor: type: object properties: threshold_db: type: number ratio: type: number attack_ms: type: number release_ms: type: number VoiceModel: type: object description: A voice model that may be user created or internal to Kits.ai. properties: id: type: integer title: type: string isUsable: type: boolean tags: type: array nullable: true items: type: string imageUrl: type: string nullable: true demoUrl: type: string nullable: true twitterLink: type: string nullable: true instagramLink: type: string nullable: true tiktokLink: type: string nullable: true spotifyLink: type: string nullable: true youtubeLink: type: string nullable: true PaginationMeta: type: object properties: total: type: integer perPage: type: integer currentPage: type: integer lastPage: type: integer firstPage: type: integer firstPageUrl: type: string lastPageUrl: type: string nextPageUrl: type: string nullable: true previousPageUrl: type: string nullable: true responses: TooManyRequests: description: Rate limit exceeded. content: text/plain: schema: type: string Forbidden: description: Attempted to fetch a resource that does not belong to the requesting user. content: text/plain: schema: type: string Unauthorized: description: Authentication was not provided or was invalid. content: text/plain: schema: type: string UnprocessableEntity: description: Request body or query params are invalid. content: text/plain: schema: type: string securitySchemes: bearerAuth: type: http scheme: bearer description: 'API key issued from the Kits AI API access page (https://app.kits.ai/api-access), sent as `Authorization: Bearer `.'