Back to Docs

API Reference

Test public endpoints live and review authentication, idempotency, and human-publication boundaries for content workflows.

Speech-to-Text API

POST/transcribe

Convert audio files to text with support for multiple formats and custom dictionaries.

Long audio may return a pending/running AI optimization status while chunked optimization finishes in the background. These code examples cover the public /transcribe request; internal AI optimization job status and recovery endpoints are not exposed as public API.

When AI optimization is enabled, dify_processing may include optional n8n_workflow_name, n8n_workflow_id, n8n_call_id, and n8n_execution_id diagnostics; a successful desktop Records retry preserves the same workflow identity. A prefetch cache hit reuses the first call, so finalize does not dispatch a duplicate workflow merely to populate these fields. These identifiers are not credentials, but they still should not be published together with transcript text, API keys, or webhook URLs.

The /transcribe endpoint requires multipart/form-data with a binary audio file under the 'audio' field (not 'file'). Optional form fields include 'prompt' and 'dict' (JSON string array of misspelling/correct_spelling pairs).

cURL Multipart Transcription Example

curl -X POST "https://api.vowise.com/transcribe" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "[email protected]" \
  -F "prompt=Interview about technology" \
  -F 'dict=[{"misspelling":"AI","correct_spelling":"Artificial Intelligence"}]'

Dictionary Management API

GET/api/v1/dictionary

Retrieve all dictionary entries for the user.

Try it out

POST/api/v1/dictionary/add

Add or update a dictionary entry.

Try it out

DELETE/api/v1/dictionary/delete

Delete a specific dictionary entry. Requires misspelling in query parameters.

Try it out

Content Workflow API

Bearer API KeyAuthorization: Bearer YOUR_API_KEY

These endpoints return only content owned by the API-key user. Platform variants roll out per environment; clients must handle 404, 409, and 503 instead of assuming that a route means the product surface is enabled.

GET/api/v1/content/items/{id}/family

Read a master, its platform variants, generation state, approval state, and freshness.

POST/api/v1/content/items/{master_id}/variants

Create or reuse variants for active user-owned Channels, with at most 10 targets per request.

POST/api/v1/content/items/{variant_id}/regenerate

Create a new generation job for an existing variant while preserving source snapshot and edit-conflict protection.

POST/api/v1/content/items/{variant_id}/approve

Approve only the current title and body identified by content_hash; later edits invalidate approval.

POST/api/v1/content/items/{id}/deliveries

Record evidence states for direct share, copy, or file export; opening a share sheet is not confirmed publication.

POST/api/v1/content/items/{variant_id}/deliveries/manual

Confirm a manually posted approved, fresh variant; this endpoint never calls a third-party platform.

Create-platform-variants example

client_request_id must be stable and unique within the current user scope. The same ID may replay only the identical master, Channel, preset, and source snapshot; another payload returns 409 idempotency_conflict.

curl -X POST "https://api.vowise.com/api/v1/content/items/CONTENT_ITEM_ID/variants" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "client_request_id": "client-generated-stable-id",
    "targets": [
      { "channel_id": "CHANNEL_ID", "preset_id": "PRESET_ID" }
    ]
  }'

Delivery evidence boundary

The content workflow stores no third-party account credentials and does not auto-post for a user. A native or browser share surface usually proves only initiated, presented, or result-unknown state; an external result becomes confirmed only with separate trusted evidence. The internal generation callback is service-secret protected, is not public API, and has no tester here.

Integration Examples & Code

Python (requests)

import requests

# 1. Transcribe audio with multipart form upload
url = "https://api.vowise.com/transcribe"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
files = {"audio": open("audio.wav", "rb")}
data = {
    "prompt": "Interview about technology",
    "dict": '[{"misspelling": "AI", "correct_spelling": "Artificial Intelligence"}]'
}

response = requests.post(url, headers=headers, files=files, data=data)
print(response.json())

# 2. Manage dictionary
dict_url = "https://api.vowise.com/api/v1/dictionary"
entries = requests.get(dict_url, headers=headers).json()
print("Dictionary entries:", entries)

# Delete dictionary entry (misspelling as query parameter)
requests.delete(f"{dict_url}/delete", headers=headers, params={"misspelling": "AI"})

JavaScript (fetch)

// 1. Transcribe audio with FormData
const formData = new FormData();
formData.append("audio", audioFile); // File or Blob object
formData.append("prompt", "Interview about technology");
formData.append("dict", JSON.stringify([
  { misspelling: "AI", correct_spelling: "Artificial Intelligence" }
]));

const transcribeRes = await fetch("https://api.vowise.com/transcribe", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY"
  },
  body: formData
});
const result = await transcribeRes.json();
console.log("Transcript:", result.text);

// 2. Manage dictionary
const dictRes = await fetch("https://api.vowise.com/api/v1/dictionary", {
  headers: { "Authorization": "Bearer YOUR_API_KEY" }
});
const entries = await dictRes.json();
console.log("Dictionary entries:", entries);

// Delete dictionary entry (misspelling as query parameter)
await fetch("https://api.vowise.com/api/v1/dictionary/delete?misspelling=AI", {
  method: "DELETE",
  headers: { "Authorization": "Bearer YOUR_API_KEY" }
});