API Reference
Complete endpoint documentation for the NDinomics Bazaar platform.
Authentication
All API calls require a Bearer token obtained during account registration.
Authorization: Bearer <api_key>
Register an Account
Create a new value adder account and receive an API key.
// Request { "email": "you@example.com", "name": "Your Name or Firm", "account_type": "value_adder" } // Response { "account_id": "va_abc123...", "account_type": "value_adder", "api_key": "baz_sk_...", "warning": "Store this API key securely — it will not be shown again." }
| Account Type | Purpose |
|---|---|
user | End user consuming strategies/signals/skills |
value_adder | Publisher of strategies, signals, or skills |
core | NDinomics internal (signal promotion/demotion) |
Strategy API
Strategies are allocation templates — tickers + weights + metadata. They are data, not code. Every strategy runs through the gauntlet before publication.
Submit a Strategy
Submit a new strategy as a private draft.
{
"strategy_id": "conservative-growth-v1",
"name": "Conservative Growth",
"publisher": "va_abc123",
"description": "60/30/10 core allocation for conservative investors",
"allocation": {
"VTI": 0.60,
"BND": 0.30,
"GLD": 0.10
},
"rebalance": {
"trigger": "drift_pct",
"threshold": 10.0,
"cadence": "quarterly"
},
"constraints": {
"min_age": 40,
"min_portfolio": 10000
},
"account_guidance": {
"traditional_ira": "Full allocation suitable",
"roth_ira": "Consider higher equity tilt for younger holders",
"taxable": "BND generates ordinary income — prefer in tax-advantaged"
}
}
Validation rules: weights must sum to 1.0 (tolerance: 0.01), no negative weights, strategy_id / name / publisher required.
Run Gauntlet
Stress-test the strategy and generate a nutrition label.
// Response { "gauntlet_passed": true, "nutrition_label": { "survival_rate": 87.5, "max_drawdown": -18.3, "stress_tests_passed": 5, "stress_tests_total": 6, "sharpe_ratio": 0.82, "volatility_annual": 9.4, "concentration_risk": "low", "liquidity_score": "high" } }
Pass criteria: survival_rate >= 50.0, stress_tests_passed >= 3.
Publish
Publish to marketplace. Requires gauntlet pass.
Other Strategy Endpoints
Retrieve the platform-generated nutrition label.
Strategy metadata. Allocation hidden for non-owners (IP protection).
List strategies. Filter: public | private_draft | all.
Signal API
Signals are external intelligence feeds that can influence Axiom's grading pipeline. Every signal starts in shadow mode for a minimum of 1 quarter.
| Signal Type | Purpose |
|---|---|
sentiment | Directional view (bullish/bearish/neutral + confidence) |
grading | Asset score override or adjustment |
regime | Macro regime classification feed |
enrichment | Supplementary data (alt data, supply chain, etc.) |
Register a Signal Feed
Register a new signal feed in shadow mode.
{
"signal_id": "social-sentiment-tech",
"signal_type": "sentiment",
"description": "Social media sentiment for tech mega-caps",
"asset_coverage": ["AAPL", "MSFT", "GOOGL"],
"update_frequency": "daily",
"schema": {
"score_range": [-1.0, 1.0],
"confidence_range": [0.0, 1.0],
"direction_values": ["up", "down", "neutral"]
}
}
Submit Data Points
Submit single or batch data points.
{
"points": [
{
"ticker": "AAPL",
"score": 0.72,
"confidence": 0.85,
"timestamp": "2026-05-06T14:30:00Z",
"direction": "up",
"metadata": {"source": "twitter", "volume": 12500}
}
]
}
| Field | Required | Description |
|---|---|---|
ticker | Yes | Asset symbol (uppercased) |
score | Yes | Numeric score |
confidence | Yes | 0.0 to 1.0 |
timestamp | Yes | ISO 8601 |
direction | No | up / down / neutral |
metadata | No | Arbitrary metadata dict |
Check Accuracy
Directional accuracy, hit rate, confidence calibration, promotion eligibility.
Signal Lifecycle
Skills API
Skills are sandboxed analysis tools. They take Axiom data as input and produce recommendations. Cannot modify user portfolios — recommendations only. All output labeled as third-party.
| Skill Type | Purpose |
|---|---|
screener | Filter assets based on criteria |
analyzer | Evaluate a portfolio or position |
optimizer | Suggest allocation changes |
Register a Skill
Register a new skill in private draft status.
{
"skill_id": "sector-rotation-analyzer",
"name": "Sector Rotation Analyzer",
"publisher": "va_abc123",
"skill_type": "analyzer",
"input_requires": ["holdings", "sector_grades", "regime"],
"output_schema": {
"type": "recommendations",
"fields": {
"action": "overweight | underweight | hold",
"ticker": "string",
"rationale": "string"
}
},
"skill_code": "def analyze(input_data): ..."
}
| Input Key | Description |
|---|---|
holdings | User's current portfolio positions |
sector_grades | Axiom sector scores |
regime | Current market regime classification |
calibration | Asset calibration data |
tickers | List of tickers to analyze |
Execute a Skill
Execute against user data. Requires explicit user consent.
// Request { "account_id": "user_xyz", "consent_ref": "consent_20260506_user_xyz_sector-rotation", "input_data": { "holdings": {"VTI": 0.40, "QQQ": 0.30, "BND": 0.20, "GLD": 0.10}, "sector_grades": {"technology": "A", "healthcare": "B+"}, "regime": "expansion" }, "timeout_seconds": 30, "memory_limit_mb": 256 } // Response { "execution_id": "exec_a1b2c3...", "status": "completed", "source_label": "third-party", "recommendations": [ { "action": "overweight", "ticker": "XLV", "rationale": "Healthcare grade B+ with momentum divergence", "estimated_impact": {"return_delta": 0.02, "risk_delta": 0.01} } ], "duration_ms": 145 }
Publish a Skill
Run gauntlet validation and publish to marketplace.
Other Skill Endpoints
Skill metadata and registration details.
Retrieve persisted execution results.
List skills. Filter by skill_type and visibility.
Marketplace
Once a strategy, signal, or skill passes the gauntlet and is published:
- Strategies appear with nutrition label; allocation weights hidden (IP protection)
- Signals appear after promotion to active (min 1 quarter shadow)
- Skills appear with execution stats and gauntlet certification
Users subscribe through the Arya interface. Subscriptions grant access to run strategies in simulation, receive signal data in personalized grading, or execute skills against their portfolio (with consent).
Error Codes
| HTTP Code | Meaning | Common Causes |
|---|---|---|
| 400 | Bad Request | Malformed JSON |
| 403 | Forbidden | Wrong account type, gauntlet not passed |
| 404 | Not Found | Invalid ID |
| 409 | Conflict | Duplicate ID |
| 422 | Validation Error | Missing fields, weights don't sum to 1.0 |
// Error response format { "detail": "Strategy must pass gauntlet before publishing." } // Structured errors { "detail": { "errors": [ "Weights sum to 0.9000, must be 1.0", "strategy_id is required" ] } }
Rate Limits
| Resource | Limit | Window |
|---|---|---|
| API calls (general) | 1,000 | per hour |
| Signal data submissions | 10,000 points | per day |
| Gauntlet runs | 10 | per hour |
| Skill executions | 100 | per hour |
| Skill timeout | 30 seconds | per execution |
| Skill memory | 256 MB | per execution |
Rate limit headers are included in responses:
X-RateLimit-Remaining: 847 X-RateLimit-Reset: 1714999200