apache/seatunnel · error · IllegalArgumentException

Stripe option 'created_gte' must be less than 'created_lt'

Error message

Stripe option 'created_gte' must be less than 'created_lt'

What it means

buildWithConfig enforces that when both created_gte and created_lt are set, the lower bound is strictly less than the exclusive upper bound. Otherwise the time window is empty or inverted and Stripe would return no data, so the connector throws this IllegalArgumentException instead.

Solutions

  1. Swap created_gte and created_lt if they were accidentally reversed.
  2. Ensure created_gte < created_lt strictly; if you meant a single period, set created_lt to the period end (exclusive).
  3. Remove one of the bounds if an unbounded range is acceptable.
  4. Verify the epoch values correspond to the intended start/end times (date -d @<epoch>).

Example fix

// before
created_gte = 1735689600
created_lt = 1704067200
// after
created_gte = 1704067200
created_lt = 1735689600
Defensive patterns

Strategy: validation

Validate before calling

long gte = pluginConfig.getOptional(StripeSourceOptions.CREATED_GTE).orElse(Long.MIN_VALUE);
long lt = pluginConfig.getOptional(StripeSourceOptions.CREATED_LT).orElse(Long.MAX_VALUE);
if (gte >= lt) {
    throw new IllegalArgumentException("created_gte must be strictly less than created_lt");
}

Try / catch

try {
    StripeSourceParameter p = StripeSourceParameter.buildWithConfig(pluginConfig);
} catch (IllegalArgumentException e) {
    throw new IllegalArgumentException("Invalid time window: " + e.getMessage(), e);
}

Prevention

When it happens

Trigger: Calling buildWithConfig with CREATED_GTE >= CREATED_LT, including the equal case (created_gte == created_lt yields an empty range because created_lt is exclusive).

Common situations: Copy-paste swapping the two values; user assumes both endpoints are inclusive so sets them equal for a single day; timezone/unit mismatch makes gte compute larger than lt.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/b1b2ec2c16ce428f. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-http/connector-http-stripe/src/main/java/org/apache/seatunnel/connectors/seatunnel/stripe/source/config/StripeSourceParameter.java:68

            throw new IllegalArgumentException("Stripe option 'api_base_url' must not be blank");
        }

        int pageSize = pluginConfig.get(StripeSourceOptions.PAGE_SIZE);
        if (pageSize < 1 || pageSize > 100) {
            throw new IllegalArgumentException(
                    "Stripe option 'page_size' must be between 1 and 100");
        }

        Long createdGte = pluginConfig.getOptional(StripeSourceOptions.CREATED_GTE).orElse(null);
        Long createdLt = pluginConfig.getOptional(StripeSourceOptions.CREATED_LT).orElse(null);
        if (createdGte != null && createdGte < 0) {
            throw new IllegalArgumentException("Stripe option 'created_gte' must not be negative");
        }
        if (createdLt != null && createdLt < 0) {
            throw new IllegalArgumentException("Stripe option 'created_lt' must not be negative");
        }
        if (createdGte != null && createdLt != null && createdGte >= createdLt) {
            throw new IllegalArgumentException(
                    "Stripe option 'created_gte' must be less than 'created_lt'");
        }

        this.rateLimitMaxRetries = pluginConfig.get(StripeSourceOptions.RATE_LIMIT_MAX_RETRIES);
        this.rateLimitBackoffMs = pluginConfig.get(StripeSourceOptions.RATE_LIMIT_BACKOFF_MS);
        if (rateLimitMaxRetries < 0) {
            throw new IllegalArgumentException(
                    "Stripe option 'rate_limit_max_retries' must not be negative");
        }
        if (rateLimitBackoffMs < 0) {
            throw new IllegalArgumentException(
                    "Stripe option 'rate_limit_backoff_ms' must not be negative");
        }

        setUrl(trimTrailingSlash(apiBaseUrl.trim()) + PAYMENT_INTENTS_PATH);
        setMethod(HttpRequestMethod.GET);

        Map<String, String> requestHeaders = new LinkedHashMap<>();

View on GitHub (pinned to cf67b549a7)