Feedback API reference
Report bugs, feature requests, feedback or questions to the SignWith team on the user's behalf. Meant for API clients and AI agents such as the SignWith MCP server.
Send feedback to the SignWith team
/api/v1/feedback- Read-only keys can call this
- Accepts Idempotency-Key
Sends a bug report, feature request, general feedback or question to the SignWith team on
the user's behalf. This is how API clients and AI agents — for example the SignWith MCP
server (recorded with source mcp) — pass on problems or ideas the user mentions, without
the user having to leave their tool. The team is notified straight away.
Include what happened and, in context, identifiers that help reproduce it (the failing
error_code, signature_request_id, etc.). Don't include passwords, API keys or document
contents. Read-only keys may call it. Limited to 20 messages per user per hour
(429 rate_limited).
Headers
Idempotency-KeystringA unique value (e.g. a UUID) that makes retries of this request safe. A successful response is stored for 24 hours and replayed for retries with the same key.
at most 255 characters
Request body
typestringWhat kind of message this is.
One ofbug,feature_request,feedback,questionDefaultfeedbackmessagestringRequiredThe feedback in plain language. Up to 5,000 characters.
1 to 5,000 characterscontextobjectOptional details that help the team investigate. Only the keys below are kept; others are dropped.
7 child fields
clientstringName of the client or AI assistant, e.g.
claude-desktop.client_versionstringtoolstringThe tool or operation the user was using.
signature_request_idinteger or stringtemplate_idinteger or stringerror_codestringThe API
error.codethe user ran into, if any.request_idstring
Request sample
curl -X POST https://app.signwith.co/api/v1/feedback \
-H "Authorization: Bearer $SIGNWITH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"type": "bug",
"message": "Prefilling the \"Start date\" field with 2026-11-01 shows an empty date to the signer.",
"context": {
"client": "claude-desktop",
"client_version": "1.4.2",
"tool": "send_signature_request",
"signature_request_id": 4812,
"template_id": 311
}
}'const response = await fetch('https://app.signwith.co/api/v1/feedback', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SIGNWITH_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
type: 'bug',
message: 'Prefilling the "Start date" field with 2026-11-01 shows an empty date to the signer.',
context: {
client: 'claude-desktop',
client_version: '1.4.2',
tool: 'send_signature_request',
signature_request_id: 4812,
template_id: 311,
},
}),
})
console.log(response.status, await response.json())import os
import uuid
import requests
response = requests.post(
"https://app.signwith.co/api/v1/feedback",
headers={
"Authorization": f"Bearer {os.environ['SIGNWITH_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"type": "bug",
"message": "Prefilling the \"Start date\" field with 2026-11-01 shows an empty date to the signer.",
"context": {
"client": "claude-desktop",
"client_version": "1.4.2",
"tool": "send_signature_request",
"signature_request_id": 4812,
"template_id": 311,
},
},
)
print(response.status_code, response.json())Example: Feature request
curl -X POST https://app.signwith.co/api/v1/feedback \
-H "Authorization: Bearer $SIGNWITH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"type": "feature_request",
"message": "Please let me set a different reminder schedule per signature request."
}'const response = await fetch('https://app.signwith.co/api/v1/feedback', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SIGNWITH_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
type: 'feature_request',
message: 'Please let me set a different reminder schedule per signature request.',
}),
})
console.log(response.status, await response.json())import os
import uuid
import requests
response = requests.post(
"https://app.signwith.co/api/v1/feedback",
headers={
"Authorization": f"Bearer {os.environ['SIGNWITH_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"type": "feature_request",
"message": "Please let me set a different reminder schedule per signature request.",
},
)
print(response.status_code, response.json())Response 201
The feedback was received. Returns a feedback object.
Example response: see the example object below.
Errors
| 400 | The request body is not valid JSON. (invalid_json) |
| 401 | The API key is missing, invalid or expired, or its account has been archived. (unauthenticated, api_key_expired) |
| 409 | A request with the same Idempotency-Key is still being processed. Retry shortly. (idempotency_key_in_use) |
| 422 | The request is valid JSON but can't be processed. See error.code; the codes each endpoint
can return are described in the endpoint's description and in the error table above. (missing_parameter, invalid_parameter, invalid_request, missing_documents, too_many_documents, document_too_large, invalid_document, invalid_file_type, pdf_encrypted, missing_signers, invalid_signer, already_completed, not_open, nothing_to_remind, invalid_field, template_has_no_fields, template_archived, signer_finished, idempotency_key_reused, invalid_discount_code, already_purchased, billing_details_required) |
| 429 | Rate limit exceeded (rate_limited, with Retry-After); more than 20 POST /feedback
messages in an hour (rate_limited, with Retry-After: seconds until the next clock hour); or — for
POST /signature_requests/{id}/remind — signers were reminded less than an hour ago
(remind_too_soon, with Retry-After). (rate_limited, remind_too_soon) |
| 500 | Something went wrong on SignWith's side. It's safe to retry with the same Idempotency-Key. (internal_error) |
Codes listed are the examples the spec gives; see all error codes.
The feedback object
Confirms the feedback was received.
objectstringRequiredAlwaysfeedbackidintegerRequiredtypestringRequiredOne ofbug,feature_request,feedback,questionstatusstringRequiredAlwaysreceivedmessagestringRequiredA confirmation you can show to the user.
{
"object": "feedback",
"id": 57,
"type": "bug",
"status": "received",
"message": "Thanks! The SignWith team has been notified."
}Base URL, pagination and idempotency work the same on every endpoint: see making requests. Every error code is on errors.
Start building
The API and MCP server come with every account. 3 free documents a month, then pay per document.