defmodule Download do use Pipe def start(api_key) do api_key ~> download() ~> parse() end defp download(123), do: {:ok, "valid result"} defp download(_), do: {:error, "invalid API key"} defp parse({:ok, message}), do: %{message: message, downloaded_at: Time.utc_now()} end Download.start(123) #=> %{downloaded_at: ~T[10:53:31.643047], message: "valid result"} Download.start("invalid") |> IO.inspect() #=> {:error, "invalid API key"}