Implement a conforming Conduit backend
Build the Conduit API around the shared contract, then verify the implementation with the official behavioral suites.
Build a Conduit backend that matches the public API contract and can pass the official behavioral tests. This tutorial gives you a controlled implementation loop: define the contract boundary, implement the resource behavior, and verify the result with Hurl before using Bruno for interactive investigation.
Before you begin
You need a backend project that can serve HTTP requests, a local URL for that backend, and the RealWorld API specification sources. Choose the API base path your application will expose, such as http://localhost:3000/api, and keep that same base path when you configure the test runner.
The OpenAPI document is the contract for paths, methods, request bodies, response envelopes, and status codes. Use the endpoint pages for reader-facing request examples, and use authentication and token usage, response envelopes and resource models, pagination for articles and feeds, and error envelope and HTTP status behavior for shared rules.
Build the implementation loop
Read the specs/api/openapi.yml document and list the operations your backend must expose. Group the work by the contract tags: user and authentication, articles, comments, favorites, profiles, and tags.
The result is an implementation checklist tied to public operations rather than to a framework-specific design. Keep the external paths, HTTP methods, parameter names, and response shapes unchanged.
Implement each operation with the request validation, authentication requirement, resource relationships, and response status declared by the contract. Preserve the documented envelopes when returning users, profiles, articles, comments, and tags.
Start with one vertical path through your backend, then add the remaining operations. Keep the architecture understandable to a new contributor; the implementation expectations recommend a functionally complete, stable codebase without unnecessary engineering complexity.
Make the backend startable at a stable local address and document the command in your repository README. For example, if your server listens on port 3000 and mounts the API at /api, the test target is http://localhost:3000/api.
The observable result is an endpoint that stays available while the conformance runner sends its requests. Do not substitute a browser route or a frontend origin for the API base URL.
From the API specification directory, point the Hurl runner at your backend:
HOST=http://localhost:3000/api ./run-api-tests-hurl.shThe runner supplies the host and uid variables and executes the Hurl files serially. A passing run reports successful test assertions. A failure identifies the request or assertion that does not match the expected behavior; use that operation to return to the contract and implementation.
After the Hurl suite establishes the behavioral baseline, open the generated bruno/ collection in Bruno or run the backend conformance workflow from the command line. Bruno is generated from Hurl, so treat Hurl as the source of truth when the two representations differ.
The result is a repeatable way to inspect requests while you correct the backend, followed by another Hurl run to confirm that the behavior is still conforming.
Verify the implementation
Your backend is ready for the next stage when the complete Hurl suite passes against the intended API base URL. Also include at least one unit test in the repository, as required by the implementation expectations, and document how a contributor starts the backend and runs its tests. A unit test does not replace the API conformance suite: the two checks cover different boundaries.
The diagram shows the verification loop: the OpenAPI contract defines the public shape, your operations implement it, and Hurl checks observable behavior. When an assertion fails, correct the operation and run the suite again.
Next steps
Run the complete backend conformance workflow, then use Run Hurl tests for focused suite configuration or Run the generated Bruno collection for interactive inspection.