signalapp/Signal-Server · warning · CallQualityInvalidArgumentsException
Call type not specified
Error message
Call type not specified
What it means
validateRequest in CallQualitySurveyManager throws when the survey request's callType is null or blank. callType distinguishes audio vs video calls and is required for survey analysis. The CallQualityInvalidArgumentsException includes the field name callType for the client to correct.
Solutions
- Set callType to a valid value (e.g. "audio" or "video") in the request body
- Have the client derive callType from the active call object rather than user input
- Log/inspect the outgoing JSON to confirm callType is non-blank before submission
Example fix
// before
{"startTimestamp": 1699999400, "endTimestamp": 1700000000}
// after
{"startTimestamp": 1699999400, "endTimestamp": 1700000000, "callType": "audio"} Defensive patterns
Strategy: validation
Validate before calling
if (!request.callType || request.callType.trim() === '') { throw new Error('callType must be a non-empty string (e.g. audio/video)'); } Type guard
const hasCallType = (r) => typeof r.callType === 'string' && r.callType.trim().length > 0;
Try / catch
try { await submitCallQualitySurvey(request); } catch (CallQualityInvalidArgumentsException e) { if ('callType'.equals(e.getField())) { request.setCallType(inferCallTypeFromSession()); resubmit(); } } Prevention
- Derive callType from the call session object instead of optional user input
- Keep client/server callType values in sync with the API enum
- Validate the full survey payload before sending
When it happens
Trigger: submitCallQualitySurvey called with a SubmitCallQualitySurveyRequest whose callType is missing, empty, or whitespace-only.
Common situations: Clients omitting callType in the survey payload; enum/string mapping regressions after client upgrades; manually crafted API calls or integration tests leaving the field out.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- Start timestamp not specified
- End timestamp not specified
- Call end reason not specified
- invalid captcha action
- Blank header
AI-assisted analysis of signalapp/Signal-Server@100ab61c82 (2026-09-09).
Data as JSON: /api/errors/cd4a44b691b8ebfe.
Report an issue: GitHub.
Appendix: source
Thrown at service/src/main/java/org/whispersystems/textsecuregcm/metrics/CallQualitySurveyManager.java:169
}
Metrics.counter(PUB_SUB_MESSAGE_COUNTER_NAME, "success", String.valueOf(throwable == null))
.increment();
});
}
@VisibleForTesting
static void validateRequest(final SubmitCallQualitySurveyRequest request) throws CallQualityInvalidArgumentsException {
if (request.getStartTimestamp() == 0) {
throw new CallQualityInvalidArgumentsException("Start timestamp not specified", "startTimestamp");
}
if (request.getEndTimestamp() == 0) {
throw new CallQualityInvalidArgumentsException("End timestamp not specified", "endTimestamp");
}
if (StringUtils.isBlank(request.getCallType())) {
throw new CallQualityInvalidArgumentsException("Call type not specified", "callType");
}
if (StringUtils.isBlank(request.getCallEndReason())) {
throw new CallQualityInvalidArgumentsException("Call end reason not specified", "callEndReason");
}
}
}
View on GitHub (pinned to 100ab61c82)