diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+1.1.0:
+
+- Replace `output_format` with `output_config` on `CreateMessage` (breaking change)
+  - New `OutputConfig` type with `effort` and `format` fields
+  - `effortConfig` helper for effort-only configuration
+  - `jsonSchemaConfig` helper for structured output configuration
+- Remove beta header requirement for structured outputs (now GA)
+
 1.0.1:
 
 - Add structured outputs support (beta feature `structured-outputs-2025-11-13`)
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -80,7 +80,7 @@
 
 ## Running the Examples
 
-See [examples/README.md](examples/README.md) for descriptions of each example.
+See [examples](examples) for descriptions.
 
 ```bash
 cabal run claude-example
@@ -94,21 +94,20 @@
 
 ### Advanced Examples
 
-Several examples demonstrate beta features:
+- **[Structured Outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs)**: Constrain Claude's responses to follow a specific JSON schema, or validate tool parameters with strict mode
 
-**Tool Search & Programmatic Tool Calling** (`advanced-tool-use-2025-11-20`):
-- **[Tool Search Tool](https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/tool-search-tool)**: Server-side tool search for efficiently handling large numbers of tools
-- **[Programmatic Tool Calling (PTC)](https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/programmatic-tool-calling)**: Claude writes and executes code to call multiple tools and aggregate results
+The following examples require beta features:
 
-**Structured Outputs** (`structured-outputs-2025-11-13`):
-- **[Structured Outputs](https://docs.anthropic.com/en/docs/build-with-claude/structured-outputs)**: Constrain Claude's responses to follow a specific JSON schema, or validate tool parameters with strict mode
+**Tool Search & Programmatic Tool Calling** (`advanced-tool-use-2025-11-20`):
+- **[Tool Search Tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool)**: Server-side tool search for efficiently handling large numbers of tools
+- **[Programmatic Tool Calling (PTC)](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling)**: Claude writes and executes code to call multiple tools and aggregate results
 
 To enable beta features, use `makeMethodsWith` with the appropriate beta header:
 
 ```haskell
 let options = defaultClientOptions
         { apiKey = key
-        , anthropicBeta = Just "structured-outputs-2025-11-13"
+        , anthropicBeta = Just "advanced-tool-use-2025-11-20"
         }
 let Methods{ createMessage } = makeMethodsWith clientEnv options
 ```
diff --git a/claude.cabal b/claude.cabal
--- a/claude.cabal
+++ b/claude.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               claude
-version:            1.0.1
+version:            1.1.0
 synopsis:           Servant bindings to Anthropic's Claude API
 description:        This package provides comprehensive and type-safe bindings
                     to Anthropic's Claude API, providing both a Servant interface
diff --git a/examples/claude-structured-outputs-example/Main.hs b/examples/claude-structured-outputs-example/Main.hs
--- a/examples/claude-structured-outputs-example/Main.hs
+++ b/examples/claude-structured-outputs-example/Main.hs
@@ -6,10 +6,8 @@
 -- | Example demonstrating structured outputs with Claude
 --
 -- This example shows how to use:
--- 1. JSON outputs (output_format) to get structured JSON responses
+-- 1. JSON outputs (output_config.format) to get structured JSON responses
 -- 2. Strict tool use (strict: true) to validate tool parameters
---
--- Requires the structured-outputs-2025-11-13 beta header.
 module Main where
 
 import Data.Aeson (FromJSON(..), (.:), (.=))
@@ -48,10 +46,8 @@
     key <- Text.pack <$> Environment.getEnv "ANTHROPIC_KEY"
     env <- V1.getClientEnv "https://api.anthropic.com"
 
-    -- Use makeMethodsWith to pass the structured outputs beta header
     let options = V1.defaultClientOptions
             { V1.apiKey = key
-            , V1.anthropicBeta = Just "structured-outputs-2025-11-13"
             }
 
     let V1.Methods{ V1.createMessage } = V1.makeMethodsWith env options
@@ -66,7 +62,7 @@
     Text.IO.putStrLn "=== Example 2: Strict Tool Use ===\n"
     strictToolUseExample createMessage
 
--- | Example using output_format to get structured JSON responses
+-- | Example using output_config to get structured JSON responses
 jsonOutputsExample :: (Messages.CreateMessage -> IO Messages.MessageResponse) -> IO ()
 jsonOutputsExample createMessage = do
     let emailText = "Hi there! I'm John Smith from Acme Corp (john.smith@acme.com). \
@@ -111,7 +107,7 @@
         { Messages.model = "claude-sonnet-4-5-20250929"
         , Messages.messages = [message]
         , Messages.max_tokens = 1024
-        , Messages.output_format = Just (Messages.jsonSchemaFormat outputSchema)
+        , Messages.output_config = Just (Messages.jsonSchemaConfig outputSchema)
         }
 
     let Messages.MessageResponse{ Messages.content = responseContent, Messages.stop_reason = stopReason } = response
diff --git a/src/Claude/V1/Messages.hs b/src/Claude/V1/Messages.hs
--- a/src/Claude/V1/Messages.hs
+++ b/src/Claude/V1/Messages.hs
@@ -7,9 +7,12 @@
     , _CreateMessage
     , MessageResponse(..)
     , MessageStreamEvent(..)
-      -- * Structured outputs
+      -- * Output configuration
+    , OutputConfig(..)
     , OutputFormat(..)
+    , jsonSchemaConfig
     , jsonSchemaFormat
+    , effortConfig
       -- * Content types
     , Content(..)
     , ContentBlock(..)
@@ -558,12 +561,10 @@
 
 -- | Output format specification for structured outputs
 --
--- Use with the @structured-outputs-2025-11-13@ beta header.
---
 -- Example:
 --
 -- @
--- let outputFormat = jsonSchemaFormat $ Aeson.object
+-- let schema = Aeson.object
 --         [ "type" .= ("object" :: Text)
 --         , "properties" .= Aeson.object
 --             [ "name" .= Aeson.object ["type" .= ("string" :: Text)]
@@ -572,6 +573,10 @@
 --         , "required" .= (["name", "age"] :: [Text])
 --         , "additionalProperties" .= False
 --         ]
+--     request = _CreateMessage
+--         { output_config = Just $ jsonSchemaConfig schema
+--         , ...
+--         }
 -- @
 data OutputFormat = OutputFormat
     { type_ :: Text    -- ^ Currently only "json_schema" is supported
@@ -584,9 +589,82 @@
 instance ToJSON OutputFormat where
     toJSON = genericToJSON aesonOptions
 
--- | Create a JSON schema output format
+-- | Output configuration for the Messages API
 --
+-- Controls both the structured output format and the effort level.
+--
+-- __Effort__ controls how many tokens Claude uses when responding, trading off
+-- between response thoroughness and token efficiency. It affects all tokens
+-- including text responses, tool calls, and extended thinking.
+--
+-- * @"low"@  — Most efficient. Significant token savings, some capability reduction.
+--              Good for simple tasks, classification, or high-volume use cases.
+-- * @"medium"@ — Balanced approach with moderate token savings.
+-- * @"high"@ — Full capability (the default when effort is omitted).
+-- * @"max"@ — Absolute maximum capability, no constraints on token spending.
+--              Opus 4.6 only.
+--
+-- Setting @"high"@ is equivalent to not setting effort at all.
+--
+-- See <https://platform.claude.com/docs/en/build-with-claude/effort>
+--
+-- __Format__ specifies a JSON schema for structured outputs. See 'jsonSchemaFormat'.
+--
+-- Both fields are optional and can be used independently or together.
+--
+-- @
+-- -- Effort only
+-- output_config = Just $ effortConfig "low"
+--
+-- -- Structured output only
+-- output_config = Just $ jsonSchemaConfig mySchema
+--
+-- -- Both
+-- output_config = Just $ (jsonSchemaConfig mySchema) { effort = Just "low" }
+-- @
+data OutputConfig = OutputConfig
+    { effort :: Maybe Text
+    -- ^ Effort level: @"low"@, @"medium"@, @"high"@, or @"max"@.
+    -- Controls token spend vs thoroughness. @"high"@ is the default.
+    -- @"max"@ is Opus 4.6 only.
+    -- See <https://platform.claude.com/docs/en/build-with-claude/effort>
+    , format :: Maybe OutputFormat
+    -- ^ Structured output format (use 'jsonSchemaFormat' to construct)
+    } deriving stock (Eq, Generic, Show)
+
+instance FromJSON OutputConfig where
+    parseJSON = genericParseJSON aesonOptions
+
+instance ToJSON OutputConfig where
+    toJSON = genericToJSON aesonOptions
+
+-- | Create an output configuration with only an effort level
+--
+-- @
+-- output_config = Just $ effortConfig "low"
+-- @
+--
+-- See <https://platform.claude.com/docs/en/build-with-claude/effort>
+effortConfig :: Text -> OutputConfig
+effortConfig e = OutputConfig
+    { effort = Just e
+    , format = Nothing
+    }
+
+-- | Create a JSON schema output configuration
+--
 -- This is the primary way to use structured outputs.
+--
+-- @
+-- output_config = Just $ jsonSchemaConfig mySchema
+-- @
+jsonSchemaConfig :: Value -> OutputConfig
+jsonSchemaConfig s = OutputConfig
+    { effort = Nothing
+    , format = Just $ jsonSchemaFormat s
+    }
+
+-- | Create a JSON schema output format
 jsonSchemaFormat :: Value -> OutputFormat
 jsonSchemaFormat s = OutputFormat
     { type_ = "json_schema"
@@ -611,8 +689,9 @@
     , tools :: Maybe (Vector ToolDefinition)
     , tool_choice :: Maybe ToolChoice
     , container :: Maybe Text
-    , output_format :: Maybe OutputFormat
-    -- ^ Structured output format (requires @structured-outputs-2025-11-13@ beta header)
+    , output_config :: Maybe OutputConfig
+    -- ^ Output configuration: effort level and/or structured output format.
+    -- Use 'effortConfig', 'jsonSchemaConfig', or construct 'OutputConfig' directly.
     } deriving stock (Generic, Show)
 
 instance FromJSON CreateMessage where
@@ -637,7 +716,7 @@
     , tools = Nothing
     , tool_choice = Nothing
     , container = Nothing
-    , output_format = Nothing
+    , output_config = Nothing
     }
 
 -- | Text delta in streaming
diff --git a/src/Claude/V1/Tool.hs b/src/Claude/V1/Tool.hs
--- a/src/Claude/V1/Tool.hs
+++ b/src/Claude/V1/Tool.hs
@@ -109,13 +109,12 @@
 -- it will return a @tool_use@ content block with the tool name and input arguments.
 --
 -- Set @strict = Just True@ to enable strict schema validation (structured outputs).
--- This requires the @structured-outputs-2025-11-13@ beta header.
 data Tool = Tool
     { name :: Text
     , description :: Maybe Text
     , input_schema :: InputSchema
     , strict :: Maybe Bool
-    -- ^ Enable strict schema validation for tool inputs (structured outputs beta)
+    -- ^ Enable strict schema validation for tool inputs
     } deriving stock (Eq, Generic, Show)
 
 instance FromJSON Tool where
@@ -161,7 +160,6 @@
 --
 -- This is like 'functionTool' but enables strict mode for structured outputs.
 -- Automatically sets @additionalProperties = False@ as required by the API.
--- Requires the @structured-outputs-2025-11-13@ beta header.
 strictFunctionTool
     :: Text           -- ^ Tool name (must match [a-zA-Z0-9_-]+)
     -> Maybe Text     -- ^ Description of what the tool does
diff --git a/tasty/Main.hs b/tasty/Main.hs
--- a/tasty/Main.hs
+++ b/tasty/Main.hs
@@ -232,14 +232,6 @@
                 HUnit.assertBool "Should have positive token count"
                     (input_tokens > 0)
 
-    -- Structured outputs tests require beta header
-    let structuredOutputsOptions = V1.defaultClientOptions
-            { V1.apiKey = Text.pack key
-            , V1.anthropicBeta = Just "structured-outputs-2025-11-13"
-            }
-    let V1.Methods{ V1.createMessage = createMessageStructured } =
-            V1.makeMethodsWith clientEnv structuredOutputsOptions
-
     let jsonOutputsTest =
             HUnit.testCase "Create message - JSON outputs" do
                 -- Define output schema
@@ -258,7 +250,7 @@
                         ]
 
                 Messages.MessageResponse{ stop_reason, content } <-
-                    createMessageStructured
+                    createMessage
                         Messages._CreateMessage
                             { Messages.model = model
                             , Messages.messages =
@@ -271,7 +263,7 @@
                                     }
                                 ]
                             , Messages.max_tokens = 200
-                            , Messages.output_format = Just (Messages.jsonSchemaFormat outputSchema)
+                            , Messages.output_config = Just (Messages.jsonSchemaConfig outputSchema)
                             }
 
                 -- Should complete normally
@@ -309,7 +301,7 @@
                             ]
 
                 Messages.MessageResponse{ stop_reason, content } <-
-                    createMessageStructured
+                    createMessage
                         Messages._CreateMessage
                             { Messages.model = model
                             , Messages.messages =
