Understanding the Solr JSON Response

Solr API

Ask with wt=json and every answer of your index is built from the same parts. This is what each one holds.

01 · The parts

PartWhenWhat it holds
responseHeaderAlwaysstatus 0 means success. QTime is the time Solr spent, in milliseconds, network not included.
responseAlways, unless there is an errornumFound (all the matches), start (the offset you asked for), maxScore (when fl asks for the score) and docs, the results of this page.
highlightinghl=trueSnippets with the searched words marked, keyed by document id: Highlighting.
facet_countsfacet=trueCounts per value: Facets.
spellcheckspellcheck=trueCorrections: Did you mean.
errorOn failureThe reason and the HTTP code.

02 · A result

{
  "id": "1f9e6cba8357fe106a950a1f80b301cc",
  "uri": "https://www.example.com/blog/solar-panels",
  "title": "Solar Panels for Small Roofs",
  "description": "How many panels fit on a small roof, and what they produce.",
  "og_image": "https://www.example.com/img/solar.jpg",
  "meta_domain": "example.com",
  "meta_detected_language": "en",
  "content_type": "text/html",
  "creation_date": "2026-09-14T08:30:00Z",
  "score": 0.853
}

A result carries the fields named in fl; score is there only when fl asks for it. What each field holds: the core fields and the fields Opensolr adds to every document.

03 · Facets

Each facet is a flat list of value, count, value, count:

"facet_counts": {
  "facet_fields": {
    "meta_detected_language": ["en", 834, "de", 245, "fr", 123]
  }
}
var pairs = data.facet_counts.facet_fields.meta_detected_language;
var facets = [];
for (var i = 0; i < pairs.length; i += 2) {
  facets.push({ value: pairs[i], count: pairs[i + 1] });
}

With json.nl=map in the request, the same facet comes back as an object instead: {"en": 834, "de": 245}.

04 · Did you mean

"spellcheck": {
  "suggestions": ["bakup", {"numFound": 3, "startOffset": 5, "endOffset": 10, "suggestion": ["backup", "backups", "baked"]}],
  "collations": ["collation", "solr backup", "collation", "solr backups"]
}

collations alternates the word collation with a whole corrected search; the first one is collations[1].

05 · Errors

{
  "responseHeader": { "status": 400, "QTime": 36 },
  "error": {
    "metadata": ["error-class", "org.apache.solr.common.SolrException", "root-error-class", "org.apache.solr.common.SolrException"],
    "msg": "undefined field nonexistent_field",
    "code": 400
  }
}

The HTTP status of the answer is the same code. 400 means the request is wrong (syntax, a field that does not exist, a bad value); 401 means the username or password is wrong; 500 is an error inside Solr, and your Error Log shows it.