A job change feed your stack can consume
Every time someone in your contact list moves, Champions emits a structured event: who moved, where from, where to, their best known email at the new company, whether that company and role fit your ICP, and when we caught it. Take it as a signed webhook, poll it on a timestamp, or let us write it back for you.
What every move tells you
A useful event is more than "someone moved". If your automation has to make a second call to work out who this person is or who should get the alert, the event is doing half its job. So each one arrives already matched to your record and already attributed to an owner.
person object The contact who moved — first_name, last_name and linkedin_url — already matched to the record you track, not a fresh identity you have to reconcile.
old_company, old_title string What they left. This is also your churn signal: when the move is out of a customer account, Champions raises a second churn_risk play against it.
new_company, new_title string Where they landed. The title is what decides whether this is the same buyer you already sold to or a new seat at a bigger table.
email, email_status string The best known email for the person at the new company, with its verification state, so outreach does not bounce on a guessed address pattern.
account_fit, contact_fit boolean The new company and the new role scored against your own ICP rules before the event is sent. Both true is a direct play; account only is a referral.
type, segment enum What to do and who this was to you: direct, referral, watch, promotion or churn_risk, against customer, churned, closed_lost or open_pipeline.
owner, owner_id, crm_record_id string The rep who held the relationship and the CRM ids behind them, so the alert routes itself to the right person without a second lookup.
detected_at timestamp When Champions detected the move. The first days are where the warmth is, so this is the field your SLAs and reporting should key on.
Examples you can build against
Base URL https://api.getchampions.io/v1. The full reference lives at docs.getchampions.io, and the OpenAPI 3.1 document is published if you would rather generate a client than read one.
Push, pull, or both
Polling tells you a contact moved eventually. A webhook tells you the moment it happens. Most teams run push as the live path and a nightly poll as the safety net, which is the pattern we walk through in job change webhooks.
Scoped keys, signed deliveries
The feed runs against your own contacts, so credentials are scoped to your workspace rather than handed out at public self-signup. You call us with a bearer token over HTTPS. We call you with a signature you can verify, because a webhook endpoint is a public endpoint and nothing else should be able to post moves into your pipeline.
Verify a delivery by recomputing HMAC-SHA256 over the timestamp, a dot, and the raw body, keyed with the endpoint secret we return once at creation. Compare in constant time and reject anything over five minutes old.
- Bearer token or
X-API-Keyover HTTPS, created in your workspace settings readscope for every GET,writefor anything that changes state- OAuth 2.1 with PKCE for agents, plus a hosted MCP server
- 600 read and 120 write requests a minute — see the FAQ
Skip the receiver entirely
You do not have to consume the feed to use it. Champions writes each play back to HubSpot and routes alerts into Slack — a channel for the team, a DM to the rep who owns the record — so the warm lead is waiting before anyone opens a laptop. You choose whether a push creates a new contact or updates the existing one, and which play types are worth pushing at all.
That is the managed path, and it is how most customers run: no app to install, no logins for reps. The platform page covers it, and how it works walks the monitoring end to end.
- HubSpot write-back: create a new contact or update the existing one
- Filter by play type, so only what you act on reaches the CRM
- Departures raise a churn_risk play for CS the day they are detected
Developer questions
Where is the full API reference?
The reference is at docs.getchampions.io and the machine-readable contract is the OpenAPI 3.1 document at api.getchampions.io/openapi.json, which you can point a client generator straight at. The base URL is https://api.getchampions.io/v1, and the same API is served at https://app.getchampions.io/api/v1. The samples on this page are generated from that spec, not sketched by hand.
How do I get API access?
Workspaces are invite-only rather than public self-signup, because the feed runs against your own contacts and credentials are scoped to that data. Once you have a workspace you create a key yourself under Settings, API and integrations, and send it as a bearer token. Book a demo or email [email protected] to get started.
Should I use webhooks or polling?
Use webhooks as the default, because a job change is most valuable in its first days and push removes the lag. Use GET /v1/changes with a since timestamp for backfills and as a reconciliation job alongside webhooks, so a delivery you missed during a deploy still lands. The webhook data object carries the same shape the REST endpoints return.
What are the rate limits?
Six hundred read and 120 write requests a minute, per workspace. Over the limit you get a 429 with code rate_limited. That is generous against the real volume: 2 to 3% of B2B contacts change jobs each month, so a 10,000-contact CRM produces roughly 200 to 300 events a month, not a firehose.
How do I verify a webhook delivery?
Every delivery carries X-Champions-Signature in the form t=<unix seconds>,v1=<signature>, where the signature is an HMAC-SHA256 of the timestamp, a dot, and the raw request body, keyed with the endpoint secret returned once when you create the endpoint. Recompute it over the raw body before parsing, compare in constant time, and reject anything older than five minutes.
Do I need the API if Champions already writes to my CRM?
No, and most teams never touch it. Champions can write each play back to HubSpot and route alerts into Slack channels and owner DMs with no app to install and no logins for reps. Reach for the API when you want the signal somewhere that is not the CRM: a data warehouse, a lead router, a scoring model, an internal app, or an AI agent through the hosted MCP server.
Can I send Champions my own contact list instead of connecting a CRM?
Yes. POST /v1/contacts takes up to 1,000 people a call and deduplicates on CRM id, then LinkedIn URL, then email, then name and company. Anyone with a LinkedIn URL starts tracking immediately. Teams usually start with closed-won contacts, power users and promoters rather than every name in the table, because those are the relationships that convert when they move.