Product Guide

Guide

Everything you need to know about Signalshoot.

Troubleshooting

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.

401missing_api_key
SymptomRequest returns 401. Response body: {"error":"missing_api_key"}.
CauseThe X-API-Key header is missing from your request entirely.
FixAdd the header: X-API-Key: fb_live_YOUR_KEY (or fb_test_ for testing). Check that your HTTP client isn't stripping custom headers — some proxy configurations or CORS preflight issues can cause this.
401invalid_api_key
SymptomRequest returns 401. Response body: {"error":"invalid_api_key"}.
CauseThe key is present but doesn't match any key on record. Common reasons: the key was regenerated and the old one is no longer valid, there is a typo or extra whitespace, or you are using a key from a different app.
FixGo to Settings and check your current keys. If you recently regenerated, make sure your app is using the new key. Copy-paste directly to avoid typos. Keys are case-sensitive.
400invalid_body
SymptomRequest returns 400. Response body: {"error":"invalid_body"}.
CauseThe request body is not valid JSON. Common reasons: missing Content-Type: application/json header, malformed JSON (trailing commas, unquoted keys), or the body is empty.
FixSet Content-Type to application/json. Validate your JSON with a linter before sending. Most languages have a JSON.stringify() equivalent — use it instead of building JSON strings manually.
400invalid_type / invalid_message
SymptomRequest returns 400. Response body: {"error":"invalid_type"} or {"error":"invalid_message"} or {"error":"message_too_long"} or {"error":"invalid_channel"}.
CauseA required field is missing, empty, or exceeds the character limit. type: required, 1-50 chars. message: required, 1-5,000 chars. channel: optional, max 100 chars.
FixCheck that type and message are present and non-empty in your JSON body. Trim whitespace. If message is user-generated, truncate to 5,000 characters before sending.
404app_not_found
SymptomRequest returns 404. Response body: {"error":"app_not_found"}.
CauseThe app_id in the URL does not match any app in the system. You may have a typo in the URL, or you are using an app ID from a different account.
FixGo to Settings and copy the App ID exactly. The URL format is: POST https://api.signalshoot.com/v1/ingest/{app_id}
404parent_not_found
SymptomRequest returns 404. Response body: {"error":"parent_not_found"}.
CauseYou sent a parent_id that doesn't exist or belongs to a different app. The original feedback may have been deleted, or the ID is incorrect.
FixVerify that the parent_id matches an existing feedback ID from the same app. You can get feedback IDs from the replies endpoint or from the 201 response when the original feedback was created.
429rate_limit_exceeded
SymptomRequest returns 429. Response body: {"error":"rate_limit_exceeded"}.
CauseYou have reached the monthly feedback limit for your plan. This is NOT a per-second rate limit — it is a monthly cap. Free: 200/month, Pro: 1,000/month, Infinite: unlimited. The count resets on the first day of each calendar month. Only new feedback counts — threaded follow-ups (parent_id) and test-key submissions do not count.
FixDo not retry — the request will keep failing until the next month or until you upgrade. Check your current usage in Settings. Upgrade your plan to increase the limit. If you need more capacity immediately, the upgrade takes effect instantly.

Duplicate submissions

The ingest API does not have built-in deduplication. Every POST creates a new feedback entry (or reply), even if the content is identical. This means that network retries, double-taps, or client-side retry logic can create duplicates. To avoid 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, you can deduplicate by checking if a feedback with the same message, user_id, and type was created in the last few seconds before sending. Signalshoot does not reject duplicates, so prevention must happen on your side.