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 4 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.
## v0.46.5 (2025-06-24) ### 🐛 Fixes - #3135 Ensure Singer SDK warnings are logged
## v0.46.4 (2025-05-28) ### 🐛 Fixes - #3066 Revert table name splitting by - in SQL targets when default_target_schema is set, introduced in #3020
- in SQL targets when default_target_schema is set, introduced in #3020## v0.46.3 (2025-05-15) ### 🐛 Fixes - #3042 Revert "fix(targets): Avoid emitting message "No schema for record field." when "additionalProperties" is
## v0.46.2 (2025-05-15) ### 🐛 Fixes - #3037 Avoid aborting parent stream before child stream is finished in standard tap tests - #3031 Avoid emitting
"No schema for record field." when "additionalProperties" is set to true in stream schema -- Thanks @SidduHussain!## v0.46.1 (2025-05-13) ### 🐛 Fixes - #3034 Avoid emitting an empty state from the target if the tap has not sent any state messages - #3030 Bump stan
## v0.46.0 (2025-05-06) ### ✨ New - #2162 Expose metric dictionary to make logging metrics as JSON easier - #2977 Limit extraction to 25 records by de
default_target_schema is specifiednan, inf and -inf values as null in Singer stream## v0.45.12 (2025-06-24) ### 🐛 Fixes - #3132 Ensure Singer SDK warnings are logged
## v0.45.11 (2025-04-28) ### 🐛 Fixes - #3004 Ensure fields with an array of JSON schema types are properly handled by SQL targets - #2995 Pin GitHub a
Faker from stream maps contextseffective_schema to apply schema manipulations even on the input catalogmsgspec extra as a prerequisite to using the corresponding writer/reader classes -- Thanks @ReubenFrankel!## v0.45.10 (2025-04-16) ### 🐛 Fixes - #2978 Restore private _http_headers attribute of REST streams
## v0.45.9 (2025-04-15) ### 🐛 Fixes - #2975 Update cookiecutter templates - #2974 Do not log a warning if null cannot be appended to schema types - #2
## v0.45.8 (2025-04-14) ### 🐛 Fixes - #2965 AttributeError: object has no attribute '_requests_session' when accessing public property during stream i
## v0.45.7 (2025-04-14) ### 🐛 Fixes - #2968 singer_sdk.singerlib.resolve_schema_references now resolves oneOf schema references - #2924 Generate stand
singer_sdk.singerlib.resolve_schema_references now resolves oneOf schema referencesschema attributes (e.g. REST and GraphQL streams) can have their schema overridden by the catalogfallback-version for hatch vcs## v0.45.6 (2025-04-11) ### 🐛 Fixes - #2961 Conform NaN, Infinity and -Infinity to null values ### 📚 Documentation Improvements - #2960 Documented usi
## v0.45.5 (2025-04-04) ### 🐛 Fixes - #2952 Adapt field schema type to string when transformed with stream maps using json.dumps ### ⚙️ Under the Hood
## v0.45.4 (2025-04-01) ### 🐛 Fixes - #2946 In the built-in tap tests, do not emit a warning for missing records on ignored streams
## v0.45.3 (2025-03-29) ### 🐛 Fixes - #2937 Revert "fix: Ensure stream schema is overridden by the input catalog (#2932)" ### 📚 Documentation Improvem
## v0.45.2 (2025-03-28) ### 🐛 Fixes - #2935 Added uv venv backend to Meltano project in templates - #2934 Updated cookiecutter pre-commit hooks and ad
## v0.45.1 (2025-03-27) ### 🐛 Fixes - #2925 Let downstream packages import from deprecated singer_sdk._singerlib.catalog
singer_sdk._singerlib.catalog…singer_sdk.singerlib. If you're using the now deprecated _singerlib module, please update your code to use the new public module.
Taps and targets now support custom message writing and reading interfaces, and the new (experimental) msgspec-based encoding is available.
See the docs for more information.
Thanks to @BuzzCutNorman and @s7clarke10 for the thoughts and suggestions!
singerlib is now a public moduleThe low-level Singer library is now available as a public module and can be imported directly from singer_sdk.singerlib. If you're using the now deprecated _singerlib module, please update your code to use the new public module.
The x-singer.decimal JSON Schema extension is now supported by the SDK. Read the docs to learn how to use it with taps and targets.
x-singer.decimal JSON Schema extensionsingerlib to public modulepytest-github-actions-annotate-failures for GitHub workflows of tap, target and mapper templatesNo records were available to test warning when no records are ignored for all streams -- Thanks @ReubenFrankel!No records were available to test warnings when empty stream is ignored -- Thanks @ReubenFrankel!JSONSchemaToSQL from the target configurationNothing published for this version
Nothing published for this version
Nothing published for this version
## v0.44.4 (2025-06-24) ### 🐛 Fixes - #3128 Ensure Singer SDK warnings are logged ### 📦 Packaging changes - #3129 Test with click 8.2.x
## v0.44.3 (2025-02-05) ### 🐛 Fixes - #2870 Do not emit a warning needlessly when rest_method is not set in a stream class
rest_method is not set in a stream class## v0.44.2 (2025-01-31) ### 🐛 Fixes - #2862 Include package license metadata conditionally in templates -- _Thanks @ReubenFrankel!_ - #2859 Use uv in
Nothing published for this version
## v0.44.1 (2025-01-29) ### 🐛 Fixes - #2847 Update Cookiecutter templates - #2844 Avoid writing an empty state -- _Thanks @joaopamaral!_ - #2843 Use S
## v0.44.0 (2025-01-23) ### ✨ New - #2830 Allow developers to mark stream schema and settings fields as deprecated - #2829 Support a x-sql-datatype JS
x-sql-datatype JSON Schema annotation to let targets customize SQL type handlingNothing published for this version
## v0.43.1 (2024-12-10) ### 🐛 Fixes - #2807 Allow developers to set RESTStream.http_method
The RESTStream.rest_method attribute is deprecated in favor of `RESTStream.http_method`.
This release introduces a few improvements and changes to the SDK that should make it easier to work with SQL taps, REST streams, and targets.
A new SQL tap class attribute exclude_streams allows developers to exclude certain database schemas by default from discovery. This can speed up discovery and avoid issues when mapping types from database-internal schemas.
Discovery for SQL taps should be about 35% faster now, thanks to using SQLAlchemy 2.0+ reflection features.
A new target built-in setting process_activate_version_messages lets users disable processing of ACTIVATE_VERSION messages.
Support for other content-types in REST streams with the new RESTStream.payload_as_json attribute. This should make it easier to work with APIs that expect non-JSON payloads, such as XML.
The RESTStream.rest_method attribute is deprecated in favor of RESTStream.http_method.
[!IMPORTANT] This release drops support for Python 3.8. Please make sure to upgrade your tap or target to support Python 3.9+.
[!NOTE] SQL taps now require SQLAlchemy 2.0+.
activate_version for targets to optionally disable processing of ACTIVATE_VERSION messagesdecimal.Decimal in REST and GraphQL stream responsesmaxLength limit for VARCHARsversioning-strategy to dependabot config of Cookiecutter templateslistdir in folder taptable-key-properties, replication-key and forced-replication-methodactivate_version to process_activate_version_messages--catalog or --state do not existSQLToJSONSchema from the tap configurationNothing 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.42.1 (2024-11-11) ### 🐛 Fixes - #2756 Safely compare UUID replication keys with state bookmarks -- _Thanks @nikzavada!_ Full Changelog: https://
Full Changelog: https://github.com/meltano/sdk/compare/v0.42.0...v0.42.1
For SQL target developers, there is now a public and official API for overriding how JSON schema types are mapped into SQL types. Let us know if there
__stream_name__, including in the context of __alias__ expressions.SQLConnector.prepare_primary_key for target to implement for custom table primary key adaptationtitle is now supported in configuration and stream properties__alias__ context of stream maps -- Thanks @holly-evans!datetime.datetime instances in stream maps are now correctly mapped to date-time JSON schema stringsNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
It's easier now for SQL tap developers to customize the mapping from SQL column types to JSON schema. See the guide for details.
BATCH messages via stream maps -- Thanks @ReubenFrankel!maxLength when applicableflattening_max_depth is not setdate-time strings in the schema message -- Thanks @gregkoutsimp!None or __NULL__ in stream maps are now also removed from the schema required arrayFileStream (still in active development!)Faker class in stream mapsrecord-flattening capability -- Thanks @ReubenFrankel!SQLConnector.type_mapping to SQLConnector.sql_to_jsonschemawarnings.deprecated decoratorNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Targets now emit basic metrics. There's nothing to do on your end, they're enabled by default!
Faker class is available in stream maps context. Note that like the faker instance added in v0.35.0, this requires installing the faker library in the tap/target environment. For example, with tap-example[faker].schema_is_valid built-in tap test validates stream schemas against the JSON Schema specificationFaker class, rather than just a faker instancepytest-durations dependency from testing and use native pytest option --durations@override decoratorauth_headers and auth_params of APIAuthenticatorBase simple instance attributes instead of decorated propertiesfake and Faker objects were added to the stream maps contextget_starting_timestamp in incremental replication guidefaker extraNothing published for this version
Nothing published for this version
## v0.39.1 (2024-08-07) - PyPI 🐍 ### 🐛 Fixes - #2589 Make sink assertion compatible with stream maps -- _Thanks @JCotton1123!_ - #2592 Fixed typos in
--about plain text output_ (underscore) based on engine -- Thanks @haleemur!pendulum and python-dateutilpackaging semantic type in contributing guideThe json module can now be used within stream maps
The json module can now be used within stream maps
stream_maps:
animals:
id: id
data: "json.dumps({'description': description, 'verified': verified, 'views': views, 'created_at': created_at})"
__else__: null
The crypto dependencies PyJWT and cryptography are now optional and can be installed by requesting the jwt extra, i.e. singer-sdk[jwt]. These are only currently required for JWT authentication, but if your package depends on any of these, make sure the dependency is explicit.
The pendulum and python-dateutil dependencies are no longer used by this library and will be removed in a future release. If your package relies on any of them, make sure the dependency is explicit.
We're working on supporting msgspec for more performant IO, so keep an eye out for that 😉.
default_logging.yml to their packagejson module is now avaiable to stream maps -- Thanks @grigi!Stream.context attributeACTIVATE_VERSION messages in the base target class--aboutSQLSink a generic with a SQLConnector type parameterserialize_message for Singer writersPyJWT and cryptography dependencies optionalget_starting_timestamp requires setting a non-null replication_keyurl_base, path and the sync contextNothing published for this version
## v0.38.0 (2024-06-17) ### ✨ New - #2433 Tap developers can now disable HTTP redirects - #2426 Added an optional GitHub workflow to publish to PyPI w
launch.json to use debugpydatetime.datetime class in type conforming checksutc_now from pendulum.DateTime to datetime.datetimeNothing published for this version
Nothing published for this version
Nothing published for this version
You can reference your streams with glob patterns in stream map configuration:
You can reference your streams with glob patterns in stream map configuration:
stream_maps:
# This will affect all streams with names starting with 'my_prefix_'
"my_prefix_*":
id: id
first_name: first_name
email: # drop the PII field from RECORD and SCHEMA messages
email_domain: email.split('@')[-1]
email_hash: md5(config['hash_seed'] + email)
__else__: null
allOf is now supportedPropertiesList can now behave as an iterable -- Thanks @ReubenFrankel!sensitive: true to password settings in templatesadditionalPropertiesNo schema for record field warning -- Thanks @tobiascadee!importlib-resources >=6.3.2jwt package extra, but the cryptography and jwt dependencies are still installed by default for nowBATCH as a default plugin capability -- Thanks @ReubenFrankel!Your coding agent can read these notes before it upgrades. Set up the MCP server →