UCSF Industry Documents Library Solr API

Public, unauthenticated Apache Solr query interface over the UCSF Industry Documents Library, an archive of 28,298,987 internal documents from the tobacco, drug, chemical, food, fossil fuel and opioid industries, produced in litigation and preserved by the UCSF Library Center for Knowledge Management. Documents are retrieved by eight-character ID or by Solr field query with AND / OR / NOT and explicit parentheses, and serialized as xml, json, python, ruby, php or csv. UCSF documents the interface in its "Industry Documents Data API v5" PDF. Two defects were confirmed on 2026-08-19: the documented `rows` parameter is accepted and echoed back but not honoured — the deployed page size is 1000 records, not the documented 100 — and the documentation page UCSF links to is now a client-side route in a single-page application that returns the same 200 shell for every path, so the authoritative PDF survives only in the Internet Archive. Verified live 2026-08-19.

OpenAPI Specification

ucsf-industry-documents-solr-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: UCSF Industry Documents Library Solr API
  version: '5'
  description: >-
    Public, unauthenticated Apache Solr query interface over the UCSF Industry Documents
    Library (IDL) — an archive of 28.2 million internal documents from the tobacco, drug,
    chemical, food, fossil fuel and opioid industries, produced in litigation and preserved
    by the UCSF Library Center for Knowledge Management (CKM). The interface is documented
    by UCSF in "Industry Documents Data API v5" and is queried directly against the IDL
    Solr server. This OpenAPI description is DERIVED by API Evangelist from that UCSF
    documentation plus live probed responses; UCSF does not publish an OpenAPI document.
  termsOfService: https://www.industrydocuments.ucsf.edu/copyright/
  contact:
    name: UCSF Industry Documents Library
    url: https://www.industrydocuments.ucsf.edu/
  license:
    name: UCSF Copyright and Fair Use statement
    url: https://www.industrydocuments.ucsf.edu/copyright/
  x-operator: institution
  x-operator-evidence: >-
    servers[] host solr.idl.ucsf.edu is under the ucsf.edu registrable domain; idl.ucsf.edu
    redirects to www.industrydocuments.ucsf.edu; the CNAME target libckm.org is the UCSF
    Library Center for Knowledge Management's own infrastructure domain (github.com/ucsf-ckm,
    "UCSF Center for Knowledge Management", 74 repositories). No other institution in the
    248-university cohort claims this host.
  x-provenance:
    generated: '2026-08-19'
    method: derived
    source:
      - https://www.industrydocuments.ucsf.edu/wp-content/uploads/2022/02/IndustryDocumentsDataAPI_v5.pdf
      - https://web.archive.org/web/20230130203403/https://industrydocuments.ucsf.edu/research-tools/api/
      - https://solr.idl.ucsf.edu/solr/ltdl3/query?q=id:kylw0221&wt=json
servers:
  - url: https://solr.idl.ucsf.edu/solr/ltdl3
    description: UCSF Industry Documents Library production Solr collection (ltdl3)
tags:
  - name: Documents
    description: Query the IDL document corpus by identifier or by Solr query syntax.
paths:
  /query:
    get:
      tags: [ Documents ]
      operationId: queryDocuments
      summary: Query the Industry Documents Library corpus
      description: >-
        Executes a Solr query against the IDL corpus. Retrieve a single document with
        `q=id:<8-character-id>`, or run a field query using Solr syntax with AND / OR / NOT
        and explicit parentheses. Results are paged 100 records at a time via `start`.
        Ampersands inside field values must be percent-encoded as %26.
      parameters:
        - name: q
          in: query
          required: true
          description: >-
            Solr query. Examples — `id:kylw0221`; `author:glantz`;
            `(author:glantz AND industry:tobacco)`;
            `((collection:"brown %26 williamson" AND type:letter) NOT brand:kool)`;
            `documentdateiso:[2001-01-01T00:00:00Z TO 2011-12-31T00:00:00Z]`.
          schema: { type: string }
          example: 'id:kylw0221'
        - name: wt
          in: query
          required: false
          description: Writer type — the response serialization format.
          schema:
            type: string
            default: xml
            enum: [ xml, json, python, ruby, php, csv ]
        - name: start
          in: query
          required: false
          description: >-
            Zero-based offset into the result set. Honoured. The deployed page size is 1000
            documents (UCSF's documentation says 100).
          schema: { type: integer, minimum: 0, default: 0 }
        - name: rows
          in: query
          required: false
          description: >-
            Accepted and echoed back in responseHeader.params, but NOT HONOURED by the deployed
            /query request handler as of 2026-08-19 — rows=0, rows=1, rows=5 and rows=100 all
            return the same 1000-document page. UCSF's own published documentation states that
            "we only return 100 records at a time" and instructs callers to page with start=100;
            the deployed page size is 1000. Page with `start` and read the actual length of
            response.docs rather than assuming a page size.
          schema: { type: integer, minimum: 0 }
          x-deployed-behavior: ignored
          x-verified: '2026-08-19'
        - name: fl
          in: query
          required: false
          description: Comma-separated list of fields to return.
          schema: { type: string }
      responses:
        '200':
          description: Solr response envelope containing matched documents.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/SolrResponse' }
            application/xml:
              schema: { type: string }
            text/csv:
              schema: { type: string }
        '400':
          description: Malformed Solr query.
        '403':
          description: Request rejected — collection not exposed, or edge protection engaged.
        '404':
          description: Unknown Solr collection.
components:
  schemas:
    SolrResponse:
      type: object
      properties:
        responseHeader:
          type: object
          properties:
            status: { type: integer }
            QTime: { type: integer }
            params: { type: object, additionalProperties: true }
        response:
          type: object
          properties:
            numFound: { type: integer, description: Total records matching the query. }
            start: { type: integer }
            numFoundExact: { type: boolean }
            docs:
              type: array
              items: { $ref: '#/components/schemas/IndustryDocument' }
    IndustryDocument:
      type: object
      description: One archived industry document record as indexed in the ltdl3 collection.
      properties:
        id: { type: string, description: 'Eight-character document identifier: four letters then four digits. Case-insensitive.', example: kylw0221 }
        tid: { type: string, description: Legacy transfer identifier. }
        collection: { type: array, items: { type: string } }
        collectioncode: { type: array, items: { type: string } }
        industry: { type: array, items: { type: string }, description: 'tobacco | drug | chemical | food | fossilfuel | opioids' }
        availability: { type: array, items: { type: string }, description: 'e.g. public, no restrictions' }
        case: { type: array, items: { type: string }, description: Litigation case the document was produced in. }
        title: { type: string }
        author: { type: array, items: { type: string } }
        mentioned: { type: array, items: { type: string } }
        witness: { type: string }
        type: { type: array, items: { type: string } }
        brand: { type: array, items: { type: string } }
        box: { type: string }
        pages: { type: integer }
        bates: { type: string }
        batesexpanded: { type: string, description: Expanded bates range — query bates numbers against this field. }
        description: { type: string }
        documentdate: { type: string, description: 'String date in "YYYY Month DD" form, e.g. "2014 November 25".' }
        documentdateiso: { type: string, format: date-time, description: ISO form of documentdate — use this field for range queries. }
        dateaddeducsf: { type: string }
        dateaddedindustry: { type: string }
        datemodifiedindustry: { type: string }
        dateshipped: { type: string }
        minnesotarequestnumber: { type: string }
        cited: { type: array, items: { type: string } }