Competitor Tracker & Co. Docs

Feedback

File a bug report or suggest an improvement, or head to the idea board to pitch and vote on features. Public, no sign-in required, screenshots welcome.

Something broke, or something's missing. Either way we want to hear it, and our lead detective C. T. Lucky keeps the intake open. Reports are public — no sign-in required. For parameter-level detail, see the API reference in the sidebar.

Bug reports and improvement suggestions come in through one endpoint and land in the engineering queue. Feature ideas are different: they live on a public idea board where anyone can pitch one and vote on the rest, so for those we hand you a link rather than take a submission. We read every one.

The report endpoint takes multipart/form-data, not JSON — that's what lets a screenshot ride along with the text.

Signed in or not

The report endpoint works with or without a bearer token.

  • Signed in — send your usual Authorization: Bearer header. We identify you from the token, so you skip the email field and the report arrives with your account attached.
  • Anonymous — no header, but an email field is required so we can reach you. Once the report is in, we send an acknowledgement to that address. An anonymous call without an email returns 400 ReporterEmailRequired.

File a report

POST /v1/feedback/reports

For a bug or an improvement. type declares which.

# A bug report with a screenshot. Anonymous, so the email is how we reach you.
curl -X POST "$CT_API/feedback/reports" \
  -F "type=bug" \
  -F "title=Competitor list crashes on sort" \
  -F "description=Sorting the competitor list by name shows a blank page." \
  -F "email=reporter@example.com" \
  -F "images=@screenshot.png"

Returns 201 Created:

{ "status": "received" }

The fields:

  • type — required. One of bug or improvement.
  • title — required, 1–200 characters.
  • description — required, 1–5000 characters. The more concrete, the faster we move.
  • email — required only when not signed in.
  • context — optional. A JSON object string with optional url and userAgent fields, telling us where the report was filed from. Unreadable values are ignored.
  • images — optional, repeated under this field name. Up to 3, 5 MB each.

Attachments

A screenshot often says more than the description. Up to 3 images ride along on a report, 5 MB each. The caps are hard: an image over 5 MB returns 413 AttachmentTooLarge, a fourth image returns 422 TooManyAttachments.

Suggest a feature

GET /v1/feedback/idea-board

Feature ideas live on the idea board, where you pitch new ones and vote on existing ones. This endpoint hands back the address to send the user to — it doesn't take a submission.

# Signed in, so the bearer token earns a personal board link.
curl "$CT_API/feedback/idea-board" \
  -H "Authorization: Bearer $CT_TOKEN"

Returns 200 OK:

{ "url": "https://www.votito.com/public/ideabank/?key=…" }

Signed-in callers get a personal link tied to their account; everyone else gets the public board. Either way, send the user to the returned url.

The rate limit

The report endpoint carries a per-address ceiling: 10 submissions a minute. The 11th returns 429 FeedbackRateLimited. Wait a minute and retry. The idea-board link is a plain read and carries no limit.

Errors you might see

CodeHTTPWhen
ReporterEmailRequired400The report is anonymous and no email came with it.
ReportInvalid422A field fails validation — a missing title, an unknown type, a 6000-character description.
AttachmentTooLarge413An attached image is over 5 MB, or the request as a whole is too large.
TooManyAttachments422More than 3 images on one report.
FeedbackRateLimited429More than 10 reports in a minute from your address. Wait a minute and retry.
ReportSinkUnavailable502The report could not be delivered right now. Nothing was recorded, so retry in a few minutes.

On this page