A dynamic schema means the API's queryable data model is discovered at runtime rather than hard-coded into your application. Instead of knowing at development time what fields are available, your application queries the /v1/meta endpoint to learn the current structure, then builds queries accordingly.
This is fundamentally different from traditional REST APIs where you write code against a fixed set of known fields.
The Reporting API schema is backwards compatible — Square does not remove or rename fields in breaking ways. However, the schema does grow over time as new measures, dimensions, and cubes are added. Dynamic discovery lets your application automatically pick up these additions without redeployment.
Implement a discovery layer that sits between your application logic and the API:

Layer Responsibilities:
- Application Layer: UI, business logic, and reporting components
- Discovery Layer: Metadata caching, query validation, and error handling
- API Layer: Schema discovery and query execution
- Discover on startup: Fetch metadata on application startup or periodically to surface new fields
- Cache metadata appropriately: Balance freshness with API load (1-24 hour TTL)
- Build dynamic UIs: Populate options from metadata, not hard-coded lists
- Validate before executing: Check queries against cached metadata to catch errors early
- Refresh after errors: If a query fails with "not found", invalidate cache and retry
For implementation details — caching code, validation patterns, and parsing examples — see Metadata Discovery.
| Change | Client Impact | Action |
|---|---|---|
| Measure added | None | Discover automatically |
| Dimension added | None | Discover automatically |
| Measure removed | Queries using it fail | Validate queries against metadata before execution |
| Dimension removed | Queries using it fail | Validate queries against metadata before execution |
| Cube/view added | None | Discover automatically |
| Cube/view removed | All queries to it fail | Validate cube names against metadata |
| Member renamed | Queries using old name fail | Always discover member names from /v1/meta |
| Type changed | May affect parsing/display | Check type field in metadata |