Trust, without the sales call.
The straight answers your CTO, security lead, and procurement team need before they let you ship TuneLab to production. Where the audio goes, what we log, who can read it, what happens if we get hit by a bus, and how to actually buy the thing. No NDAs, no discovery calls.
1 · Data handling
Where your user audio actually goes.
TuneLab has two request shapes — metadata lookups and audio uploads — and they touch completely different paths. Knowing which one your integration uses tells you exactly what we hold and for how long.
Metadata lookups (most calls)
GET /v1/analyze, /v1/key-bpm, /v1/resolve/{id},
and the Spotify compat shim never see your users' files. You send a track
identifier (Spotify ID, ISRC, MusicBrainz ID, artist + title, etc.); we resolve
against our pre-computed feature database (9.3M tracks indexed). On a cache hit
the response is served from the Cloudflare edge in under 10 ms and nothing of
yours is stored beyond the standard request log line.
Upload endpoints (when you compute on real audio)
POST /v1/bpm, /v1/key, /v1/lufs,
/v1/key-bpm, /v1/beatgrid, and /v1/analyze/upload
accept an audio payload. The byte path is:
- Edge ingress — Cloudflare Worker (audio-features-api) authenticates the API key and forwards the bytes downstream. Workers do not write the payload to durable storage.
- Compute — bytes go to our bare-metal FastAPI server (
audion.s.tunelab.dev) for synchronous DSP, or to a Modal GPU worker for async jobs that need overflow capacity. - Async only — for async upload jobs, the audio is staged in a private Cloudflare R2 bucket (
audio-features-uploads, prefixuploads/pending/*) so the GPU worker can pick it up. - Lifecycle delete — pending upload objects are removed by an R2 lifecycle rule after 1 hour. Generated stem outputs (vocal removal, separation) are removed after 24 hours.
Sync upload endpoints: bytes are processed in memory and never written to disk. Async upload endpoints: audio lives in a private R2 bucket for at most 1 hour, then is auto-deleted by lifecycle rule. Generated stems live at most 24 hours. We do not train any model on customer payloads. Ever.
What we do log
- Trace ID — random per-request ID propagated edge-to-Modal-to-bare-metal so you can ask support about a specific call without sharing the audio. Returned in the
X-Trace-Idresponse header. - Request metadata — endpoint, status code, latency, credits charged, API key prefix (
tl_live_*), country (Cloudflare-derived). - Cache key derivatives — for upload endpoints, a SHA-256 of the audio bytes is used as a cache lookup key so re-uploads of the same file are free. The hash is not reversible into audio.
- No payload bodies, no headers, no JSON content stored in logs.
2 · GDPR & data location
Where the compute physically happens.
TuneLab operates from the EU. Our bare-metal compute runs in Hetzner data centres in Germany (Falkenstein region). Our PostgreSQL feature database, our FastAPI compute servers, and our internal observability all live on the same private network in the same legal jurisdiction.
Edge traffic is handled by Cloudflare's global anycast network — your users hit the nearest Cloudflare PoP, the Worker authenticates the request, and any compute is routed back to the EU origin. Cache reads can be served from any region; compute and the durable feature database are EU-only.
Sub-processors
- Cloudflare, Inc. — edge network, Workers runtime, D1 cache, R2 object storage. Cloudflare GDPR posture.
- Hetzner Online GmbH — bare-metal hosting (Germany). Standard contractual clauses with us.
- Modal Labs, Inc. — on-demand GPU overflow for async jobs. US-based; engaged only when bare metal returns 503. [VERIFY: confirm Modal region pinning before promising EU-only async path]
- Stripe, Inc. — billing for the developer platform. Never sees end-user audio or analysis payloads.
- Resend — transactional email (magic link login for the developer dashboard). End users of your app are not in this system.
Data subject rights
Because TuneLab does not store end-user audio or end-user identifiers, the practical scope of data subject access requests is narrow: your developer-account email and billing data on the platform side. Email compliance@tunelab.dev for access, export, or deletion of your developer account data.
A standard Data Processing Agreement is available on request from compliance@tunelab.dev for any paid plan. We will sign yours or send ours — whichever is faster for your legal team.
Certifications — honest status
- SOC 2 Type II — not yet certified. [VERIFY: confirm whether to publish a target date]
- ISO 27001 — not yet certified. [VERIFY: same]
- GDPR — operational compliance via EU-only compute, minimal data collection, processor DPA on request. We are not a "GDPR-certified" vendor (no such certification scheme exists in the regulation).
- Cloudflare and Hetzner upstream certifications (SOC 2, ISO 27001, ISO 27018, BSI C5) cover the infrastructure layer beneath us. Public reports linked from each vendor's trust page.
3 · SLA & reliability
What "down" looks like, and what you get.
Most TuneLab requests never reach our origin: cache hits are served from Cloudflare's edge in single-digit milliseconds. Our exposed failure surface is the cache-miss path — bare metal FastAPI plus the Modal GPU overflow.
| Tier | Monthly uptime target | Service credits on miss | Status page |
|---|---|---|---|
| Free | Best effort | None | Public |
| Starter ($29) | 99.5% [VERIFY] | None | Public |
| Pro ($99) | 99.9% [VERIFY] | Pro-rated credits | Public |
| Scale ($499) | 99.95% [VERIFY] | Pro-rated credits + RCA within 5 business days | Public + email alerts |
| Enterprise | Negotiated | Custom contractual remedies | Public + dedicated Slack |
What we do during an incident
- Cache stays up. Even if bare metal and Modal both fall over, cached responses (the vast majority of traffic) keep flowing from Cloudflare D1.
- Backpressure, not blocking. The compute path uses an
asyncio.Semaphore(10)with instant-503 on overflow. We fail fast so your retry logic stays in control. - Modal overflow. A 503 from bare metal automatically routes the same request to a Modal GPU container. Bus factor on the bare-metal box alone does not take the API down.
- Public status page. status.tunelab.dev [VERIFY: confirm URL is live] — incidents are posted in real time, retroactive RCAs published within 5 business days.
- Trace ID in every response. Open a support ticket with the trace ID and we can answer "what happened to this exact call" — not "show us your logs."
4 · Bus factor & vendor continuity
If we get hit by a bus, you keep shipping.
A startup API replacing Spotify is exactly the kind of dependency a CTO is right to be paranoid about. We treat that paranoia as a feature requirement, not an objection to deflect.
Open spec, open shim
- Public OpenAPI spec. The full machine-readable contract is at /api/openapi.json. You can regenerate clients in any language any time.
- Spotify-compatible schema.
/v1/compat/spotify/audio-features/{id}returns the exact JSON shape Spotify's deprecated endpoint did. If we vanish tomorrow, your parser already works against any other Spotify-shim provider. - Public changelog with semver. developers.tunelab.dev/changelog. Minor versions add fields; breaking changes get a 90-day notice and a new
/v2/namespace. No silent deprecations.
Data export & portability
- Pull what you've computed. Anything we have analysed for you — your async job results, cached features tied to your account — is exportable as JSON or NDJSON via the platform dashboard.
- Stable identifiers. Our internal IDs are derived from MusicBrainz IDs, Spotify IDs, ISRCs, and AcoustID fingerprints — all open identifiers you can use to re-resolve against any other service.
- Source code escrow on Enterprise. Available on request for Enterprise contracts. [VERIFY: confirm legal structure for escrow]
Continuity commitments
- 90-day shutdown notice. If we ever wind the API down, you get at least 90 days of advance email notice and continued read-only access during that window.
- Data export on shutdown. On shutdown notice, every paid customer gets a one-time bulk export of all features computed against their key.
- Open methodology. Our DSP approaches are documented at /technology. You can rebuild the equivalent of our pipeline in-house using published academic methods if you ever need to.
5 · Security practices
How the infrastructure is actually wired.
Authentication & secrets
- API keys —
tl_live_*andtl_test_*prefixes, generated and rotated from the developer dashboard. Test keys never bill and never reach bare metal. - HMAC-signed webhooks — every developer webhook delivery is signed with a per-account secret you can rotate. Failed deliveries auto-disable after 5 consecutive failures and require a manual re-test.
- Stripe webhook idempotency — billing events are deduplicated via
INSERT OR IGNOREon a dedicatedstripe_webhook_eventstable. No double-charges from retried webhooks. - Scoped service tokens — Worker-to-bare-metal calls use a dedicated
BPM_SERVER_TOKENthat has no other privileges. Worker-to-Modal calls use a separateAFA_CALLBACK_SECRET.
Network & transport
- TLS 1.3 everywhere. Enforced by Cloudflare in front of every public surface.
- Private network for origin traffic. Bare metal talks to our PostgreSQL on Hetzner's private 10.x network — never over the public internet.
- HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy set on all HTML responses. Preloaded for the apex domain.
Isolation
- Product isolation. The Audio Features API has its own Cloudflare Worker, its own D1 namespace, its own R2 buckets, and its own Modal app — completely separate from the consumer site at tunelab.dev. A failure in one cannot cascade into the other.
- Test-key isolation. Test keys (
tl_test_*) hit a mock-response handler in the Worker. They never reach bare metal, never spend credits, never touch the cache. - Async job isolation. Each Modal GPU worker runs in an isolated container with no persistent state across requests.
What we publish
- Public changelog with every release. Security-relevant fixes are tagged.
- Vulnerability disclosure. Email compliance@tunelab.dev with the subject prefix
[security]. We acknowledge within 1 business day. Coordinated disclosure window is 90 days from first contact. - Penetration testing. [VERIFY: confirm whether to publish frequency or disclose under NDA only]
6 · Procurement
How to actually buy this.
Most teams onboard themselves on the dashboard with a credit card and never talk to us. For the rest of you with a real procurement process, here is the menu.
| What you need | How to get it | Lead time |
|---|---|---|
| API key & first call | platform.tunelab.dev/login | Under 2 minutes |
| Self-serve credit card billing | Stripe Checkout in the dashboard | Instant |
| Annual invoice (USD or EUR) | Email hello@tunelab.dev | 1–2 business days |
| DPA (GDPR Article 28) | Email compliance@tunelab.dev | 1–2 business days |
| Security questionnaire | Email compliance@tunelab.dev with the questionnaire attached | 3–5 business days |
| Custom MSA / order form | Enterprise tier only — hello@tunelab.dev | Negotiated |
| SSO / SAML for the dashboard | Enterprise tier — hello@tunelab.dev | Negotiated |
Legal entity
TuneLab is operated by a registered EU sole-proprietor business (Polish JDG) for the launch phase. [VERIFY: confirm exact legal entity name and registration number to publish] A formal limited company is on the Q3 2026 roadmap. Invoices are issued accordingly.
Still have questions
Talk to a human, not a sales funnel.
Compliance, security, or DPA questions go to compliance@tunelab.dev. A human reads it. We aim to reply within 1 business day. We sign NDAs but do not require one to answer routine questions about retention, sub-processors, or data location.
Everything else — pricing, custom integrations, partnership inquiries — hello@tunelab.dev.