Kalshi vs Polymarket for Developers: Preserve IDs, Fix Parsing

Kalshi vs Polymarket for Developers: Preserve IDs, Fix Parsing

Kalshi vs Polymarket for Developers: Preserve IDs, Fix Parsing

Developer-focused comparison of Kalshi and Polymarket data: wallet signing vs API keys, stringified JSON pitfalls, and a preserve-first normalization pattern.

Kalshi vs Polymarket for Developers: Preserve IDs, Fix Parsing

The single fact that determines your integration path is settlement custody: Polymarket clears trades on-chain through Polygon, giving you wallet-level auditability, while Kalshi clears through a CFTC-regulated centralized exchange, giving you cleaner fiat and tax metadata but no public ledger. That split cascades into everything else, identifiers, auth, latency, and reconciliation logic. If you’re building for analytics or cross-venue research, normalize both feeds into one schema. If you’re building for execution, connect to each venue’s native order-placement layer directly and skip the abstraction.

TL;DR:

  • Settlement custody determines the data architecture: Polymarket offers on-chain transparency with public ledger records, while Kalshi provides centralized custody with automated tax data.

  • Data identifiers differ: Kalshi uses human-readable nested IDs, whereas Polymarket employs long hex or numeric strings that require careful mapping during integration.

  • Parsing and schema normalization are crucial: maintain raw payloads, convert prices to probabilities, and preserve native IDs to ensure accurate cross-venue analysis and backtesting.

  • Order placement varies: Polymarket relies on wallet signatures with gas management, while Kalshi uses API keys with RSA signatures, affecting client development and capital flow timing.

  • Regular schema updates and raw payload logging are essential to avoid silent failures and reduce ongoing maintenance costs.

Table of Contents

  • Kalshi vs Polymarket Data: The Architecture That Drives Everything

  • Mapping Endpoints, IDs, and Payload Shapes

  • Auth and Order Placement: Wallets vs API Keys

  • What These Differences Mean for Your Trading Bot or Model

  • Building a Cross-Venue Normalization Layer

  • The Checklist for Your First Integration Sprint

  • Why Most Teams Underestimate the Maintenance Cost

  • Skip the Two-Client Problem With a Canonical Feed

  • Selected Research and Docs

  • Sources

  • FAQ

Kalshi vs Polymarket Data: The Architecture That Drives Everything

Settlement custody is the root variable. Everything downstream, schema shape, identifier format, latency profile, reconciliation burden, traces back to whether a venue clears on-chain or through a regulated clearinghouse.

Polymarket settles trades on Polygon, which means every fill, redemption, and position transfer is a public on-chain event. You can reconstruct a wallet’s entire trading history, including PnL, without ever calling an authenticated endpoint, because the ledger itself is the audit trail. That’s a meaningful advantage if you’re building wallet-tracking tools or smart-money monitors.

Kalshi settles through a centralized, CFTC-regulated exchange. There’s no public ledger to scrape, but you get custodial USD balances, settled cash flows, and automated tax documentation that Polymarket simply doesn’t generate. Kalshi also carries broader coverage of political and economic indicator markets, while Polymarket has historically offered wider global market breadth with deeper transparency on crypto and sports categories.

Both venues use central limit order book (CLOB) mechanics at the market level, so the trading logic looks familiar. Where they diverge is in the details that matter for data engineering:

  • Resolution sources differ: Kalshi relies on named data providers tied to regulated benchmarks; Polymarket resolution depends on decentralized oracle mechanisms and community dispute processes.

  • Overround behavior varies by liquidity depth and market age, and you’ll need separate calibration per venue rather than a shared model.

  • Fee structures attach differently to the settlement layer, custodial fees on Kalshi versus gas and protocol fees on Polymarket.

Mapping Endpoints, IDs, and Payload Shapes

Once you start pulling data, the identifier mismatch is the first thing that breaks a naive integration. Kalshi and Polymarket don’t just use different field names, they use fundamentally different addressing schemes for the same concept: a market.

Kalshi nests markets under a series → event → market hierarchy with human-readable tickers, so a market ID looks like something you could read aloud. Polymarket instead identifies markets by condition_id and individual outcomes by token_id, both long hex or numeric strings with no semantic meaning on their own.

The catalog split matters too. Polymarket splits its API surface between Gamma, which handles market discovery and metadata, and CLOB, which handles order book and trade data, and some payloads arrive as stringified JSON arrays that need to be decoded twice before you can use them. Kalshi keeps discovery and trading data under one REST surface, which simplifies the catalog layer but still requires careful handling of its _dollars fields, which arrive as 0 to 1 strings representing implied probability rather than raw decimals.

Here’s the practical sequence for building an ingestion pipeline against either venue:

  1. Pull the catalog endpoint first to resolve series/tickers (Kalshi) or condition IDs and token IDs (Polymarket).

  2. Cast all price fields from string to float before any arithmetic, both venues serialize prices as strings, not numbers.

  3. For Polymarket, run json.loads() on any field that looks like an escaped array before parsing it as JSON.

  4. Pull full-depth orderbook or midpoint endpoints depending on whether you need execution-grade or reference-grade pricing.

  5. For historical backfill, check whether the endpoint requires authentication, Kalshi generally opens more historical OHLC data to public reads than Polymarket does.

Pro Tip: Write a single “cast and validate” function per venue that runs immediately after the HTTP response lands, before any business logic touches the payload. Catching a malformed stringified array at the parser boundary is far cheaper than debugging a corrupted backtest three weeks later.

Auth and Order Placement: Wallets vs API Keys

Placing an order on Polymarket means signing an EIP-712 typed message with a wallet’s private key, then submitting it through the CLOB’s Layer 2 relay, which requires you to manage gas considerations and nonce sequencing even though the relay itself is gasless for the trader. Kalshi order placement uses API key authentication with RSA-signed requests, and enterprise users can access a FIX gateway for lower-latency execution, a pattern borrowed directly from traditional finance infrastructure.

That split changes what your client code looks like on day one:

  • Polymarket clients need wallet management, signing libraries, and nonce tracking baked into the execution path.

  • Kalshi clients need credential rotation and RSA key management, closer to what you’d build for a traditional brokerage API.

  • Rate limits and pagination styles differ enough that your polling or WebSocket reconnection logic can’t be shared code between venues without an abstraction layer.

  • Withdrawal timing diverges sharply: Polymarket settlement is near-instant on-chain once a market resolves, while Kalshi’s custodial withdrawal and settlement windows follow traditional exchange clearing timelines.

That withdrawal gap directly affects capital efficiency if you’re running strategies across both venues simultaneously, money tied up in Kalshi’s settlement window isn’t available for a Polymarket opportunity that closes faster.

Pro Tip: Build your reconciliation job to run on a fixed UTC schedule rather than triggering on settlement events. Kalshi and Polymarket resolve markets on different clocks, and event-triggered reconciliation tends to silently miss the venue that settles slower.

What These Differences Mean for Your Trading Bot or Model

The architecture gap isn’t academic, it directly shapes what you can build and how reliable the output will be.

  • Cross-venue arbitrage: You need pre-funded positions on both sides because Polymarket settles near-instantly while Kalshi’s clearing introduces basis risk during the reconciliation window.

  • Smart-money tracking: Polymarket’s on-chain wallets let you trace individual actors with precision. Kalshi’s custodial model hides account-level activity, so you’re stuck inferring account linkage from surrogate signals like order timing and size clustering.

  • Model training: Raw trade volume is a misleading feature on its own. A study of nearly 12,000 active Polymarket wallets found that 11% placed more than 1,000 trades in six weeks while 24% were casual or inactive, meaning a handful of high-frequency actors can dominate a volume-weighted skill score unless you filter for them first.

  • Reconciliation: Store both raw and canonical representations of every trade, timestamp alignment and resolution metadata are the two things most likely to drift silently between venues.

Tools built for detecting trading pattern anomalies can help separate genuine signal from bot-driven noise before it reaches a production model.

Building a Cross-Venue Normalization Layer

The fix for all of the above is a canonical schema that preserves native identifiers rather than discarding them. Every row keeps its original Kalshi ticker or Polymarket condition ID and token ID, alongside a unified market ID that lets you join data across venues without losing the ability to audit back to the source.

A working normalization pattern looks like this:

  • Store the raw JSON payload untouched, next to the parsed and canonicalized row, so a mapping bug never destroys your ability to recompute a metric.

  • Convert every price field to a single numeric probability column (0 to 1), then precompute decimal odds so downstream models don’t repeat the same conversion logic per venue.

  • Tag source-specific metadata separately, overround, fee model, resolution source, rather than flattening it into shared fields that lose venue context.

  • Version your canonical schema explicitly, so a backfill run against last month’s data doesn’t silently break against this month’s field additions.

  • Log every schema migration with a timestamp and diff, this is what makes an audit trail defensible months later.

Assymetrix operationalizes this exact pattern: its Data API aggregates Kalshi and Polymarket (plus Limitless) into one canonical feed built on roughly 1.5 terabytes of historical data spanning nearly one billion rows of trading activity, while preserving every native identifier for cross-checking. Wallet-level Polymarket activity feeds directly into Smart Money profiles, giving you skill-adjusted trader scores instead of raw, easily-gamed volume counts.

The Checklist for Your First Integration Sprint

Direct venue connections make sense when you need sub-second execution or you’re only trading one venue. A canonical feed makes sense the moment you need cross-venue analytics, backtesting, or arbitrage signal generation.

  1. Preserve native IDs (ticker, condition ID, token ID) in every stored record, never discard them during transformation.

  2. Align every timestamp to UTC and tag each row with its source venue.

  3. Snapshot orderbooks at a cadence that matches your strategy’s holding period, not an arbitrary default.

  4. Run a scheduled reconciliation job that checks settlement status independent of event triggers.

  5. Log raw payloads permanently, they’re your only real defense in an audit or a dispute.

  6. Filter for high-frequency bot activity before treating volume as a proxy for trader skill.

Why Most Teams Underestimate the Maintenance Cost

Unifying two schemas looks like a weekend project until the first API change breaks silently three months in. Most teams underestimate ongoing maintenance because the parsing logic hides in unglamorous corners, stringified arrays, string-to-float casts, tax metadata fields nobody reads until reconciliation fails. Track record beats cleverness here: strong monitoring, retained raw payloads, and a versioned schema outperform a “smarter” client with none of the three.

— Dean

Skip the Two-Client Problem With a Canonical Feed

Maintaining separate parsers for Kalshi’s ticker system and Polymarket’s condition IDs costs real engineering hours every time either venue ships a field change, hours most quant teams would rather spend on strategy logic than schema patchwork. The Assymetrix Data API gives you both venues under one canonical schema, native IDs preserved, historical backfill included, and Smart Money wallet linkage already computed, so you’re not rebuilding trader-skill scoring from raw volume counts.


Assymetrix

Integration follows the pattern your architecture already expects: REST endpoints for bulk historical pulls, WebSocket streams for low-latency monitoring, and SDKs that get a working client running in an afternoon rather than a sprint. Enterprise licensing is available for teams that need dedicated throughput or custom data agreements. Start with the Data API documentation to see the canonical schema firsthand and get your first authenticated request running.

Selected Research and Docs


Selected Research and Docs — overview diagram

Key references: the Polymarket API developer guide on Gamma/CLOB parsing, the Kalshi/Polymarket Python comparison on ticker and price formats, and the full venue comparison on coverage gaps. For hands-on integration, see the Kalshi API tutorial.

Sources

FAQ

Is Polymarket or Kalshi more accurate?

Neither venue is inherently more accurate; accuracy depends on market liquidity and resolution source quality. Kalshi’s regulated benchmarks tend to produce tighter economic and political markets, while Polymarket’s deeper liquidity in crypto and sports categories often produces sharper pricing there.

What are the key differences between Kalshi and Polymarket?

Kalshi is a CFTC-regulated centralized exchange with ticker-based IDs, RSA-signed API auth, and custodial USD settlement, while Polymarket settles on-chain via Polygon with condition IDs, EIP-712 wallet signing, and public wallet-level trade history.

Why is Kalshi legal in the US while Polymarket faced restrictions?

Kalshi operates under a CFTC designation as a regulated exchange, which permits it to offer event contracts to US residents under federal derivatives law. Polymarket’s crypto-native, offshore structure historically fell outside that same regulatory framework, which shaped its availability to US users.

Which platform gives developers better data access?

Neither venue alone gives complete coverage. Kalshi offers stronger data for political and economic markets with cleaner tax metadata, Polymarket offers deeper on-chain transparency for crypto and sports, and a normalization layer like Assymetrix combines both into a single queryable schema.

Do I need to parse Polymarket and Kalshi data differently?

Yes. Polymarket often returns stringified JSON arrays requiring double parsing, while Kalshi returns price data as 0 to 1 strings in _dollars fields; both need explicit type casting before use in any model.

Kalshi vs Polymarket for Developers: Preserve IDs, Fix Parsing

The single fact that determines your integration path is settlement custody: Polymarket clears trades on-chain through Polygon, giving you wallet-level auditability, while Kalshi clears through a CFTC-regulated centralized exchange, giving you cleaner fiat and tax metadata but no public ledger. That split cascades into everything else, identifiers, auth, latency, and reconciliation logic. If you’re building for analytics or cross-venue research, normalize both feeds into one schema. If you’re building for execution, connect to each venue’s native order-placement layer directly and skip the abstraction.

TL;DR:

  • Settlement custody determines the data architecture: Polymarket offers on-chain transparency with public ledger records, while Kalshi provides centralized custody with automated tax data.

  • Data identifiers differ: Kalshi uses human-readable nested IDs, whereas Polymarket employs long hex or numeric strings that require careful mapping during integration.

  • Parsing and schema normalization are crucial: maintain raw payloads, convert prices to probabilities, and preserve native IDs to ensure accurate cross-venue analysis and backtesting.

  • Order placement varies: Polymarket relies on wallet signatures with gas management, while Kalshi uses API keys with RSA signatures, affecting client development and capital flow timing.

  • Regular schema updates and raw payload logging are essential to avoid silent failures and reduce ongoing maintenance costs.

Table of Contents

  • Kalshi vs Polymarket Data: The Architecture That Drives Everything

  • Mapping Endpoints, IDs, and Payload Shapes

  • Auth and Order Placement: Wallets vs API Keys

  • What These Differences Mean for Your Trading Bot or Model

  • Building a Cross-Venue Normalization Layer

  • The Checklist for Your First Integration Sprint

  • Why Most Teams Underestimate the Maintenance Cost

  • Skip the Two-Client Problem With a Canonical Feed

  • Selected Research and Docs

  • Sources

  • FAQ

Kalshi vs Polymarket Data: The Architecture That Drives Everything

Settlement custody is the root variable. Everything downstream, schema shape, identifier format, latency profile, reconciliation burden, traces back to whether a venue clears on-chain or through a regulated clearinghouse.

Polymarket settles trades on Polygon, which means every fill, redemption, and position transfer is a public on-chain event. You can reconstruct a wallet’s entire trading history, including PnL, without ever calling an authenticated endpoint, because the ledger itself is the audit trail. That’s a meaningful advantage if you’re building wallet-tracking tools or smart-money monitors.

Kalshi settles through a centralized, CFTC-regulated exchange. There’s no public ledger to scrape, but you get custodial USD balances, settled cash flows, and automated tax documentation that Polymarket simply doesn’t generate. Kalshi also carries broader coverage of political and economic indicator markets, while Polymarket has historically offered wider global market breadth with deeper transparency on crypto and sports categories.

Both venues use central limit order book (CLOB) mechanics at the market level, so the trading logic looks familiar. Where they diverge is in the details that matter for data engineering:

  • Resolution sources differ: Kalshi relies on named data providers tied to regulated benchmarks; Polymarket resolution depends on decentralized oracle mechanisms and community dispute processes.

  • Overround behavior varies by liquidity depth and market age, and you’ll need separate calibration per venue rather than a shared model.

  • Fee structures attach differently to the settlement layer, custodial fees on Kalshi versus gas and protocol fees on Polymarket.

Mapping Endpoints, IDs, and Payload Shapes

Once you start pulling data, the identifier mismatch is the first thing that breaks a naive integration. Kalshi and Polymarket don’t just use different field names, they use fundamentally different addressing schemes for the same concept: a market.

Kalshi nests markets under a series → event → market hierarchy with human-readable tickers, so a market ID looks like something you could read aloud. Polymarket instead identifies markets by condition_id and individual outcomes by token_id, both long hex or numeric strings with no semantic meaning on their own.

The catalog split matters too. Polymarket splits its API surface between Gamma, which handles market discovery and metadata, and CLOB, which handles order book and trade data, and some payloads arrive as stringified JSON arrays that need to be decoded twice before you can use them. Kalshi keeps discovery and trading data under one REST surface, which simplifies the catalog layer but still requires careful handling of its _dollars fields, which arrive as 0 to 1 strings representing implied probability rather than raw decimals.

Here’s the practical sequence for building an ingestion pipeline against either venue:

  1. Pull the catalog endpoint first to resolve series/tickers (Kalshi) or condition IDs and token IDs (Polymarket).

  2. Cast all price fields from string to float before any arithmetic, both venues serialize prices as strings, not numbers.

  3. For Polymarket, run json.loads() on any field that looks like an escaped array before parsing it as JSON.

  4. Pull full-depth orderbook or midpoint endpoints depending on whether you need execution-grade or reference-grade pricing.

  5. For historical backfill, check whether the endpoint requires authentication, Kalshi generally opens more historical OHLC data to public reads than Polymarket does.

Pro Tip: Write a single “cast and validate” function per venue that runs immediately after the HTTP response lands, before any business logic touches the payload. Catching a malformed stringified array at the parser boundary is far cheaper than debugging a corrupted backtest three weeks later.

Auth and Order Placement: Wallets vs API Keys

Placing an order on Polymarket means signing an EIP-712 typed message with a wallet’s private key, then submitting it through the CLOB’s Layer 2 relay, which requires you to manage gas considerations and nonce sequencing even though the relay itself is gasless for the trader. Kalshi order placement uses API key authentication with RSA-signed requests, and enterprise users can access a FIX gateway for lower-latency execution, a pattern borrowed directly from traditional finance infrastructure.

That split changes what your client code looks like on day one:

  • Polymarket clients need wallet management, signing libraries, and nonce tracking baked into the execution path.

  • Kalshi clients need credential rotation and RSA key management, closer to what you’d build for a traditional brokerage API.

  • Rate limits and pagination styles differ enough that your polling or WebSocket reconnection logic can’t be shared code between venues without an abstraction layer.

  • Withdrawal timing diverges sharply: Polymarket settlement is near-instant on-chain once a market resolves, while Kalshi’s custodial withdrawal and settlement windows follow traditional exchange clearing timelines.

That withdrawal gap directly affects capital efficiency if you’re running strategies across both venues simultaneously, money tied up in Kalshi’s settlement window isn’t available for a Polymarket opportunity that closes faster.

Pro Tip: Build your reconciliation job to run on a fixed UTC schedule rather than triggering on settlement events. Kalshi and Polymarket resolve markets on different clocks, and event-triggered reconciliation tends to silently miss the venue that settles slower.

What These Differences Mean for Your Trading Bot or Model

The architecture gap isn’t academic, it directly shapes what you can build and how reliable the output will be.

  • Cross-venue arbitrage: You need pre-funded positions on both sides because Polymarket settles near-instantly while Kalshi’s clearing introduces basis risk during the reconciliation window.

  • Smart-money tracking: Polymarket’s on-chain wallets let you trace individual actors with precision. Kalshi’s custodial model hides account-level activity, so you’re stuck inferring account linkage from surrogate signals like order timing and size clustering.

  • Model training: Raw trade volume is a misleading feature on its own. A study of nearly 12,000 active Polymarket wallets found that 11% placed more than 1,000 trades in six weeks while 24% were casual or inactive, meaning a handful of high-frequency actors can dominate a volume-weighted skill score unless you filter for them first.

  • Reconciliation: Store both raw and canonical representations of every trade, timestamp alignment and resolution metadata are the two things most likely to drift silently between venues.

Tools built for detecting trading pattern anomalies can help separate genuine signal from bot-driven noise before it reaches a production model.

Building a Cross-Venue Normalization Layer

The fix for all of the above is a canonical schema that preserves native identifiers rather than discarding them. Every row keeps its original Kalshi ticker or Polymarket condition ID and token ID, alongside a unified market ID that lets you join data across venues without losing the ability to audit back to the source.

A working normalization pattern looks like this:

  • Store the raw JSON payload untouched, next to the parsed and canonicalized row, so a mapping bug never destroys your ability to recompute a metric.

  • Convert every price field to a single numeric probability column (0 to 1), then precompute decimal odds so downstream models don’t repeat the same conversion logic per venue.

  • Tag source-specific metadata separately, overround, fee model, resolution source, rather than flattening it into shared fields that lose venue context.

  • Version your canonical schema explicitly, so a backfill run against last month’s data doesn’t silently break against this month’s field additions.

  • Log every schema migration with a timestamp and diff, this is what makes an audit trail defensible months later.

Assymetrix operationalizes this exact pattern: its Data API aggregates Kalshi and Polymarket (plus Limitless) into one canonical feed built on roughly 1.5 terabytes of historical data spanning nearly one billion rows of trading activity, while preserving every native identifier for cross-checking. Wallet-level Polymarket activity feeds directly into Smart Money profiles, giving you skill-adjusted trader scores instead of raw, easily-gamed volume counts.

The Checklist for Your First Integration Sprint

Direct venue connections make sense when you need sub-second execution or you’re only trading one venue. A canonical feed makes sense the moment you need cross-venue analytics, backtesting, or arbitrage signal generation.

  1. Preserve native IDs (ticker, condition ID, token ID) in every stored record, never discard them during transformation.

  2. Align every timestamp to UTC and tag each row with its source venue.

  3. Snapshot orderbooks at a cadence that matches your strategy’s holding period, not an arbitrary default.

  4. Run a scheduled reconciliation job that checks settlement status independent of event triggers.

  5. Log raw payloads permanently, they’re your only real defense in an audit or a dispute.

  6. Filter for high-frequency bot activity before treating volume as a proxy for trader skill.

Why Most Teams Underestimate the Maintenance Cost

Unifying two schemas looks like a weekend project until the first API change breaks silently three months in. Most teams underestimate ongoing maintenance because the parsing logic hides in unglamorous corners, stringified arrays, string-to-float casts, tax metadata fields nobody reads until reconciliation fails. Track record beats cleverness here: strong monitoring, retained raw payloads, and a versioned schema outperform a “smarter” client with none of the three.

— Dean

Skip the Two-Client Problem With a Canonical Feed

Maintaining separate parsers for Kalshi’s ticker system and Polymarket’s condition IDs costs real engineering hours every time either venue ships a field change, hours most quant teams would rather spend on strategy logic than schema patchwork. The Assymetrix Data API gives you both venues under one canonical schema, native IDs preserved, historical backfill included, and Smart Money wallet linkage already computed, so you’re not rebuilding trader-skill scoring from raw volume counts.


Assymetrix

Integration follows the pattern your architecture already expects: REST endpoints for bulk historical pulls, WebSocket streams for low-latency monitoring, and SDKs that get a working client running in an afternoon rather than a sprint. Enterprise licensing is available for teams that need dedicated throughput or custom data agreements. Start with the Data API documentation to see the canonical schema firsthand and get your first authenticated request running.

Selected Research and Docs


Selected Research and Docs — overview diagram

Key references: the Polymarket API developer guide on Gamma/CLOB parsing, the Kalshi/Polymarket Python comparison on ticker and price formats, and the full venue comparison on coverage gaps. For hands-on integration, see the Kalshi API tutorial.

Sources

FAQ

Is Polymarket or Kalshi more accurate?

Neither venue is inherently more accurate; accuracy depends on market liquidity and resolution source quality. Kalshi’s regulated benchmarks tend to produce tighter economic and political markets, while Polymarket’s deeper liquidity in crypto and sports categories often produces sharper pricing there.

What are the key differences between Kalshi and Polymarket?

Kalshi is a CFTC-regulated centralized exchange with ticker-based IDs, RSA-signed API auth, and custodial USD settlement, while Polymarket settles on-chain via Polygon with condition IDs, EIP-712 wallet signing, and public wallet-level trade history.

Why is Kalshi legal in the US while Polymarket faced restrictions?

Kalshi operates under a CFTC designation as a regulated exchange, which permits it to offer event contracts to US residents under federal derivatives law. Polymarket’s crypto-native, offshore structure historically fell outside that same regulatory framework, which shaped its availability to US users.

Which platform gives developers better data access?

Neither venue alone gives complete coverage. Kalshi offers stronger data for political and economic markets with cleaner tax metadata, Polymarket offers deeper on-chain transparency for crypto and sports, and a normalization layer like Assymetrix combines both into a single queryable schema.

Do I need to parse Polymarket and Kalshi data differently?

Yes. Polymarket often returns stringified JSON arrays requiring double parsing, while Kalshi returns price data as 0 to 1 strings in _dollars fields; both need explicit type casting before use in any model.

Other Blog