elastic/elasticsearch · error · XContentParseException

[{}] parsefield doesn't accept: {}

Error message

[{}] parsefield doesn't accept: {}

What it means

Thrown inside FieldParser.assertSupports when ParseField.match() returns false for the current field name. ParseField.match() checks the name against the field's accepted names (primary, deprecated, and all-replaced-with) using the deprecation handler and REST API version. A false return means the field name is not valid under the current parsing context.

Source

Thrown at libs/x-content/src/main/java/org/elasticsearch/xcontent/ObjectParser.java:700

        private final ParseField parseField;
        private final ValueType type;

        FieldParser(Parser<Value, Context> parser, EnumSet<XContentParser.Token> supportedTokens, ParseField parseField, ValueType type) {
            this.parser = parser;
            this.supportedTokens = supportedTokens;
            this.parseField = parseField;
            this.type = type;
        }

        void assertSupports(String parserName, XContentParser xContentParser, XContentParser.Token currentToken, String currentFieldName) {
            boolean match = parseField.match(
                parserName,
                xContentParser::getTokenLocation,
                currentFieldName,
                xContentParser.getDeprecationHandler()
            );
            if (match == false) {
                throw new XContentParseException(
                    xContentParser.getTokenLocation(),
                    "[" + parserName + "] parsefield doesn't accept: " + currentFieldName
                );
            }
            if (supportedTokens.contains(xContentParser.currentToken()) == false) {
                throw new XContentParseException(
                    xContentParser.getTokenLocation(),
                    "[" + parserName + "] " + currentFieldName + " doesn't support values of type: " + currentToken
                );
            }
        }

        @Override
        public String toString() {
            String[] deprecatedNames = parseField.getDeprecatedNames();
            String allReplacedWith = parseField.getAllReplacedWith();
            String deprecated = "";
            if (deprecatedNames != null && deprecatedNames.length > 0) {

View on GitHub (pinned to db6a809a66)

Solutions

  1. Check the error message for the rejected field name and replace it with the current accepted name.
  2. Review the deprecation notes for the endpoint to find the replacement field name.
  3. Ensure the REST API version header matches a version under which the field name is still valid.
  4. Update the client library to a version that emits current field names.

Example fix

// before — deprecated field name removed in current API version
{
  "type": "string"
}

// after — current accepted name
{
  "type": "keyword"
}
Defensive patterns

Strategy: validation

Validate before calling

// Before sending, check field names against current API version's accepted names
Set<String> currentFieldNames = Set.of("query", "size", "from", "sort", "aggs");
for (String key : body.keySet()) {
    if (!currentFieldNames.contains(key)) {
        throw new IllegalArgumentException("Field '" + key + "' is not accepted in this API version");
    }
}

Try / catch

try {
    objectParser.parse(parser, context);
} catch (XContentParseException e) {
    if (e.getMessage().contains("parsefield doesn't accept")) {
        return badRequest(e.getMessage());
    }
    throw e;
}

Prevention

When it happens

Trigger: The field name in the input does not match any of the ParseField's accepted names for the current REST API version. This can happen when a deprecated field name was fully removed in a newer API version, or when a field name was only valid in a specific version range and the parser is operating under a different version.

Common situations: Using a deprecated field name that has been removed in the target REST API version. Sending a request with Accept/Content-Type headers specifying a REST API version where the field name is no longer accepted. Client and server version mismatch where the client uses old field names.

Related errors


AI-assisted analysis of elastic/elasticsearch@db6a809a66 (2026-08-12). Data as JSON: /api/errors/61644fc71f447f94. Report an issue: GitHub.