Ondo Configuration
API base URL, credential resolution, and how the node registers itself
Node Config Fields
Every operation on this node accepts the same three top-level fields, plus operation-specific ones:
| Field | Type | Required | Description |
|---|---|---|---|
resource | select | ✓ Yes | One of assets, attestations, chains, limits, status, tickers. Defaults to assets. |
operation | select | ✓ Yes | The operation within that resource, e.g. getPrice. Defaults to getAllPrices. |
credentialID | text | ✓ Yes | Vault reference to a stored Ondo API key. The node resolves this to a Bearer token at execution time — the key itself is never entered directly on the node. |
apiBaseUrl | text | No | Overrides the Ondo API base URL. Defaults to https://api.ondo.finance. Useful for pointing at a sandbox/test environment. |
Missing credential: If
credentialID doesn't resolve to a usable API key,
every call fails fast with AUTH_MISSING_KEY before any HTTP request is made — see
Troubleshooting.
appsettings.json
The API base URL can also be set once for the whole application rather than per-node:
{
"Ondo": {
"ApiBaseUrl": "https://api.ondo.finance"
}
}
AddDependenciesOndoServices(apiBaseUrl) reads this at startup and configures the
underlying HttpClient's BaseAddress accordingly. If omitted, the client
falls back to the production URL above.
HTTP Client Behavior
| Setting | Value |
|---|---|
| Request timeout | 30 seconds per request |
| Rate-limit retry | Up to 3 retries on HTTP 429, exponential backoff (1s, 2s, 4s) |
| Connection pooling | 5-minute handler lifetime (SetHandlerLifetime) |
| Authentication | Authorization: Bearer <apiKey> on every request |
Registration
OndoNodeExecutorDependency.RegisterDefaults(services) registers everything the node needs:
OndoApiClient(typedHttpClient, scoped)- Six per-resource services:
IOndoAssetService,IOndoAttestationService,IOndoChainService,IOndoLimitService,IOndoStatusService,IOndoTickerService - The executor itself, scoped
- The
ExecutorRegistryentry forondo
Host apps must also add an explicit registration call: alongside the standard DI
registration, add
new OndoNodeExecutorDependency().RegisterDefaults(services); to your
node-plugin bootstrap (Plugins_RegisterAllNodes(...) in
ServiceCollectionExtensionsForAI.cs) so the assembly is force-loaded and discoverable
at runtime. Without this line the node type won't appear in the workflow designer even though the
package is referenced.
Project Layout
The node ships as three .NET 9 projects:
| Project | Responsibility |
|---|---|
BizFirst.Integration.Ondo.Domain |
Sealed result records and supporting models (prices, markets, balances, limits, statuses). Zero external dependencies. |
BizFirst.Integration.Ondo.Services |
OndoApiClient (Bearer auth, retry, error mapping) and one service per resource (assets/attestations/chains/limits/status/tickers). |
BizFirst.Ai.ExecutionNodes.Ondo |
The executor: operation routing, config parsing, per-operation validation, operation-info DTOs. |
Error Code Reference
| HTTP Status | Error Code |
|---|---|
| 400 | VALIDATION_ERROR |
| 401 | AUTH_UNAUTHORIZED |
| 403 | AUTH_FORBIDDEN (or MARKET_CLOSED for trading operations) |
| 404 | RESOURCE_NOT_FOUND |
| 429 | RATE_LIMIT_EXCEEDED (retried automatically before surfacing) |
| 5xx | SERVER_ERROR / SERVICE_UNAVAILABLE |