From a2f82f1b07e33f2bb4495ac93406808d00a8b3a4 Mon Sep 17 00:00:00 2001 From: linq-sdks-bot Date: Wed, 5 Aug 2026 22:10:43 +0000 Subject: [PATCH 1/3] docs: clarify presigned url behavior and configuration --- src/linq/types/attachment_create_response.py | 4 +++- uv.lock | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/linq/types/attachment_create_response.py b/src/linq/types/attachment_create_response.py index dbe180b..c6dd48e 100644 --- a/src/linq/types/attachment_create_response.py +++ b/src/linq/types/attachment_create_response.py @@ -37,5 +37,7 @@ class AttachmentCreateResponse(BaseModel): """Presigned URL for uploading the file. PUT the raw binary file content to this URL with the `required_headers`. Do not - JSON-encode or multipart-wrap the body. Expires after 15 minutes. + JSON-encode or multipart-wrap the body. Expires after 15 minutes. Treat the URL + as opaque — the hostname depends on partner configuration and is the same across + sandbox and production. """ diff --git a/uv.lock b/uv.lock index bdb9df0..266f215 100644 --- a/uv.lock +++ b/uv.lock @@ -530,7 +530,7 @@ wheels = [ [[package]] name = "linq-python" -version = "0.19.1" +version = "0.20.0" source = { editable = "." } dependencies = [ { name = "anyio" }, From fa522c848f176ac2f33dda752f1270431105d3c0 Mon Sep 17 00:00:00 2001 From: linq-sdks-bot Date: Sat, 8 Aug 2026 01:08:20 +0000 Subject: [PATCH 2/3] fix: clarify stop keyword behavior and matching rules --- src/linq/types/chat.py | 7 ++++--- src/linq/types/chat_create_response.py | 7 ++++--- src/linq/types/chat_created_webhook_event.py | 7 ++++--- src/linq/types/message_edited_webhook_event.py | 7 ++++--- src/linq/types/message_event_v2.py | 7 ++++--- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/linq/types/chat.py b/src/linq/types/chat.py index f8f5d1f..8e72b16 100644 --- a/src/linq/types/chat.py +++ b/src/linq/types/chat.py @@ -35,9 +35,10 @@ class HealthStatus(BaseModel): part of a longer one: `STOP` counts, `please stop` does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and - `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP`, - or if they keep replying on the chat — sustained two-way conversation is treated - as a sign the stop keyword was a false positive. + `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — + these match in any casing — or if they keep replying on the chat, since + sustained two-way conversation is treated as a sign the stop keyword was a false + positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/chat_create_response.py b/src/linq/types/chat_create_response.py index e1c34ed..0618f0a 100644 --- a/src/linq/types/chat_create_response.py +++ b/src/linq/types/chat_create_response.py @@ -36,9 +36,10 @@ class ChatHealthStatus(BaseModel): part of a longer one: `STOP` counts, `please stop` does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and - `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP`, - or if they keep replying on the chat — sustained two-way conversation is treated - as a sign the stop keyword was a false positive. + `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — + these match in any casing — or if they keep replying on the chat, since + sustained two-way conversation is treated as a sign the stop keyword was a false + positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/chat_created_webhook_event.py b/src/linq/types/chat_created_webhook_event.py index 0522edf..5658bad 100644 --- a/src/linq/types/chat_created_webhook_event.py +++ b/src/linq/types/chat_created_webhook_event.py @@ -36,9 +36,10 @@ class DataHealthStatus(BaseModel): part of a longer one: `STOP` counts, `please stop` does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and - `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP`, - or if they keep replying on the chat — sustained two-way conversation is treated - as a sign the stop keyword was a false positive. + `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — + these match in any casing — or if they keep replying on the chat, since + sustained two-way conversation is treated as a sign the stop keyword was a false + positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/message_edited_webhook_event.py b/src/linq/types/message_edited_webhook_event.py index 4b52d49..bea3f1c 100644 --- a/src/linq/types/message_edited_webhook_event.py +++ b/src/linq/types/message_edited_webhook_event.py @@ -34,9 +34,10 @@ class DataChatHealthStatus(BaseModel): part of a longer one: `STOP` counts, `please stop` does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and - `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP`, - or if they keep replying on the chat — sustained two-way conversation is treated - as a sign the stop keyword was a false positive. + `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — + these match in any casing — or if they keep replying on the chat, since + sustained two-way conversation is treated as a sign the stop keyword was a false + positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/message_event_v2.py b/src/linq/types/message_event_v2.py index fa20f95..25c33f0 100644 --- a/src/linq/types/message_event_v2.py +++ b/src/linq/types/message_event_v2.py @@ -49,9 +49,10 @@ class ChatHealthStatus(BaseModel): part of a longer one: `STOP` counts, `please stop` does not. Most keywords must match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and - `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP`, - or if they keep replying on the chat — sustained two-way conversation is treated - as a sign the stop keyword was a false positive. + `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — + these match in any casing — or if they keep replying on the chat, since + sustained two-way conversation is treated as a sign the stop keyword was a false + positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across From 1833ad1738c0fdd3133f9b9007c4bf547b3661a5 Mon Sep 17 00:00:00 2001 From: linq-sdks-bot Date: Sun, 9 Aug 2026 20:11:20 +0000 Subject: [PATCH 3/3] fix: clarify stop keyword behavior for multi-chat replies --- src/linq/types/chat.py | 6 +++--- src/linq/types/chat_create_response.py | 6 +++--- src/linq/types/chat_created_webhook_event.py | 6 +++--- src/linq/types/message_edited_webhook_event.py | 6 +++--- src/linq/types/message_event_v2.py | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/linq/types/chat.py b/src/linq/types/chat.py index 8e72b16..f1fd16a 100644 --- a/src/linq/types/chat.py +++ b/src/linq/types/chat.py @@ -36,9 +36,9 @@ class HealthStatus(BaseModel): match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — - these match in any casing — or if they keep replying on the chat, since - sustained two-way conversation is treated as a sign the stop keyword was a false - positive. + these match in any casing — or if they keep replying — replies in any + conversation with you count, the same way the block does — since sustained + two-way conversation is treated as a sign the stop keyword was a false positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/chat_create_response.py b/src/linq/types/chat_create_response.py index 0618f0a..6e8b843 100644 --- a/src/linq/types/chat_create_response.py +++ b/src/linq/types/chat_create_response.py @@ -37,9 +37,9 @@ class ChatHealthStatus(BaseModel): match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — - these match in any casing — or if they keep replying on the chat, since - sustained two-way conversation is treated as a sign the stop keyword was a false - positive. + these match in any casing — or if they keep replying — replies in any + conversation with you count, the same way the block does — since sustained + two-way conversation is treated as a sign the stop keyword was a false positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/chat_created_webhook_event.py b/src/linq/types/chat_created_webhook_event.py index 5658bad..be28803 100644 --- a/src/linq/types/chat_created_webhook_event.py +++ b/src/linq/types/chat_created_webhook_event.py @@ -37,9 +37,9 @@ class DataHealthStatus(BaseModel): match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — - these match in any casing — or if they keep replying on the chat, since - sustained two-way conversation is treated as a sign the stop keyword was a false - positive. + these match in any casing — or if they keep replying — replies in any + conversation with you count, the same way the block does — since sustained + two-way conversation is treated as a sign the stop keyword was a false positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/message_edited_webhook_event.py b/src/linq/types/message_edited_webhook_event.py index bea3f1c..0cf11ce 100644 --- a/src/linq/types/message_edited_webhook_event.py +++ b/src/linq/types/message_edited_webhook_event.py @@ -35,9 +35,9 @@ class DataChatHealthStatus(BaseModel): match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — - these match in any casing — or if they keep replying on the chat, since - sustained two-way conversation is treated as a sign the stop keyword was a false - positive. + these match in any casing — or if they keep replying — replies in any + conversation with you count, the same way the block does — since sustained + two-way conversation is treated as a sign the stop keyword was a false positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across diff --git a/src/linq/types/message_event_v2.py b/src/linq/types/message_event_v2.py index 25c33f0..44acae9 100644 --- a/src/linq/types/message_event_v2.py +++ b/src/linq/types/message_event_v2.py @@ -50,9 +50,9 @@ class ChatHealthStatus(BaseModel): match exactly, including case. `OPT OUT` is the exception — it matches in any casing, with or without the space or a hyphen, so `opt out`, `Opt-Out` and `optout` all count. It clears if they later send `START`, `OPTIN`, or `UNSTOP` — - these match in any casing — or if they keep replying on the chat, since - sustained two-way conversation is treated as a sign the stop keyword was a false - positive. + these match in any casing — or if they keep replying — replies in any + conversation with you count, the same way the block does — since sustained + two-way conversation is treated as a sign the stop keyword was a false positive. Linq enforces this: while a recipient is opted out, every send to them is rejected with `403` (error code `2024`) before the message is queued, across