Skip to API documentation

Developer platform

Ship better audio.
One API.

Analyze tracks, create release-ready masters, and mix complete stem sessions with the same Exynos engines that power the website.

27 documented routes 3 audio workflows JSON + WAV responses HTTPS recommended
# Keep the key on your server
export EXYNOS_API_KEY="YOUR_API_KEY"

curl --fail-with-body \
  -H "X-API-Key: $EXYNOS_API_KEY" \
  -F "file=@track.wav" \
  https://tamamologics.de/api/analyze
https://tamamologics.de
On this page

Quick start

Your first request.

Three steps are enough. Use the API from a trusted backend, CLI, worker, or desktop application.

01

Get an API key

Ask the Exynos installation owner for a dedicated key. Use one key per integration so it can be rotated independently.

02

Store it securely

Put the key in a server-side secret or an environment variable such as EXYNOS_API_KEY.

03

Send the header

Add X-API-Key to every request. Never append a key to a URL or query string.

Do not call Exynos directly from public browser JavaScript.

The API intentionally has no cross-origin browser access. A frontend would expose your long-lived key to every visitor. Call Exynos from your own backend and return only the result your app needs.

Authentication

One key. Every request.

Header keys are stateless and work across CLI tools, backend runtimes, queues, and native applications.

API-key header Recommended
X-API-Key: YOUR_API_KEY

The clearest option for Exynos integrations.

Bearer authorization Supported
Authorization: Bearer YOUR_API_KEY

Useful when your HTTP client already supports bearer tokens.

Keys define ownership and rate limits.

A mastering job belongs to the exact key that submitted it. Send that same key while polling, previewing, and downloading. A different or revoked key receives an intentional 404/401. Never share one production key between unrelated customers.

End-to-end example

Mastering is asynchronous.

Submit the audio once, poll a lightweight job endpoint, then download before the result expires.

OPTIONAL · POSTAnalyzeMeasure the source and inspect the AI recommendation.
POSTSubmit masterUpload track(s), settings, and an optional reference.
GET · ~2 SECPoll jobWait for completed or stop on error.
GET · 10 MINDownloadSave the WAV or ZIP while the result is available.
BASE_URL="https://tamamologics.de"
API_KEY="$EXYNOS_API_KEY"

# 1. Submit the mastering job
curl --fail-with-body -H "X-API-Key: $API_KEY" \
  -F "file=@track.wav" \
  -F 'settings={"preset":"AI","target_lufs":-14,"ceiling":-1,"bitdepth":24}' \
  "$BASE_URL/api/master"
# => {"success":true,"job_id":"JOB_ID"}

# 2. Poll approximately every two seconds
curl --fail-with-body -H "X-API-Key: $API_KEY" \
  "$BASE_URL/api/job/JOB_ID"

# 3. Download immediately after completion
curl --fail-with-body -H "X-API-Key: $API_KEY" \
  -OJ "$BASE_URL/api/download/JOB_ID"

Core audio API

The four calls you will use most.

These are the stable, developer-facing processing operations. All multipart examples let your HTTP client generate the boundary automatically.

POST

Analyze a track

/api/analyze

Runs a synchronous technical analysis and adds recommended mastering targets. Use it to explain what Exynos hears before you submit a master.

FieldTypeRequiredDescription
fileAudio fileYesOne file, maximum 250 MiB. Supported: .aac, .aif, .aiff, .caf, .flac, .m4a, .mp3, .ogg, .wav.
20 requests / minuteapplication/jsonSynchronous
POST

Submit a master

/api/master

Queues an asynchronous mastering job. A successful submission returns HTTP 200 and a job_id; it does not contain the rendered audio yet.

FieldTypeRequiredDescription
fileAudio file, repeatedYes1–24 tracks. Combined audio and reference maximum 250 MiB.
settingsJSON stringNoPreset, loudness, ceiling, export depth, tone, and advanced modules. Maximum 65,536 characters.
reference_fileAudio fileNoOptional tonal/loudness reference in a supported format.
8 submissions / minuteMax 3 active jobs / keyQueue capacity 25
GET

Poll and collect

/api/job/<job_id> · /api/preview/<job_id> · /api/download/<job_id>

Poll status every one or two seconds. When status becomes completed, preview inline or download the final attachment. Results expire 10 minutes after completion and live only in the current server process.

StatusMeaningNext action
queuedWaiting for the engine.Poll again.
processingAudio render is running.Use progress for UI; poll again.
completedResult is ready.Download immediately.
errorThe render failed.Show the error and stop polling.
Same API key requiredWAV or ZIP404 hides ownership
POST

Mix a stem session

/api/mix

Renders a complete WAV synchronously. Give this request a long client/proxy timeout; repeated stems parts map to zero-based routing[].index.

FieldTypeRequiredDescription
stemsWAV, repeatedYes1–96 files; total maximum 900 MiB; each up to 12 minutes.
settingsJSON stringYesStyle, per-stem routing, buses, reference matching, and render output.
referenceWAVNoUsed when reference_match is true.
mix-request.sh
curl --fail-with-body \
  -H "X-API-Key: $EXYNOS_API_KEY" \
  -F "stems=@vocal.wav" \
  -F "stems=@beat.wav" \
  -F 'settings={"style":{"name":"clean","headroom_db":-6,"sequence_ai_enabled":true,"sequence_strength":0.72,"use_true_peak_limiter":true},"routing":[{"index":0,"category":"vocals"},{"index":1,"category":"music"}],"render":{"output_sr":48000,"bitdepth":24}}' \
  -o exynos_mix.wav \
  "https://tamamologics.de/api/mix"
4 renders / 5 minutesaudio/wavSynchronousMix v6.0 Sequence Intelligence

Complete reference

Every API operation.

Search by path, action, authentication type, or feature. Open any operation for its request, response, and common errors.

31 operations
Core audio API is the supported server-to-server surface. Account, privacy, community, pack, and artist-page routes power the Exynos website and are documented for completeness; treat their raw schemas as website-internal and subject to change.

Access & privacy

API-key access and the website's optional-advertising consent state.

Website integration
GET /api/access/status Check API access

Reports whether this installation has keys configured and whether the current request is authorized.

PublicStandard
RequestNo request body.
Success response{"configured": true, "authorized": false}
Errors / notesNo endpoint-specific errors.
POST /api/access/verify Create a browser key session

Validates an API key and stores a short-lived, signed browser grant. Intended for the first-party access screen, not server integrations.

PublicFailed-attempt protection
RequestJSON or form: {"api_key":"YOUR_API_KEY","next":"/mastering"}. next must be a local path.
Success response{"ok": true, "next": "/mastering"}
Errors / notes401 INVALID_API_KEY · 429 RATE_LIMITED · 503 API_KEYS_NOT_CONFIGURED
GET /api/privacy/consent Read privacy choice

Returns the advertising-consent state for the current browser/session.

API key or website sessionStandard
RequestNo request body.
Success response{"ok":true,"available":true,"version":"…","decided":true,"advertising":false,"decided_at":0,"receipt_id":"…"}
Errors / notes401 when neither an API key nor first-party website session is present.
POST /api/privacy/consent Update privacy choice

Stores an explicit optional-advertising choice and returns the resulting consent record.

API key or website sessionStandard
RequestJSON: {"advertising": false}
Success response{"ok":true,"decided":true,"advertising":false,"receipt_id":"…"}
Errors / notes400 when advertising is not a boolean · 403 for an invalid cookie-session origin.

Audio engines

Analyze, master, and mix audio with the Exynos processing engines.

Core developer API
POST /api/analyze Analyze a track

Synchronously measures loudness, dynamics, spectrum, stereo image, and returns an AI mastering recommendation.

API key or signed-in website account20 / minute
Requestmultipart/form-data: file (one supported audio file, maximum 250 MiB).
Success responseJSON analysis object including ai_recommendation.
Errors / notes400 NO_FILE or INVALID_FILE_TYPE · 413 INVALID_FILE_SIZE/PAYLOAD_TOO_LARGE · 500 ANALYSIS_ERROR
POST /api/master Submit mastering job

Queues one or more tracks for asynchronous mastering and returns a job identifier immediately.

API key or signed-in website account8 / minute
Requestmultipart/form-data: file (repeat, up to 24), settings (JSON string), optional reference_file. Combined audio maximum 250 MiB.
Success response{"success": true, "job_id": "b6f…"}
Errors / notes400 validation error · 429 CONCURRENCY_LIMIT · 503 QUEUE_FULL · 413 PAYLOAD_TOO_LARGE
POST /api/mix Render a stem mix

Synchronously mixes up to 96 WAV stems with intelligent routing, buses, vocal anchoring, and sequence-aware automation.

API key or signed-in website account4 / 5 minutes
Requestmultipart/form-data: stems (repeat), settings (required JSON string), optional reference. WAV only; stems total maximum 900 MiB.
Success responseBinary audio/wav plus X-Mix-*, X-Vocal-*, and X-Sequence-* diagnostic headers.
Errors / notes400 validation error · 413 PAYLOAD_TOO_LARGE · 503 MIX_BUSY or render error
POST /api/premium/validate Validate supporter access

Checks a legacy donator key or the live supporter rank of the signed-in account.

API key or signed-in website accountStandard
RequestJSON: {"donator_key":"optional-legacy-key"}
Success response{"ok": true}
Errors / notes500 only if validation cannot be completed.

Mastering jobs & files

Poll an asynchronous mastering job, preview it, and download the result.

Core developer API
GET /api/job/<job_id> Read job status

Returns queued, processing, completed, or error state. Poll approximately every two seconds.

Same principal that submitted the jobStandard
RequestPath parameter: job_id returned by POST /api/master.
Success response{"status":"completed","job_id":"…","progress":100,"result":{"output_filename":"…","processing_time":"12.4s","ai_summary":{}}}
Errors / notes404 when the job is missing, expired, or owned by another key/session.
GET /api/preview/<job_id> Stream a preview

Streams the first completed master as inline WAV audio for playback.

Same principal that submitted the jobStandard
RequestPath parameter: completed job_id.
Success responseBinary audio/wav (inline).
Errors / notes404 when unavailable, expired, or not owned by the caller.
GET /api/download/<job_id> Download a master

Downloads a WAV for a normal single-track master or a ZIP for batch/spatial exports.

Same principal that submitted the jobStandard
RequestPath parameter: completed job_id. Download within 10 minutes of completion.
Success responseBinary audio/wav or application/zip attachment.
Errors / notes404 when unavailable, expired, or not owned by the caller.

Accounts

Website-account sessions used by community and publishing features.

Website integration
GET /api/auth/me Read current account

Returns the account attached to the current cookie session, including supporter status.

API key or website sessionStandard
RequestNo request body. Preserve the account cookie for external account workflows.
Success response{"ok":true,"user":{"id":"…","username":"artist","email":"…","is_donator":true}}
Errors / notesuser is null when no account is signed in.
POST /api/auth/login Sign in

Validates credentials and establishes a persistent signed account cookie.

API key or first-party website session30 / 5 minutes
RequestJSON: {"username":"artist","password":"at-least-8-chars"}
Success response{"ok":true,"user":{"id":"…","username":"artist","is_donator":false}}
Errors / notes400 missing fields · 401 invalid credentials.
POST /api/auth/register Create account

Creates a website account and signs it in.

API key or first-party website session10 / hour
RequestJSON: {"username":"artist","password":"at-least-8-chars"}. Username: 3–32 letters, numbers, _, -, or .
Success response{"ok":true,"user":{"id":"…","username":"artist"}}
Errors / notes400 invalid username/password · 409 username already exists.
POST /api/auth/logout Sign out

Revokes existing account sessions while keeping an independent browser API-key grant intact.

API key or website sessionStandard
RequestNo request body.
Success response{"ok": true}
Errors / notesNo endpoint-specific errors.
POST /api/auth/forgot-password Request password reset

Sends a one-hour reset link when the email exists. The response is deliberately identical for unknown emails.

API key or first-party website session6 / hour
RequestJSON: {"email":"artist@example.com"}
Success response{"ok":true,"message":"If the email is registered, we have sent a reset link."}
Errors / notes400 missing email · 429 RATE_LIMITED.
POST /api/auth/reset-password Reset password

Consumes a one-time password-reset token and revokes older account sessions.

API key or first-party website session10 / hour
RequestJSON: {"token":"one-time-token","password":"new-password"}
Success response{"ok": true}
Errors / notes400 invalid/expired token or password shorter than 8 characters.
POST /api/auth/profile Update profile

Updates or clears the email address of the signed-in account.

Account cookie requiredStandard
RequestJSON: {"email":"new@example.com"}. A blank value clears the email.
Success response{"ok":true,"user":{"id":"…","username":"artist","email":"new@example.com","is_donator":false}}
Errors / notes401 login required · 409 email already in use.
GET /api/donators List supporters

Returns up to 500 usernames whose hub.db donator flag is enabled.

API key or website sessionStandard
RequestNo request body.
Success response{"donators":["producer_one","producer_two"]}
Errors / notesNo endpoint-specific errors.

Sound packs

Discover, preview, upload, and download community sound packs.

Website integration
GET /api/packs Search packs

Returns up to 200 packs filtered by free-text query and style.

API key or website sessionStandard
RequestQuery: q (optional), style (optional).
Success response{"count":1,"items":[{"id":"…","title":"Drum Kit","style":"Drums","downloads":12}]}
Errors / notesNo endpoint-specific errors.
POST /api/packs Upload a pack

Publishes one account-owned pack file, up to 1 GiB.

Account cookie requiredStandard
Requestmultipart/form-data: file, title (2–120), style, optional bpm (20–400), optional key (≤24).
Success response{"ok": true}
Errors / notes400 invalid metadata/file · 401 login required · 413 payload too large.
GET /api/packs/<pack_id>/preview Preview a pack

Streams the stored pack asset inline when a previewable file is available.

API key or website sessionStandard
RequestPath parameter: pack_id.
Success responseBinary file response.
Errors / notes404 when the pack/file is unavailable.
GET /api/packs/<pack_id>/download Download a pack

Downloads a pack attachment and increments its download count.

Account cookie requiredStandard
RequestPath parameter: pack_id.
Success responseBinary attachment.
Errors / notes401 login required · 404 when unavailable.

Community

Read community content and perform signed-in social actions.

Website integration
GET /api/community/posts List posts

Returns up to 200 community posts with optional search, category, and sorting.

API key or website sessionStandard
RequestQuery: q, cat, and sort=hot|new (all optional).
Success response{"items":[{"id":"…","title":"Mix feedback","category":"Feedback","upvotes":4}]}
Errors / notesNo endpoint-specific errors.
POST /api/community/posts Create a post

Publishes a post as the signed-in account.

Account cookie requiredStandard
RequestJSON: {"title":"3–160 chars","content":"up to 12000 chars","category":"Feedback"}.
Success response{"ok": true}
Errors / notes400 invalid title/content · 401 login required. Unknown categories fall back to General.
GET /api/community/posts/<pid> Read post and comments

Returns one post, its comments, vote totals, and user_voted state for the current account.

API key or website sessionStandard
RequestPath parameter: pid.
Success response{"post":{"id":"…","user_voted":false},"comments":[]}
Errors / notes404 when the post does not exist.
POST /api/community/posts/<pid>/upvote Toggle post vote

Adds or removes the current account's upvote.

Account cookie requiredStandard
RequestPath parameter: pid. No request body.
Success response{"voted":true,"upvotes":5}
Errors / notes401 login required · 404 post not found.
POST /api/community/posts/<pid>/comments Add a comment

Adds a non-empty comment of up to 6,000 characters.

Account cookie requiredStandard
RequestJSON: {"content":"Your feedback"}
Success response{"ok": true}
Errors / notes400 invalid content · 401 login required · 404 post not found.
POST /api/community/comments/<cid>/upvote Toggle comment vote

Adds or removes the current account's comment upvote.

Account cookie requiredStandard
RequestPath parameter: cid. No request body.
Success response{"ok": true}
Errors / notes401 login required · 404 comment not found.

Artist pages

Read and publish the signed-in account's public link-page configuration.

Website integration
GET /api/linktree/config Read artist-page config

Returns the account's saved configuration or an editable default.

Account cookie requiredStandard
RequestNo request body.
Success response{"ok":true,"alias":"artist","profile_name":"Artist","bio":"…","avatar_url":"","links":[],"theme":"dark"}
Errors / notes401 login required.
POST /api/linktree/config Publish artist-page config

Publishes an alias, profile, theme, and up to 12 validated HTTP(S) links.

Account cookie requiredStandard
RequestJSON: {"alias":"artist","profile_name":"Artist","bio":"…","avatar_url":"https://…","links":[{"label":"Listen","url":"https://…"}],"theme":"dark"}
Success response{"ok": true}
Errors / notes400 invalid fields/URLs · 401 login required · 409 alias already in use.

Settings & models

Useful defaults, clear boundaries.

Start with the minimal examples. Add advanced processing only when your product needs direct control.

Master settings

A safe AI-first payload for streaming-focused material.

  • presetAI, DSP_MudCleaner, Glue, Punchy, Smooth, or EDM.
  • target_lufsClamped from −18 to −8 LUFS.
  • ceilingClamped from −3 to −0.1 dBTP.
  • bitdepth16, 24, or 32; invalid values become 24.
  • bass_adj / mid_adj / high_adjManual tone, each −12 to +12 dB.
  • width / saturationWidth 0.5–1.5; saturation 0–6.

Spatial mastering

Enable a packaged spatial export only when the client can consume ZIP results.

  • binaural_spatial_masterCreates a headphone-ready binaural master.
  • adm_exportAdds ADM/BW64 assets and metadata where available.
  • spatial_amount0–1 intensity.
  • spatial_sample_rate48,000 or 96,000 Hz.

Mix settings

Routing follows the order of repeated multipart stem files. Categories normalize to drums, bass, vocals, music, and fx.

  • styleclean, punchy, warm, or aggressive, plus headroom, vocal presence, sequence intelligence, reverb, delay, ducking, and limiter controls.
  • routing[]index, category, gain trim (−18…18 dB), pan (−1…1), compression (0…1), width (0…2), filters, polarity, solo/mute, and sends.
  • busesPer-category gain, glue, tone (neutral/bright/dark), width, reverb, and delay sends.
  • render.output_srSource/null, 44.1, 48, 88.2, 96, 176.4, or 192 kHz.
  • render.bitdepth16 or 24-bit WAV output.
  • reference_matchSet true and include the reference multipart file.
minimal-master-settings.json
{
  "preset": "AI",
  "target_lufs": -14,
  "ceiling": -1,
  "bitdepth": 24
}

Reliability

Errors, limits, and retries.

Check HTTP status and JSON error bodies before treating a response as audio. Back off when the server tells you to.

StatusCode / conditionWhat to do
400Invalid inputFix field names, multipart parts, JSON settings, formats, or bounds. Do not retry unchanged.
401API_KEY_REQUIRED / API_KEY_OR_LOGIN_REQUIREDSend a configured key on every request. Never place it in the URL.
403Invalid session originFor website-cookie mutations, use the same origin. Header-key server calls are not cross-site browser calls.
404Missing or non-owned job/resourceConfirm the ID and the submitting key. Completed job results may already have expired.
413PAYLOAD_TOO_LARGE / file limitReduce upload size or split the workload within the documented endpoint limits.
429RATE_LIMITED / CONCURRENCY_LIMITHonor Retry-After when present; otherwise wait for an active mastering job to finish.
503QUEUE_FULL / MIX_BUSYRetry with exponential backoff and jitter. Avoid synchronized retry storms.
500Processing errorLog a request correlation on your side, retry once if safe, then contact support without sending API keys.

Upload limits

Analyze/master audio: 250 MiB. Master: up to 24 tracks. Mix: 96 WAV stems / 900 MiB total. Mix stem duration: 12 minutes each.

Job lifetime

Active mastering jobs time out after 20 minutes. Completed files expire after 10 minutes and are stored in memory, so a process restart removes them.

Rate-limit headers

A global 429 response includes Retry-After in seconds. Apply exponential backoff plus a small random delay.

Transport

Use HTTPS in production, long upload/render timeouts, streaming downloads, and automatic multipart boundaries generated by your HTTP client.

Developer support

Need a second pair of eyes?

Bring your request shape, response status, and a redacted error to Discord. Never post your API key, reset token, or private audio URL.

Join the Discord
Join Discord