The Soul Company, Inc.Book a demo
the sandbox

Try it end to end.

Install it, render it, and watch the engine work on real signal. Nothing here is a mockup.

01 · install

One embed, or one command.

paste this
<div id="soul"></div>
<script src="https://www.soulverified.com/sdk.js"></script>
<script>
  Soul.init({
    partner: 'YOUR_SLUG',
    key: 'YOUR_KEY',
    user: currentUser.id,
    city: 'New York',
    accent: '#7fd0c0'
  });

  Soul.Community({ el: '#soul' });
</script>
or scaffold the whole thing
curl -fsSL https://www.soulverified.com/install | sh

Detects your framework, writes the component, the env file and the README, and gitignores your key.

or hand it to your coding agent
set up https://www.soulverified.com/SKILL.md

Paste that into Claude Code, Cursor or any agent. It reads the full API, the data rules and an integration checklist, then wires it up. Nothing in that file needs a key.

02 · try it

Every method, running on this page.

This page loads the same sdk.js you install and calls the same endpoints your app would. Pick a brand to reskin it, run any method, and read the exact request and response. RSVP inside the tab and watch your own callback fire.

loading sdk.js
Oura
run itlive against production
// pick a method. the real request and the real response land here.
your callbacksSoul.on('rsvp', fn)
nothing yet. rsvp inside the tab on the left and it fires here.

03 · everything it does

One script tag. The whole community layer.

Render it, overlay it, or take the JSON and build your own. Nothing here is a paid tier.

Soul.Community({ el })
The full tab, inline.
Renders the community in your brand, in any element you give it. Sizes itself to its content and to whatever width you hand it.
Soul.open() / .close()
The same tab, as an overlay.
For products with no room in the layout. Closes on Escape and on a backdrop click, so it can never trap a user.
Soul.badge({ el })
A live count for your nav.
Renders "3 gatherings near you" from real data, and says nothing at all when there is nothing on rather than inventing a number.
Soul.events()
The board as JSON.
The same engine and the same ranking as the rendered tab, headless, so you can build the entire thing yourself. Each gathering carries why it surfaced for that member.
Soul.rsvp(id, going)
Commit without our UI.
One call. Returns the live going count so your own interface can update.
Soul.identify(user, { tags })
Send your own signal.
For signal that has no OAuth: Canva knows a user makes event posters, Calm knows they meditate at six. Tags are namespaced to you and never collide with a connector.
Soul.connect(source)
The real consent screen.
Opens the platform’s own OAuth for Oura, Strava, Whoop, Spotify and the rest. Their account, their consent, their scopes.
Soul.host({ title, when, where })
Host your own, or a collab.
Your company programs its own gathering in one call. Pass collab: ['notion'] and the room is two communities at once, which only works because Soul sits across all of them.
Soul.on(event, fn)
Know what your users did.
ready, join, rsvp, connect, open, close. Fires for the rendered tab as well as for headless calls, so you never poll us.

04 · where these actually happen

Nothing is booked. Nobody is billed for the room.

A run club at the waterfront. Coffee where everyone buys their own. A reading hour in a bookstore. There is no venue to sign, so your users have somewhere to be the week you install this.

where
Free, public, walk-in places.
Parks, waterfront paths, coffee shops, bookstores, record shops, markets, public courts. Somewhere a stranger can find and simply turn up to.
what is booked
Nothing. That is the point.
No reservation, no deposit, no guest list, no deal with an owner, nothing held under anyone’s name. Which is why your users in a city we have never touched have somewhere to be this week.
who pays
Each person, for their own.
Their own coffee, their own ticket. Never a shared bill, never a minimum spend, and never a charge to attend.

05 · whose gathering is it

Five kinds, and who sees each.

Anything Soul programs is open by default, because a room needs people in it. Anything you make is private by default, because your name is on it. That is the whole rule.

Everyone
Soul gatherings
Programmed by the agent from what your users are into. Shared across the network, which is why a room fills in a city you just launched in. Most of the board.
Your users only
Your own
You host it, we run it. It appears on your users’ board and nobody else’s, so a gathering with your name on it never fills with somebody else’s community.
Both communities
Collabs
Name another company on Soul and both sets of users are in the room. Notion x Canva. One call, and it is the one thing an in-house team structurally cannot build.
Everyone, branded to you
Takeovers
Take over a Soul gathering that is already filling. The room stays open, the card carries your line. The cheapest way to be in front of the whole network.
Everyone sees, not everyone gets in
Soul exclusives
Capped, invitation decided by the network rather than by a form. Run by us. The thing people talk about afterwards.

05 · every company, at once

One network. A different front door for each.

All of these are live and running right now, each in that company’s own skin. Join one, RSVP in it, and it persists.

Ouramatched to your rhythm
Lightyour offline circle
Whooppeople who push like you
Spotifymatched on your artists
Stravamatched on your pace

06 · the engine

Watch it match, and check our arithmetic.

step 1 · the signal

Switch on what your app already knows.

Your users connect a source, or you send the signal server-side. Soul stores the derived tags, never the raw data.

loading sources…

what Soul derives

Switch on a source.

step 2 · the matching

The people they would click with.

Switch on a source to run the engine.

No matches yet.

07 · the ai, and your users’ data

No black box, and nothing trained on your users.

what goes in
One user id, and only the scopes they approve.
You send your own user id, never an email or a name. Everything else arrives because a user tapped Connect on their own account and consented to specific scopes.
what we keep
Derived tags, not raw records.
Each connector reduces a source to coarse, namespaced affinities: strava:long-run, oura:early-riser, reddit:coffee. We store those. We do not retain raw health records, GPS routes, listening history, or financial data.
how it matches
Deterministic set similarity, not a black box.
Two members are scored by 0.5 x Jaccard + 0.5 x min-set overlap on their affinity tags. The second term rewards niche agreement, so sharing three rare tags beats sharing three common ones. Every match can be explained by the tags behind it, which is why the console shows the arithmetic.
is anything trained on user data
No. Nothing is trained on members.
The matching engine is arithmetic, not a learned model, so there is no training set and no weights derived from anyone. A language model is used for one job only: writing and scheduling the gatherings a cluster implies. It never sees raw source data.
what gets better over time
The graph, not a model.
Attendance is the feedback loop. Who actually showed up tunes which clusters become events and which rooms get used. The engine stays swappable: the similarity function can be replaced with cosine over learned embeddings without changing a single caller.
what never happens
No feed, no ads, no resale.
Nothing is posted on a user’s behalf. No personal data is sold or shared for advertising. Partners and brands see aggregated, de-identified insight only. A user can disconnect a source and its signal is deleted.

Ready to give your users each other?

Book a demo →
© 2026 The Soul Company, Inc.
PricingThe moatPrivacyTermsCareersBook a demo