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
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing 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.54.7 (2026-09-29) 🐛 Fixes #3804 Ensure state partition context is a writable object
v0.54.6 (2026-09-13) 🐛 Fixes Bump simpleeval to 1.0.8
v0.54.5 (2026-06-16) 🐛 Fixes #3677 Convert class-scoped fixtures in built-in integration tests into @classmethod s
v0.54.4 (2026-05-28) 🐛 Fixes #3654 Emitted ACTIVATE_VERSION messages now honor the stream aliases configured with stream maps
ACTIVATE_VERSION messages now honor the stream aliases configured with stream mapsv0.54.3 (2026-05-27) 🐛 Fixes #3650 Ensure stream name is included in log messages when ACTIVATE_VERSION forces _sdc metadata columns
v0.54.2 (2026-05-18) 🐛 Fixes #3632 Honor state_partitioning_keys declared as class attributes
## v0.54.1 (2026-05-15) ### 🐛 Fixes - #3628 Avoid logging full context dictionary
This method allows setting multiple request arguments at once: headers, URL query parameters, etc.
RESTStream.get_http_requestThis method allows setting multiple request arguments at once: headers, URL query parameters, etc.
class MyStream(RESTStream):
def get_http_request(self, *, page):
request = super().get_http_request(page=page)
request.params["page"] = page.next_page_token
return request
Docs: https://sdk.meltano.com/en/v0.54.0/classes/singer_sdk.RESTStream.html#singer_sdk.RESTStream.get_http_request
RESTStream.get_http_request method to construct the HTTP request for a streamoneOf schema members where one of them is the null type, into a single nullable schemamdformat in tap, target and mapper templates to format markdown filesanyOf members in OpenAPI specsoneOf members in OpenAPI specspattern keys to avoid issues in downstream consumers where they might not be able to parse the regex patternBasePageNumberPaginator and BaseOffsetPaginator in favor of PageNumberPaginator and OffsetPaginator, respectivelysinger-sdk/<version> as the default User-Agent headerx-sql-datatype in x-sql-datatype-propertiesStream.replication_key in metadata as the default replication keyflattening_separator as an additional flattening config -- Thanks @iamlorax!simpleeval 1.0.5+ by subclassing simpleeval.EvalWithCompoundTypesrequests~=2.33.0 in tap and target templatesstrict = true in pytest configastral-sh/setup-uv in GitHub workflows$refs in additionalPropertiesBasicAuthenticator class is no longer deprecated.secrets directory and instead ignore any config.json file at the rootuser_agent setting# noqa: ERA001 comments from templatessqlalchemy.types.Float and sqlalchemy.types.Numeric as distinct types when mapping them to JSON schema in preparation for SQLAlchemy 2.1s3fs dependency to prevent it from going stalemeltano.ymlcontext parameter of Stream.get_replication_key_signpost() optional and default to NoneDatetimeErrorTreatmentEnum from singer_sdk.helpers.conformTypeConformanceLevel from singer_sdk.helpers.conformdict(...) to copy the default functions supported in stream mapsIgnorableSyncError -> SkippableSyncErrorStream.reset_state_progress_markers method@warnings.deprecated decorator directlyPluginBase.config_from_cli_args method, which has not been used for a whileDatetimeErrorTreatmentEnum and TypeConformanceLevel from private singer_sdk.helpers._typing to a public singer_sdk.helpers.conforming moduledatetime.datetime checksinger_sdk.exceptions moduleStream.state_partitioning_keys to allow a tuple of stringsRESTStream.get_url_params return type annotation to only support dictionariesUser-Agent even if user overrides http_headersrefs attribute of the singer_sdk.singerlib.resolve_schema_references functionAny to RESTStream type parameterFURB rulesplugin_cli implementation to private module singer_sdk.cli._decoratortyping.ClassVar in examplesNumberType to reference index pagecreate_for_streamReturns, Yields and Raises sections in docstrings in a consistent wayhatchling build dependencyNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing 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.53.7 (2026-04-15) ### 🐛 Fixes - #3601 Support simpleeval 1.0.5+ by subclassing simpleeval.EvalWithCompoundTypes
simpleeval 1.0.5+ by subclassing simpleeval.EvalWithCompoundTypes## v0.53.6 (2026-03-13) ### 🐛 Fixes - #3562 Constrain simpleeval dependency to prevent issues with using json in stream maps expressions
simpleeval dependency to prevent issues with using json in stream maps expressionssimpleeval dependency to prevent issues when using json in stream maps expressions## v0.53.5 (2026-01-06) ### 🐛 Fixes - #3436 Do not try to parse the error response from the OAuth token request as JSON to avoid deserialization error
variant prompt in templates## v0.53.4 (2025-11-28) ### 🐛 Fixes - #3393 Make StreamSchema.get_stream_schema generic to avoid downstream warnings about violation of the LSP ### ⚙️
## v0.53.3 (2025-11-25) ### 🐛 Fixes - #3387 Do not leave dangling nullable field in OpenAPI schema properties - #3386 Do not add "type": ["null"] to O
nullable field in OpenAPI schema properties"type": ["null"] to OpenAPI spec properties without a typeStream.reset_state_progress_markers since it is not being used## v0.53.2 (2025-11-19) ### 🐛 Fixes - #3378 Revert "feat(taps): Queue parent contexts and sync child streams only when the queue is full (#3058)"
## v0.53.1 (2025-11-19) ### 🐛 Fixes - #3374 For log-based streams, write starting bookmark to the state to ensure the sync runs "incrementally"
## v0.53.0 (2025-11-18) ### ✨ New - #3369 In OpenAPI schema normalization, treat all fields as nullable unless they are part of a primary key - #3058
nullable unless they are part of a primary keyallOf components in OpenAPI spec schemasflattening_max_key_length configuration optionbackoff to python-backoffbranches condition from pull request workflow triggermeltano.yml in templates, use SchemaDirectorysinger_sdk.sinks.sql more specific## v0.52.5 (2025-10-30) ### 🐛 Fixes - #3350 Configuration schema now reflects that casting to bool(...) in stream map __filter__ expressions is not re
## v0.52.4 (2025-10-28) ### 🐛 Fixes - #3346 Preserve properties with empty JSON schema when flattening them - #3345 Use tuple primary keys in tap temp
## v0.52.3 (2025-10-28) ### 🐛 Fixes - #3343 Fix regression in v0.52.0 where the auth attribute was removed from the RESTStream.requests_session instan
auth attribute was removed from the RESTStream.requests_session instanceRECORD messages## v0.52.2 (2025-10-22) ### 🐛 Fixes - #3328 Support MIT as a license option in templates - #3327 Emit a log when requesting a new access token in OAut
## v0.52.1 (2025-10-22) ### 📦 Packaging changes - #3325 Fix python_version marker in backoff dependency
## v0.52.0 (2025-10-21) ### ✨ New - #3311 New Stream.preprocess_context lets developers make changes to the stream context before it is frozen ### 🐛 F
Stream.preprocess_context lets developers make changes to the stream context before it is frozenProgramming Language :: Python :: 3 :: Only classifier when generating --about outputschema to extra log fields when schema validation failsbackoff_wait_generator in example## v0.51.0 (2025-10-17) ### ✨ New - #3307 Allow the user to override stream and sink meters (i.e. counters & timers) ### ⚙️ Under the Hood - #3302 In
## v0.50.2 (2025-10-06) ### 🐛 Fixes - #3297 Honor the _LOG_REQUEST_METRICS stream parameter
## v0.50.1 (2025-10-03) ### 🐛 Fixes - #3295 Ensure plugins advertise structured-logging capability
## v0.50.0 (2025-10-01) ### ✨ New - #3279 Emit structured logs and document this new capability for downstream consumers ### 🐛 Fixes - #3287 Handle pr
charset in Content-Type header when retrieving schema from OpenAPI specSingerMetricsFormattercommon_options modulemetrics_log_level setting in favor of application log levelPoint instance for metrics## v0.49.1 (2025-09-14) ### 🐛 Fixes - #3275 Add setter method to deprecated APIAuthenticatorBase.tap_name property
APIAuthenticatorBase.tap_name property## v0.49.0 (2025-09-11) ### ✨ New - #3262 By default ObjectType fields now use additionalProperties: true - #3196 Use ty to check types in tap, target
ObjectType fields now use additionalProperties: truety to check types in tap, target and mapper templatesDecimalType alias for NumberTypesinger_sdk.sql, deprecate old locations and add a sql dependency extrastream attribute in authenticator constructors and also deprecate the create_for_stream methodtyping.override in mapper and tap templatesplugin_type attribute from test template classes## v0.48.1 (2025-08-21) ### ✨ New - #3238 Auto-detect and load YAML-formatted OpenAPI specs - #3227 Get the supported Python versions in --about outpu
--about output from PyPI classifiers if they are available<4 Python version constraint for backoff dependencyuv in templates READMEuv in templates.env in templatesRESTStream.backoff_runtime to support any number typeDiscoveryError when schema for stream is not providedThe Singer SDK now provides an extensible API for loading schemas from various sources through the SchemaSource API. For example,
The Singer SDK now provides an extensible API for loading schemas from various sources through the SchemaSource API. For example,
from typing import ClassVar
from singer_sdk import OpenAPISchema, StreamSchema
# Load from OpenAPI spec
openapi_source = OpenAPISchema("https://api.example.com/openapi.json")
class UsersStream(RESTStream):
name = "users"
schema: ClassVar[StreamSchema] = StreamSchema(openapi_source, key="User") # Load "User" component
Docs: https://sdk.meltano.com/en/v0.48.0/guides/schema-sources.html
__original_stream_name__ in stream maps -- Thanks @ReubenFrankel!.env.example files to tap, target and mapper templatesstream_maps--about --format=markdown compliant with CommonMarkRESTStream.get_new_paginator to indicate returning None is supported to indicate no pagination- in SQL targets when default_target_schema is set, introduced in #3020RESTStream.records_jsonpath read-only by defaultget_stream_schema the public API of the StreamSchema descriptorSchemaSource generic on any hashable key typecapabilities a proper class attribute for tap, target and mapper classesBaseTestClass subclass when generating built-in testsSingerTestRunner classjsonschema validator instance directly instead of routing through jsonschema.validators.validator_forTestSuite → SingerTestSuite to prevent a pytest test collection warningclick callback to parse config input arguments and deprecate PluginBase.config_from_cli_argsFaker class from stream mapssinger_sdk._singerlib## v0.47.4 (2025-06-25) ### 🐛 Fixes - #3138 Ensure Singer SDK warnings are logged
## v0.47.3 (2025-06-19) ### 🐛 Fixes - #3113 Remove redundant tool.ruff.target-version from tap template ### 📚 Documentation Improvements - #3116 Docum
## v0.47.2 (2025-06-17) ### 🐛 Fixes - #3111 Ensure state progress markers in child streams are finalized - #3108 Suppress unmapped warning for additio
## v0.47.1 (2025-06-16) ### 🐛 Fixes - #3106 Apply .upper() to metrics_log_level setting value - #3102 Bump "build and inspect python package" action i
Taps can now emit `ACTIVATE_VERSION` messages when the builtin emit_activate_version_messages config is set to True.
ACTIVATE_VERSIONTaps can now emit ACTIVATE_VERSION messages when the builtin emit_activate_version_messages config is set to True.
Setting the <APP_NAME>_LOGLEVEL or LOGLEVEL environment variables will now apply that level to all logs generated by taps , mappers and targets.
post_processThe stream post_process method is now executed for all stream types automatically. This can result in duplicate calls to the function if you have a stream with a custom get_records implementation such as
def get_records(self, context):
"""Get records from the API response."""
for record in self.request_records(context):
transformed_record = self.post_process(record, context)
if transformed_record is None:
continue
yield transformed_record
So you may want to streamline it:
def get_records(self, context: dict | None) -> t.Iterable[dict[str, t.Any]]:
"""Get records from the API response."""
yield from self.request_records(context):
SELECT statement filter and limit clauses without modifying extraction logic<APP_NAME>_LOGLEVEL and LOGLEVEL environment variables across all default loggingACTIVATE_VERSION messages for streams with FULL_TABLE replicationpost_process automatically to all stream typesrequired properties list in the JSON schema- in SQL targets when default_target_schema is set, introduced in #3020BATCH extra dependency in templatesauth callable/tuple to each tap API requestdict.setdefault to fill in state dictionarypyproject.toml in tap, mapper and target templatescontext parameter of SQLStream.build_query a keyword-only argumentSQLStream.build_queryTypedDict for tap stateStream.get_recordsINFO to DEBUGBATCH storage object only once per set of filesStream.primary_keys to always be a sequenceYour coding agent can read these notes before it upgrades. Set up the MCP server →