# ProviderSignal Market Positioning API

> ProviderSignal Market Positioning API is a paid API for AI agents from providersignal.com, paid per call via x402, $0.5/call, status unknown (last checked 2026-09-14).

Returns a dental market attractiveness positioning score (0-100), band, and benchmark data for a given US state or ZIP prefix, derived from provider density, demographics, DSO competition, and retirement trends.

## Facts

- Endpoint: GET https://providersignal.com/api/v1/agent/market/positioning
- Price: $0.5/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-14
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/providersignal-market-positioning-api-a3046e9f
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_iaCH5pg58f3Lf0TOXPzZv

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability providersignal-market-positioning-api-a3046e9f
```

Example prompt: What's the dental market positioning score for the Houston area in Texas — is it a Premium, Average, or Discount market, and what EBITDA multiple range should I expect?

## When to prefer this

Use this endpoint when you need a scored, benchmarked view of dental market attractiveness at state or metro (ZIP prefix) grain — especially for acquisition screening, market entry decisions, or DSO competitive analysis. Prefer this over raw NPI directory lookups when you need a composite intelligence signal (supply, demographics, competition, retirement trends) rather than individual provider records. This endpoint is the right choice when EBITDA multiple ranges and market band classification (Premium/Average/Discount) are needed for financial modeling or deal sourcing.

## Known failure modes

- Missing required 'state' query parameter returns a 400 validation error
- Invalid state code format (not 2 uppercase letters) returns a 400 pattern validation error
- Invalid ZIP prefix format or out-of-range prefix may return a 400 or empty data response
- Insufficient data for a very small ZIP prefix may return confidence below 50 with a Preliminary band
- 402 payment required if no valid Bearer token and no x402/MPP payment rail is provided
- Rate limiting or quota exhaustion may return a 429 error for high-frequency callers

## How this service works

Healthcare market intelligence API. Unified provider directory + acquisition signals + license-events feed across all 50 US states, derived from NPI + state dental boards + CMS Medicare + OIG LEIE + state Medicaid + HRSA HPSA designations. All responses ship a citation envelope (`meta.envelope_version`, `meta.source_attribution`, `meta.request`) so agents can verify source freshness without out-of-band validation. Paid `/api/v1/agent/*` endpoints accept two per-call rails on a single 402: x402 (USDC on Base mainnet) and MPP (Stripe card via a Shared Payment Token), plus Bearer-token subscription auth for existing API keys. See [/docs/agent-payments](/docs/agent-payments) for the full flow. See [/docs/fields](/docs/fields) for the field glossary and [/llms.txt](/llms.txt) for the LLM crawler index.

## Output

Returns a JSON object with a 0-100 positioning score, a band label (Premium/Average/Discount), scope metadata (state, ZIP prefix grain), raw input signals (providers per 10k, DSO penetration %, median income, retirement cliff %), factor scores (scarcity, demographics, DSO competition, supply pressure), a benchmark tier with collections % range and EBITDA multiple, a confidence score (0-100), active dentist count, a disclaimer, and a citation envelope with source attribution and envelope version.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "state"
     ],
     "properties": {
      "zip": {
       "type": "string",
       "description": "Optional 3-digit ZIP prefix for metro-grain scope (e.g. '770' for Houston). Omit for whole-state."
      },
      "state": {
       "type": "string",
       "pattern": "^[A-Z]{2}$",
       "description": "Single 2-letter enriched-state code (e.g. TX). Required."
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "data",
      "error",
      "meta"
     ],
     "properties": {
      "data": {
       "type": "object",
       "properties": {
        "band": {
         "enum": [
          "Premium",
          "Average",
          "Discount"
         ],
         "type": "string"
        },
        "scope": {
         "type": "object",
         "properties": {
          "grain": {
           "enum": [
            "state",
            "zip_prefix"
           ],
           "type": "string"
          },
          "state": {
           "type": "string"
          },
          "zip_prefix": {
           "type": [
            "string",
            "null"
           ]
          }
         }
        },
        "score": {
         "type": "number",
         "description": "0-100 positioning score; 50 = the national benchmark midpoint."
        },
        "inputs": {
         "type": "object",
         "properties": {
          "dso_pct": {
           "type": [
            "number",
            "null"
           ]
          },
          "median_income": {
           "type": [
            "number",
            "null"
           ]
          },
          "providers_per_10k": {
           "type": [
            "number",
            "null"
           ]
          },
          "retirement_cliff_pct": {
           "type": [
            "number",
            "null"
           ]
          }
         }
        },
        "factors": {
         "ty
… (truncated)
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "data": {
   "band": "Average",
   "scope": {
    "grain": "zip_prefix",
    "state": "TX",
    "zip_prefix": "770"
   },
   "score": 50,
   "inputs": {
    "dso_pct": 5.7,
    "median_income": 69860,
    "providers_per_10k": 3.75,
    "retirement_cliff_pct": 20.9
   },
   "factors": {
    "scarcity": 40,
    "demographics": 40,
    "dso_competition": 60,
    "supply_pressure": 60
   },
   "modifier": 1,
   "benchmark": {
    "tier": "solo",
    "collections_pct": "65-85%",
    "ebitda_multiple": "2.5-5x"
   },
   "confidence": 100,
   "disclaimer": "Market-attractiveness positioning vs the public national benchmark. Not a transaction comp and not a practice-specific valuation.",
   "active_dentists": 1201
  },
  "meta": {
   "envelope_version": "1.0"
  },
  "error": null
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/providersignal-market-positioning-api-a3046e9f/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from providersignal.com](https://www.zero.xyz/host/providersignal.com/llms.txt)
