driftwatch

What your API vendors changed, read from the calling end. Every diff tool on the market watches your own spec to protect your customers. This one watches theirs.

OpenAI2026-09-29 · c25ff3f01 breaking11 additive
  • Breakingdirection flipresponse.enum.value-added

    value can now return "gpt-6.1-sol"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "gpt-6.1-sol"

    2 places: BetaModelIdsShared, ModelIdsShared
    switch (response) {
      // existing branches …
      // no branch for "gpt-6.1-sol"
      default:
        throw new Error("unexpected value");
    }

Additive3 new response fieldsEnvironmentResourceOpenaiHosted.container_size, EnvironmentResourceOpenaiHosted.desktop, EnvironmentTemplateResource.desktop

Additive8 new request propertiesNetworkPolicyParam.blocked_domains, CreateEnvironmentTemplateParams.network.blocked_domains, CreateEnvironmentTemplateParams.desktop, EnvironmentParamOpenaiHosted.network.blocked_domains, EnvironmentParamOpenaiHosted.container_size, EnvironmentParamOpenaiHosted.desktop, UpdateEnvironmentTemplateParams.network.blocked_domains, UpdateEnvironmentTemplateParams.desktop

OpenAI2026-09-28 · 14b6495c4 breaking
  • Breakingdirection flipresponse.property.became-optional

    Response field noise_reduction is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    can now be null

    3 places: RealtimeSessionCreateResponse.audio.input.noise_reduction, RealtimeSessionCreateResponseGA.audio.input.noise_reduction, RealtimeTranscriptionSessionCreateResponseGA.audio.input.noise_reduction
    // response.audio.input.noise_reduction may now be absent or null
    const noise_reduction = response.audio.input.noise_reduction ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field turn_detection is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    can now be null

    2 places: RealtimeSessionCreateResponse.audio.input.turn_detection, RealtimeSessionCreateResponse.turn_detection
    // response.audio.input.turn_detection may now be absent or null
    const turn_detection = response.audio.input.turn_detection ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field include is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    can now be null

    2 places: RealtimeSessionCreateResponseGA.include, RealtimeTranscriptionSessionCreateResponseGA.include
    // response.include may now be absent or null
    const include = response.include ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field language is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    AudioTranscriptionResponse.language · reachable from 3 operations
    // response.language may now be absent or null
    const language = response.language ?? fallback;
OpenAI2026-09-28 · 87b2daae8 breaking6 additive
  • Breakingresponse.property.removed

    Response field annotations removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    ChatCompletionMessageList.data[].annotations · reachable from 1 operation
    // response.data[0].annotations is now undefined
    const annotations = response.data[0].annotations;
  • Breakingresponse.property.removed

    Response field audio removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    ChatCompletionMessageList.data[].audio · reachable from 1 operation
    // response.data[0].audio is now undefined
    const audio = response.data[0].audio;
  • Breakingresponse.property.removed

    Response field function_call removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    ChatCompletionMessageList.data[].function_call · reachable from 1 operation
    // response.data[0].function_call is now undefined
    const function_call = response.data[0].function_call;
  • Breakingresponse.property.removed

    Response field refusal removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    ChatCompletionMessageList.data[].refusal · reachable from 1 operation
    // response.data[0].refusal is now undefined
    const refusal = response.data[0].refusal;
  • Breakingdirection flipresponse.enum.value-added

    role can now return "developer", "function", "system", "tool", "user"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    ChatCompletionMessageList.data[].role · reachable from 1 operation
    switch (response.data[0].role) {
      // existing branches …
      // no branch for "developer"
      // no branch for "function"
      // no branch for "system"
      // no branch for "tool"
      // no branch for "user"
      default:
        throw new Error("unexpected role");
    }
  • Breakingresponse.property.removed

    Response field tool_calls removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    ChatCompletionMessageList.data[].tool_calls · reachable from 1 operation
    // response.data[0].tool_calls is now undefined
    const tool_calls = response.data[0].tool_calls;
  • Breakingdirection flipresponse.property.became-optional

    Response field first_id is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    ChatCompletionMessageList.first_id · reachable from 1 operation
    // response.first_id may now be absent or null
    const first_id = response.first_id ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field last_id is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    ChatCompletionMessageList.last_id · reachable from 1 operation
    // response.last_id may now be absent or null
    const last_id = response.last_id ?? fallback;

Additive6 new response fieldsChatCompletionMessageList.data[].content_parts[].file, ChatCompletionMessageList.data[].content_parts[].image_url, ChatCompletionMessageList.data[].content_parts[].input_audio, ChatCompletionMessageList.data[].content_parts[].text, ChatCompletionMessageList.data[].content_parts[].type, ChatCompletionMessageList.data[].name

OpenAI2026-09-28 · f6be21c58 breaking
  • Breakingdirection flipresponse.property.became-optional

    Response field action is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    no longer guaranteed present

    2 places: BetaWebSearchToolCall.action, WebSearchToolCall.action
    // response.action may now be absent or null
    const action = response.action ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field completed_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.completed_at · reachable from 4 operations
    // response.completed_at may now be absent or null
    const completed_at = response.completed_at ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field error_file_id is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.error_file_id · reachable from 4 operations
    // response.error_file_id may now be absent or null
    const error_file_id = response.error_file_id ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field expires_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.expires_at · reachable from 4 operations
    // response.expires_at may now be absent or null
    const expires_at = response.expires_at ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field finalizing_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.finalizing_at · reachable from 4 operations
    // response.finalizing_at may now be absent or null
    const finalizing_at = response.finalizing_at ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field in_progress_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.in_progress_at · reachable from 4 operations
    // response.in_progress_at may now be absent or null
    const in_progress_at = response.in_progress_at ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field output_file_id is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.output_file_id · reachable from 4 operations
    // response.output_file_id may now be absent or null
    const output_file_id = response.output_file_id ?? fallback;
  • Breakingdirection flipresponse.enum.value-added

    object can now return "vector_store.file_batch"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    VectorStoreFileBatchObject.object · reachable from 3 operations
    switch (response.object) {
      // existing branches …
      // no branch for "vector_store.file_batch"
      default:
        throw new Error("unexpected object");
    }
OpenAI2026-09-28 · 883357cf7 breaking
  • Breakingdirection flipresponse.property.became-optional

    Response field refusal is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    no longer guaranteed present

    2 places: ChatCompletionMessageList.data[].refusal, ChatCompletionResponseMessage.refusal
    // response.data[0].refusal may now be absent or null
    const refusal = response.data[0].refusal ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field function_call is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    can now be null

    2 places: ChatCompletionMessageList.data[].function_call, ChatCompletionResponseMessage.function_call
    // response.data[0].function_call may now be absent or null
    const function_call = response.data[0].function_call ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field hyperparameters is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    FineTuningJob.hyperparameters · reachable from 6 operations
    // response.hyperparameters may now be absent or null
    const hyperparameters = response.hyperparameters ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field seed is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    FineTuningJob.seed · reachable from 6 operations
    // response.seed may now be absent or null
    const seed = response.seed ?? fallback;
  • Breakingdirection flipresponse.enum.value-added

    status can now return "paused", "pausing"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    FineTuningJob.status · reachable from 6 operations
    switch (response.status) {
      // existing branches …
      // no branch for "paused"
      // no branch for "pausing"
      default:
        throw new Error("unexpected status");
    }
  • Breakingdirection flipresponse.property.became-optional

    Response field first_id is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    ChatCompletionList.first_id · reachable from 1 operation
    // response.first_id may now be absent or null
    const first_id = response.first_id ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field last_id is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    ChatCompletionList.last_id · reachable from 1 operation
    // response.last_id may now be absent or null
    const last_id = response.last_id ?? fallback;
OpenAI2026-09-28 · 78e0725d1 breaking7 additive
  • Breakingdirection flipresponse.property.became-optional

    Response field user is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    can now be null

    4 places: BetaResponse.user, BetaModelResponseProperties.user, ModelResponseProperties.user, Response.user
    // response.user may now be absent or null
    const user = response.user ?? fallback;
  • Additiverequest.property.became-nullable

    Request field now accepts null

    A relaxation. Existing payloads are unaffected.

    ModelResponseProperties.user · reachable from 4 operations
  • Additiverequest.property.became-nullable

    Request field now accepts null

    A relaxation. Existing payloads are unaffected.

    BetaModelResponseProperties.user · reachable from 3 operations
  • Additiverequest.property.became-nullable

    Request field now accepts null

    A relaxation. Existing payloads are unaffected.

    CreateModelResponseProperties.user · reachable from 2 operations
  • Additiverequest.property.became-nullable

    Request field now accepts null

    A relaxation. Existing payloads are unaffected.

    BetaCreateModelResponseProperties.user · reachable from 1 operation
  • Additiverequest.property.became-nullable

    Request field now accepts null

    A relaxation. Existing payloads are unaffected.

    BetaCreateResponse.user · reachable from 1 operation
  • Additiverequest.property.became-nullable

    Request field now accepts null

    A relaxation. Existing payloads are unaffected.

    CreateChatCompletionRequest.user · reachable from 1 operation
  • Additiverequest.property.became-nullable

    Request field now accepts null

    A relaxation. Existing payloads are unaffected.

    CreateResponse.user · reachable from 1 operation
OpenAI2026-09-28 · 6faa7e5e1 breaking
  • Breakingdirection flipresponse.enum.value-added

    finish_reason gained response values

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    CreateChatCompletionStreamResponse.choices[].finish_reason · reachable from 1 operation
    switch (response.choices[0].finish_reason) {
      // existing branches …
    
      default:
        throw new Error("unexpected finish_reason");
    }
OpenAI2026-09-28 · aae0ce2c5 breaking
  • Breakingdirection flipresponse.property.became-optional

    Response field cancelled_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.cancelled_at · reachable from 4 operations
    // response.cancelled_at may now be absent or null
    const cancelled_at = response.cancelled_at ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field cancelling_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.cancelling_at · reachable from 4 operations
    // response.cancelling_at may now be absent or null
    const cancelling_at = response.cancelling_at ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field errors is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.errors · reachable from 4 operations
    // response.errors may now be absent or null
    const errors = response.errors ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field expired_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.expired_at · reachable from 4 operations
    // response.expired_at may now be absent or null
    const expired_at = response.expired_at ?? fallback;
  • Breakingdirection flipresponse.property.became-optional

    Response field failed_at is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    Batch.failed_at · reachable from 4 operations
    // response.failed_at may now be absent or null
    const failed_at = response.failed_at ?? fallback;
GitHub · rest2026-09-24 · f4f0708f1 behavioral
  • Behavioralresponse.status-code.added

    503 is now documented on /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers

    An unhandled branch in your error handling.

    POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers
Stripe2026-09-23 · c8faccbd24 breaking106 additive

Stripe's published spec describes its newest API version. Accounts are pinned to the version they signed up on, so a change like this reaches your integration when you upgrade that version, not the day Stripe ships it.

  • Breakingdirection fliprequest.property.removed

    igic is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    27 places: POST /v1/tax/registrations · country_options.at.igic, POST /v1/tax/registrations · country_options.be.igic, POST /v1/tax/registrations · country_options.bg.igic, POST /v1/tax/registrations · country_options.cy.igic, POST /v1/tax/registrations · country_options.cz.igic, POST /v1/tax/registrations · country_options.de.igic +21 more
    await client.post("/v1/tax/registrations", {
      // igic is now ignored, not rejected
      igic: value,
    });
  • Breakingdirection flipresponse.enum.value-added

    type can now return "paypay", "sequra"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "paypay", "sequra"

    5 places: confirmation_tokens_resource_payment_method_preview.type, payment_intent.excluded_payment_method_types[], payment_link.payment_method_types[], payment_method.type, setup_intent.excluded_payment_method_types[]
    switch (response.type) {
      // existing branches …
      // no branch for "paypay"
      // no branch for "sequra"
      default:
        throw new Error("unexpected type");
    }
  • Breakingrequest.property.became-required

    type is now required

    Partial payloads are rejected.

    3 places: POST /v1/invoices/create_preview · subscription_details.billing_cycle_anchor.type, POST /v1/subscriptions/{subscription_exposed_id} · billing_cycle_anchor.type, POST /v1/subscriptions/{subscription}/resume · billing_cycle_anchor.type
    await client.post("/v1/invoices/create_preview", {
      // …
      type: /* now required */,
    });
  • Breakingdirection flipresponse.enum.value-added

    allowed_payment_method_types can now return "card_present", "interac_present"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "card_present", "interac_present"

    2 places: payment_intent.allowed_payment_method_types[], setup_intent.allowed_payment_method_types[]
    switch (response.allowed_payment_method_types[0]) {
      // existing branches …
      // no branch for "card_present"
      // no branch for "interac_present"
      default:
        throw new Error("unexpected allowed_payment_method_types");
    }
  • Breakingdirection flipresponse.enum.value-added

    payment_method_types can now return "blik"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "blik"

    2 places: invoices_payment_settings.payment_method_types[], subscriptions_resource_payment_settings.payment_method_types[]
    switch (response.payment_method_types[0]) {
      // existing branches …
      // no branch for "blik"
      default:
        throw new Error("unexpected payment_method_types");
    }
  • Breakingdirection flipresponse.enum.value-added

    setup_future_usage can now return "off_session"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "off_session"

    2 places: checkout_bancontact_payment_method_options.setup_future_usage, payment_intent_payment_method_options_blik.setup_future_usage
    switch (response.setup_future_usage) {
      // existing branches …
      // no branch for "off_session"
      default:
        throw new Error("unexpected setup_future_usage");
    }
  • Breakingdirection flipresponse.enum.value-added

    network can now return "rtp"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "rtp"

    2 places: treasury.received_credit.network, treasury_financial_accounts_resource_financial_address.supported_networks[]
    switch (response.network) {
      // existing branches …
      // no branch for "rtp"
      default:
        throw new Error("unexpected network");
    }
  • Breakingdirection flipresponse.enum.value-added

    tax_type can now return "admissions_tax", "attendance_tax", "digital_excise_tax", "entertainment_tax", "gross_receipts_tax", "hospitality_tax", "luxury_tax", "recycling_fee", "resort_tax", "tourism_tax", "utility_users_tax"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "admissions_tax", "attendance_tax", "digital_excise_tax", "entertainment_tax", "gross_receipts_tax", "hospitality_tax", "luxury_tax", "recycling_fee", "resort_tax", "tourism_tax", "utility_users_tax"

    2 places: tax_product_resource_line_item_tax_rate_details.tax_type, tax_product_resource_tax_rate_details.tax_type
    switch (response.tax_type) {
      // existing branches …
      // no branch for "admissions_tax"
      // no branch for "attendance_tax"
      // no branch for "digital_excise_tax"
      // no branch for "entertainment_tax"
      // no branch for "gross_receipts_tax"
      // no branch for "hospitality_tax"
      // no branch for "luxury_tax"
      // no branch for "recycling_fee"
      // no branch for "resort_tax"
      // no branch for "tourism_tax"
      // no branch for "utility_users_tax"
      default:
        throw new Error("unexpected tax_type");
    }
  • Breakingdirection flipresponse.enum.value-added

    code can now return "invalid_address_cmra_address", "invalid_address_registered_agent_address"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    account_requirements_error.code · reachable from 575 operations
    switch (response.code) {
      // existing branches …
      // no branch for "invalid_address_cmra_address"
      // no branch for "invalid_address_registered_agent_address"
      default:
        throw new Error("unexpected code");
    }
  • Breakingdirection flipresponse.enum.value-added

    type can now return "issuing_dispute_provisional_credit", "issuing_dispute_provisional_credit_reversal"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    balance_transaction.type · reachable from 553 operations
    switch (response.type) {
      // existing branches …
      // no branch for "issuing_dispute_provisional_credit"
      // no branch for "issuing_dispute_provisional_credit_reversal"
      default:
        throw new Error("unexpected type");
    }
  • Breakingdirection flipresponse.enum.value-added

    tax_type can now return "digital_excise_tax", "utility_users_tax"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    tax_rate.tax_type · reachable from 543 operations
    switch (response.tax_type) {
      // existing branches …
      // no branch for "digital_excise_tax"
      // no branch for "utility_users_tax"
      default:
        throw new Error("unexpected tax_type");
    }
  • Breakingdirection flipresponse.enum.value-added

    version can now return "2.3.0", "2.3.1"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    payments_primitives_payment_records_resource_payment_method_card_details_resource_three_d_secure.version · reachable from 143 operations
    switch (response.version) {
      // existing branches …
      // no branch for "2.3.0"
      // no branch for "2.3.1"
      default:
        throw new Error("unexpected version");
    }
  • Breakingdirection flipresponse.enum.value-added

    ui_mode can now return "form"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    checkout.session.ui_mode · reachable from 15 operations
    switch (response.ui_mode) {
      // existing branches …
      // no branch for "form"
      default:
        throw new Error("unexpected ui_mode");
    }
  • Breakingdirection flipresponse.enum.value-added

    status can now return "expired", "pending"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    bank_connections_resource_account_number_details.status · reachable from 14 operations
    switch (response.status) {
      // existing branches …
      // no branch for "expired"
      // no branch for "pending"
      default:
        throw new Error("unexpected status");
    }
  • Breakingdirection fliprequest.property.removed

    payment_method_types is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    POST /v1/checkout/sessions · payment_method_types · 6 call sites
    await client.post("/v1/checkout/sessions", {
      // payment_method_types is now ignored, not rejected
      payment_method_types: value,
    });
  • Breakingresponse.property.removed

    Response field countries removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    bank_connections_resource_link_account_session_filters.countries · reachable from 4 operations
    // response.countries is now undefined
    const countries = response.countries;
  • Breakingresponse.property.removed

    Response field igic removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    tax_product_registrations_resource_country_options_europe.igic · reachable from 4 operations
    // response.igic is now undefined
    const igic = response.igic;
  • Breakingdirection flipresponse.enum.value-added

    type can now return "admissions_tax", "attendance_tax", "entertainment_tax", "gross_receipts_tax", "hospitality_tax", "luxury_tax", "resort_tax", "tourism_tax"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    tax_product_registrations_resource_country_options_united_states.type · reachable from 4 operations
    switch (response.type) {
      // existing branches …
      // no branch for "admissions_tax"
      // no branch for "attendance_tax"
      // no branch for "entertainment_tax"
      // no branch for "gross_receipts_tax"
      // no branch for "hospitality_tax"
      // no branch for "luxury_tax"
      // no branch for "resort_tax"
      // no branch for "tourism_tax"
      default:
        throw new Error("unexpected type");
    }
  • Breakingdirection flipresponse.enum.value-added

    sourcing can now return "performance"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    tax_product_resource_line_item_tax_breakdown.sourcing · reachable from 3 operations
    switch (response.sourcing) {
      // existing branches …
      // no branch for "performance"
      default:
        throw new Error("unexpected sourcing");
    }
  • Breakingdirection fliprequest.property.removed

    countries is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    POST /v1/financial_connections/sessions · filters.countries · 2 call sites
    await client.post("/v1/financial_connections/sessions", {
      // countries is now ignored, not rejected
      countries: value,
    });
  • Breakingrequest.property.type-changed

    billing_cycle_anchor changed type

    Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage.

    POST /v1/subscriptions/{subscription_exposed_id} · billing_cycle_anchor · 2 call sites
    // payload.billing_cycle_anchor
    // was: string
    // now: object
  • Breakingdirection flipresponse.property.became-optional

    Response field score is no longer guaranteed

    Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date.

    insights_resources_payment_evaluation_signal_v2.score · reachable from 1 operation
    // response.score may now be absent or null
    const score = response.score ?? fallback;
  • Breakingdirection flipresponse.enum.value-added

    type can now return "rerouted"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    insights_resources_payment_evaluation_outcome.type · reachable from 1 operation
    switch (response.type) {
      // existing branches …
      // no branch for "rerouted"
      default:
        throw new Error("unexpected type");
    }
  • Breakingdirection fliprequest.property.removed

    payto is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    POST /v1/payment_methods/{payment_method} · payto
    await client.post("/v1/payment_methods/{payment_method}", {
      // payto is now ignored, not rejected
      payto: value,
    });
  • Additivepath.added

    /v1/apps/installs added

    No action needed.

    /v1/apps/installs · 12 call sites
  • Additiverequest.enum.constraint-removed

    Value restriction lifted

    A relaxation, not a break. Everything you could send before still works, and more is accepted now.

    POST /v1/subscriptions/{subscription_exposed_id} · billing_cycle_anchor · 2 call sites

Additive56 new response fieldspayment_method.paypay, payment_method.sequra, payment_intent.payment_record, account_capabilities.blik_recurring_payments, account_capabilities.paypay_payments, account_capabilities.sequra_payments, account_business_profile.specified_commercial_transactions_act_url, account_settings.paypay_payments +48 more

Additive48 new request propertiespayment_method_data.paypay, payment_method_data.sequra, payment_settings.payment_method_options.billie.company_details, payment_settings.payment_method_options.blik, payment_method_options.blik, payment_method_options.sequra, items[].current_trial, trial_settings.end_behavior.billing_cycle_anchor +40 more

GitHub · rest2026-09-23 · 677c1b8f5 breaking
  • Breakingdirection fliprequest.property.removed

    budget_entity_name is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    PATCH /organizations/{org}/settings/billing/budgets/{budget_id} · budget_entity_name
    await client.post("/organizations/{org}/settings/billing/budgets/{budget_id}", {
      // budget_entity_name is now ignored, not rejected
      budget_entity_name: value,
    });
  • Breakingdirection fliprequest.property.removed

    budget_product_sku is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    PATCH /organizations/{org}/settings/billing/budgets/{budget_id} · budget_product_sku
    await client.post("/organizations/{org}/settings/billing/budgets/{budget_id}", {
      // budget_product_sku is now ignored, not rejected
      budget_product_sku: value,
    });
  • Breakingdirection fliprequest.property.removed

    budget_scope is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    PATCH /organizations/{org}/settings/billing/budgets/{budget_id} · budget_scope
    await client.post("/organizations/{org}/settings/billing/budgets/{budget_id}", {
      // budget_scope is now ignored, not rejected
      budget_scope: value,
    });
  • Breakingdirection fliprequest.property.removed

    budget_type is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    PATCH /organizations/{org}/settings/billing/budgets/{budget_id} · budget_type
    await client.post("/organizations/{org}/settings/billing/budgets/{budget_id}", {
      // budget_type is now ignored, not rejected
      budget_type: value,
    });
  • Breakingdirection fliprequest.property.removed

    user is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    PATCH /organizations/{org}/settings/billing/budgets/{budget_id} · user
    await client.post("/organizations/{org}/settings/billing/budgets/{budget_id}", {
      // user is now ignored, not rejected
      user: value,
    });
GitHub · rest2026-09-17 · 649b8c491 breaking
  • Breakingdirection flipresponse.enum.value-added

    permissions can now return "triage_plus"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    repository-invitation.permissions · reachable from 4 operations
    switch (response.permissions) {
      // existing branches …
      // no branch for "triage_plus"
      default:
        throw new Error("unexpected permissions");
    }
GitHub · rest2026-09-16 · 29bcb5562 behavioral
  • Behavioralresponse.status-code.added

    422 is now documented on /repos/{owner}/{repo}/commits

    An unhandled branch in your error handling.

    GET /repos/{owner}/{repo}/commits · 3 call sites
  • Behavioralresponse.status-code.added

    429 is now documented on /repos/{owner}/{repo}/commits

    An unhandled branch in your error handling.

    GET /repos/{owner}/{repo}/commits · 2 call sites
GitHub · rest2026-09-16 · 6b1cc8631 breaking1 behavioral1 additive
  • Breakingdirection flipresponse.enum.value-added

    status can now return "enterprise_enforced"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "enterprise_enforced"

    3 places: code-security-configuration-repositories.status, code-security-configuration.enforcement, code-security-configuration-for-repository.status
    switch (response.status) {
      // existing branches …
      // no branch for "enterprise_enforced"
      default:
        throw new Error("unexpected status");
    }
  • Behavioralresponse.status-code.added

    403 is now documented on /orgs/{org}/code-security/configurations/{configuration_id}/attach

    An unhandled branch in your error handling.

    POST /orgs/{org}/code-security/configurations/{configuration_id}/attach
  • Additivepath.added

    /orgs/{org}/actions/policies added

    No action needed.

    /orgs/{org}/actions/policies · 4 call sites
GitHub · rest2026-09-11 · f5d6d10f1 behavioral
  • Behavioralresponse.status-code.added

    410 is now documented on /repos/{owner}/{repo}/dependabot/alerts/{alert_number}

    An unhandled branch in your error handling.

    GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number} · 2 call sites
Stripe2026-08-26 · 30d3391c4 breaking54 additive

Stripe's published spec describes its newest API version. Accounts are pinned to the version they signed up on, so a change like this reaches your integration when you upgrade that version, not the day Stripe ships it.

  • Breakingdirection flipresponse.enum.value-added

    allowed_payment_method_types can now return "touch_n_go"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "touch_n_go"

    2 places: payment_intent.allowed_payment_method_types[], setup_intent.allowed_payment_method_types[]
    switch (response.allowed_payment_method_types[0]) {
      // existing branches …
      // no branch for "touch_n_go"
      default:
        throw new Error("unexpected allowed_payment_method_types");
    }
  • Breakingdirection flipresponse.enum.value-added

    payment_method_types can now return "billie"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "billie"

    2 places: invoices_payment_settings.payment_method_types[], subscriptions_resource_payment_settings.payment_method_types[]
    switch (response.payment_method_types[0]) {
      // existing branches …
      // no branch for "billie"
      default:
        throw new Error("unexpected payment_method_types");
    }
  • Breakingresponse.property.removed

    Response field cryptogram removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    payments_primitives_payment_records_resource_payment_method_card_details_resource_three_d_secure.cryptogram · reachable from 48 operations
    // response.cryptogram is now undefined
    const cryptogram = response.cryptogram;
  • Breakingdirection flipresponse.enum.value-added

    type can now return "customer_update"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    portal_flows_flow.type · reachable from 1 operation
    switch (response.type) {
      // existing branches …
      // no branch for "customer_update"
      default:
        throw new Error("unexpected type");
    }
  • Additivepath.added

    /v1/billing/feedback_options added

    No action needed.

    /v1/billing/feedback_options · 3 call sites

Additive15 new response fieldscancellation_details.feedback_option, subscriptions_resource_payment_method_options.billie, invoices_payment_method_options.billie, payment_method_details_link.funding_source_group, payment_method_details_card_wallet_link.funding_source_group, payment_pages_private_card_payment_method_options_resource_restrictions.funding_types_blocked, portal_subscription_cancellation_reason.feedback_options, bank_connections_resource_link_account_session_filters.country +7 more

Additive38 new request propertiespayment_settings.payment_method_options.billie, cancellation_details.feedback_option, features.subscription_cancel.cancellation_reason.feedback_options, components.payment_method_settings, payment_method_options.card.restrictions.funding_types_blocked, components.active_entitlements, components.customer_portal, application_fee_amount +30 more

Twilio · api_v20102026-08-11 · 591755b51 behavioral9 additive
  • Behavioralresponse.status-code.added

    409 is now documented on /2010-04-01/Accounts/{Sid}.json

    An unhandled branch in your error handling.

    POST /2010-04-01/Accounts/{Sid}.json

Additive9 new request propertiesPassports, EmergencyAddress, EmergencyCallerLocation, EmergencyCallerPosition, EmergencyCity, EmergencyCountry, EmergencyName, EmergencyState +1 more

Twilio · messaging_v12026-08-11 · 591755b51 breaking
  • Breakingpath.removed

    /v1/a2p/BrandRegistrations/{BrandRegistrationSid}/2fa removed

    Requests to this path now 404.

    /v1/a2p/BrandRegistrations/{BrandRegistrationSid}/2fa
    // Was:
    await client.request("GET", "/v1/a2p/BrandRegistrations/{BrandRegistrationSid}/2fa");
    // Now: 404
Stripe2026-07-29 · af5309ca10 breaking42 additive

Stripe's published spec describes its newest API version. Accounts are pinned to the version they signed up on, so a change like this reaches your integration when you upgrade that version, not the day Stripe ships it.

  • Breakingdirection flipresponse.enum.value-added

    type can now return "ic_nif"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "ic_nif"

    4 places: invoices_resource_invoice_tax_id.type, payment_pages_checkout_session_tax_id.type, tax_id.type, tax_product_resource_customer_details_resource_tax_id.type
    switch (response.type) {
      // existing branches …
      // no branch for "ic_nif"
      default:
        throw new Error("unexpected type");
    }
  • Breakingdirection flipresponse.enum.value-added

    type can now return "mass_transit_parking_tax", "parking_tax"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "mass_transit_parking_tax", "parking_tax"

    4 places: tax_product_registrations_resource_country_options_united_states.type, tax_product_resource_line_item_tax_rate_details.tax_type, tax_product_resource_tax_rate_details.tax_type, tax_rate.tax_type
    switch (response.type) {
      // existing branches …
      // no branch for "mass_transit_parking_tax"
      // no branch for "parking_tax"
      default:
        throw new Error("unexpected type");
    }
  • Breakingdirection flipresponse.enum.value-added

    result can now return "data_share_only"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "data_share_only"

    3 places: payments_primitives_payment_records_resource_payment_method_card_details_resource_three_d_secure.result, three_d_secure_details.result, three_d_secure_details_charge.result
    switch (response.result) {
      // existing branches …
      // no branch for "data_share_only"
      default:
        throw new Error("unexpected result");
    }
  • Breakingdirection flipresponse.enum.value-added

    payment_method_types can now return "alipay", "mb_way"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "alipay", "mb_way"

    2 places: invoices_payment_settings.payment_method_types[], subscriptions_resource_payment_settings.payment_method_types[]
    switch (response.payment_method_types[0]) {
      // existing branches …
      // no branch for "alipay"
      // no branch for "mb_way"
      default:
        throw new Error("unexpected payment_method_types");
    }
  • Breakingresponse.property.removed

    Response field iin removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    card.iin · reachable from 572 operations
    // response.iin is now undefined
    const iin = response.iin;
  • Breakingdirection flipresponse.enum.value-added

    supported_networks can now return "chaps"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    funding_instructions_bank_transfer_financial_address.supported_networks[] · reachable from 399 operations
    switch (response.supported_networks[0]) {
      // existing branches …
      // no branch for "chaps"
      default:
        throw new Error("unexpected supported_networks");
    }
  • Breakingdirection flipresponse.enum.value-added

    reason can now return "stripe_internal_error"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    issuing_authorization_request.reason · reachable from 184 operations
    switch (response.reason) {
      // existing branches …
      // no branch for "stripe_internal_error"
      default:
        throw new Error("unexpected reason");
    }
  • Breakingdirection flipresponse.enum.value-added

    carrier can now return "correos"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    issuing_card_shipping.carrier · reachable from 165 operations
    switch (response.carrier) {
      // existing branches …
      // no branch for "correos"
      default:
        throw new Error("unexpected carrier");
    }
  • Breakingrequest.enum.value-removed

    mode no longer accepts "custom"

    A value you may have hardcoded is now rejected.

    POST /v1/financial_connections/sessions · manual_entry.mode · 2 call sites
    // sending "custom" for manual_entry.mode is now rejected
  • Breakingdirection fliprequest.property.removed

    proof_of_registration is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    POST /v1/accounts · documents.proof_of_registration
    await client.post("/v1/accounts", {
      // proof_of_registration is now ignored, not rejected
      proof_of_registration: value,
    });
  • Additivepath.added

    /v1/payment_records added

    No action needed.

    /v1/payment_records · 2 call sites

Additive22 new response fieldssetup_intent.allowed_payment_method_types, payment_intent.allowed_payment_method_types, legal_entity_company.administrative_address, legal_entity_company.principal_place_of_business, refund.payment_method, refund.customer, refund.customer_account, subscription_schedule_phase_configuration.trial +14 more

Additive19 new request propertiesallowed_payment_method_types, payment_method_options.payco.setup_future_usage, payment_method_options.samsung_pay.setup_future_usage, company.administrative_address, company.principal_place_of_business, shipping.business_name, radar_options.referrer, components.disputes_list.features.smart_disputes_management +11 more

Stripe2026-07-01 · 7061322c2 breaking28 additive

Stripe's published spec describes its newest API version. Accounts are pinned to the version they signed up on, so a change like this reaches your integration when you upgrade that version, not the day Stripe ships it.

  • Breakingdirection flipresponse.enum.value-added

    bank can now return "bnp_paribas", "citibank", "mbsb_bank"

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return "bnp_paribas", "citibank", "mbsb_bank"

    2 places: payment_method_details_fpx.bank, payment_method_fpx.bank
    switch (response.bank) {
      // existing branches …
      // no branch for "bnp_paribas"
      // no branch for "citibank"
      // no branch for "mbsb_bank"
      default:
        throw new Error("unexpected bank");
    }
  • Breakingdirection fliprequest.property.removed

    dynamic_tax_rates is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    POST /v1/checkout/sessions · line_items[].dynamic_tax_rates
    await client.post("/v1/checkout/sessions", {
      // dynamic_tax_rates is now ignored, not rejected
      dynamic_tax_rates: value,
    });

Additive14 new response fieldsinvoice_setting_subscription_schedule_setting.custom_fields, invoice_setting_subscription_schedule_setting.description, invoice_setting_subscription_schedule_setting.footer, invoice_setting_subscription_schedule_phase_setting.custom_fields, invoice_setting_subscription_schedule_phase_setting.description, invoice_setting_subscription_schedule_phase_setting.footer, dispute_payment_method_details_card.network, invoice_setting_quote_setting.custom_fields +6 more

Additive14 new request propertiesfilters.require_payment_method_support, limits, manual_entry, invoice_settings.custom_fields, invoice_settings.description, invoice_settings.footer, default_settings.invoice_settings.custom_fields, default_settings.invoice_settings.description +6 more