soniox 2.4.0__tar.gz → 2.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. soniox-2.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +81 -0
  2. soniox-2.5.0/.github/ISSUE_TEMPLATE/feature_request.yml +44 -0
  3. soniox-2.5.0/.github/PULL_REQUEST_TEMPLATE.md +27 -0
  4. {soniox-2.4.0 → soniox-2.5.0}/CHANGELOG.md +29 -5
  5. soniox-2.5.0/CODE_OF_CONDUCT.md +39 -0
  6. soniox-2.5.0/CONTRIBUTING.md +56 -0
  7. {soniox-2.4.0 → soniox-2.5.0}/PKG-INFO +1 -1
  8. soniox-2.5.0/SECURITY.md +14 -0
  9. {soniox-2.4.0 → soniox-2.5.0}/docs/async_client.md +364 -1
  10. {soniox-2.4.0 → soniox-2.5.0}/docs/realtime_client.md +612 -590
  11. {soniox-2.4.0 → soniox-2.5.0}/docs/types.md +28 -10
  12. {soniox-2.4.0 → soniox-2.5.0}/docs/utils.md +3 -3
  13. {soniox-2.4.0 → soniox-2.5.0}/pyproject.toml +1 -1
  14. {soniox-2.4.0 → soniox-2.5.0}/scripts/generate_docs.py +18 -6
  15. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/_utils.py +36 -1
  16. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_stt.py +214 -2
  17. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/stt.py +209 -2
  18. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/_utils.py +10 -0
  19. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/async_stt.py +35 -4
  20. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/async_tts.py +62 -16
  21. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/stt.py +35 -5
  22. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/tts.py +51 -14
  23. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/__init__.py +5 -1
  24. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/api.py +20 -11
  25. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/realtime.py +2 -1
  26. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/utils.py +7 -1
  27. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_async_tts_realtime.py +107 -1
  28. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_stt_realtime.py +209 -0
  29. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_tts_realtime.py +104 -1
  30. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_async_stt_workflows.py +17 -0
  31. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_client.py +31 -0
  32. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_stt_workflows.py +15 -0
  33. soniox-2.5.0/tests/unit/test_translate.py +280 -0
  34. soniox-2.5.0/tests/unit/test_types.py +70 -0
  35. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_utils.py +66 -0
  36. {soniox-2.4.0 → soniox-2.5.0}/uv.lock +1 -1
  37. {soniox-2.4.0 → soniox-2.5.0}/.claude/settings.local.json +0 -0
  38. {soniox-2.4.0 → soniox-2.5.0}/.gitignore +0 -0
  39. {soniox-2.4.0 → soniox-2.5.0}/LICENSE +0 -0
  40. {soniox-2.4.0 → soniox-2.5.0}/README.md +0 -0
  41. {soniox-2.4.0 → soniox-2.5.0}/assets/coffee_shop.mp3 +0 -0
  42. {soniox-2.4.0 → soniox-2.5.0}/assets/coffee_shop.pcm_s16le +0 -0
  43. {soniox-2.4.0 → soniox-2.5.0}/assets/two_way_translation.mp3 +0 -0
  44. {soniox-2.4.0 → soniox-2.5.0}/assets/two_way_translation.pcm_s16le +0 -0
  45. {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/api_example.py +0 -0
  46. {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/realtime_example.py +0 -0
  47. {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/tts_api_example.py +0 -0
  48. {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/tts_realtime_example.py +0 -0
  49. {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/tts_realtime_multiplexed_example.py +0 -0
  50. {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/api_example.py +0 -0
  51. {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/realtime_example.py +0 -0
  52. {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/tts_api_example.py +0 -0
  53. {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/tts_realtime_example.py +0 -0
  54. {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/tts_realtime_multiplexed_example.py +0 -0
  55. {soniox-2.4.0 → soniox-2.5.0}/justfile +0 -0
  56. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/__init__.py +0 -0
  57. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/__init__.py +0 -0
  58. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_auth.py +0 -0
  59. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_concurrency_limits.py +0 -0
  60. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_files.py +0 -0
  61. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_models.py +0 -0
  62. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_tts.py +0 -0
  63. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_tts_models.py +0 -0
  64. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_usage_logs.py +0 -0
  65. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_webhooks.py +0 -0
  66. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/auth.py +0 -0
  67. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/concurrency_limits.py +0 -0
  68. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/files.py +0 -0
  69. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/models.py +0 -0
  70. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/tts.py +0 -0
  71. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/tts_models.py +0 -0
  72. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/usage_logs.py +0 -0
  73. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/webhooks.py +0 -0
  74. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/client.py +0 -0
  75. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/errors.py +0 -0
  76. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/py.typed +0 -0
  77. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/__init__.py +0 -0
  78. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/_constants.py +0 -0
  79. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/common.py +0 -0
  80. {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/webhooks.py +0 -0
  81. {soniox-2.4.0 → soniox-2.5.0}/tests/__init__.py +0 -0
  82. {soniox-2.4.0 → soniox-2.5.0}/tests/conftest.py +0 -0
  83. {soniox-2.4.0 → soniox-2.5.0}/tests/data/openapi.json +0 -0
  84. {soniox-2.4.0 → soniox-2.5.0}/tests/helpers.py +0 -0
  85. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/__init__.py +0 -0
  86. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/cases.py +0 -0
  87. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/mock_ws.py +0 -0
  88. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_chaos_realtime.py +0 -0
  89. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_fuzz_realtime.py +0 -0
  90. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_keepalive.py +0 -0
  91. {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_live_ws.py +0 -0
  92. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/__init__.py +0 -0
  93. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/_openapi.py +0 -0
  94. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/_sdk_bindings.py +0 -0
  95. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_api.py +0 -0
  96. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_async_client.py +0 -0
  97. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_async_tts_workflows.py +0 -0
  98. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_concurrency_limits.py +0 -0
  99. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_coverage_gaps.py +0 -0
  100. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_schema_drift.py +0 -0
  101. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_stt_extras.py +0 -0
  102. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_sync_async_parity.py +0 -0
  103. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_tts_workflows.py +0 -0
  104. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_usage_logs.py +0 -0
  105. {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_webhooks.py +0 -0
@@ -0,0 +1,81 @@
1
+ name: Bug report
2
+ description: Report something the SDK does wrong, or fails to do
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for taking the time to file a bug. A **minimal** reproducer speeds things up significantly.
9
+
10
+ - type: checkboxes
11
+ id: non_api
12
+ attributes:
13
+ label: SDK or API?
14
+ description: For API-level problems such as transcription accuracy or server-side errors, please contact [support@soniox.com](mailto:support@soniox.com) instead.
15
+ options:
16
+ - label: I confirm this is an issue with the Python SDK, not the Soniox API.
17
+ required: true
18
+
19
+ - type: textarea
20
+ id: what_happened
21
+ attributes:
22
+ label: What happened?
23
+ description: What did you observe? What did you expect instead?
24
+ placeholder: |
25
+ Observed: ...
26
+ Expected: ...
27
+ validations:
28
+ required: true
29
+
30
+ - type: textarea
31
+ id: repro
32
+ attributes:
33
+ label: Minimal reproducer
34
+ description: The smallest script that triggers the issue. Strip out anything unrelated.
35
+ render: python
36
+ placeholder: |
37
+ from soniox import SonioxClient
38
+ ...
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: traceback
44
+ attributes:
45
+ label: Logs or traceback
46
+ description: Full traceback or relevant log lines, if any.
47
+ render: shell
48
+ validations:
49
+ required: false
50
+
51
+ - type: input
52
+ id: sdk_version
53
+ attributes:
54
+ label: SDK version
55
+ placeholder: "soniox==2.4.0"
56
+ validations:
57
+ required: true
58
+
59
+ - type: input
60
+ id: python_version
61
+ attributes:
62
+ label: Python version
63
+ placeholder: "Python 3.12.3"
64
+ validations:
65
+ required: true
66
+
67
+ - type: input
68
+ id: os
69
+ attributes:
70
+ label: Operating system
71
+ placeholder: "Ubuntu 24.04 / macOS 15 / Windows 11"
72
+ validations:
73
+ required: true
74
+
75
+ - type: textarea
76
+ id: additional
77
+ attributes:
78
+ label: Additional context
79
+ description: Anything else relevant: timing patterns, frequency, workarounds you have tried.
80
+ validations:
81
+ required: false
@@ -0,0 +1,44 @@
1
+ name: Feature request
2
+ description: Propose a new capability or improvement
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Use this template to propose new SDK functionality or improvements to existing APIs.
9
+
10
+ - type: textarea
11
+ id: problem
12
+ attributes:
13
+ label: Problem
14
+ description: What are you trying to do? What does the SDK currently make hard or awkward?
15
+ validations:
16
+ required: true
17
+
18
+ - type: textarea
19
+ id: solution
20
+ attributes:
21
+ label: Proposed solution
22
+ description: The shape of the API or behavior you would like. Python sketches welcome.
23
+ render: python
24
+ placeholder: |
25
+ # What the call site could look like:
26
+ client.foo.bar(...)
27
+ validations:
28
+ required: true
29
+
30
+ - type: textarea
31
+ id: alternatives
32
+ attributes:
33
+ label: Alternatives considered
34
+ description: Other approaches you thought about, and why you do not prefer them.
35
+ validations:
36
+ required: false
37
+
38
+ - type: textarea
39
+ id: context
40
+ attributes:
41
+ label: Additional context
42
+ description: Links to similar features in other SDKs, related issues, or use-case background.
43
+ validations:
44
+ required: false
@@ -0,0 +1,27 @@
1
+ ## Summary
2
+
3
+ <!-- One or two sentences. What does this PR do, and why? -->
4
+
5
+ ## Type of change
6
+
7
+ - [ ] Bug fix
8
+ - [ ] New feature
9
+ - [ ] Breaking change
10
+ - [ ] Internal refactor
11
+ - [ ] Documentation
12
+
13
+ ## How to test
14
+
15
+ <!-- Steps a reviewer can run to verify the change. -->
16
+
17
+ ## Checklist
18
+
19
+ - [ ] Tests added or updated under `tests/unit/` or `tests/realtime/`.
20
+ - [ ] `just lint`, `just typecheck`, and `just test` all pass locally.
21
+ - [ ] `CHANGELOG.md` `[Unreleased]` section updated, if the change is user-visible.
22
+ - [ ] Reference docs regenerated with `just docs`, if public APIs changed.
23
+ - [ ] No leftover `print()` debug statements or commented-out code.
24
+
25
+ ## Related issues
26
+
27
+ <!-- Closes #123, refs #456 -->
@@ -63,20 +63,44 @@ Examples:
63
63
 
64
64
  ### Added
65
65
 
66
- -
67
-
68
66
  ### Changed
69
67
 
70
- -
68
+ ### Deprecated
71
69
 
72
70
  ### Fixed
73
71
 
74
- -
75
-
76
72
  ### Removed
77
73
 
78
74
  ---
79
75
 
76
+ ## [2.5.0] - 12 jun 2026
77
+
78
+ ### Added
79
+
80
+ - `LanguageCode` type alias (`Annotated[str, Field(min_length=2, max_length=2)]`) representing an ISO 639-1 two-letter code. Now used by `TranslationConfig.target_language`, `language_a`, `language_b`, and by the `language_hints` lists on `CreateTranscriptionPayload`, `CreateTranscriptionConfig`, and `RealtimeSTTConfig`.
81
+ - `SupportedLanguage` model (renamed from `Language`) describing a `{code, name}` language entry returned by `client.models.list()`.
82
+ - `translate*` methods on the async and sync STT clients (`translate`, `translate_from_url`, `translate_from_file_id`, `translate_from_file`, `translate_and_wait`, `translate_and_wait_with_tokens`). Pass `to=` for one-way translation (optionally with `source=` as a strict language hint) or `between=("en", "fr")` for two-way; exactly one of `to` or `between` is required.
83
+ - `connect_timeout_sec` parameter on the realtime `connect()` and `connect_multi_stream()` methods (STT and TTS, sync and async): maximum seconds to wait for the WebSocket handshake. Defaults to 10 seconds; must be greater than zero. ([#4](https://github.com/soniox/soniox-python/pull/4) by [@imcooder](https://github.com/imcooder))
84
+
85
+ ### Changed
86
+
87
+ - Reorganized reference docs: `async_client.md` now documents only the async surface (the sync `SonioxClient` is a line-by-line mirror, called out in a preamble); `realtime_client.md` continues to cover both sync and async realtime clients.
88
+ - Expanded the `output_file_for_audio_format` docstring with a proper `Args` block.
89
+ - `language_hints` fields now validate each entry as a two-letter code; previously any string was accepted client-side.
90
+ - Realtime WebSocket connection failures now raise `SonioxRealtimeError` (with message `"Connection timed out"` when the handshake times out) instead of propagating raw `websockets` exceptions. ([#4](https://github.com/soniox/soniox-python/pull/4) by [@imcooder](https://github.com/imcooder))
91
+ - Default model for asynchronous transcriptions is now `stt-async-v5` (was `stt-async-v4`).
92
+
93
+ ### Deprecated
94
+
95
+ - `Language` is a deprecated alias for `SupportedLanguage`. Update imports to `from soniox.types import SupportedLanguage`.
96
+
97
+ ### Fixed
98
+
99
+ - Removed Sphinx `:meth:` directive leaks from realtime STT client docstrings; they were rendering as raw text in the generated markdown reference.
100
+ - `AsyncRealtimeTTSClient.connect_multi_stream()` now validates that an API key is available, matching the sync `RealtimeTTSClient.connect_multi_stream()`; previously it silently constructed a connection with an empty key.
101
+
102
+ ---
103
+
80
104
  ## [2.4.0] - 13 may 2026
81
105
 
82
106
  ### Added
@@ -0,0 +1,39 @@
1
+ # Code of Conduct
2
+
3
+ ## Our pledge
4
+
5
+ We pledge to make participation in this project a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+ We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
8
+
9
+ ## Our standards
10
+
11
+ Behavior that contributes to a positive environment includes:
12
+
13
+ - Using welcoming and inclusive language.
14
+ - Respecting differing viewpoints and experiences.
15
+ - Accepting constructive criticism gracefully.
16
+ - Focusing on what is best for the community.
17
+ - Showing empathy toward other community members.
18
+
19
+ Unacceptable behavior includes:
20
+
21
+ - Sexualized language or imagery, and unwelcome sexual attention or advances.
22
+ - Trolling, insulting or derogatory comments, and personal or political attacks.
23
+ - Public or private harassment.
24
+ - Publishing others' private information, such as a physical or email address, without their explicit permission.
25
+ - Other conduct that could reasonably be considered inappropriate in a professional setting.
26
+
27
+ ## Scope
28
+
29
+ This Code of Conduct applies on GitHub, Discord, and any other channel where someone is representing the project.
30
+
31
+ ## Reporting and enforcement
32
+
33
+ Report incidents to [support@soniox.com](mailto:support@soniox.com). All reports are reviewed and investigated promptly and fairly. We respect the privacy of reporters.
34
+
35
+ Maintainers are responsible for clarifying and enforcing these standards, and may take corrective action in response to behavior they consider inappropriate.
36
+
37
+ ## Attribution
38
+
39
+ This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1, available at <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
@@ -0,0 +1,56 @@
1
+ # Contributing
2
+
3
+ Contributions are welcome. PRs that are small, typed, and tested move through review fastest.
4
+
5
+ By participating in this project, you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md).
6
+
7
+ ## Development setup
8
+
9
+ Install [uv](https://docs.astral.sh/uv/) and [just](https://github.com/casey/just), then:
10
+
11
+ ```bash
12
+ git clone https://github.com/soniox/soniox-python
13
+ cd soniox-python
14
+ uv sync --extra dev
15
+ ```
16
+
17
+ > Python 3.13.6 has a regression in the `ssl` module that hangs realtime WebSocket sessions ([CPython #137583](https://github.com/python/cpython/issues/137583)). For local development, use Python 3.10 through 3.12, or 3.13.5 / 3.13.7 and later.
18
+
19
+ Day-to-day commands:
20
+
21
+ ```bash
22
+ just test # full test suite
23
+ just lint # ruff
24
+ just typecheck # pyright
25
+ just docs # regenerate docs/*.md from source
26
+ ```
27
+
28
+ ## Opening a pull request
29
+
30
+ Open PRs against the `dev` branch. `main` tracks releases.
31
+
32
+ Before you push:
33
+
34
+ 1. Keep the PR focused. One bug fix, one feature, or one refactor. Mixed PRs are slower to review.
35
+ 2. Add tests. New endpoints belong in `tests/unit/`; realtime helpers belong in `tests/realtime/`.
36
+ 3. Run `just lint`, `just typecheck`, and `just test`. All three must pass before review.
37
+ 4. Maintain coverage above the threshold set in `pyproject.toml`.
38
+ 5. Update the `[Unreleased]` section of `CHANGELOG.md` for any user-visible change. Categorize as Added, Changed, Fixed, or Removed.
39
+ 6. If you changed public APIs, regenerate the reference docs with `just docs`.
40
+
41
+ To pick up a newer OpenAPI schema, run `just download-schema`. This pulls the latest `openapi.json` into `tests/data/`. The `test_schema_drift.py` suite then reports missing fields and changed signatures automatically.
42
+
43
+ ## Conventions
44
+
45
+ - `ruff` handles formatting and lint rules; the configuration lives in `pyproject.toml`.
46
+ - `pyright` runs in strict mode against `src/`. Tests have a narrower config in the same file.
47
+ - Write docstrings in plain markdown with backticks for code references. Do not use Sphinx directives such as `:meth:` or `:param:`. They leak as raw text into the generated reference.
48
+ - Write comments to explain why, not what. Well-named identifiers already say what the code does.
49
+
50
+ ## Reporting bugs
51
+
52
+ File issues at [github.com/soniox/soniox-python/issues](https://github.com/soniox/soniox-python/issues) using the bug report template. Include the SDK version, the Python version, and a minimal reproducer.
53
+
54
+ ## Reporting security issues
55
+
56
+ Do not file a public issue for security vulnerabilities. See [SECURITY.md](SECURITY.md) for the channels we monitor.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soniox
3
- Version: 2.4.0
3
+ Version: 2.5.0
4
4
  Summary: The official Python SDK for the Soniox API (STT, REST)
5
5
  Project-URL: Homepage, https://soniox.com
6
6
  Project-URL: Documentation, https://soniox.com/docs
@@ -0,0 +1,14 @@
1
+ # Security Policy
2
+
3
+ ## Reporting a vulnerability
4
+
5
+ If you have discovered a security vulnerability in this SDK, please report it through one of the channels below. Use whichever is most convenient; we monitor all of them.
6
+
7
+ - **Email** [support@soniox.com](mailto:support@soniox.com) with a description of the issue and steps to reproduce.
8
+ - **Open a GitHub issue** describing the broad nature of the problem, but omit sensitive details (payloads, tokens, exact exploit steps). We will follow up privately to collect the rest.
9
+ - **Direct-message a maintainer** on GitHub or anywhere else you have already corresponded with us.
10
+ - **Reach us on [Discord](https://discord.gg/soniox)** and ask for a maintainer in DMs.
11
+
12
+ ## Responsible disclosure
13
+
14
+ We ask that you allow us a reasonable window to investigate and ship a fix before publishing any details. We will acknowledge your report, work through the diagnosis with you, and credit your disclosure in the release notes if you would like.