π‘ Zillow Search Scraper
Pricing
$19.99/month + usage
π‘ Zillow Search Scraper
Automate Zillow search scraping with reliable filtering for price, home type, beds, baths, and neighborhood. Retrieve complete listing details, photos, and agent insights. Perfect for building market datasets, powering dashboards, or enriching real estate intelligence tools.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Zillow Search Scraper β Extract Listings, Details & Zestimates
Zillow Search Scraper pulls property listings straight from Zillow's own search endpoints β no browser, no HTML scraping for the core path β and returns typed, normalized JSON for every result: address, price, beds/baths, Zestimate, tax assessment, days on market, and photos. An opt-in enrichment mode adds a second entity, per-property detail rows carrying price history, tax history, agent/broker contact, and nearby schools. Every response is structured JSON β no HTML, no selectors, no parsing step. After reading this, you'll know exactly which input fields drive which behavior, what every output field means, and where the Actor's real limits sit.
π‘ What is Zillow Search Scraper?
Zillow Search Scraper is an Apify Actor that scrapes property listings from Zillow.com search results β for-sale, for-rent, and recently-sold homes β and, on request, enriches individual properties with detail-page data. It requires no Zillow account or login: the source (src/page_main.py, src/zoom_main.py, src/detail_main.py) makes only unauthenticated HTTP requests, the same ones a visitor's browser makes. No MCP server is documented for this Actor, so it is reached the way any Apify Actor is β Console, API, or scheduled run.
- Scrape listings from a full Zillow search URL, a bare location (
dallas-tx), or a ZIP code - Scrape property details for specific ZPIDs or listing URLs (opt-in, separate billing event)
- Apply price, bed/bath, sqft, home-type, status, days-on-market, and keyword filters server-side, injected into Zillow's own
searchQueryState - Get derived market metrics computed in the row β price per square foot, price vs. Zestimate
- Export as JSON, CSV, Excel, XML, or HTML table from the Apify dataset β no proxy setup or parsing required on your end
What data does Zillow Search Scraper collect?
The Actor returns three distinct kinds of data in one run: search-result listings, opt-in per-property detail enrichment, and computed market analytics layered onto each listing.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Property listings | Price, address, beds/baths, home type, status, Zestimate, tax assessment, days on market | unformattedPrice, addressStreet, beds, baths, homeType, homeStatus, zestimate, taxAssessedValue, daysOnZillow |
| Property detail enrichment (opt-in) | Price history, tax history, agent & broker contact, nearby schools, description | priceHistory, taxHistory, agentName, agentEmail, brokerPhoneNumber, schools, description |
| Market & pricing analytics | Price per sqft, price vs. Zestimate delta/percent, price-cut flag, days-on-market bucket | pricePerSqft, priceVsZestimateDelta, priceVsZestimatePct, priceCutFlag, daysOnMarketBucket |
Need more Zillow data?
Some Zillow scrapers on the Apify Store split search results and property-detail pages into two separate products β for example, maxcopell/zillow-scraper and a companion Zillow Details Scraper are listed as separate Actors (observed on the Apify Store on 2026-07-26). Zillow Search Scraper covers both in a single run: turn on enableDetailEnrichment and the same run emits detail rows alongside listing rows, billed under their own pay-per-event event rather than requiring a second Actor.
Why not build a Zillow scraper yourself?
Zillow is fronted by PerimeterX, which fingerprints the TLS ClientHello (JA3/JA4) and HTTP/2 frame settings before it reads a single request header. A standard Python HTTP stack (requests/urllib3) has a distinguishable TLS fingerprint that Zillow blocks on the very first request, independent of headers or proxy quality β this Actor's src/http_client.py documents that exact failure mode and works around it with curl_cffi's Chrome TLS/JA3 impersonation. On top of that, Zillow caps any single search query at roughly 820 results (zoom_main.py's CAP_LIMIT = 820), so covering a dense metro area means recursively subdividing the map into smaller tiles and deduplicating by ZPID across all of them β logic that has to be rebuilt and re-verified every time Zillow reshapes its internal hdpData/gdpClientCache payloads.
Building and maintaining that yourself means owning TLS fingerprint parity with a real browser, a soft-block detector that catches a 200 response carrying a captcha page, a proxy-escalation chain, and continuous adaptation to an undocumented internal API. Zillow Search Scraper already does this and ships it as pay-per-event Apify infrastructure β no server, no proxy contract, no scraper maintenance on your side.
Why do developers and teams scrape Zillow?
For AI engineers and agent builders
An agent answering "find me a 3-bed under $500k in Dallas with a recent price cut" needs structured fields, not HTML. Feed unformattedPrice, priceCutFlag, daysOnMarketBucket, and priceVsZestimatePct straight into a tool call or a RAG index over a metro area's active listings, and the agent can filter and rank without ever touching a selector. The Actor's null-not-0 convention (missing Zestimate is null, never a fake zero) matters here β an agent that treats 0 as a real value will make wrong comparisons on exactly the listings where data is genuinely absent.
For investors and market analysts
priceVsZestimateDelta, priceVsZestimatePct, and pricePerSqft are computed on every listing row, so a batch pull across several ZIP codes turns into a ranked list of listings trading below Zillow's own estimate without a spreadsheet formula. Layer taxAssessedValue and daysOnMarketBucket on top to separate stale, overpriced inventory from fresh listings worth a closer look, then re-run the same searchUrls on a schedule to track how a market moves.
For lead-generation and real estate marketing teams
Turning on enableDetailEnrichment for a shortlist of ZPIDs returns agentName, agentPhoneNumber, agentEmail, brokerName, and brokerPhoneNumber for each listing's attributed agent β publicly published professional contact information, not a private account. Combined with mlsId and listingAgents, that is enough to route qualified property leads to the right agent or brokerage without visiting each detail page by hand.
For developers building data products
Because searchUrls accepts full Zillow URLs with an embedded searchQueryState, a scheduled run against a saved search reproduces the exact filters a user set on Zillow itself. Pair that with Apify's scheduling and webhooks to build a market-monitoring product or a property-alert pipeline on top of a stable, typed output schema instead of re-deriving Zillow's filter encoding from scratch.
How to scrape Zillow (step by step)
- Open Zillow Search Scraper on its Apify Store listing and click Try for free (or run it directly if you already use the Apify Console).
- Provide the required input,
searchUrlsβ one or more full Zillow search URLs (ideally with asearchQueryState), or bare locations/ZIP codes likedallas-txor90210, which the Actor resolves to a real map search. - Optionally set filters β
status,minPrice/maxPrice,minBeds/maxBeds/minBaths,minSqft/maxSqft,homeType,maxDaysOnMarket,keywordsβ and choose anextractionMethodif the default dynamic-zoom mode isn't what you need. - Click Start and let the run finish (or stream results as they land via the Apify API).
- Download results from the OUTPUT tab as JSON, CSV, Excel, XML, or HTML table β or pull them programmatically via
apify_client.
What to do when Zillow changes its structure
Zillow's internal hdpData and gdpClientCache payloads are undocumented and can change shape without notice. The Actor's field-lifting logic and derived-metric calculations are maintained against those payloads, and the output schema is designed to stay stable on your end β field names and types don't change even if Zillow moves data around internally. No fixed turnaround time is published for adapting to a given Zillow change.
β¬οΈ Input
searchUrls is the only required field. Everything else is optional and defaults as shown.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
searchUrls | Yes | array | Zillow search URLs (best β a full URL with searchQueryState), or bare locations/ZIP codes resolved to a real map search. | "dallas-tx" |
extractionMethod | No | string | PAGINATION_WITH_DYNAMIC_ZOOM_INCREASE (default β beats the ~820 cap), PAGINATION_WITHOUT_ZOOMING_IN (HTML pages, capped ~820), MAP_MARKERS (capped ~500). | "PAGINATION_WITH_DYNAMIC_ZOOM_INCREASE" |
maxItems | No | integer | Max listings for the whole run, global across all URLs, deduplicated by ZPID. 0 = as many as possible. Min 0, max 100000, default 10. | 100 |
status | No | string | all (default, uses the URL's own status), forSale, forRent, sold. | "forSale" |
minPrice | No | integer | Minimum price (USD). Min 0. | 200000 |
maxPrice | No | integer | Maximum price (USD). Min 0. | 750000 |
minBeds | No | integer | Minimum bedrooms. Min 0, max 20. | 3 |
maxBeds | No | integer | Maximum bedrooms. Min 0, max 20. | 5 |
minBaths | No | integer | Minimum bathrooms. Min 0, max 20. | 2 |
minSqft | No | integer | Minimum living area (sqft). Min 0. | 1000 |
maxSqft | No | integer | Maximum living area (sqft). Min 0. | 4000 |
homeType | No | string | all (default), houses, condos, townhomes, multiFamily, apartments, manufactured, lotsLand. | "houses" |
maxDaysOnMarket | No | integer | Only listings on Zillow at most this many days, mapped to Zillow's nearest supported bucket (1, 7, 14, 30, 90, 180, 365 days). Min 0. | 7 |
keywords | No | string | Free-text keyword filter passed to Zillow (matches listing descriptions). | "pool" |
rawData | No | boolean | Also include the raw nested hdpData blob and full carouselPhotosComposable on each row. Clean columns are lifted regardless. Default false. | false |
maxPhotos | No | integer | Hi-res photo URLs to build per listing, from photoData keys. Min 0, max 50, default 5. | 5 |
enableDetailEnrichment | No | boolean | Opt-in. For each ZPID/URL in detailUrlsOrZpids, fetch the detail page and emit a child row with price history, tax history, agent/broker contact, schools, and description. Billed under the separate detail_result event. Default false. | false |
detailUrlsOrZpids | No | array | Zillow ZPIDs (e.g. 55826232) or full property (homedetails) URLs to enrich. Only used when enableDetailEnrichment is true. | "55826232" |
proxyConfiguration | No | object | Proxy settings. Zillow's anti-bot (PerimeterX) blocks datacenter IPs, so RESIDENTIAL is strongly recommended. Default: {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example input
{"searchUrls": ["https://www.zillow.com/dallas-tx/?searchQueryState=%7B%22isMapVisible%22%3Atrue%2C%22mapBounds%22%3A%7B%22north%22%3A33.10483509834637%2C%22south%22%3A32.53008985410089%2C%22east%22%3A-96.3544578671875%2C%22west%22%3A-97.2004051328125%7D%2C%22filterState%22%3A%7B%22sort%22%3A%7B%22value%22%3A%22globalrelevanceex%22%7D%7D%2C%22isListVisible%22%3Atrue%2C%22usersSearchTerm%22%3A%22Dallas%2C%20TX%22%7D"],"extractionMethod": "PAGINATION_WITH_DYNAMIC_ZOOM_INCREASE","maxItems": 100,"status": "forSale","minPrice": 200000,"maxPrice": 750000,"minBeds": 3,"maxBeds": 5,"minBaths": 2,"minSqft": 1000,"maxSqft": 4000,"homeType": "houses","maxDaysOnMarket": 7,"keywords": "pool","rawData": false,"maxPhotos": 5,"enableDetailEnrichment": true,"detailUrlsOrZpids": ["55826232"],"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Common pitfall: the input description for maxItems says 0 means "as many as possible," but the source (src/main.py) treats 0 or any non-positive value as 10000 internally β a maxItems: 0 run is effectively capped at 10,000 listings, not unlimited. Set maxItems explicitly (up to the schema's own ceiling of 100000) if you need more than that in one run.
β¬οΈ Output
Every run writes to the Apify dataset as typed JSON β no HTML, no null-as-zero. Two row shapes exist: type: "listing" (search results) and type: "detail" (opt-in enrichment, only present when enableDetailEnrichment is on). The default dataset view surfaces 32 columns for quick reading in the Console; the underlying rows carry more fields than the view shows β switch to the JSON tab or download the full dataset to get everything documented below.
Scraped listing
{"type": "listing","isDetail": false,"zpid": "26822756","id": "26822756","detailUrl": "https://www.zillow.com/homedetails/3810-Hawthorne-Ave-Dallas-TX-75219/26822756_zpid/","price": "$525,000","unformattedPrice": 525000,"countryCurrency": "$","shouldShowRequestOnPrice": false,"address": "3810 Hawthorne Ave, Dallas, TX 75219","addressStreet": "3810 Hawthorne Ave","addressCity": "Dallas","addressState": "TX","addressZipcode": "75219","isUndisclosedAddress": false,"latLong": { "latitude": 32.82, "longitude": -96.81 },"beds": 3,"baths": 2,"area": 2100,"homeType": "SINGLE_FAMILY","homeStatus": "FOR_SALE","statusType": "FOR_SALE","statusText": "House for sale","yearBuilt": 1998,"lotAreaValue": 0.18,"lotAreaUnit": "acres","zestimate": 531000,"rentZestimate": 3200,"shouldShowZestimateAsPrice": false,"taxAssessedValue": 480000,"taxAssessedYear": 2025,"daysOnZillow": 5,"timeOnZillow": "5 days","priceReduction": null,"priceChange": null,"datePriceChanged": null,"brokerName": "Some Realty","variableDataText": "5 days on Zillow","variableDataType": "DAYS_ON","pricePerSqft": 250.0,"priceVsZestimateDelta": -6000,"priceVsZestimatePct": -1.13,"priceCutFlag": false,"daysOnMarketBucket": "0-7 days (new)","imgSrc": "https://photos.zillowstatic.com/fp/33578db80c877648aba386c3aa28e042-p_e.jpg","hasImage": true,"photoCount": 34,"photoUrls": ["https://photos.zillowstatic.com/fp/33578db80c877648aba386c3aa28e042-uncropped_scaled_within_1536_1152.jpg"],"has3DModel": false,"hasVideo": false,"isZillowOwned": false,"isFeaturedListing": false,"isShowcaseListing": false,"foundFromSearchUrl": "https://www.zillow.com/dallas-tx/?searchQueryState=...","zoomQuadrantSequence": [0, 2],"scrapedAt": "2026-07-26T00:00:00Z"}
When rawData is true, each listing row also carries the raw hdpData object and the full carouselPhotosComposable structure exactly as Zillow returned them.
Every field is null when genuinely unavailable β never a fabricated 0 or empty string. unformattedPrice is null for "Contact for price" listings, and zestimate/rentZestimate are null (not 0) when Zillow doesn't publish one for that property.
Scraped property detail (opt-in enrichment)
{"type": "detail","isDetail": true,"scrapedAt": "2026-07-26T00:00:00Z","zpid": "55826232","detailUrl": "https://www.zillow.com/homedetails/example-address/55826232_zpid/","description": "Updated 3-bedroom home with an open floor plan and a fenced backyard.","homeType": "SINGLE_FAMILY","homeStatus": "FOR_SALE","yearBuilt": 1998,"livingArea": 2100,"lotSize": 7841,"priceHistory": [{ "date": "2026-06-01", "event": "Listed for sale", "price": 525000, "priceChangeRate": null, "pricePerSquareFoot": 250, "source": "Public Record" }],"taxHistory": [{ "time": 1735689600000, "taxPaid": 9800, "value": 480000, "taxIncreaseRate": 0.02, "valueIncreaseRate": 0.03 }],"schools": [{ "name": "Example Elementary", "rating": 7, "level": "Primary", "grades": "K-5", "distance": 0.6, "type": "Public" }],"agentName": "Jane Doe","agentPhoneNumber": "555-123-4567","agentEmail": "jane.doe@example-realty.com","brokerName": "Some Realty","brokerPhoneNumber": "555-123-0000","listingAgents": [{ "name": "Jane Doe", "phone": "555-123-4567", "email": "jane.doe@example-realty.com" }],"mlsId": "20260001","hoaFee": null,"parking": "Garage - Attached","heating": ["Central"],"cooling": ["Central Air"],"appliances": ["Dishwasher", "Refrigerator"]}
Detail rows are billed under the detail_result event, separate from row_result, and are also mirrored to a per-run child dataset named zillow-details-<runId>. If a detail page can't be parsed (blocked, or Zillow served an unexpected page), the Actor still emits a row with zpid: null and only detailUrl populated rather than silently dropping the input β that row is still billed as a detail_result event, since the fetch itself succeeded even though parsing found nothing usable. A request that fails outright (network error, exhausted retries) is not pushed and is not charged.
How does Zillow Search Scraper compare to other Zillow scrapers?
| Feature | Zillow Search Scraper | Generic Zillow scraper |
|---|---|---|
| Search + detail enrichment in one Actor | β
opt-in enableDetailEnrichment on the same run | β often a separate Actor purchase (maxcopell/zillow-scraper + a separate Zillow Details Scraper, observed on the Apify Store, 2026-07-26) |
| Null handling | β
missing price/Zestimate emitted as null, never a fabricated 0 | Not documented on the reviewed listings |
| Derived market metrics computed server-side | β
pricePerSqft, priceVsZestimateDelta/Pct, priceCutFlag, daysOnMarketBucket | Not documented on the reviewed listings |
| Soft-block detection (captcha served as a 200) | β response body checked for anti-bot markers before being treated as data | Not documented on the reviewed listings |
| Bare location/ZIP resolved to a real map search | β
resolves dallas-tx / 90210 to a live searchQueryState, not a naive URL | maxcopell/zillow-zip-search accepts ZIP codes as a dedicated input path (observed on the Apify Store, 2026-07-26) |
If you're building an AI agent or RAG pipeline, the null-handling row is the decision-maker β an agent that reads a fabricated 0 as a real price or Zestimate will make wrong downstream comparisons on exactly the listings where the data is genuinely missing.
How many results can you scrape with Zillow Search Scraper?
The real ceiling depends on extractionMethod and maxItems. MAP_MARKERS is hard-capped at 500 results in the source (min(max_items, 500)); PAGINATION_WITHOUT_ZOOMING_IN follows Zillow's own pagination, which the default dynamic-zoom mode treats as a roughly 820-result-per-query soft cap (CAP_LIMIT = 820 in zoom_main.py). The default PAGINATION_WITH_DYNAMIC_ZOOM_INCREASE mode checks Zillow's own totalResultCount and, when it exceeds that cap, recursively subdivides the map into quadrants (up to 6 levels deep) and paginates each tile separately, deduplicating by ZPID across every tile and every input URL β this is what lets a single dense metro search return far more than 820 listings. The one honest edge case: if a single tile still reports more than the cap at the maximum subdivision depth, that tile is truncated to roughly the cap and logged as a warning; narrowing your filters (price, home type, beds) further subdivides that area logically instead. maxItems itself defaults to 10, accepts up to 100000 per the input schema, and a 0 value is treated as 10000 internally rather than truly unlimited (see the Input pitfall note above).
Integrate Zillow Search Scraper and automate your workflow
Zillow Search Scraper works with any language or tool that can send an HTTP request to the Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("zillow-search-scraper").call(run_input={"searchUrls": ["dallas-tx"],"maxItems": 100,"status": "forSale","minPrice": 200000,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["addressStreet"], item["unformattedPrice"], item["zestimate"])
Works in Python, Node.js, Go, Ruby, and cURL β any client that can call the Apify API with your Apify token.
Automation platforms (n8n, Make, LangChain)
Any Apify Actor, including this one, can be triggered from n8n's Apify node or Make's Apify app by selecting the Actor and passing the same input shown above as run input; both platforms poll the run and pass the resulting dataset items downstream. In a LangChain or similar agent framework, wrap the apify_client call above as a tool function β the Actor's typed JSON output can be passed directly into an agent's context or a vector-store ingestion step without an HTML-parsing stage in between.
Is it legal to scrape Zillow?
Yes β scraping publicly available property listing data (prices, addresses, beds/baths, status) is legal; this Actor returns only data visible on Zillow's own public search and detail pages, without logging in or bypassing any access control. This is business/product data (listings, prices, market records), governed by Zillow's Terms of Service and database-rights considerations rather than personal-data law β GDPR does not attach to a property's price or square footage. The opt-in detail-enrichment mode does surface publicly published professional contact information for listing agents and brokers (agentName, agentPhoneNumber, agentEmail), which is business contact data agents themselves choose to list publicly on their listings. Consult legal counsel for commercial use cases involving bulk personal data.
β Frequently asked questions
Does Zillow Search Scraper work without a Zillow account?
Yes. The Actor makes only unauthenticated HTTP requests to Zillow's public search and detail endpoints β no login, cookie, or Zillow account credential is used or required anywhere in the source.
How often is the scraped data updated?
Every run performs a fresh live fetch against Zillow's search and detail endpoints β there is no caching layer in the source, so each run reflects Zillow's data at the moment it ran, not a stored snapshot.
What happens if a search returns zero listings?
The Actor stops paginating a given URL after three consecutive pages return no new, non-duplicate listings (consecutive_empty_pages >= max_empty_pages in both page_main.py and zoom_main.py), then moves on to the next searchUrls entry rather than erroring the whole run. A zero-result URL is usually a search with no matching inventory, filters set too narrow, or a location string that didn't resolve to a real Zillow region β check the Actor's log for a "Could not resolve a searchQueryState" warning if you passed a bare location or ZIP.
Can I scrape private or login-gated Zillow content?
No. The Actor only reaches the same public search-results and detail pages any visitor sees. Listings that Zillow marks "Contact for price" still return an address and status, but unformattedPrice is null rather than a guessed number, and shouldShowRequestOnPrice reflects Zillow's own flag for that listing.
Can I try Zillow Search Scraper before committing to a paid plan?
Yes. It uses Apify's pay-per-event pricing: row_result is billed at $0.002 per listing row and detail_result at $0.01 per detail-enrichment row (from the Actor's own pricing configuration) β you only pay for events the run actually emits. Check the Pricing tab on the Actor's Apify Store page for current free-usage and plan details.
Does Zillow Search Scraper work for AI agent workflows and LLM pipelines?
Yes β it's callable as an HTTP endpoint by any agent framework via the Apify API, and every response is typed, normalized JSON with stable field names, so it can be passed directly into an LLM context window or an agent's tool-call result without an HTML-parsing step.
How does Zillow Search Scraper handle Zillow's anti-bot system?
It replays a genuine Chrome TLS/JA3 fingerprint via curl_cffi (see src/http_client.py) rather than a stock Python HTTP stack, which Zillow's PerimeterX otherwise blocks on the first request regardless of headers or IP. Responses are checked for known anti-bot markers (captcha/challenge text, or an HTML document served where JSON was expected) so a soft block isn't silently parsed as "zero results." On a block, the proxy manager escalates from a direct connection to Apify Residential proxy, retries with a fresh residential exit IP up to three times, and every request retries up to four attempts total with exponential backoff capped at 8 seconds between attempts.
How does Zillow Search Scraper compare to other Zillow scrapers?
Compared with maxcopell/zillow-scraper and maxcopell/zillow-zip-search (both observed on the Apify Store on 2026-07-26), this Actor's main difference is combining search and per-property detail enrichment in a single run rather than requiring a separate Actor for detail pages, and computing derived pricing metrics (pricePerSqft, priceVsZestimateDelta/Pct) in the row rather than leaving that to the user. memo23/apify-zillow-agents-cheerio (observed on the Apify Store on 2026-07-26) is a different tool entirely β it targets agent profile/directory data from a pre-built database, not property listings.
Does Zillow Search Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names β no HTML, no CSS selectors, no parsing. Pass a dataset item directly into an LLM's context window, index it into a vector store, or route it through an agent tool call.
Can I use Zillow Search Scraper without managing proxies?
Yes. Leaving proxyConfiguration at its default starts the run direct and automatically escalates to Apify Residential proxy if Zillow blocks it; setting proxyConfiguration yourself (for example to Apify Residential explicitly) locks the run to that configuration for its duration.
What happens when Zillow changes its structure or blocks the scraper?
The Actor is maintained against Zillow's internal payload shapes, and the output schema is designed to stay stable on your end β field names and types don't change even when Zillow's underlying data shape does. No numeric turnaround time is published for adapting to a given change.
π¬ Your feedback
Found a bug, or a field you need that isn't in the output yet? We want to know β use the Issues section on the Actor's Apify Console page to report it, and it will be looked at.