public boolean isValid() {
    RequestFields requestFields = getCachedRequestFields();
    Set<String> keys = apiRequest.getKeys();

    // All keys defined
    for (String key : keys) {
      if (!requestFields.containsKey(key)) {
        return false;
      }
    }

    // All required keys present
    for (RequestField requestField : getRequestFields().values()) {
      if (!requestField.isValid(apiRequest)) {
        return false;
      }
    }
    return true;
  }