HttpClient.tap() runs a side effect after a successful response is received. This is the response-side counterpart to tapRequest.
import { FetchHttpClient, HttpClient, HttpClientRequest,} from "effect/unstable/http";import { Effect } from "effect";
function fetchUserWithResponseLogging(userId: number) { return Effect.gen(function* () { const client = (yield* HttpClient.HttpClient).pipe( HttpClient.tap((response) => Effect.sync(() => { console.log(`[Response] Status: ${response.status}`); console.log(`[Response] Headers:`, response.headers); }), ), );
const request = HttpClientRequest.get( `https://dummyjson.com/users/${userId}`, );
const response = yield* client.execute(request); const user = yield* response.json;
return user; }).pipe(Effect.provide(FetchHttpClient.layer));}
// Test itEffect.runPromise(fetchUserWithResponseLogging(1)).then((user) => { console.log("User:", user.firstName, user.lastName);});Output:
[Response] Status: 200[Response] Headers: { 'access-control-allow-origin': '*', 'cf-cache-status': 'DYNAMIC', 'cf-ray': '9d0617b0acc6d43a-SIN', connection: 'keep-alive', 'content-encoding': 'br', 'content-type': 'application/json; charset=utf-8', date: 'Thu, 19 Feb 2026 13:25:51 GMT', etag: 'W/"58f-CoL/KoXlW3x1PtqQr3wqPsXj6DE"', nel: '{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}', 'report-to': '{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=2mQIukE1lkEHVqD0dmK%2F4UFc%2B%2FaDuB%2FAkxldT47AFxVSW4kn57D%2BxUr9%2FCi6ZGCIbRvtIfafgQfMZfi3wBrZklxBNYX0R39HUBw4FZsyLaYJQJ8DyJXDt%2FI%3D"}]}', server: 'cloudflare', 'strict-transport-security': 'max-age=15552000; includeSubDomains', 'transfer-encoding': 'chunked', vary: 'Accept-Encoding', 'x-content-type-options': 'nosniff', 'x-dns-prefetch-control': 'off', 'x-download-options': 'noopen', 'x-frame-options': 'SAMEORIGIN', 'x-ratelimit-limit': '100', 'x-ratelimit-remaining': '73', 'x-ratelimit-reset': '1771507553', 'x-xss-protection': '1; mode=block'}User: Emily Johnsontap receives the HttpClientResponse object. Like tapRequest, it’s a side effect. The response flows through unchanged.