What it is
A single <script> tag that mounts a Kalinklo-styled "Request a hold" button on your own site. The button opens the artist's request page on kalinklo.com in a new tab; the visitor finishes the request there and the hold lands in the artist's (or their agent's) Kalinklo inbox.
No API key. No build step. No iframe. The whole widget is ~2 KB of vanilla JavaScript.
Embed snippet
Drop one host element per artist, then load the script once anywhere on the page:
<div data-kalinklo-artist-slug="elsa-laurent"></div>
<script src="https://kalinklo.com/widget/request-hold.js" defer></script>
The script scans the page on load (and again when the DOM changes, for SPA hosts) and mounts a button inside every element with data-kalinklo-artist-slug. You can include the script once and use as many host elements as you like.
Styling
The button ships with an inline italic serif style in the Kalinklo oxblood (#7a1f1f) so it reads as a deliberate handoff rather than a third-party ad. If you want to restyle, target the rendered <a> element from your own stylesheet:
[data-kalinklo-artist-slug] > a {
/* override at will */
}
Below the button the widget prints "Powered by Kalinklo Artists" — small, italic, muted grey. Please leave it in; it's how a visiting presenter knows the request rail is real.
Where the request lands
Clicking the button opens https://kalinklo.com/request-hold/<slug> in a new tab. The visitor fills out the standard request form (date, venue, programme, fee range, contact). The resulting BookingRequest is routed through the same territory routing as a marketplace request — if the artist has an active agent on file, the request lands in the agent's inbox; otherwise it goes to the artist directly.
SPA hosts
The widget installs a MutationObserver on document.documentElement, so newly inserted host elements get mounted automatically. You don't need to call anything from your own router.
Caching and privacy
The script is served with Cache-Control: public, max-age=300, s-maxage=3600 and Access-Control-Allow-Origin: *. It does not set cookies on the host page, does not call analytics, and does not phone home. Loading the script is functionally equivalent to placing a hand-written link.
Versioning
The file at /widget/request-hold.js is the stable URL. Breaking changes will ship under a new path (e.g. /widget/request-hold-v2.js); the original keeps working unchanged. Watch the status page for deprecation notices.