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

POST /accounts/v1/register

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 TypePurpose
userEnd user consuming strategies/signals/skills
value_adderPublisher of strategies, signals, or skills
coreNDinomics 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

POST /strategies/v1/submit

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

POST /strategies/v1/{strategy_id}/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

POST /strategies/v1/{strategy_id}/publish

Publish to marketplace. Requires gauntlet pass.

Other Strategy Endpoints

GET /strategies/v1/{strategy_id}/nutrition-label

Retrieve the platform-generated nutrition label.

GET /strategies/v1/{strategy_id}

Strategy metadata. Allocation hidden for non-owners (IP protection).

GET /strategies/v1/?visibility=public

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 TypePurpose
sentimentDirectional view (bullish/bearish/neutral + confidence)
gradingAsset score override or adjustment
regimeMacro regime classification feed
enrichmentSupplementary data (alt data, supply chain, etc.)

Register a Signal Feed

POST /signals/v1/register

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

POST /signals/v1/{signal_id}/submit

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}
    }
  ]
}
FieldRequiredDescription
tickerYesAsset symbol (uppercased)
scoreYesNumeric score
confidenceYes0.0 to 1.0
timestampYesISO 8601
directionNoup / down / neutral
metadataNoArbitrary metadata dict

Check Accuracy

GET /signals/v1/{signal_id}/accuracy

Directional accuracy, hit rate, confidence calibration, promotion eligibility.

Signal Lifecycle

shadow ---(1 quarter + accuracy review)---> active ---(degradation)---> demoted

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 TypePurpose
screenerFilter assets based on criteria
analyzerEvaluate a portfolio or position
optimizerSuggest allocation changes

Register a Skill

POST /skills/v1/register

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 KeyDescription
holdingsUser's current portfolio positions
sector_gradesAxiom sector scores
regimeCurrent market regime classification
calibrationAsset calibration data
tickersList of tickers to analyze

Execute a Skill

POST /skills/v1/{skill_id}/execute

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

POST /skills/v1/{skill_id}/publish

Run gauntlet validation and publish to marketplace.

Other Skill Endpoints

GET /skills/v1/{skill_id}

Skill metadata and registration details.

GET /skills/v1/{skill_id}/results/{execution_id}

Retrieve persisted execution results.

GET /skills/v1/?skill_type=analyzer&visibility=public

List skills. Filter by skill_type and visibility.

Marketplace

Once a strategy, signal, or skill passes the gauntlet and is published:

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 CodeMeaningCommon Causes
400Bad RequestMalformed JSON
403ForbiddenWrong account type, gauntlet not passed
404Not FoundInvalid ID
409ConflictDuplicate ID
422Validation ErrorMissing 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

ResourceLimitWindow
API calls (general)1,000per hour
Signal data submissions10,000 pointsper day
Gauntlet runs10per hour
Skill executions100per hour
Skill timeout30 secondsper execution
Skill memory256 MBper execution

Rate limit headers are included in responses:

X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1714999200