NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2841 most downloaded on PyPI
A framework for building Singer taps and targets
Last release 5 days ago
29 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
3 versions withdrawn
withdrawn after publishing
6 years old
411 releases · first in 2021
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
## v0.36.1 (2024-03-13) ### 🐛 Fixes - #2310 Limited importlib-resources to < 6.2 due to breaking changes - #2288 Bumped min joblib dependency to >=1.3
importlib-resources to < 6.2 due to breaking changes>=1.3.0 and replaced deprecated parallel_backend with parallel_config -- Thanks @BuzzCutNorman!state_partition_context dictionary is now correctly interpolated in the error message when duplicate partitions/contexts are detected in the input state## v0.36.0 (2024-02-26) ### ✨ New - #2241 JSON schema keywords such as maxLength are now supported in StringType, IntegerType and NumberType JSON sche
maxLength are now supported in StringType, IntegerType and NumberType JSON schema helpers--about --format=markdownbatch_size_rows setting to configure how many rows are loaded in each record batch -- Thanks @BuzzCutNorman!pool_pre_ping parametersinger_sdk.authenticators.BasicAuthenticator in favor of requests.auth.HTTPBasicAuthNothing published for this version
## v0.35.2 (2024-02-19) ### 🐛 Fixes - #2252 Null type is now correctly appended as {"type": "null"} to oneOf types
{"type": "null"} to oneOf types## v0.35.1 (2024-02-15) ### 🐛 Fixes - #2243 Flattening level of record is now forced to match the provided flattened schema -- _Thanks @joaopamaral!_
oneOf are now handled by null-appending logicACTIVATE_VERSION messages now use the same WHERE clause -- Thanks @vitoravancini!"required": [...] array of the discovered JSON schemaThe package now acts a proper pytest plugin, so you may need to remove pytest_plugins = ("singer_sdk.testing.pytest_plugin",) from your tests/conftest
pytest_plugins = ("singer_sdk.testing.pytest_plugin",) from your tests/conftest.py file for test fixtures to be loaded correctly.pytz. If your package uses pytz in any capacity, you may need to add it as an explicit dependency to your project.ObjectId from mongoDB) during flattening -- Thanks @dgawlowsky!schemas directory in REST tap cookiecutterjsonschema._RefResolver with recommended referencing library.vscode directory is included when requested in cookiecutters and avoid failing if it does not exist--about output to existing onespytest_plugins in conftest.pyACTIVATE_VERSION messages to soft deletes and add new SQLConnector.delete_old_versions methodfunctools.lru_cache instead of the stale memoization library (#1981)logger parameter from private catalog helper functionspytz dependency and use datetime.timezone.utc instead of pytz.UTC where possiblepython-jsonschema -- Thanks @BuzzCutNorman!importlib.resources.abc.Traversable typesNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
## v0.34.1 (2023-12-19) ### 🐛 Fixes - #2118 Output JSONPath expression with match count message -- _Thanks @mjsqu!_ - #2107 Respect forced replication
nulls_first when available to order NULL results in incremental SQL streamsCursorResult.mappings() in SQL streamsdatetime.fromisoformat in other placesT iso date separatorDate-time parsing in target sinks is now significantly faster, thanks to @BuzzCutNorman!
python-dateutildatetime.fromisoformat/backports.datetime_fromisoformat -- Thanks @BuzzCutNorman!TapTestClassFactory._annotate_test_class into simpler methodsSingerWriter class in singer_sdk.io_base and use it to emit Singer messages -- Thanks @BuzzCutNorman!post_gen_project.py hook -- Thanks @vicmattos!post_gen_project.py hook -- Thanks @vicmattos!Full Changelog: https://github.com/meltano/sdk/compare/v0.33.1...v0.34.0
### 🐛 Fixes - #2076 Make a explicit dependency on python-dateutil
python-dateutil### ✨ New - #2044 Add Parquet as a batch encoding option -- _Thanks @jamielxcarter!_ - #768 Better error messages when config validation fails - #1854
datetime.fromisoformat/backports.datetime_fromisoformat -- Thanks @BuzzCutNorman!TapTestClassFactory._annotate_test_class into simpler methodsSingerWriter class in singer_sdk.io_base and use it to emit Singer messages -- Thanks @BuzzCutNorman!post_gen_project.py hook -- Thanks @vicmattos!post_gen_project.py hook -- Thanks @vicmattos!## v0.33.1 (2023-11-08) ### 🐛 Fixes - #2035 Retry all 5xx status codes -- _Thanks @asamasoma!_
Support for simple comprehension expression in stream maps: https://sdk.meltano.com/en/v0.33.0/stream_maps.html#compound-expressions
time_extracted into datetime.datetime instancerecord field to a JSON object typedefault property is passed to SCHEMA messages -- Thanks @prakharcode!Nothing published for this version
Nothing published for this version
Initial experimental support for different loading methods in targets. Currently, the overwrite method works by dropping and recreating tables in SQL
overwrite method works by dropping and recreating tables in SQL targets. Methods upsert and append are still expected to be implemented by the target.decimal.Decimal instances in flatteningnull to typesraw_schema in stream mapper is immutableNothing published for this version
Nothing published for this version
Nothing published for this version
## v0.31.1 (2023-08-17) ### ✨ New - #1905 Add email field and use human-readable questions in templates ### 🐛 Fixes - #1913 Fix tap tests for multiple
Improved connection handling in SQL targets by sharing a connector instance among stream sinks
add_record_metadata and batch_config target settings_sdc_sync_started_at metadata column to indicate the start of the target process1.* to 2.*decimal.Decimal in JSON fields of SQL targetsadd_record_metadata as a builtin target settingSQLTap initializertap_idimportlib.resources instead of __file__ to retrieve sample Singer output filespip_url example that uses shell script workaround for editable installation## v0.30.0 (2023-07-10) ### ✨ New - #1815 Support optional headers for OAuth request -- _Thanks @s7clarke10!_ - #1800 Publish supported python version
--aboutdecimal.Decimalpackaging libraryA bunch of target improvements, including better batch message handling and more extensive tests.
decimal.Decimalbatch_config propertiesSQLStream.schema into a cached property -- Thanks @mjsqu!## v0.28.0 (2023-06-05) ### ✨ New - #1728 Add an optional Dependabot file to projects generated from templates - #1572 Add batch_config handling in ap
batch_config handling in append_builtin_config() -- Thanks @aaronsteers!meltano run in target cookiecutter README## v0.27.0 (2023-05-11) ### ✨ New - #1681 Allow SQL tap developers to leverage post_process -- _Thanks @BuzzCutNorman!_ - #1672 Support deselecting st
post_process -- Thanks @BuzzCutNorman!urllib3 to <2 to avoid incompatibility issues with botocoreget_new_paginator in REST tap cookiecutter template## v0.26.0 (2023-05-02) ### ✨ New - #1623 Explicitly support URL params in string form
## v0.25.0 (2023-04-25) ### ✨ New - #1603 Allow allowed_values and examples in any JSON schema type constructor ### ⚙️ Under the Hood - #1610 Consolid
## v0.24.0 (2023-04-12) ### ✨ New - #1601 Allow skipping child streams by returning an empty child context from parent stream - #1581 Add pattern, con
pattern, contentMediaType, and contentEncoding to Schema data class -- Thanks @BuzzCutNorman!## v0.23.0 (2023-04-04) ### ✨ New - #1563 Migrate shell scripts for cookiecutter e2e tests to Nox -- _Thanks @mkranna!_ ### 🐛 Fixes - #1574 Conform me
## v0.22.1 (2023-03-28) ### 🐛 Fixes - #1172 Handle merging of SQL types when character column lengths are less than the max -- _Thanks @BuzzCutNorman!
__alias__ when mapping streams with repeated schema messages -- Thanks @DanilJr!type value when checking JSON schema types## v0.22.0 (2023-03-14) ### ✨ New - #1478 Retry some streaming and decoding request errors -- _Thanks @visch!_ - #1480 Added RESTStream.backoff_jitter
RESTStream.backoff_jitter to support custom backoff jitter generators -- Thanks @visch!pyarrow and viztracer extras to main dependenciesRESTStream.backoff_jitter to support custom backoff jitter generators -- Thanks @visch!pyarrow and viztracer extras to main dependencies## v0.21.0 (2023-02-21) ### 🐛 Fixes - #1410 Tap template: fix style, types and imports; and also catch more errors by building from replay files in CI
## v0.20.0 (2023-02-13) ### ✨ New - #1365 Add strptime_to_utc and strftime functions to _singerlib.utils -- _Thanks @menzenski!_ - #1394 Refactor SQLC
strptime_to_utc and strftime functions to _singerlib.utils -- Thanks @menzenski!requests.auth authenticatorspytest_pluginsisort compatible with Python 3.8## v0.19.0 (2023-01-30) ### ✨ New - #1171 Improve included tap and target tests in singer_sdk.testing -- _Thanks @stkbailey!_ ### 🐛 Fixes - #1345 Remo
singer_sdk.testingif __name__ == example## v0.18.0 (2023-01-23) ### ✨ New - #1283 Automatic catalog selection of replication keys ### 📚 Documentation Improvements - #1335 Stream maps example
## v0.17.0 (2023-01-06) ### 🐛 Fixes - #1308 Replace hyphens with underscores when generating expected env var name _LOGLEVEL -- _Thanks @adherr!_ - #8
<PLUGIN_NAME>_LOGLEVEL -- Thanks @adherr!conform_record_data_types work on nested objects and arrays -- Thanks @Jack-Burnett!properties key -- Thanks @visch!## v0.16.0 (2022-12-19) ### ✨ New - #1262 Support string "__NULL__" wherever null values are allowed in stream maps configuration ### 🐛 Fixes - #1214
"__NULL__" wherever null values are allowed in stream maps configuration## v0.15.0 (2022-12-08) ### ✨ New - #1157 Built-in handling of default-target-schema for SQL Targets -- _Thanks @BuzzCutNorman!_ - #1087 S3 batch stor
default-target-schema for SQL Targets -- Thanks @BuzzCutNorman!patternProperties in JSON schema helpersadditional_properties in JSON schema helper objectsConnectionResetError exceptions in HTTP taps## v0.14.0 (2022-11-16) ### ✨ New - #1175 Add `datetime` capabilities in stream maps -- _Thanks @qbatten!_ - #1114 Add ability to override DDL for col
datetime capabilities in stream maps -- Thanks @qbatten!ADD, ALTER, and RENAME.SQLConnector import for SQL target cookiecutter -- Thanks @radbrt!SQLConnector.table_exists() to use separate table_name and schema_name instead of fully qualified name -- Thanks @BuzzCutNorman!datetime functions to simpleeval env in stream maps -- Thanks @qbatten!SQLConnector import for SQL target cookiecutter -- Thanks @radbrt!SQLConnector.table_exists() to use separate table_name and schema_name instead of fully qualified name -- Thanks @BuzzCutNorman!ADD, ALTER, and RENAME operations## v0.13.1 (2022-11-08) ### 🐛 Fixes - #1126 Resolve failure in _increment_stream_state() when using LOG_BASED replication. - #1111 Add proper handling
_increment_stream_state() for cases when replication_method is LOG_BASED_MAX_RECORDS_LIMIT down into SQL## v0.13.0 (2022-10-24) ### ✨ New - #1096 Add JSON Schema Property(..., secret=True) helper for designating passwords and other credentials within con
Property(..., secret=True) helper for designating passwords and other credentials within config.allowed_values (enum) and examples.Property helpers for allowed_values (enum) and examplesProperty(..., secret=True)## v0.12.0 (2022-10-17) ### ✨ New - #978 Users can now configure a dedicated metrics logger using SINGER_SDK_LOG_CONFIG. ### 🐛 Fixes - #1043 Support W
allow_column_alter error message.SELECT statement which are selected in the catalog.docs/stream_maps.md -- Thanks @spacecowboy!context usage.BaseHATEOASPaginator.split_url to work with Windows paths -- Thanks @BuzzCutNorman!allow_column_alter error message## v0.11.1 (2022-09-27) ### 🐛 Fixes - #999 Resolve issue where file paths created by taps in BATCH mode can't be processed by the Sink.
BATCH mode can't be processed by the Sink.targetUrl of semantic PR title check to point to SDK docs## v0.11.0 (2022-09-23) ### ✨ New - #904 Add support for file-based processing with a new BATCH message type in taps and targets. - #968 Add docs for
ciso8601.TypeError is thrown by SQLConnector cookiecutter implementation due to super() references.pipelinewise-singer-python and move Singer library code into private module singer_sdk._singerlib.BATCH message type in taps and targetsUse __future__.annotations on singer_sdk.helpers._singer.
RecordsWitoutSchemaException -> RecordsWithoutSchemaException.__future__.annotations on singer_sdk.helpers._singer.__future__.annotations on singer_sdk.helpers._singer## v0.9.0 (2022-08-24) ### ✨ New - #842 Add authenticate_request method to `APIAuthenticatorBase` class to handle more generic authentication requests
APIAuthenticatorBase class to handle more generic authentication requests in custom authenticators.ConnectionError to list of backoff exceptions for auto-retry -- Thanks, @jlloyd-widen!start_date as the starting_replication_value if more recent than the latest bookmark -- Thanks, @ericboucher!required and enum fields -- Thanks, @Jack-Burnett!SQLSink.ConnectionError to list of backoff exceptions for auto-retryrequired and enum fieldsSQLSink## v0.8.0 (2022-08-05) ### 🐛 Fixes - #784 Update return type for backoff_max_tries to reflect it accepts a callable that returns an integer -- _Thanks
backoff_max_tries to reflect it accepts a callable that returns an integer## v0.7.0 (2022-07-21) ### 🚀 Changes - #785 Output full URL path in error messages -- _Thanks, @ericboucher_ ### 🐛 Fixes - #815 Generate correct SQL t
This is a fast-follow patch fix for `v0.6.0`.
This is a fast-follow patch fix for v0.6.0.
_Note: `0.6.1` is available and resolves this issue._
Note: 0.6.1 is available and resolves this issue.
LOGLEVEL environment variables. (!300) - Thanks, Eric Boucher!Stream.calculate_sync_cost hook to gather "cost" (in terms of number of requests, etc.) for each stream. (#348, #704) - Thanks, Laurent Savaëte!Sink implementations (#750) - Thanks, Alexander Butler!STDOUT. (!303) - Thanks, Andrey Tatarinov!LOGLEVEL environment variables. (!300) - Thanks, Eric Boucher!Stream.calculate_sync_cost hook to gather "cost" (in terms of number of requests, etc.) for each stream. (#348, #704) - Thanks, Laurent Savaëte!Sink implementations (#750) - Thanks, Alexander Butler!PyJWT to 2.4 (#396, !302).check_sorted flag is set to True (#736, #737).STDOUT. (!303) - Thanks, Andrey Tatarinov!Tap and Target SDK: The --config=ENV option now also considers environment variables from a dotenv (.env) file if present (#384, !293).
--config=ENV option now also considers environment variables from a
dotenv (.env) file if present (#384, !293).Target SDK: Use generic SQLALchemy markers for parameterized queries in SQL targets (#376, !287) - Thanks, Thomas Briggs!
Target SDK: Explicitly specify column names when inserting rows in SQL targets (#385, !294) - Thanks, Thomas Briggs!
Target SDK: Fixes bug where an activate_version message caused an error when destination table does not exist (#372, !285) - Thanks, Thomas Briggs!
Tap and Target SDK: Do not fail --about option if tap or target is not configured (#379, !291).
Tap SDK: Improved helpers for handling rate limits, backoff and retries (#137, #140, !277) - _Thanks, [Fred O'Loughlin](https://gitlab.com/fred-olough
null did not remove it from SCHEMA message (#370, !286) - Thanks, Ryan Whitten!Your coding agent can read these notes before it upgrades. Set up the MCP server →