Search "structured data vs unstructured data" and most of what comes back is a data-science 101 lesson: spreadsheets are structured, photos are unstructured, here's a table of examples. That's true, but if you run a website, it skips the part that actually matters to you. The real question isn't which bucket your content falls into. It's what happens when a search engine or an AI assistant tries to read a fact off your page, and whether that system has to look the fact up or guess at it.
Those are two very different outcomes, and the difference between them is exactly the line between structured and unstructured data. This post walks through what each term actually means, where the confusing middle category (semi-structured data) fits, and, most usefully, what a machine actually does differently when it hits each kind of content on your site.
What "Structured Data" Actually Means
Google's own documentation defines it plainly: structured data is "a standardized format for providing information about a page and classifying the page content," giving the example of a recipe page stating its ingredients, cooking time, temperature, and calories as separate, labeled facts rather than a paragraph you'd have to read to find them.
The key word is standardized. A database table is structured because every reader, human or machine, already agrees in advance what column three means before looking at a single value in it. Schema.org markup works the same way: when a page includes a JSON-LD block with a telephone property, both your site and the system reading it already share an agreed definition of what telephone means and what kind of value belongs there. Nothing needs to be figured out. It's a lookup, not an interpretation.
That's also why Google leans on it so heavily for rich results, the enhanced search listings with star ratings, prices, or FAQ dropdowns. Google's documentation cites Rotten Tomatoes adding structured data to 100,000 pages and measuring a 25% higher click-through rate on those pages compared to pages without it. The mechanism behind that number is the same one that matters for AI search: a system that can read a fact directly, rather than infer it, can display it, cite it, or act on it with much more confidence.
What "Unstructured Data" Actually Means
Unstructured data is everything on the other end. As CrowdStrike's glossary puts it, this category, "text documents, images, and videos," "lacks any recognizable structure or order" that a machine can act on directly. A paragraph of marketing copy, a customer testimonial, a photo of your storefront, a podcast episode: all unstructured, no matter how good the content actually is.
That last point trips a lot of people up. "Unstructured" doesn't mean disorganized, badly written, or low quality. A tightly edited About page with clear headings and a logical flow is still unstructured data in the technical sense, because nothing on the page declares, in a form a machine can parse without guessing, which sentence is the founding date, which phrase is the service area, and which paragraph is just marketing color. A human reader resolves all of that instantly using language understanding built up over a lifetime. A machine has to do the computational version of the same thing, called inference, and inference is a guess dressed up as an answer. It's often a good guess. It's still a guess, which is the same argument made in more depth in entity grounding: guessing vs. knowing.
The Middle Ground: Semi-Structured Data
Between those two extremes sits semi-structured data, and it's the category most real websites actually live in. CrowdStrike's definition is a useful one: semi-structured data "does not conform to the rigid structure of traditional relational databases but still exhibits some level of structure," sitting between "the unstructured chaos of text documents and the strict schema of structured databases." Common examples include XML, CSV files, and plain JSON: data with some internal organization (fields, tags, nesting) but no universally shared definition of what each field means outside of whatever document you're looking at.
Here's the nuance that most articles on this topic skip entirely, and it matters directly for anyone running structured data on a website: JSON-LD, the format schema.org markup uses, is built on a data format that's technically semi-structured, but it behaves like fully structured data once you add the vocabulary. Plain JSON is semi-structured because a key called "phone" in one JSON file could mean something completely different in another, nothing forces agreement. JSON-LD closes that gap by pinning every property name to a public, shared definition: schema.org's telephone property means the exact same thing on your site as it does on every other site using it, and as it does to whatever system is reading it. The format is semi-structured; the shared vocabulary is what makes the result function as fully structured data. That combination, a flexible format plus a fixed, agreed vocabulary, is the whole reason schema.org markup works as well as it does for machine reading, and it's a big part of why Google recommends JSON-LD over the older Microdata and RDFa formats, which achieve the same agreement but by embedding attributes directly inside your visible HTML rather than in a separate, cleanly readable block.
A plain HTML table sits in this same semi-structured middle ground for a different reason. It has real structure, rows and columns, but no declared meaning behind that structure unless you add it. A <table> listing your business hours has visible rows and columns a browser renders correctly, but nothing tells a machine that column one is a day of the week and column two is an opening time, unless you also add <th> headers or, better, wrap the same information in schema.org's openingHoursSpecification. The visual structure helps a human. It does close to nothing for a machine on its own.
How Each One Actually Gets Read
The practical difference between the three categories shows up the moment something has to extract a specific fact, not just display it.
Structured data (schema.org JSON-LD) is a direct lookup. A system looking for your business's phone number searches the page's JSON-LD block for a telephone property and reads the value. No language processing, no pattern matching, no ambiguity. If the property exists, the fact is there. If it doesn't, the system knows immediately that the fact isn't declared, rather than mistaking a missing fact for a present one.
Semi-structured data (a plain table, a list, a PDF with columns) requires some interpretation, but less than free text. A system can detect that there's tabular structure and use position (first column, second row) as a weak signal, but it's still guessing at meaning from layout, and that guess breaks the moment the layout changes, a column gets reordered, or the same information appears in a slightly different shape on another page.
Unstructured data (a sentence, a paragraph, an image) requires full inference. To pull a phone number out of the sentence "give us a call at 555-0100," a system has to recognize that string of digits as a phone number using a pattern it has learned, the same way it would recognize a phone number in any other context, including one where it's not actually a phone number at all (a product SKU, a zip code plus extension, a date written unusually). This works well for common, unambiguous patterns. It gets noticeably less reliable the moment two facts on a page could plausibly be confused for each other, which is precisely the scenario entity SEO is built to prevent.
One Fact, Three Formats: A Worked Example
Take a single, ordinary business fact: a shop closes at 9pm on weekdays. Here's how that fact looks in each of the three formats, and what happens when an AI assistant is asked "is this place open right now" at 8:30pm on a Tuesday.
Unstructured: the homepage says, in a sentence, "We're here for you most weeknights until 9, so swing by after work." A system has to first recognize this as an hours statement at all (not guaranteed, since it reads more like a marketing line than a fact), then extract "9" as a time, then infer "pm" and "weeknights" mean Monday through Friday closing. Get any one of those inferences wrong and the answer is wrong, with no way for the system to know it guessed.
Semi-structured: the same information sits in a plain HTML table with a "Hours" heading, rows for each day, no markup beyond ordinary HTML. A system can now more confidently associate "Tuesday" with "9:00 PM" by table position, which is a real improvement over free text, but it's still inferring the table's meaning from its shape, and that inference fails silently if the table is later restyled as a list or moved into an image.
Structured: the same fact is declared through schema.org's openingHoursSpecification, with dayOfWeek, opens, and closes as explicit properties. A system reading the page doesn't infer anything. It reads Tuesday, closes: 21:00, compares that to the current time, and answers correctly, every time, regardless of how the page's visible design changes around it.
Nothing about what a visitor sees needs to change between these three versions. What changes is whether a machine reading the page is looking a fact up or reconstructing it from context, which is the entire practical stake in this comparison.
Common Mistakes
Assuming well-formatted content is already structured data. Headings, bullet points, and bold text make a page easier for a human to scan. None of that is structured data in the technical sense unless it's also declared through schema.org markup, Microdata, or RDFa. Formatting is a presentation choice; structured data is a separate, machine-readable declaration underneath it.
Treating a table or PDF as "structured" just because it has columns. As covered above, visible tabular layout is semi-structured at best, and a PDF without accessible tags is often closer to unstructured, since many PDF readers extract it as an undifferentiated text stream. Neither reliably declares what each value means without additional markup.
Assuming plain JSON and JSON-LD are interchangeable. They share a syntax but not a function. Arbitrary JSON with no shared vocabulary is semi-structured data; JSON-LD using schema.org's vocabulary is functionally structured data because the property names carry an agreed, public meaning. Confusing the two leads people to think any JSON on a page counts as SEO-relevant structured data, when only the schema.org-vocabulary version does.
Marking up facts that aren't actually true or verifiable, to chase the "more structure is always better" idea. Structured data only helps if it's accurate. A foundingDate or award property that's approximated or aspirational isn't a shortcut to credibility, it's a fabrication risk, covered in more depth in how schema generation works. The goal is closing the gap between what's true and what's declared, not maximizing the amount of markup on a page.
Assuming today's AI models are now "smart enough" to make structured data less necessary. Language models keep getting better at inferring facts from prose, which makes this myth feel more plausible every year, not less. But better inference is still inference: it's a probability, re-run fresh every time a system reads your page, rather than a stable, declared fact it can point back to. That gap doesn't shrink to zero just because the guessing gets more accurate; it just gets harder to notice, right up until a model update, a competitor's page becoming a stronger pattern match, or a genuinely unusual fact about your business exposes it.
How to Check Where Your Own Site Falls
You don't need a specialized tool for a first pass, just a browser and a specific question for each important fact on your site: if I had to look this up as a machine, would I find a labeled field, or would I have to read a sentence and guess?
To check mechanically: view your page's source (right-click, "View Page Source," not the rendered page) and search for application/ld+json. If it's there, you likely have real structured data for at least some facts, though the presence of a block doesn't guarantee every fact you care about is inside it, common gaps are covered in common schema markup errors. If you find a <table> or a bulleted list holding an important fact with no accompanying JSON-LD, that fact is semi-structured at best, readable by a human, not reliably readable by a machine. If the fact only exists inside a paragraph of prose, it's unstructured, and an AI system quoting it back correctly is doing real inferential work every single time, work that can fail differently depending on which system is doing the reading and when.
Run that same check for the facts that actually matter most: your business's identity, hours, location, pricing model, and the specific things that make you different from a competitor with a similar name. Those are exactly the fields worth moving out of prose and into a genuine structured declaration first.
Frequently Asked Questions
Is your site ready for AI?
Get a free readiness score in under a minute. No signup, no card.
Run the free check