The problem with treating localization as a black box
Most engineering teams inherit localization the way they inherit a legacy billing system: a dashboard someone else logs into, a vendor contact who "handles it," and a process that produces files but exposes no state. You can't query it. You can't hook a webhook to it. You can't reason about it as a system with defined objects, transitions, and failure modes, the way you reason about your order-processing pipeline or your CI system.
That's the actual gap an execution layer has to close, and it isn't a UI problem. A polished dashboard sitting on top of an opaque backend does not make localization callable. What makes it callable is the object model underneath: a defined hierarchy of Folder, Project, Order, Level, Workflow, and Review Gate objects that are addressable, stateful, and observable through an API instead of a support ticket. This document walks through that model directly, because once you understand it, you can reason about localization the same way you reason about any other subsystem your team owns.
The object hierarchy: Folder β Project β Order
Ollang's structure starts with three nested containers. A Folder organizes related projects, think of it as the top-level namespace for a product line, a brand, or a business unit. A Project sits inside a Folder and groups the assets and settings for a given localization effort. An Order is the actual unit of work: a specific source asset, or set of assets, submitted for translation into one or more target languages.
This isn't incidental structure, the documentation frames the Folder β Project β Order hierarchy as the operational model you need to understand before integrating at all. The API reflects this directly: you can list and search folders to organize projects, list all projects or retrieve details for a specific project by ID, and list and search Ollang folders for organizing projects. That is addressable resource structure rather than dashboard convenience, the same pattern you'd expect from any REST-modeled system with parent-child scoping.
Below Order, two more concepts do the real mechanical work, Level and Workflow. A Level determines how much human involvement an order requires, AI-only output versus output that passes through a review gate. A Workflow determines which models, language pairs, and providers actually execute the work. Both are configured per order, not added afterward, which is the detail that matters for engineering teams: quality tier and routing logic live inside the same object graph as the asset itself, not in a separate ticketing layer.
Orders are stateful, not fire-and-forget
Treat an Order the way you'd treat a job in a queue system: it has a lifecycle, and that lifecycle is inspectable. An order stuck in pending or ongoing for a long time is expected in some cases, most AI orders complete within minutes, while Level 1 orders with human review depend on reviewer availability and may take hours. That state progression, uploaded, processing, in review, QC-scored, delivered, is queryable via a GET on the order resource, and it is also pushable via callback.
The callback contract is explicit about its own limits, which is useful for a vendor API. Callbacks have a 10-second timeout, and if your handler takes longer to respond, Ollang treats it as a failure, so acknowledge quickly and process asynchronously. Critically, callback failures do not affect the order itself, and you should fall back to polling Get Order by ID if you do not receive a callback within a reasonable window. This is a deliberate design choice: the webhook is a convenience notification, the order resource itself is the source of truth.
The documentation also pushes you toward correct distributed-systems hygiene rather than assuming you'll get it right by accident. Treat callback handlers as idempotent, using the orderId plus completedAt as a dedup key, or upserting into your store keyed by orderId. It explicitly warns against trusting the payload alone. Do not rely on the body alone; pair the callback with a GET confirmation using your API key before acting on the contents. The full contract, including polling behavior, retries, pagination, and error handling, is documented in Ollang's API documentation.
A practical order lifecycle, as it plays out through the API or an agent, looks like this: upload a file to get a projectId, create an order to get an orderId, poll status until it reads "completed," run a quality check for scores and segment analysis, create revisions to report any issues, and optionally upgrade to a professional linguist review. Every one of those steps is a state transition on an object your systems can hold a reference to.
