{"record":{"id":"20af9efac0042db9","repo":"apache/seatunnel","slug":"stripe-option-api-base-url-must-not-be-blank","errorCode":null,"errorMessage":"Stripe option 'api_base_url' must not be blank","messagePattern":"Stripe option 'api_base_url' must not be blank","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"critical","filePath":"seatunnel-connectors-v2/connector-http/connector-http-stripe/src/main/java/org/apache/seatunnel/connectors/seatunnel/stripe/source/config/StripeSourceParameter.java","lineNumber":50,"sourceCode":"\n    private static final String PAYMENT_INTENTS_PATH = \"/v1/payment_intents\";\n    private static final String AUTHORIZATION = \"Authorization\";\n    private static final String ACCEPT = \"Accept\";\n    private static final String STRIPE_VERSION = \"Stripe-Version\";\n\n    private int rateLimitMaxRetries;\n    private int rateLimitBackoffMs;\n\n    @Override\n    public void buildWithConfig(ReadonlyConfig pluginConfig) {\n        String secretKey = pluginConfig.get(StripeSourceOptions.SECRET_KEY);\n        if (Strings.isNullOrEmpty(secretKey) || secretKey.trim().isEmpty()) {\n            throw new IllegalArgumentException(\"Stripe option 'secret_key' must not be blank\");\n        }\n\n        String apiBaseUrl = pluginConfig.get(StripeSourceOptions.API_BASE_URL);\n        if (Strings.isNullOrEmpty(apiBaseUrl) || apiBaseUrl.trim().isEmpty()) {\n            throw new IllegalArgumentException(\"Stripe option 'api_base_url' must not be blank\");\n        }\n\n        int pageSize = pluginConfig.get(StripeSourceOptions.PAGE_SIZE);\n        if (pageSize < 1 || pageSize > 100) {\n            throw new IllegalArgumentException(\n                    \"Stripe option 'page_size' must be between 1 and 100\");\n        }\n\n        Long createdGte = pluginConfig.getOptional(StripeSourceOptions.CREATED_GTE).orElse(null);\n        Long createdLt = pluginConfig.getOptional(StripeSourceOptions.CREATED_LT).orElse(null);\n        if (createdGte != null && createdGte < 0) {\n            throw new IllegalArgumentException(\"Stripe option 'created_gte' must not be negative\");\n        }\n        if (createdLt != null && createdLt < 0) {\n            throw new IllegalArgumentException(\"Stripe option 'created_lt' must not be negative\");\n        }\n        if (createdGte != null && createdLt != null && createdGte >= createdLt) {\n            throw new IllegalArgumentException(","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-http/connector-http-stripe/src/main/java/org/apache/seatunnel/connectors/seatunnel/stripe/source/config/StripeSourceParameter.java#L32-L68","documentation":"StripeSourceParameter.buildWithConfig requires a non-blank 'api_base_url' and throws IllegalArgumentException when it is null, empty, or whitespace-only. This base URL is used to build PaymentIntents list requests; unlike secret_key, there is no default, so it must always be provided.","triggerScenarios":"The job config omits 'api_base_url' or sets it to \"\"/whitespace; get() returns null when the option is absent.","commonSituations":"Deleting the option while refactoring configs; template configs with empty values; assuming a default Stripe URL exists when it does not in this connector.","solutions":["Set 'api_base_url' to \"https://api.stripe.com\" (or your test/mock base URL) in the source config","Do not leave the option blank; there is no default fallback","Verify no whitespace-only value slipped into the config"],"exampleFix":"// before\napi_base_url = \"\"\n// after\napi_base_url = \"https://api.stripe.com\"","handlingStrategy":"validation","validationCode":"String url = config.get(\"api_base_url\");\nif (url == null || url.trim().isEmpty()) {\n  throw new IllegalArgumentException(\"Stripe source requires non-blank 'api_base_url'\");\n}","typeGuard":null,"tryCatchPattern":"try { param.buildWithConfig(pluginConfig); } catch (IllegalArgumentException e) {\n  if (e.getMessage().contains(\"api_base_url\")) { /* set https://api.stripe.com and resubmit */ }\n}","preventionTips":["Always include api_base_url in Stripe source configs — there is no default","Use a config template with the default filled in","Lint configs for empty-string options before submission"],"tags":["config-validation","stripe","url"],"backgroundTag":"missing-required-config-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}