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.
Target SDK: Use maxLength in SQL targets for string fields if the schema provides it (#371, !284) - _Thanks, [Thomas Briggs](https://gitlab.com/tbrigg
maxLength in SQL targets for string fields if the schema provides it (#371, !284) - Thanks, Thomas Briggs!Tap Cookiecutter: Fixed a bug where the wrong key was used to select the appropriate Tap class for SQL taps (#353, !275) - _Thanks, [Dan Norman](https
Tap class for SQL taps (#353, !275) - Thanks, Dan Norman!client.py for SQL taps was overwritten during initialization (#354, !276) - Thanks, Dan Norman!pyjwt dependency to ~=2.3 (!281) - Thanks, Eric Boucher!Raise more descriptive exceptions when wrapped JSON typing classes needs to be instantiated (#55, #360, !270).
Avoid SQLAlchemy deprecation warning caused by using Engine.has_table() (#341, !264)
Engine.has_table() (#341, !264)poetry-core version in cookiecutter templates (#338, !260)Nothing published for this version
Define all built-in JSON Schema string formats as separate types (#336, !250) - _Thanks, [Reuben Frankel](https://gitlab.com/ReubenFrankel)_!
Deprecate Python 3.6 (#316, !246)
Add record and schema flattening in Stream Maps (!236),
Always sync one record per stream when invoking with --test or --test=all (#311, !241)
--test or --test=all (#311, !241)--test=schema option to emit tap SCHEMA messages only (!218) - Thanks, Laurent Savaëte!Nothing published for this version
Nothing published for this version
Nothing published for this version
Inline Mapper SDK: Support for creation of inline mapper plugins (#257, !234)
pip install -e .) with PEP 660 (#238, !231)target-jsonl (!228) -- Thanks, Niall Woodward!expires_in property optional in OAuth response (#297, !232) -- Thanks, Daniel Ferguson!Tap SDK: Add configurable timeout for HTTP requests (#287, !217, !225) -- _Thanks, [Josh Lloyd](https://gitlab.com/jlloyd3)!_
Tap SDK: Fix datelike type parsing bug with nested schemas (#283, !219)
Tap SDK: Fixed mapped __key_properties__ not being passed to the emitted schema message (#281, !209)
__key_properties__ not being passed to the emitted schema message (#281, !209)Tap SDK: New method RESTStream.validate_response for custom validation of HTTP responses (#207, !195)
RESTStream.validate_response for custom validation of HTTP responses (#207, !195)RESTStream.request_decorator for custom back-off and retry parameters (#137, !195)Nothing published for this version
Target SDK: CLI flag for targets to read messages from a file instead of stdin (#249, !190) -- _Thanks, [Charles Julian Knight](https://gitlab.com/rab
Nothing published for this version
Nothing published for this version
Tap and Target SDK: Fix markdown table formatting in --about for multi-line settings descriptions (#240, !185)
--about for multi-line settings descriptions (#240, !185)None from post_process() (#233, !187)dataclasses as an explicit third-party dependency for Python 3.6 (#245, !189)--discover and --about execution without requiring settings validation (#235, !188)Tap and Target SDK: Adds capability to print markdown docs with --about --format=markdown (!172, !180) -- _Thanks, [Nick Müller](https://gitlab.com/mu
--about --format=markdown (!172, !180) -- Thanks, Nick Müller!Stream.get_starting_timestamp() and Stream.get_starting_replication_key_value() calls where results where not cached breaking stream sorting (!157)Tap and Target SDK: Prevents the leaking of sensitive configuration values when JSON schema validation fails (!173) -- _Thanks, [Kevin Mullins](https:
Nothing published for this version
Nothing published for this version
Nothing published for this version
Add description attribute to Property class for JSON schemas (#159, !164) -- _Thanks, [Stephen Bailey](https://gitlab.com/stkbailey)!_
Property class for JSON schemas (#159, !164) -- Thanks, Stephen Bailey!key_properties = [] instead of null per the Singer spec (!160) -- Thanks, Niall Woodward!Nothing published for this version
Tap and Target SDK: Resolves 2to3 compatibility issues when installed with setuptools>=58.0.
2to3 compatibility issues when installed with setuptools>=58.0.Tap and Target SDK: Added compatibility with PEP 561 and mypy type checking (#212, !150) -- _Thanks, [Laurent Savaëte](https://gitlab.com/LaurentS)!_
mypy type checking (#212, !150) -- Thanks, Laurent Savaëte!Tap and Target SDK: Adds support for Python 3.9 (#66, !38)
BasicAuthenticator, BearerTokenAuthenticator, and APIKeyAuthenticator (#185, !128) -- Thanks, Stephen Bailey!click library version to 8.0 (#178, !140).BatchSink performance by reducing the frequency by which batches are processed. (#172, !137)--help output (#177, !140).+0:00 (#176, !142) -- Thanks, Joshua Adeyemi!Nothing published for this version
Nothing published for this version
Tap SDK: Fixed a bug where not using a catalog file resulted in all streams being selected but all properties being removed from the schema and record
Nothing published for this version
Nothing published for this version
Tap SDK: Added full support for selection metadata as specified by the Singer Spec, including metadata for selected, selected-by-default, and inclusio
selected, selected-by-default, and inclusion (!121)Nothing published for this version
Added JSONPath for taps to handle record extraction from API responses (!77)
context not being reset between batches (#164, !117)DEFAULT_BATCH_SIZE_ROWS in favor of max_size for BatchSink implementations (#163, !118)Resolve stream map duplicates not aliased correctly (#154, !114)
Added target support for add_record_metadata config (#157, !111)
add_record_metadata config (#157, !111)default_sink_class is not used (#153, !109)Removed methods deprecated in v0.2.0: get_partition_state() and get_stream_or_partition_state(). Affected developers should replace these with referen…
get_partition_state() and get_stream_or_partition_state(). Affected developers should replace these with references to get_context_state(). (#152, !107)Nothing published for this version
Nothing published for this version
Nothing published for this version
The methods Stream.get_partition_state() and Stream.get_stream_or_partition_state() have been deprecated in favor of the new and simpler get_context_s…
Stream.state_partitioning_keys to a
subset of available context keys (!79)partition dictionary arg in method signatures to the more generic context (!79)Stream.get_partition_state() and Stream.get_stream_or_partition_state()
have been deprecated in favor of the new and simpler get_context_state() (!79)Nothing published for this version
Nothing published for this version
Stability and bugfix release. No breaking changes.
Stability and bugfix release. No breaking changes.
Nothing published for this version
Bugfix release. No breaking changes.
Bugfix release. No breaking changes.
Nothing published for this version
Nothing published for this version
Significant release with newly added features. No breaking changes.
Significant release with newly added features. No breaking changes.
Significant release with newly added features. No breaking changes.
Significant release with newly added features. No breaking changes.
is_sorted stream property, which enables long-running incremental streams to be
resumed if interrupted. (!61)get_replication_key_signpost() stream method which defaults to the current time
for timestamp-based replication keys. (!61)Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →