Pulse

Terms of service.

Last updated: 2026-05-01

The short version

1. What Pulse does

Pulse is a pay-per-use audio-intelligence API operated by StudioSphere Inc.. You give Pulse a public audio URL or upload a file, and Pulse returns analytical metadata about the track — currently BPM (tempo), musical key, and a waveform-peaks visualization. Structure and chord analysis are coming later.

Pulse does not stream, host, distribute, share, or play back audio. It reads, measures, and reports non-expressive technical metadata. BPM and key are facts about the track. Waveform peaks are compressed amplitude samples for visualization, not playable audio and not enough to reconstruct the original recording.

2. What we store — and what we don't

This section is meant to be specific. We've validated each claim against the running code.

What never persists

What persists, and why

WhatWhereWhy
API key + email + ToS metadatapulse_accountsAuthentication and account recovery. Email may be used to send a billing receipt.
Banked-token balancepulse_accounts.banked_tokensPer-second pricing model.
Hash of the URL you submitted (API path)pulse_usage_log.audio_url_hashSHA-256 only — the URL itself is never written to this table. Used to dedupe identical submissions for billing-cache lookups.
The URL you submitted (Checkout path)pulse_payment_jobs.audio_urlStripe Checkout completes asynchronously; the worker needs a way to fetch the audio after payment confirmation. Stored as text on the payment record. Not the audio — only the link.
Hash of the audio bytespulse_analysis_cache.content_hashSHA-256 of the file. Lets us return cached results when the same content is analyzed twice without re-running compute.
Analysis resultspulse_analysis_cache.result_jsonBPM number, key string, waveform peaks (an array of compressed amplitude samples — visualization data, not the original audio and not sufficient to recreate it). Sample size: BPM ~70 bytes, waveform ~30 KB, key ~70 bytes.
Stripe checkout-session IDstripe_checkout_session on pulse_payment_jobs, pulse_pack_purchases, pulse_usage_logString like cs_live_a1... — an opaque handle Stripe assigned to your checkout. Pulse uses it to look up payment status. Not payment data.
Stripe payment-intent IDstripe_payment_intent on the same tablesString like pi_3T... — an opaque handle for the underlying charge. Pulse uses it to issue refunds. Not payment data.
Stripe checkout URLpulse_payment_jobs.stripe_checkout_urlThe https://checkout.stripe.com/... URL Stripe gave us for the customer to pay at. We persist it so repeat /pay calls return the same URL instead of creating a new session.
Dollar amounts (integer cents)amount_estimate_cents, amount_buffered_cents, amount_paid_cents, amount_refunded_cents, cost_usdJust integers and a 3-letter currency code. The amount you paid, the amount we estimated, the amount we refunded. No card-specific fields.
Webhook event IDspulse_stripe_eventsIdempotency table — stores event_id + event_type + timestamp. Prevents Stripe re-deliveries from double-charging or double-crediting.

Two columns exist in the schema but are reserved and not currently written: pulse_accounts.stripe_customer_id (Pulse doesn't create Stripe Customer objects today) and pulse_payment_jobs.conversion_email (planned post-checkout follow-up flow that hasn't shipped). We mention them only because someone reading the schema might notice them.

How payment processing actually works

This is important enough to spell out in detail. The trust model is: your payment details flow to Stripe, never to Pulse.

  1. You click "Analyze for $X.XX" or "Buy a pack" on Pulse. Pulse calls stripe.checkout.sessions.create() with: payment mode, the line item (a price ID or amount + currency + product reference), and Pulse-specific metadata (job IDs, account IDs — no user-identifying fields). Pulse receives back a session ID and a checkout URL.
  2. Pulse redirects your browser to checkout.stripe.com. From this point until you finish or cancel, you are on a page hosted by Stripe, not by Pulse. The card form, the form validation, the 3-D Secure challenge if any — all on Stripe's domain.
  3. You enter your card on Stripe's page. Stripe receives the card number, CVV, expiration, and (for some payment methods) billing address. Stripe handles all PCI-DSS scope. Pulse is out of scope: we do not, in any code path, receive or transmit primary account number (PAN) or any other cardholder data.
  4. Stripe processes the payment. Stripe charges your payment method and (for Pulse Checkout) captures the funds.
  5. Stripe sends Pulse a webhook. The checkout.session.completed event arrives at pulse.studiosphere.space/webhook/stripe, signature-verified. Pulse reads exactly these fields from the event: session.id, session.payment_intent, and session.metadata (the Pulse fields we set in step 1). We do not read customer_details (which would contain email/name/address), we do not read payment_method, we do not read any card-specific data.
  6. Pulse triggers the work. For analyze-checkout: enqueue the analysis job. For pack purchases: credit the banked-token balance.

Refunds happen the same way in reverse: Pulse calls stripe.refunds.create({ payment_intent: pi_…, amount: cents }) with an opaque PaymentIntent ID. Stripe issues the refund to the original payment method without Pulse knowing what that payment method is.

The Stripe API is also used by Pulse for billing-display purposes only — fetching the public receipt URL Stripe hosts for the customer (pi.latest_charge.receipt_url), so we can show a "View on Stripe" link on the success page. The receipt is rendered by Stripe.

PCI scope. Pulse is fully out of scope for PCI-DSS because no cardholder data ever transits through any Pulse system. Stripe Inc. is a PCI Service Provider Level 1 (the highest tier). If you want to verify the boundary yourself, audit our entire stripe SDK usage — it's about a dozen call sites in src/worker.js, src/routes/pay.js, src/routes/account/index.js, src/routes/webhook/stripe.js, and src/lib/cleanup.js. None of them touch a payment method.

Short-term caches

Backups

The MySQL database is backed up by our hosting provider (DreamHost). Backups inherit whatever's in the live tables — none of which contain audio. Backup retention follows the provider's rolling schedule (typically 30 days).

Want to verify? The cleanup behavior is in src/worker.js step 9. The schemas are in migrations/pulse_001_initial.sql through the latest. The result-cache TTL is in setJobResult() at src/worker.js. Email support@studiosphere.space if you want a deeper walk-through.

3. Your responsibilities

By using Pulse you confirm that:

If a claim, demand, loss, or expense arises from audio you submit or from your breach of these responsibilities, you agree to defend and indemnify StudioSphere Inc. and its officers, employees, contractors, and service providers to the fullest extent allowed by law.

4. Pricing, billing, and refunds

Pricing is per-second of audio analyzed, multiplied by per-tool rates. The rate sheet at /tools is the source of truth.

How charges work

Disputes

Email support@studiosphere.space within 30 days of the charge. We'd much rather work it out directly than route through Stripe disputes.

Payment data, again

To restate the point in the billing context: Pulse does not see your payment details — card number, CVV, expiration date, billing address, bank credentials, or any tokenized payment method — at any point in the payment flow. Stripe handles all of that on their hosted page. Pulse only sees Stripe-issued reference IDs (which we use to issue refunds) and the dollar amount of the charge. If you'd like the technical detail, see "How payment processing actually works" in §2 above.

5. Data deletion and access

You have two ways to remove your data:

If you want a copy of what we have on file (banked-token balance, recent jobs, recent purchases), email the same address.

Rights holders can also email support@studiosphere.space to request removal of cached analysis metadata associated with a specific audio file. Include enough information for us to identify the file or submission. Because Pulse does not store audio, we may need a copy or hash of the file to match the cache entry.

6. Warranties and liability

Pulse is provided "as is." We make our best effort at accurate analysis, uptime, and timely processing, but we don't warrant fitness for any specific purpose. Audio analysis is statistical; results can be off, especially on very short clips, distorted recordings, or content the model wasn't designed for.

StudioSphere Inc.'s aggregate liability under these terms is limited to the amount you paid Pulse in the twelve months preceding the claim.

7. Changes to these terms

If we change these terms in a way that materially affects your rights or our obligations, we'll update the "Last updated" date at the top and email a heads-up to any account with a registered address. Continued use after the update means you accept the new terms.

8. Governing law and parent platform terms

StudioSphere Inc. is based in Quebec, Canada. These terms are governed by the laws of Quebec and the federal laws of Canada that apply there. Disputes that can't be resolved by direct conversation are handled in Montreal courts.

Pulse is a service of StudioSphere. The broader StudioSphere platform terms — covering accounts, payments, and the listening-room product — are at studiosphere.space/terms. Where the two documents address the same topic, this Pulse-specific document controls for Pulse-related questions.

9. Contact

Questions, requests, or anything we should know: support@studiosphere.space.