Everything you need to know about Signal shoot
When something goes wrong, the API returns a JSON error with an error code and a human-readable message. This section lists every error you may encounter, what causes it, and how to fix it.
400invalid_body400invalid_type / invalid_message / message_too_long400invalid_channel400invalid_user_id400invalid_parent_id400invalid_metadata400missing_user_id400user_id_required_for_followup401missing_api_key401invalid_api_key401test_key_expired401signature_required401invalid_signature403origin_not_allowed403pub_key_user_features_forbidden403pub_key_forbidden403test_key_forbidden403parent_user_mismatch404app_not_found404parent_not_found413payload_too_large429too_many_requests429monthly_limit_exceeded500internal_error500signing_master_not_configured{
"error": "too_many_requests",
"message": "Too many requests. Maximum 10 submissions per minute per app. Please wait and try again."
}{
"error": "monthly_limit_exceeded",
"message": "Monthly limit reached for the free plan. Upgrade or wait for the next period.",
"limit": 200
}The ingest API does not deduplicate. Every POST creates a new feedback entry (or reply), even if the content is identical. Network retries, double-taps, or client-side retry logic can create duplicates. To prevent this: (1) Disable the submit button after the first tap until you receive a response. (2) If you implement retry logic, use it only for network errors (no response received) — not for 4xx errors. (3) On the server side, check if feedback with the same message, user_id, and type was created in the last few seconds before sending. Signal shoot does not reject duplicates, so prevention must happen on your side.