An importer reads bytes in some format and turns them into the unified model. Importers are first-party: the app ships with a set, and we publish more to the marketplace. Importing is one of the few things that writes the model, so importers are part of the app rather than something third parties add.
The formats today
Fifteen importers exist: OpenAPI 3.x, OpenAPI 2.0 (Swagger), AsyncAPI 3.x, Arazzo, Postman, Insomnia, Bruno, HAR, cURL, HTTP files, Hoppscotch, Thunder Client, RAML, API Blueprint, and OpenAPI Overlay. OpenAPI, AsyncAPI, and Arazzo ship with the app; the rest are marketplace plugins you add. Most are written in Rust.
Format detection
When you import a file, Spirefy decides which importer handles it without making you choose. It works in passes: the file extension first, then a keyword in the content, then a recognizable top-level key, then asking each importer whether it can handle the bytes.
One atomic change
An importer does not write the model directly. It hands the import flow a spirefy.cmd.v1 command batch, and the app applies it atomically and records the format as the source of everything it created. A failed import leaves no half-written model, and every entity carries the source it came from, so you can always see where it originated.
Run it headlessly
The same import runs in the app and from the command line. spirefy import drives the import orchestrator without opening the UI, which is how an import fits into a script.