{"x402Version":2,"type":"bazaar-listing","service":{"name":"HALOWERK audiowerk","url":"https://audio.halowerk.com","version":"1.0.0","icon":"https://audio.halowerk.com/favicon.svg"},"items":[{"id":"audiowerk.audio_voice_evidence","name":"audio_voice_evidence","title":"Measures the markers of a recording that speak to how it was produced — spectral cut-off, room tone variation between pauses, loudness range, clipping, DC offset and container encoder tags — and states for each what it does and does not indicate.","description":"Returns measured evidence about a recording, not a verdict on it. The spectral cut-off says which lossy stages the file has already been through, since every encoder discards everything above its own ceiling. The room tone measurement compares the noise floor across the silent stretches: a microphone in a room produces a floor that differs between pauses, and a level identical to the hundredth of a decibel across every pause means the silence was inserted rather than recorded. Loudness range, true peak, clipped sample runs and DC offset describe the processing chain. Container and stream tags are reported verbatim, because an encoder tag contradicting the claimed origin is evidence that needs no interpretation. What this endpoint deliberately does not return is a judgement on whether a voice is human or synthetic. That judgement requires a classifier calibrated against synthetic speech, and generating or holding synthetic voices is forbidden in this hub in use, integration and simulation alike; a verdict without that calibration would be a number whose error nobody has measured. Every marker therefore comes with its method and its limits, so the caller can combine it with evidence this service cannot see.","category":"audiowerk","keywords":["audio provenance markers","recording analysis","spectral cutoff","room tone","encoding history"],"resource":"https://audio.halowerk.com/voice-evidence","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["audio"],"additionalProperties":false,"properties":{"audio":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64, not both.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the audio file. Private and local addresses are refused."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64. A data: prefix is accepted."}}},"silence_threshold_db":{"type":"integer","minimum":-70,"maximum":-20,"default":-35,"description":"Level below which a stretch counts as a pause, for the room tone measurement."}}},"outputSchema":{"type":"object"},"price":{"amount":"6000","currency":"USDC","decimals":6,"human":"0.006 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_speech_rate","name":"audio_speech_rate","title":"Measures the speaking rate of a recording in words per minute, separately for the whole running time and for speaking time with the pauses removed, and reports where within the recording the rate rises and falls.","description":"Transcribes the recording, then measures rate rather than words. Two figures come back and they are not interchangeable: the gross rate over the whole running time, which is what a listener experiences, and the articulation rate over speaking time only, which is what a speaker can actually change. On a recording with normal pauses the two differ by thirty per cent or more, and coaching against the wrong one produces the wrong correction. The rate is also reported per segment with the fastest and slowest passages named by timestamp, so a passage that runs away is findable rather than merely counted. Pauses are measured independently of the transcript, by level detection, because a transcriber places segment boundaries by grammar and not by silence. The comparison scale for the verdict is stated in the answer and is drawn from broadcast practice: roughly 120 to 150 words per minute for narration, 150 to 180 for conversational presentation, above 200 for auctioneer-grade delivery. Language is detected, not assumed, and reported, since the same rate means different things across languages. This endpoint sells the measurement, not the transcript; for a transcript with per-word confidence, medienwerk /v1/stt is the endpoint for that.","category":"audiowerk","keywords":["words per minute","speaking rate","speech tempo analysis","articulation rate","presentation pacing"],"resource":"https://audio.halowerk.com/speech-rate","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["audio"],"additionalProperties":false,"properties":{"audio":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64, not both.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL of the audio file."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."}}},"language":{"type":"string","maxLength":8,"description":"ISO 639-1 code of the spoken language. Left out, it is detected."},"include_transcript":{"type":"boolean","default":false,"description":"Return the transcript text alongside the measurement. Segment timings always come back."},"silence_threshold_db":{"type":"integer","minimum":-70,"maximum":-20,"default":-35,"description":"Level below which a stretch counts as a pause."}}},"outputSchema":{"type":"object"},"price":{"amount":"8000","currency":"USDC","decimals":6,"human":"0.008 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"8000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_duck","name":"audio_duck","title":"Mixes a voice track over a music bed with sidechain ducking, so the music drops whenever the voice speaks, and measures on the finished mix how many decibels of ducking were actually achieved.","description":"Takes a voice recording and a music bed and returns one mixed file in which the music is pulled down by the voice through an ffmpeg sidechain compressor. Threshold, ratio, attack and release are all settable and all reported back with the result, because they are the difference between a mix that breathes and one that pumps: a release under 100 ms makes the bed audibly flutter between words, above 1500 ms it never returns between sentences. The bed is looped or cut to the length of the voice track, and which of the two happened is stated. After mixing, the result is measured rather than assumed: the integrated loudness of the passages where the voice speaks is compared against the passages where it does not, and the difference is the ducking depth that was actually reached — the figure a producer checks and the one a parameter set alone cannot promise. Both input tracks and the mix are reported with their loudness in LUFS and their true peak, so the mix can be dropped into a chain with a known target. The result comes back inline as base64; at six megabytes the answer is refused with the reason rather than truncated.","category":"audiowerk","keywords":["sidechain ducking","voice over music","automatic music ducking","podcast bed mix","broadcast mix"],"resource":"https://audio.halowerk.com/duck","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["voice","music"],"additionalProperties":false,"properties":{"voice":{"type":"object","additionalProperties":false,"description":"The voice track. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."}}},"music":{"type":"object","additionalProperties":false,"description":"The music bed. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."}}},"music_gain_db":{"type":"number","minimum":-40,"maximum":6,"default":-8,"description":"Level of the bed before ducking, relative to its own level."},"threshold_db":{"type":"number","minimum":-60,"maximum":-6,"default":-30,"description":"Voice level above which the bed starts to be pulled down."},"ratio":{"type":"number","minimum":1.5,"maximum":20,"default":8,"description":"How hard the bed is pulled down once the threshold is crossed."},"attack_ms":{"type":"integer","minimum":1,"maximum":500,"default":20,"description":"How fast the bed ducks when the voice starts. Short values can clip the first syllable."},"release_ms":{"type":"integer","minimum":50,"maximum":3000,"default":400,"description":"How fast the bed returns between words. Under 100 ms the bed audibly flutters."},"loop_music":{"type":"boolean","default":true,"description":"Loop a bed shorter than the voice track. Off, the mix ends when the bed does."},"output_format":{"type":"string","enum":["mp3","wav","flac","opus"],"default":"mp3","description":"Format of the mixed file."}}},"outputSchema":{"type":"object"},"price":{"amount":"10000","currency":"USDC","decimals":6,"human":"0.010 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_trim_silence","name":"audio_trim_silence","title":"Shortens every silent stretch above a chosen length down to a floor rather than deleting it, returns the trimmed file, and lists every cut with its position in the original so the result can be checked.","description":"Finds silent stretches with ffmpeg level detection and shortens each one that exceeds the threshold length. Pauses are shortened to a floor, never removed outright: a pause cut to zero makes the end of one sentence collide with the start of the next, which is a worse defect than the dead air it replaced. The floor defaults to 400 milliseconds, roughly the pause a speaker leaves between sentences, and is settable. Leading and trailing silence are treated separately and can be removed completely, because there the collision problem does not arise. Every cut comes back with its start and end in the original timeline, its original length and its new length, so the edit is auditable rather than a black box — with a long recording that list is the difference between accepting the result and having to listen to the whole thing. The saving is reported in seconds and as a share, and the loudness of source and result are both measured, since trimming pauses raises the integrated loudness of the file and the next stage in a chain needs to know by how much. The result comes back inline as base64.","category":"audiowerk","keywords":["remove dead air","trim silence podcast","silence detection ffmpeg","shorten pauses","audio editing automation"],"resource":"https://audio.halowerk.com/trim-silence","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["audio"],"additionalProperties":false,"properties":{"audio":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."}}},"threshold_seconds":{"type":"number","minimum":0.2,"maximum":30,"default":1.5,"description":"Pauses longer than this are shortened."},"keep_seconds":{"type":"number","minimum":0,"maximum":5,"default":0.4,"description":"What a shortened pause is left at. Zero makes sentences collide and is allowed but not advised."},"noise_floor_db":{"type":"integer","minimum":-70,"maximum":-20,"default":-35,"description":"Level below which audio counts as silence. Raise it for a noisy recording."},"trim_edges":{"type":"boolean","default":true,"description":"Remove leading and trailing silence completely."},"output_format":{"type":"string","enum":["mp3","wav","flac","opus"],"default":"mp3","description":"Format of the trimmed file."}}},"outputSchema":{"type":"object"},"price":{"amount":"8000","currency":"USDC","decimals":6,"human":"0.008 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"8000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_loudness_normalise","name":"audio_loudness_normalise","title":"Normalises a recording to a loudness target per EBU R128 using the two-pass loudnorm method, and reports measured loudness, true peak and loudness range before and after.","description":"Normalises to −14 LUFS by default, the level the streaming platforms converged on, with named presets for podcast, European and United States broadcast, or a free target. The correction runs in two passes: the first measures integrated loudness, true peak, loudness range and threshold, the second applies a constant correction derived from those figures. The single-pass form of the same filter works its correction out as it plays and therefore rides the level during the opening seconds of a file — audible on every track, and the reason the measurement pass is not optional here. The measured values from both passes come back in full, including the loudness range, because a recording with a range above roughly 15 LU cannot be brought to a target without either compressing it or clipping the peaks, and which of the two happened is something the buyer has to be able to see. True peak is limited to the target ceiling so that a lossy encoder downstream does not push the signal into distortion — normalising to a sample peak instead of a true peak is the most common way a file that measured clean arrives clipped. If the recording already sits within half a decibel of the target, that is stated and the correction applied is near zero rather than being dressed up as work.","category":"audiowerk","keywords":["lufs normalisation","ebu r128","-14 lufs streaming","true peak limiting","loudness target"],"resource":"https://audio.halowerk.com/loudness-normalise","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["audio"],"additionalProperties":false,"properties":{"audio":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."}}},"target":{"type":"string","enum":["streaming","podcast","broadcast_eu","broadcast_us","custom"],"default":"streaming","description":"Named target. streaming is -14 LUFS."},"target_lufs":{"type":"number","minimum":-40,"maximum":-5,"description":"Integrated loudness target, only with target=custom."},"true_peak_db":{"type":"number","minimum":-9,"maximum":0,"description":"True peak ceiling in dBTP, only with target=custom."},"loudness_range_lu":{"type":"number","minimum":1,"maximum":30,"description":"Loudness range target, only with target=custom."},"output_format":{"type":"string","enum":["mp3","wav","flac","opus"],"default":"mp3","description":"Format of the normalised file."}}},"outputSchema":{"type":"object"},"price":{"amount":"8000","currency":"USDC","decimals":6,"human":"0.008 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"8000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_speech_duration","name":"audio_speech_duration","title":"Estimates how long a text takes to speak, from syllable count, punctuation pauses and a stated delivery rate, and shows every step of the arithmetic so the estimate can be adjusted rather than merely believed.","description":"Counts syllables rather than words, because word length differs between languages far more than syllable duration does — a German compound and its four-word English equivalent take about the same time to say and would give wildly different word counts. On top of the syllable count come three corrections that a plain rate multiplication misses: digits are counted at the length they are spoken rather than written, since a year is four characters and five syllables; letter-by-letter acronyms are counted the same way; and punctuation adds pause time, with a sentence break worth more than a comma. Four delivery rates are offered from deliberate reading to advertising copy, each with the kind of material it describes and its syllables per second stated, and a free rate can be given instead. The answer carries the syllable count, the pause time, the rate used and the resulting seconds separately, so an estimate that comes out wrong against a real recording can be corrected by changing one number instead of discarding the whole result. A range is returned alongside the point estimate, because no speaker holds a constant rate and a single number pretends to a precision this method does not have. No audio is involved and no speech is generated: this is arithmetic over text, and it is offered for planning a recording session, not for replacing one.","category":"audiowerk","keywords":["text to seconds","script timing estimate","voice over duration","reading time speech","syllable count timing"],"resource":"https://audio.halowerk.com/speech-duration","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","minLength":1,"maxLength":40000,"description":"The text to be spoken."},"language":{"type":"string","enum":["de","en","fr","es","it","nl","pt"],"default":"en","description":"Language of the text. Decides which syllable rules apply."},"delivery":{"type":"string","enum":["slow","narration","conversational","brisk","custom"],"default":"narration","description":"Delivery style. Each carries its own syllables per second."},"syllables_per_second":{"type":"number","minimum":1,"maximum":12,"description":"Own rate, only with delivery=custom."},"sentence_pause_ms":{"type":"integer","minimum":0,"maximum":3000,"default":600,"description":"Pause added at a full stop, question mark or exclamation mark."},"comma_pause_ms":{"type":"integer","minimum":0,"maximum":1500,"default":200,"description":"Pause added at a comma, semicolon, colon or dash."},"paragraph_pause_ms":{"type":"integer","minimum":0,"maximum":5000,"default":900,"description":"Pause added at a blank line."}}},"outputSchema":{"type":"object"},"price":{"amount":"2000","currency":"USDC","decimals":6,"human":"0.002 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_voice_spectrum","name":"audio_voice_spectrum","title":"Measures how the energy of a recording is distributed across six named speech-relevant frequency bands, estimates the fundamental of the voice, and reads the result against the two questions this measurement is usually made for.","description":"Computes the power spectrum from raw samples at 128 logarithmically spaced probe frequencies and sums it into six bands whose boundaries are fixed and stated in every answer: rumble below 80 Hz, the fundamental range to 250 Hz, body to 800 Hz, the second formant range to 2 kHz, the consonant range to 6 kHz, and air above that. Naming the boundaries is not decoration — a bass share quoted without them cannot be compared with anyone else's, and most tools do not say where theirs run. The answer reads the distribution against two practical questions. Whether the recording survives a small speaker is decided by the share below 250 Hz that a phone or laptop speaker simply cannot reproduce, so a voice whose energy sits mostly there arrives thin. Whether it is intelligible is decided by the 2 to 6 kHz band that carries the consonants, and a share too low there is heard as mumbling regardless of how loud the recording is. The fundamental of the voice is estimated over the whole recording and reported with what it does not survive: more than one speaker, and a microphone with a low-frequency roll-off. The spectral cut-off is reported alongside, because it says which lossy stages the file has already passed through and therefore which of the missing air was never there to begin with.","category":"audiowerk","keywords":["voice frequency profile","spectral balance speech","bass treble share audio","eq analysis voice","speech intelligibility band"],"resource":"https://audio.halowerk.com/voice-spectrum","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["audio"],"additionalProperties":false,"properties":{"audio":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."}}},"detail":{"type":"boolean","default":false,"description":"Also return the power at all 128 probe frequencies, for plotting."}}},"outputSchema":{"type":"object"},"price":{"amount":"6000","currency":"USDC","decimals":6,"human":"0.006 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_convert","name":"audio_convert","title":"Converts a recording between FLAC, WAV, MP3, Opus and AAC with control over sample rate, channels and bit depth, and states measurably whether the conversion preserved, lost or merely repackaged the material.","description":"Converts to FLAC, WAV at 16 or 24 bit, MP3, Opus or AAC, with sample rate, channel count and quality all settable and all reported back. What separates this from a bare transcode is the verdict on what the conversion actually did. The spectral cut-off of the source is measured first, so a source that already passed through a lossy stage is recognised before it is wrapped in a lossless container: converting an MP3 to FLAC multiplies the file size by roughly ten and restores nothing, and the answer says so with the measured cut-off as the evidence rather than leaving an archive to fill up in good faith. A conversion that discards information the source carried is named as such, with the specific loss identified — a lossy target, a lower sample rate, a downmix to mono or a reduction in bit depth are four different losses and are reported separately. Loudness is measured before and after, because a lossy encoder shifts true peak upward and a file that measured clean can arrive clipped. Downmixing to mono is offered and flagged, since for a single voice it halves the size at no cost and for anything stereo it is destructive. The result comes back inline as base64; a result above six megabytes is refused with the reason and the size it would have had.","category":"audiowerk","keywords":["convert audio to flac","mp3 to wav","audio transcode","lossless conversion","sample rate conversion"],"resource":"https://audio.halowerk.com/convert","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["audio","target_format"],"additionalProperties":false,"properties":{"audio":{"type":"object","additionalProperties":false,"description":"The recording. Either url or content_base64.","properties":{"url":{"type":"string","maxLength":2048,"description":"Public http(s) URL."},"content_base64":{"type":"string","maxLength":12000000,"description":"The file inline, base64."}}},"target_format":{"type":"string","enum":["flac","wav","wav24","mp3","opus","aac"],"description":"Target format. flac, wav and wav24 are lossless containers; mp3, opus and aac are not."},"sample_rate":{"type":"integer","enum":[8000,16000,22050,24000,32000,44100,48000,96000],"description":"Target sample rate. Left out, the source rate is kept."},"channels":{"type":"integer","enum":[1,2],"description":"Target channel count. Left out, the source layout is kept. Downmixing to mono is irreversible."},"bitrate_kbps":{"type":"integer","minimum":32,"maximum":320,"description":"Bit rate for the lossy targets. Ignored for flac and wav."}}},"outputSchema":{"type":"object"},"price":{"amount":"6000","currency":"USDC","decimals":6,"human":"0.006 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"id":"audiowerk.audio_ad_slot_auction","name":"audio_ad_slot_auction","title":"Runs sealed-bid second-price auctions for audio advertising slots: open a slot with a reserve, take sealed bids, close it and settle at the second-highest price, with bid amounts kept hidden until the close.","description":"Four actions on one endpoint. create opens a slot with its position, length, reserve price and closing time, and returns an admin token that only the opener holds. bid places a sealed bid, checked against the reserve, the slot length and the publisher's excluded categories before it is accepted — a rejected bid is recorded with its reason rather than silently dropped, so a bidder can see why it never competed. close settles the auction and needs the admin token: the highest valid bid wins and pays the second-highest price, or the reserve if it was the only bid. status reads the auction, and before the close it returns the number of bids but never their amounts, to anyone, the publisher included. The second-price rule is the point of the design rather than a detail: under it a bidder's best move is to bid what the slot is genuinely worth to them, so the publisher learns real values instead of guesses about the competition. What this is not is stated in every answer: it is a ledger and a clearing mechanism, it holds no funds, it delivers no audio, and the winner still owes the publisher out of band. Every state change is recorded with a timestamp so an auction can be audited after the fact.","category":"audiowerk","keywords":["audio ad slot auction","sealed bid second price","vickrey auction api","podcast ad bidding","agent advertising market"],"resource":"https://audio.halowerk.com/ad-slot-auction","method":"POST","mimeType":"application/json","inputSchema":{"type":"object","required":["action"],"additionalProperties":false,"properties":{"action":{"type":"string","enum":["create","bid","close","status"],"description":"create opens a slot, bid places a sealed bid, close settles it, status reads it."},"auction_id":{"type":"string","maxLength":64,"description":"Required for bid, close and status."},"admin_token":{"type":"string","maxLength":128,"description":"Required for close. Returned once by create."},"publisher":{"type":"string","maxLength":120,"description":"Name of the publisher offering the slot. create only."},"slot_label":{"type":"string","maxLength":200,"description":"What is being sold, for example \"episode 41, mid-roll 2\". create only."},"position":{"type":"string","enum":["pre_roll","mid_roll","post_roll"],"description":"Where the slot sits in the content. create only."},"slot_seconds":{"type":"integer","minimum":5,"maximum":180,"description":"Length of the slot. create only."},"reserve_usdc":{"type":"number","minimum":0,"maximum":100000,"description":"Price below which the slot is not sold. create only."},"expected_listeners":{"type":"integer","minimum":0,"maximum":100000000,"description":"Reach the publisher claims. Recorded as a claim, not verified. create only."},"excluded_categories":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":40},"description":"Advertiser categories the publisher refuses. create only."},"closes_at_unix":{"type":"integer","minimum":0,"description":"Closing time in Unix seconds. create only. At most 30 days out."},"bidder":{"type":"string","maxLength":120,"description":"Who is bidding. bid only."},"amount_usdc":{"type":"number","minimum":0,"maximum":100000,"description":"Sealed bid amount. bid only."},"category":{"type":"string","maxLength":40,"description":"Advertiser category, checked against the exclusions. bid only."},"creative_seconds":{"type":"integer","minimum":1,"maximum":180,"description":"Length of the advertisement, checked against the slot. bid only."}}},"outputSchema":{"type":"object"},"price":{"amount":"4000","currency":"USDC","decimals":6,"human":"0.004 USDC"},"accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]}],"capability_request":{"url":"https://bedarf.halowerk.com/capabilities/request","method":"POST","cost":"free","description":"Missing a capability, or does the scope not fit? Report the need here - no payment required. Similar reports are bundled; the response returns an id you can check back on.","body_example":{"requested_capability":"short label","description":"what exactly is needed","max_price":0.01}},"updated_at":"2026-08-13T13:36:48.536Z"}