SA Hot Chicken Public record

Methodology

The whole formula, in public.

A composite score nobody can check is just an opinion with decimal places. So here is every input, every weight, and the arithmetic run on real San Antonio businesses. If you think we got one wrong, you now have everything you need to prove it.

Who publishes this, and what they sell. This guide is published by Viking Net, which sells technology services to restaurants — websites, apps, point-of-sale systems and card processing — including to businesses rated on this site. Every rating here is computed by a formula published in full from public records: health inspections, city 311 complaints, published awards, and the state sales-tax permit date. No business can pay to change its score, raise its rank, or have a low score removed, and none has ever been asked to. If that ever changes, this paragraph comes down first.

There is no paid placement, no sponsored ranking, no “featured” tier that moves a number, and no way to pay to have a low score removed. Buying our services does not change a Bird Score, and declining them does not either. Where a business on this list is a Viking Net customer, we say so on its page, next to its score — no listing currently carries that notice, because we have no restaurant customers on this list yet. That separation is the reason the whole formula is below: a score built from public records and arithmetic you can rerun is a score nobody can quietly buy.

Before the arithmetic, the limits.

An inspection score describes one visit on one day. It is what one inspector recorded on one date at one address — Metro Health says so itself. It is not a standing condition, not a grade for the food, and not a prediction about your lunch. A kitchen that scored 88 in March may be spotless today, and one that scored 100 may not be.

A 311 complaint is a phone call, not a finding. The city records that a member of the public called. It is not a citation, not an investigation result, and not evidence that anything was wrong. The city files it against an address, so where two food businesses share one, neither the record nor we can tell them apart. We publish the count with its denominator and let you weigh it.

Awards are reported, not endorsed. Every recognition on this site carries its publisher, its year and a link to the page we read it on. We did not judge those contests and we do not vouch for them; where a publisher named a business rather than an address, the page says so.

Absence of data is never rendered as a finding. No inspection on record means no Bird Score — never a zero, never quietly ranked last. No award found means we searched 172 recognitions from 13 publishers and found none, which is a statement about press coverage and not about cooking.

If something here is wrong, we will fix it. Every figure links to the record it came from. Email us with the correction and we will check it against the source and correct it within 48 hours, whether or not you are a customer. How to request a correction.

The formula

BIRD SCORE = clamp( 0.35·Q + 0.25·S + 0.15·E + 0.25·R + X + V + T + L , 0 , 100 )
TermWhat it isRangeWeightWhere it comes from
QConsumer rating, volume-adjusted and recency-weighted0–1000.35First-party reviews collected on this site
SSafety score from the health inspection record0–1000.25Public health inspection records
EEditorial tasting score0–1000.15Our own visits
REditorial recognition — awards and best-of placements0–1000.25172 source-cited recognitions, 13 publishers, 2005–2026
XCross-source agreement modifier−4 to +3addedComputed across available rating sources
VEvidence-depth discount−6 to 0addedHow much inspection evidence S rests on
TComplaint-theme penalty−18 to 0addedCity of San Antonio 311 food complaints
LTenure at this address0 to +3addedTexas Comptroller sales-tax permit, first reported sale

The weights changed when R was added, and it is worth saying so out loud rather than quietly shipping different numbers than the ones we published first. The original specification gave Q 0.40, S 0.35 and E 0.25. R is funded out of all three — Q to 0.35, S to 0.25, E to 0.15 — so the four still sum to 1.00 and Q still leads.

What the score is actually made of today

Publishing the formula is worth nothing if we quietly run a different one. So, precisely and uncomfortably:

  • Q is not in any score on this site. Q comes from first-party reviews collected here, and there are none yet. The formula's own cold-start rule would hand every establishment the category average of 80.00 — and that is exactly what we do not do. A constant cannot separate anybody; with the largest single weight in the formula identical for everyone, the whole list compressed into a narrow band and thirteen establishments tied for first. So the term is dropped, not defaulted, and its weight is redistributed across the terms that actually have data — the same mechanism the formula already uses for a missing tasting score. When real reviews exist, Q comes back and the weights un-redistribute themselves.
  • E exists only where we have actually eaten. Right now that is nowhere: not one tasting score has been entered, because we have not made the visits. We would rather ship an incomplete formula than a fictional one. Where there is no visit, the term is dropped exactly like Q.
  • R is real and it is doing most of the work. It comes from 172 published awards and best-of placements — 13 publishers, 2005 to 2026, every one with a source link. 35 of the 131 establishments here have at least one. Full weighting below.
  • X is −2 everywhere. There is exactly one rating source behind these numbers. A single-source score deserves less confidence and the formula docks it accordingly.
  • V is real and it differs per establishment. Two spotless records are not the same claim if one rests on seven inspections and the other on one. V discounts a score by how thin the inspection evidence under it is. It is only ever a discount — nothing gets a bonus for being well documented, and nothing bad is quietly rescued by being under-documented.
  • T is real and comes from the City of San Antonio's 311 record of Metro Health food-establishment complaints, which is a public record like the inspections are. It applies to 31 of 112 ranked establishments.
  • L is real and small. How long the current business has been trading at that address, from the state sales-tax permit, capped at +3. We matched it for 91 of 131 listings. Read the wording caveat — it is not a founding date and we will not print it as one.

So today's ranking is half inspection record and half published recognition, adjusted for how much evidence sits under each, for public complaints, and slightly for how long the doors have been open. No taste of our own, no consumer reviews, nothing anyone told us privately. We would rather say that plainly than let an eight-part formula imply more than it currently knows.

Across 112 ranked establishments there are 100 distinct scores, and the largest group sharing one is 3. Tied scores share a rank rather than being ordered arbitrarily; where two establishments score identically we list the one with the more recent inspection first, on the grounds that the same number backed by a fresher visit is better evidenced.

R — editorial recognition

Until this term existed, every score on this site was computed from health-inspection records alone. The result was a top ten of national chains, because a corporate compliance department reliably produces a spotless inspection record and nothing in the arithmetic could tell that apart from good chicken. The most decorated chicken restaurant in San Antonio sat thirty-four places below KFC. A San Antonio reader would have found that absurd, and they would have been right.

What R is, exactly. An award, or a place on a published best-of list, is a reportable fact with a citation. “Won Best Fried Chicken in the 2025 San Antonio Current readers' poll” is ordinary journalism. That is categorically different from republishing a platform's star average, which we are not licensed to do and do not do. So this term reads exactly four things per row: the award, the year, the publisher, the URL. No star ratings. No review text. No number derived from anybody's rating database.

points = tier x recency x publisher x scope R = 100 x SUM(points) / (SUM(points) + 6)

The saturating shape is deliberate: the tenth award should move a business less than its first, and no amount of press should be able to buy the term outright.

Tier — not all recognition is the same recognition

TierWhat it isWeight
AAward, outright winner, or ranked first — a Michelin Bib Gourmand, a readers'-poll first place, a category award, a James Beard nod3.0
BRanked below first in a numbered list — “#3 of 10”. Scaled by position: 1.5 × (1 − (rank−1)/N), so #2 of 10 earns 1.35 and #10 of 10 earns 0.151.5×
CNamed in a roundup with no ranking, a nominee, a feature. Presence, not preference — and a third of the corpus is this0.4

Ranking first is treated as a win rather than a “placement”. A critic putting a restaurant at the top of their list is making the same claim a readers' poll makes when it names a winner, from a better-qualified source, and scoring it lower would have ranked it below the poll it beats.

Recency — a 2026 win outranks a 2009 mention

Age of the awardWeight
2 years or less1.0
3 to 4 years0.7
5 to 9 years0.4
10 years or more0.2

Publisher — a jury outranks a phone vote

This is not snobbery, it is a measured correction. Readers' polls carry the same chain bias this term exists to remove. San Antonio Current's Best Wings went to Wingstop in 2018, 2021 and 2023 and to Pluckers in 2019, 2020 and 2022. Juried awards and critics' lists do not behave that way, so they are weighted above a popular vote.

PublisherWeightWhy
Michelin, James Beard Foundation2.0Juried, national, and hard to get
San Antonio Express-News1.5A named critic's ranked list
Eater, GQ, Texas Monthly1.3Editorial selection, national or statewide
San Antonio Magazine1.2Editorial selection, local
CultureMap San Antonio1.1Local awards, part public vote
San Antonio Current, MySA1.0Readers' polls — real, and biased toward the familiar
Eat This, Not That!0.8The inclusion is genuine; the list carries no rank numbers at all, so nothing here is rendered as “#4”

Scope — awards attach to a place, publishers name businesses

Where a business has several locations in this guide and no published award names one, every location shows the award at a 0.6 discount and its page says the publisher did not name a location. The alternative is guessing an address, which this project does not do.

R = 0 is a measurement, not a default — and that distinction is the whole reason it is allowed to be a zero. Q's cold start asserts the category average: a number nobody measured, identical for everybody, carrying no information. That is why Q is dropped rather than defaulted. R's zero says something specific and true: we read 172 recognitions from 13 publishers spanning 2005–2026, and this business is in none of them. That is a statement about press coverage, not about the chicken. A restaurant nobody has written about is not thereby bad — it is unwritten-about, which is exactly the gap our own tasting visits are meant to close. If we have missed an award, send us the link.

117 of the 172 recognitions we hold are attached to a listing here. The other 55 are not, and each one has a written reason: the restaurant is not chicken-forward and so is not in this guide, or the publisher named a business we cannot resolve to a single address, or the award went to a different restaurant with a confusingly similar name. We do not attach an award we cannot place.

L — how long at this address

L = 3 x min( 1 , years_at_this_address / 25 )

From the Texas Comptroller's Active Sales Tax Permit Holders file, which records the first reported sale for every permitted outlet in the state. It is public domain, refreshed weekly, and populated on essentially every restaurant in Bexar County back to 1961. We matched it to 91 of the 131 listings here by address.

This is “serving at this address since 2002”. It is never “founded in 2002”, and the difference is not pedantry.

A sales-tax permit is reissued when a business changes hands, and the date resets. One Church's franchisee holds eight San Antonio addresses all stamped 28 December 2017 — that is a single acquisition, not eight simultaneous grand openings, and Church's dates to 1952. Earl Abel's reaches back only to 2019 under its current entity; the restaurant is far older. There is no flag in the data separating a genuine 1961 survivor from a 2017 change of ownership, so the date is a floor: the earliest we can prove, not the day the doors opened. Printing it as a founding date would be false on every business that has ever been sold.

It is deliberately a mild term. Tenure says a business has managed to keep paying rent, which is worth something and is not worth much. Capped at +3, it can break a tie between two otherwise identical records and it cannot carry a bad one. Nothing is penalised for being new: a restaurant that opened last year scores L = 0, the same as one we could not match, and its page says which of the two it is.

V — the evidence-depth discount

V = -6 x ( 1 - SUM(w) / (SUM(w) + 1) )

SUM(w) is the same sum of recency weights S already computes: a fresh inspection is worth about 1.0, one a year old about 0.5, one three years old about 0.13. So a business inspected seven times, several of them recently, takes about −1.5. One inspected once, eleven months ago, takes about −3.9. One resting on a single three-year-old visit takes about −5.4.

This is the same idea as the Bayesian volume adjustment in Q — how much evidence it takes before we believe a business more than we believe the category — applied to the inspection record. It is also what gives the staleness rule teeth: an old record has a small SUM(w) by construction, so it is discounted continuously rather than by a flag nobody can see in the number.

This term is ours, not the original specification's. We added it, and we are telling you we added it, because without it thirteen establishments with flawless records were arithmetically tied and the ranking could not tell you anything about them at all.

T — 311 complaints

The City of San Antonio publishes every 311 service request routed to Metro Health about a food establishment: the type, the date it was opened, and the address it was filed against. This extract holds 2,451 cases opened between July 27, 2025 and July 31, 2026.

We attributed 57 of them (2.3%) to 31 establishments on this site. The other 2,394 we did not, and they are counted nowhere. That is the correct outcome, not a failure: most of them are about the thousands of San Antonio food businesses that are not chicken places and are not on this list.

A complaint is only attached to a business when the house number, street and ZIP match exactly after normalisation, the street directionals agree, unit numbers agree or neither side has one, and exactly one establishment in this guide sits at that address. Anything ambiguous is dropped. We never match on business name — the city's complaint record does not contain one.

What a 311 case is and is not. It is a record that a member of the public called the city. It is not a finding, not a citation, and not proof that anything was wrong. The city files it against an address, not a business, so where two food businesses share a street address neither the record nor we can tell them apart. We publish the count, the total it came from, the window, the dates and a link, and we never write a sentence claiming a complaint is true.

Complaint typeMax costNotes
Reported illness8Halved unless a health inspector independently cited a CDC risk factor at the same business. Six coordinated phone calls cannot move a score far on their own.
Pests5
Food contamination5Includes food-contact surfaces.
General sanitation4Includes ventilation.
Hygienic practices4
Selling without a permit0Reported, never scored. These are overwhelmingly reports of an unpermitted vendor operating near an address. Charging the permitted business for it would invert what the complaint says.
Smoking0Reported, never scored. Not a food-safety signal.

A type costs its full weight at two or more cases and half of it at one, and T is capped at −18 in total. One phone call is one phone call; a pattern is a pattern.

S — the safety score

San Antonio inspections start at 100 and subtract demerits for each violation: 3 points for the most serious, then 2, then 1. Sixty-nine or below fails.

Raw scores are almost useless on their own because they bunch up: across this corpus the latest scores span only 83–100. A 100 and a 90 look nearly identical to a reader and are not. So we do four things:

w = 0.5^(age_months / 12) inspections within 36 months S_base = SUM(w·score) / SUM(w) S_scaled = clamp( (S_base - 78) x 100/22 , 0 , 100 ) P_repeat = 6 x (risk factors in 2+ of the last 3), max 24 P_trend = 8 if latest < (mean of previous 3) - 5 S = clamp( S_scaled - P_repeat - P_trend , 0 , 100 )
  1. Weight by recency. An inspection from last month says more about the kitchen than one from two years ago, so each score is weighted with a 12-month half-life.
  2. Rescale. The 78–100 band is where the information actually lives, so we stretch it across the full 0–100 range. 100 stays 100; 95 becomes 77; 90 becomes 55; 85 becomes 32; 80 becomes 9.
  3. Punish repeats, not one-offs. One temperature violation is a bad Tuesday. The same cold-holding failure across three consecutive inspections is a broken process. Only the five risk factors the CDC ties to foodborne illness count here: temperature control, handwashing and glove use, sanitizing, cross-contamination, and date marking.
  4. Punish a slide. A sharp drop from a business's own recent baseline costs 8 points.

Stale records. If the newest inspection is more than 400 days old we flag it on the page, and the evidence-depth discount above handles it in the arithmetic. We will not score a restaurant on a three-year-old visit and let it read as current.

Missing records. If there is no published inspection score, the establishment gets no Bird Score and the page says which of several different things went wrong — the jurisdiction publishes nothing, the business is not on its roster, only a letter grade exists, or the record itself is flagged bad by the people who published it. It is never scored as a zero, and it is never quietly ranked last. 19 of the 131 establishments here are in that position.

Per location, never per brand. Every score keys on the permit record for one address, not the name over the door. Two locations of the same chain in this dataset can differ by a wide margin, and averaging them would hide exactly the thing you came here to find out.

Q — the consumer rating

R̄ = SUM(w·r) / SUM(w) w = 0.5^(age_months / 18) Q_raw = (v·R̄ + m·C) / (v + m) m = 75, C = corpus mean rating Q = 25 · (Q_raw - 1) maps 1-5 stars onto 0-100

This is Bayesian shrinkage, and it exists to stop a perfect 5.0 from eight reviews outranking a 4.6 from two thousand. m = 75 is how much evidence it takes before we believe a business more than we believe the category.

None of this is running yet. The table below is what Q will do once first-party reviews exist. Today it contributes nothing to any score on this site, because we refuse to let its cold-start default — the last row, 80.00 for everybody — masquerade as a measurement.

InputQ_rawQ
5.0 from 8 reviews4.277181.93
4.9 from 34 reviews4.418385.46
4.3 from 480 reviews4.286582.16
4.6 from 2,000 reviews4.585589.64
3.9 from 1,200 reviews3.917672.94
No reviews — the cold-start default we do not use4.200080.00

What we deliberately do not publish

No Yelp, Google, TripAdvisor or Facebook ratings

Not a single one, anywhere on this site. This is a licensing constraint, not an oversight. Yelp's developer display requirements prohibit blending their star rating into any composite — “no aggregated overall ratings which utilize multiple sources” — and also cap how long their data may be stored. Google's Maps Platform terms separately prohibit using their content in a listings or directory service and prohibit creating derived content from it. Both also block automated collection outright.

We could have scraped them anyway. Plenty of guides do. A rating we are not allowed to show is worth less to you than one we can stand behind, and a site that breaks two platforms' terms on day one is not a site that lasts.

No claim that anyone got sick

We do not and will not say a business made someone ill. That is a factual accusation, it is unverifiable from reviews, and it is trivially gamed — six fake posts could tank a competitor and take our credibility with it. If we ever publish illness signal from reviews, it will appear only as a count with its denominator, a date, and a link to the source (“11 of 340 reviews mention illness. Most recent: March 14, 2026”), never as a badge, a warning icon, or a colour. It is also suppressed entirely below 50 total reviews, and it only counts at full weight when a health inspector independently found a matching risk factor in the same window.

What we do publish instead

The inspection record. Dates, scores, and what the inspector wrote, translated into language a normal person can act on, with a link to the original city record on every page. The fact does the work.

How we translate a Food Code citation

Inspection reports are written for inspectors. “6-301.12 Hand drying provision” means nothing to somebody choosing lunch, so every citation on this site gets three things: a plain-English headline, one line on why it matters for the food, and the official Food Code section title underneath so you can check our translation against the real code.

Section titles come from the FDA Food Code 2022 full text. The plain-English wording is ours. Category labels — temperature control, handwashing, pests, and so on — are our classification, and the five marked as illness risk factors are the ones the CDC identifies as foodborne-illness precursors.

No invented tasting scores

E is the one number here that cannot be checked against a public record. Nobody can re-run our opinion of the chicken the way they can re-run S against the city portal. So the file it lives in shipped with zero rows, and it gains a row only when somebody has actually eaten the food and written down what they thought, with the date. Right now it is still zero, and the ranking you are reading contains no opinion of ours about how anything tastes. Every establishment with a tasting score shows the visit dates and the rating from each one, so you can see exactly what the number is made of.

Where the data comes from

  • Inspections, San Antonio: the City of San Antonio Metropolitan Health District public inspection portal, observed August 6, 2026. 106 of the 131 establishments here. Records run from August 2021 to August 3, 2026. We re-check monthly and flag anything older than 400 days.
  • Inspections, the surrounding towns: each jurisdiction's own record, where one is published — Seguin's inspection feed, Boerne and Kendall County's portal, Cibolo's posted grades. 25 establishments here sit outside San Antonio, and the coverage is genuinely uneven: several of those counties publish nothing at all, so those businesses are listed with no score and a note saying which portal we checked and what we found. A missing score there is a fact about the county, not about the restaurant.
  • Complaints: the City of San Antonio 311 record of service requests routed to Metro Health about food establishments. San Antonio only — the surrounding towns are not in it, which is why their pages say so rather than showing a reassuring zero.
  • Area labels are derived from the ZIP code on the permit record. They are a rough sector of town so you can scan by neighbourhood, not a precise neighbourhood boundary and not a claim about the business. Where the permit record has no ZIP, we say “area not recorded.”
  • Brick-and-mortar or truck is only shown where we have actually recorded it in our own field research. Permit records do not reliably distinguish the two, so most listings show only whether the location is independent or part of a chain. We would rather leave a badge off than guess.
  • Known gap: trucks and pop-ups are under-represented here, because many are permitted under an LLC name that never matches the name on the truck. If that is you, tell us and we will add you.

Worked examples on real businesses

Same arithmetic as above, run on three establishments from this list — the top of the ranking, the middle, and the bottom — so you can see the formula behave across the range.

Chatman's Chicken — Bird Score 81.8

1747 W W WHITE RD S, East Side · Metro Health licence 19635 · source record

InspectionScoreAge (mo) w = 0.5^(m/12)w × score
03/11/20261004.90.755175.51
05/08/20259914.90.421741.75
12/10/20249819.80.317931.15
08/23/202410023.40.258525.85
05/09/20249526.90.211420.08
02/02/20249230.10.175816.18
08/10/20239235.90.125911.58
Totals 2.2663222.11
S_base = 222.11 / 2.2663 = 98.002 S_scaled = (98.002 - 78) x 100/22 = 90.92 P_repeat = 6 x 0 repeat risk factor(s) [none] = 0 P_trend = 0 (latest 100 vs prior mean 99.0) S = 90.92 - 0 - 0 = 90.92 V = -6 x (1 - 2.2663 / (2.2663 + 1)) = -1.84 T = 0.00 (0 attributed 311 complaint(s)) Bird = 0.5000(S 90.92) + X(-2) + V(-1.84) + T(+0.00) = 81.8

Babe's Crispy Chicken — Bird Score 40.5

12020 O CONNOR RD, Northeast Side · Metro Health licence 1800617 · source record

InspectionScoreAge (mo) w = 0.5^(m/12)w × score
12/18/20251007.60.645164.51
05/22/202510014.50.433143.31
11/14/202410020.70.302630.26
Totals 1.3807138.07
S_base = 138.07 / 1.3807 = 100.000 S_scaled = (100.000 - 78) x 100/22 = 100.00 P_repeat = 6 x 0 repeat risk factor(s) [none] = 0 P_trend = 0 (latest 100 vs prior mean 100.0) S = 100.00 - 0 - 0 = 100.00 V = -6 x (1 - 1.3807 / (1.3807 + 1)) = -2.52 T = -5.00 (2 attributed 311 complaint(s)) Bird = 0.5000(S 100.00) + X(-2) + V(-2.52) + T(-5.00) = 40.5

Wing Daddys Sauce House #10 — Bird Score 1.4

2120 JACKSON KELLER, North Central / Castle Hills · Metro Health licence 711795 · source record

InspectionScoreAge (mo) w = 0.5^(m/12)w × score
06/29/2026831.20.930477.23
09/02/20258611.10.526645.28
03/04/20258517.10.372831.69
08/20/20249323.50.257023.90
03/04/20249329.10.186517.34
08/15/20238735.70.127111.06
Totals 2.4004206.50
S_base = 206.50 / 2.4004 = 86.028 S_scaled = (86.028 - 78) x 100/22 = 36.49 P_repeat = 6 x 4 repeat risk factor(s) [temp control, handwash glove, cross contam, sanitizer] = 24 P_trend = 0 (latest 83 vs prior mean 88.0) S = 36.49 - 24 - 0 = 12.49 V = -6 x (1 - 2.4004 / (2.4004 + 1)) = -1.76 T = -2.50 (1 attributed 311 complaint(s)) Bird = 0.5000(S 12.49) + X(-2) + V(-1.76) + T(-2.50) = 1.4

Corrections

Every establishment page links to the original city record and carries a correction link. If a figure is wrong or out of date, email us and we will check it against the portal and fix it within 48 hours. Health inspection scores describe one visit on one day. Metro Health states that itself, and it is worth repeating: a score is a snapshot, not a standing condition.

Ask about the methodology