Coordination
Structural coordination detection — who copies whom, which wallets cluster into the same funding or execution family, and which tokens are being pushed by coordinated groups right now.
Conyr models coordination as five primitives:
| Primitive | Question it answers |
|---|---|
| Follows | Does wallet B systematically copy wallet A’s trades? |
| Entities | Which wallets share enough funding or execution evidence to belong to the same family? |
| Campaigns | Is this token being pushed by a coordinated group right now? |
| Crowd | How loud is the crowd on this token, minute by minute? |
| Health | Is the live signal pipeline keeping up? |
Layer 3 only — Security Intelligence.
The degraded flag. The follows, entity, entity-detail, entity-members, and campaigns responses may carry "degraded": true when the live signal pipeline is lagging. Render the data faintly or surface a “signal delayed” note — do not hide it. The crowd response does not include a degraded field — use /v1/coordination/health to gauge crowd freshness.
Follows
GET /v1/wallet/{address}/follows
Wallets this address follows (followsOut) and wallets that follow this address (followsIn). Conyr only surfaces edges that pass internal calibration gates for confidence, support count, and distinct-token diversity.
Parameters
| Parameter | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
address | path | string | yes | — | Solana wallet address |
limit | query | integer | no | 50 | Max 200 — number of edges returned per direction (followsOut / followsIn) |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/wallet/7xKXtg.../follows"Response
{
"address": "7xKXtg...",
"followsOut": [
{
"leaderWallet": "4mNqR...",
"followerWallet": "7xKXtg...",
"confidence": 0.91,
"supportCount": 18,
"distinctTokens": 7,
"lastMatchTsMs": 1709654400000,
"active": true,
"degraded": false
}
],
"followsIn": [],
"degraded": false
}| Field | Description |
|---|---|
confidence | Calibrated 0–1 score for the follow relationship |
supportCount | Number of independent observations backing the edge |
distinctTokens | Number of distinct tokens the pattern was observed on |
active | Whether the edge is currently being reinforced by recent activity |
Cache TTL: 30 seconds.
Entities
An entity is a cluster of wallets that share funding lineage, bundle execution evidence, or both.
Entity kinds
| Value | Meaning |
|---|---|
shared_funder | Members were funded from a common direct or root funder |
shared_execution | Members co-executed bundle transactions in the same slots |
GET /v1/wallet/{address}/entity
Returns the entity (if any) this wallet belongs to.
Response
{
"address": "7xKXtg...",
"membership": {
"walletAddress": "7xKXtg...",
"entityId": "ent_abc123",
"entityKind": "shared_funder",
"rootWallet": "9aBcD...",
"memberCount": 14,
"confidence": 0.87,
"lastSeenTsMs": 1709654400000,
"degraded": false
},
"siblingsSample": ["4mNqR...", "2pQrS...", "8tVuW..."],
"degraded": false
}siblingsSample is a small sample of co-members for quick UI hydration. For the full member list use the entity-detail endpoints below. membership is null if this wallet doesn’t currently belong to a tracked entity.
Cache TTL: 60 seconds.
GET /v1/entity/{entity_id}
Full entity record with embedded member sample.
{
"entityId": "ent_abc123",
"entityKind": "shared_funder",
"rootWallet": "9aBcD...",
"memberCount": 14,
"confidence": 0.87,
"firstSeenTsMs": 1709500000000,
"lastSeenTsMs": 1709654400000,
"degraded": false,
"members": [
{ "walletAddress": "4mNqR...", "confidence": 0.92, "lastSeenTsMs": 1709654400000 }
]
}Cache TTL: 60 seconds.
GET /v1/entity/{entity_id}/members
Paginated full member list.
Parameters
| Parameter | In | Type | Required | Default | Constraints |
|---|---|---|---|---|---|
entity_id | path | string | yes | — | — |
page | query | integer | no | 0 | — |
page_size | query | integer | no | 100 | Max 500 |
Response
{
"entityId": "ent_abc123",
"page": 0,
"pageSize": 100,
"total": 14,
"members": [
{ "walletAddress": "4mNqR...", "confidence": 0.92, "lastSeenTsMs": 1709654400000 }
],
"degraded": false
}Cache TTL: 60 seconds.
Campaigns
A campaign is a time-bounded coordinated push on a token — multiple wallets and entities buying in lockstep.
Campaign status
status is not a closed enum of just active/closed. Campaigns are bucketed by their lowercased status: any of active, open, forming, escalating, or escalated lands the campaign in active[]; every other value (e.g. closed, finalized) lands it in recent[].
| Bucket | Statuses | Meaning |
|---|---|---|
active[] | active, open, forming, escalating, escalated | Campaign is currently live or building on the token |
recent[] | closed, finalized (any other status) | Campaign has cooled off and been finalized |
GET /v1/token/{mint}/campaigns
{
"mint": "EPjFWd...",
"active": [
{
"tokenMint": "EPjFWd...",
"campaignId": "camp_xyz789",
"status": "active",
"startedTsMs": 1709654000000,
"lastSeenTsMs": 1709654400000,
"participantWallets": 18,
"participantEntities": 3,
"confidence": 0.83,
"degraded": false
}
],
"recent": [],
"degraded": false
}active contains campaigns currently in progress on the token; recent contains recently-closed campaigns for context.
Cache TTL: 15 seconds.
Crowd
Per-minute crowd state for a token — total trades, unique wallet count, score, and a regime label.
Crowd regime
| Value | Meaning |
|---|---|
quiet | Baseline activity, no crowd pattern detected |
trending_crowd | Sustained elevated participation |
crowded_launch | Crowd pattern around a launch window |
GET /v1/token/{mint}/crowd
{
"mint": "EPjFWd...",
"current": {
"bucketStartMs": 1709654400000,
"totalTrades": 142,
"uniqueWallets": 87,
"crowded": true,
"crowdScore": 0.78,
"crowdRegime": "trending_crowd"
},
"minutes": [
{
"bucketStartMs": 1709654340000,
"totalTrades": 98,
"uniqueWallets": 64,
"crowded": false,
"crowdScore": 0.42,
"crowdRegime": "quiet"
}
]
}crowdScore is calibrated 0–1; crowded is the boolean Conyr uses to drive the regime transition.
Cache TTL: 15 seconds.
Coordination Health
GET /v1/coordination/health
Runtime snapshot of the coordination pipeline’s freshness. Use this to decide whether to render “signal delayed” banners across coordination surfaces.
{
"healthy": true,
"degradedWindowMs": 0,
"droppedMessagesLastMinute": 0,
"observedAtMs": 1709654400000
}Cache TTL: 30 seconds.
WebSocket Streams
Coordination primitives also stream live. See WebSockets.
| Channel | Fires when |
|---|---|
wallet:{address}:follow | A follow edge involving the address activates, updates, or expires |
wallet:{address}:entity | The address’s entity membership changes |
token:{mint}:campaign | A campaign on the mint activates, updates, or closes |
If subjects appear silent, fall back to the REST endpoints above and check /v1/coordination/health.