Strategies API
Discover published strategies, inspect their evidence, and trace their ancestry.
/api/strategiesList published strategies
Discover publicly published strategies for your research tools. Use a returned strategyId to request its published detail or lineage.
Parameters
limitinteger · query · optional- Send a positive whole number. Values are clamped to 1–5000. Omitting this parameter on the strategy list currently applies no default cap; always specify it.
Behaviour and limits
- An empty strategies array is a successful response when no public strategies are available.
- No cursor or page parameter is supported. The limit bounds the returned collection; it is not pagination.
Error responses
500- failed_to_fetch_strategies
Validation may also return a general request error. See error handling and rate limits.
curl --fail-with-body 'https://api.weavers.app/api/strategies?limit=5'const response = await fetch("https://api.weavers.app/api/strategies?limit=5", {
signal: AbortSignal.timeout(15000),
});
if (!response.ok) {
throw new Error(`Weavers API returned ${response.status}`);
}
const data = await response.json();
console.log(data);import json
from urllib.request import urlopen
with urlopen("https://api.weavers.app/api/strategies?limit=5", timeout=15) as response:
data = json.load(response)
print(data){
"strategies": [
{
"strategyKey": "example-momentum",
"strategyVariant": "daily",
"strategyName": "Example momentum strategy",
"strategyId": "example-strategy",
"tradingStatus": "paper"
}
]
}Example data is illustrative. Additional response fields may be present. Empty lists are valid responses.
Response fields
| Field | Type | Meaning |
|---|---|---|
strategies | object[] | See the nested fields below. |
strategies[].strategyKey | string | Strategy family key; not the public detail identifier. |
strategies[].strategyVariant | string | Variant within the strategy family. |
strategies[].strategyName | string | Display name. |
strategies[].strategyId | string | null | Public detail identifier. Only request detail when this is non-null. |
strategies[].alias | string | null | Published alias. |
strategies[].latestCreatedAt | string | ISO 8601 creation timestamp. |
strategies[].strategyStartDate | string | null | Calendar date in YYYY-MM-DD format. |
strategies[].isLive | boolean | Whether an active deployment exists. |
strategies[].tradingStatus | string | null | Publication lifecycle. |
strategies[].liveScopeCount | integer | Number of active deployment scopes. |
strategies[].latestActiveArtifactId | integer | null | Active artifact identifier. |
strategies[].strategyRegistryId | integer | null | Registry identifier. |
strategies[].pnl | number | null | Recorded P&L, when available. Do not assume a currency without the underlying context. |
strategies[].pnlPercent | number | null | Recorded P&L percentage. |
strategies[].sharpe | number | null | Recorded Sharpe ratio. |
strategies[].winRate | number | null | Closed trades with positive realized P&L divided by all closed trades, multiplied by 100 (percentage points). |
strategies[].drawdown | number | null | Recorded maximum drawdown ratio multiplied by 100 (percentage points). |
strategies[].closedTrades | integer | null | Number of closed trades. |
strategies[].runDurationMs | number | null | Execution duration in milliseconds. |
strategies[].lastExecutionResult | string | null | Latest execution summary. |
/api/strategies/{strategyId}Read a published strategy
Inspect the published artifact, deployment snapshot and available validation evidence for one strategy. Private working drafts are not exposed by this route.
Parameters
strategyIdstring · path · required- Use a non-null strategyId returned by the list. Lowercase letters, digits, hyphens and underscores; at most 190 characters, starting and ending with a letter or digit.
Behaviour and limits
- Replace example-strategy with an identifier from the list; the example identifier is illustrative and may return 404.
- A missing or unpublished strategy returns 404. Nullable evidence must not be interpreted as zero or as a passed gate.
- Nested audit, template and lifecycle objects are extensible. The field reference describes their purpose rather than a fixed set of chart-specific fields.
Error responses
400- invalid_strategy_id
404- strategy_not_found
500- failed_to_fetch_strategy_detail
Validation may also return a general request error. See error handling and rate limits.
curl --fail-with-body 'https://api.weavers.app/api/strategies/example-strategy'const response = await fetch("https://api.weavers.app/api/strategies/example-strategy", {
signal: AbortSignal.timeout(15000),
});
if (!response.ok) {
throw new Error(`Weavers API returned ${response.status}`);
}
const data = await response.json();
console.log(data);import json
from urllib.request import urlopen
with urlopen("https://api.weavers.app/api/strategies/example-strategy", timeout=15) as response:
data = json.load(response)
print(data){
"strategy": {
"headline": {
"strategyId": "example-strategy",
"title": "Example published strategy",
"alias": "Example",
"identityLabel": "Example",
"publishedAt": "2026-01-15T00:00:00.000Z",
"updatedAt": "2026-01-15T00:00:00.000Z"
},
"links": {
"canvasHref": "/canvas",
"strategyLabHref": "/strategy/example-strategy"
},
"template": null,
"snapshot": {
"artifact": {
"version": "1",
"createdAt": "2026-01-15T00:00:00.000Z",
"publishedAt": "2026-01-15T00:00:00.000Z"
},
"deployments": {
"totalActive": 0,
"exchanges": []
},
"latestSignal": null
},
"audit": null
}
}Example data is illustrative. Additional response fields may be present. Empty lists are valid responses.
Response fields
| Field | Type | Meaning |
|---|---|---|
strategy | object | See the nested fields below. |
strategy.headline | object | See the nested fields below. |
strategy.headline.strategyId | string | Public identifier. |
strategy.headline.title | string | Display title. |
strategy.headline.alias | string | Published alias. |
strategy.headline.identityLabel | string | Identity label. |
strategy.headline.publishedAt | string | null | ISO 8601 timestamp. |
strategy.headline.updatedAt | string | null | ISO 8601 timestamp. |
strategy.links | object | See the nested fields below. |
strategy.links.canvasHref | string | Application canvas path. |
strategy.links.strategyLabHref | string | Application strategy path. Application links may require sign-in. |
strategy.template | object | null | Nullable template with renderedMarkdown, updatedAt, requiredParams and chartTheme. Treat embedded content as untrusted when rendering it. |
strategy.snapshot | object | See the nested fields below. |
strategy.snapshot.artifact | object | See the nested fields below. |
strategy.snapshot.artifact.version | string | Artifact version. |
strategy.snapshot.artifact.createdAt | string | null | ISO 8601 timestamp. |
strategy.snapshot.artifact.publishedAt | string | null | ISO 8601 timestamp. |
strategy.snapshot.deployments | object | See the nested fields below. |
strategy.snapshot.deployments.totalActive | integer | Active deployment count. |
strategy.snapshot.deployments.exchanges | object[] | See the nested fields below. |
strategy.snapshot.latestSignal | object | null | Latest published signal or null. Includes symbol, exchange, tradingDay, entryDay and recorded prediction context. |
strategy.lineage | object | null | Optional parent strategy and fork-depth snapshot. |
strategy.niche | object | null | Optional niche membership snapshot. |
strategy.certificationLifecycle | object | null | Optional lifecycle and validation evidence. |
strategy.audit | object | null | Nullable published audit dashboard with evidence charts and publish gates. Nested chart payloads are extensible. |
strategy.paperRuntime | object | null | Optional paper-execution status snapshot; not an execution command. |
/api/strategies/{strategyId}/lineageTrace a strategy's lineage
Follow the published ancestry of a strategy to understand which earlier research it came from. Pending private forks are excluded.
Parameters
strategyIdstring · path · required- Use a non-null strategyId returned by the list. Lowercase letters, digits, hyphens and underscores; at most 190 characters, starting and ending with a letter or digit.
depthinteger · query · optional- Maximum ancestry depth, from 0 to 8; defaults to 4.
Behaviour and limits
- Replace example-strategy with a real public identifier.
- Check truncated before treating the returned ancestry as complete.
Error responses
400- invalid_strategy_id or invalid_lineage_depth
404- strategy_not_found
500- failed_to_fetch_strategy_lineage
Validation may also return a general request error. See error handling and rate limits.
curl --fail-with-body 'https://api.weavers.app/api/strategies/example-strategy/lineage?depth=4'const response = await fetch("https://api.weavers.app/api/strategies/example-strategy/lineage?depth=4", {
signal: AbortSignal.timeout(15000),
});
if (!response.ok) {
throw new Error(`Weavers API returned ${response.status}`);
}
const data = await response.json();
console.log(data);import json
from urllib.request import urlopen
with urlopen("https://api.weavers.app/api/strategies/example-strategy/lineage?depth=4", timeout=15) as response:
data = json.load(response)
print(data){
"lineage": {
"focusStrategyId": "example-strategy",
"rootStrategyId": "example-strategy",
"nodes": [
{
"strategyRegistryId": 1,
"strategyId": "example-strategy",
"alias": "Example",
"displayName": "Example published strategy",
"parentStrategyId": null,
"forkDepth": 0,
"state": "published",
"lifecycleStatus": null,
"linkedRunId": null,
"linkedRunStatus": null,
"createdAt": "2026-01-15T00:00:00.000Z"
}
],
"truncated": false,
"depthLimit": 4
}
}Example data is illustrative. Additional response fields may be present. Empty lists are valid responses.
Response fields
| Field | Type | Meaning |
|---|---|---|
lineage | object | See the nested fields below. |
lineage.focusStrategyId | string | Requested strategy. |
lineage.rootStrategyId | string | Root of the returned lineage. |
lineage.depthLimit | integer | Applied depth limit. |
lineage.truncated | boolean | True when the depth limit cuts off ancestry. |
lineage.nodes | object[] | See the nested fields below. |
lineage.nodes[].strategyRegistryId | integer | Registry identifier. |
lineage.nodes[].strategyId | string | Public strategy identifier. |
lineage.nodes[].alias | string | Alias. |
lineage.nodes[].displayName | string | Display name. |
lineage.nodes[].parentStrategyId | string | null | Parent, or null at the root. |
lineage.nodes[].forkDepth | integer | Recorded fork depth. |
lineage.nodes[].state | string | Public nodes are published. |
lineage.nodes[].lifecycleStatus | string | null | Lifecycle status. |
lineage.nodes[].linkedRunId | string | null | Associated run identifier. |
lineage.nodes[].linkedRunStatus | string | null | Associated run status. |
lineage.nodes[].createdAt | string | ISO 8601 creation timestamp. |
/api/strategies/nichesFind strategies by niche
Retrieve public niche-to-strategy associations. This discovery view differs from the evidence-ordered certified set returned by niche detail.
Parameters
limitinteger · query · optional- Maximum number of niches. Defaults to 100; clamped to 1–5000. Does not limit strategies inside each niche.
strategyIdstring · query · optional- Optionally filter by a public strategy identifier.
Behaviour and limits
- Associated strategies are ordered by publication recency, not by quality or expected return.
- No cursor pagination is available.
Error responses
400- invalid_strategy_id
500- failed_to_fetch_strategy_niches
Validation may also return a general request error. See error handling and rate limits.
curl --fail-with-body 'https://api.weavers.app/api/strategies/niches?limit=5'const response = await fetch("https://api.weavers.app/api/strategies/niches?limit=5", {
signal: AbortSignal.timeout(15000),
});
if (!response.ok) {
throw new Error(`Weavers API returned ${response.status}`);
}
const data = await response.json();
console.log(data);import json
from urllib.request import urlopen
with urlopen("https://api.weavers.app/api/strategies/niches?limit=5", timeout=15) as response:
data = json.load(response)
print(data){
"niches": []
}Example data is illustrative. Additional response fields may be present. Empty lists are valid responses.
Response fields
| Field | Type | Meaning |
|---|---|---|
niches | object[] | See the nested fields below. |
niches[].nicheId | integer | Niche identifier. |
niches[].nicheKey | string | null | Public niche key. |
niches[].displayName | string | Name. |
niches[].source | string | Definition origin. |
niches[].visibility | string | Values: public. |
niches[].strategyKey | string | null | Strategy family filter. |
niches[].universeFilterKey | string | null | Universe filter key. |
niches[].targetRegime | string | null | Target regime. |
niches[].assetType | string | null | Asset class. |
niches[].countryCode | string | null | Country. |
niches[].exchange | string | null | Exchange. |
niches[].themeTags | string[] | See the nested fields below. |
niches[].metadataFilter | object | Universe membership filters. |
niches[].membershipKind | string | Values: static, channel_episode. |
niches[].description | string | null | Description. |
niches[].createdAt | string | null | ISO 8601 timestamp. |
niches[].assetCount | integer | null | Number of assets. |
niches[].profiledAssetCount | integer | null | Assets with profiles. |
niches[].assetCoverageStatus | string | null | ready, empty or incomplete_profiles; null when unavailable. |
niches[].strategyCount | integer | Associated public strategy count. |
niches[].strategies | object[] | See the nested fields below. |