15. Query an OPTIMADE server

OPTIMADE is the generic HTTP interface for materials data. The client below uses a plain base_url, so the same code works with any compatible provider. Use providers.optimade.org to discover provider endpoints, then assign the selected OPTIMADE base URL to base_url.

For the captured output below, base_url points at a local httk₂ OPTIMADE server backed by the presentation.sqlite store from the earlier tutorial sequence. The client does not depend on that server implementation; replace the URL with any provider endpoint.

15.1. Discover and filter structures

OptimadeStore is the synchronous, read-only OPTIMADE client. It discovers the service schema first, then exposes one portable search root. The element filter is an OPTIMADE list query; it selects the Ca–Ti–O structure without relying on a provider-specific endpoint name or database API.

from httk.atomistic import OptimadeStructure, UnitcellStructureView
from httk.serve.optimade import OptimadeStore

base_url = "http://127.0.0.1:18770"

with OptimadeStore(base_url) as store:
    print("entry types", [entry_type.name for entry_type in store.entry_types])

    search = store.searcher()
    structure = search.variable(OptimadeStructure)
    search.add(
        structure.elements.has("Ca")
        & structure.elements.has("Ti")
        & structure.elements.has("O")
    )
    rows = [row for row in search.results(structure=structure)]
    print("matches", len(rows))

    for row in rows:
        remote = row.structure
        loaded = UnitcellStructureView(remote)
        print("loaded", type(remote).__name__, remote.id, loaded.elements, loaded.nsites)
entry types ['structures']
matches 1
loaded OptimadeStructure d68ac9ddb91b3bee269a37683a3541bb3dddcc4a2784861cbdcbc06c17067e8b ('Ca', 'O', 'Ti') 5

The result is an OptimadeStructure, which retains the exact remote OPTIMADE resource. UnitcellStructureView loads its structural data into the ordinary httk atomistic interface; the conversion happens only when the view’s properties are requested. No remote write occurs. For one known entry URL, httk.core.fetch(url, kind="optimade") is also available, but filtered queries use OptimadeStore as shown here.

This is the same read-only interoperability boundary as the old OMDB example, without an OMDB-specific singleton: providers publish OPTIMADE, and httk consumes the standard service.