API · Manage · Signing Envelopes
Decline a signer.
Record a single signer's refusal to sign — invoked from the hosted signer portal when the human clicks "Decline" or by API when a counterparty rejects the document offline.
A single decline propagates: the signer transitions to declined, and because envelopes are atomic ("all or none"), the envelope itself transitions to declined and any pending sibling signers are notified that the request has fallen through. Already-signed siblings retain their signatures but are unlinked from the now-terminal envelope.
Pass a reason so the audit trail captures why — Matter surfaces the reason on the envelope's history view and on any downstream requires_replacement resources triggered by the decline.
Returns 202 Accepted. On completion, emits signing_envelope.declined. Subscribe via `POST /v1/webhook_endpoints` to consume. Idempotent via Idempotency-Key. See idempotency.
See also: Signing envelopes API overview.
Last updated
Path Parameters
idstringRequiredsigner_idstringRequiredRequest Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
reasonstringOptionalResponse Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
Request
curl -X POST "https://api.mattermode.com/v1/signing_envelopes/string/signers/string/decline" \ -H "Content-Type: application/json" \ -d '{ "reason": "string" }'const body = JSON.stringify({ "reason": "string"})fetch("https://api.mattermode.com/v1/signing_envelopes/string/signers/string/decline", { method: "POST", headers: { "Content-Type": "application/json" }, body})package mainimport ( "fmt" "net/http" "io/ioutil" "strings")func main() { url := "https://api.mattermode.com/v1/signing_envelopes/string/signers/string/decline" body := strings.NewReader(`{ "reason": "string" }`) req, _ := http.NewRequest("POST", url, body) req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := ioutil.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body))}import requestsheaders = { "Authorization": "Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc", "Matter-Version": "2026-06-10", "Idempotency-Key": "ee7c3a9b-3f1a-4d8e-9b2a-7c5e1f0a2d4b",}payload = { "reason": "string"}resp = requests.post( "https://api.mattermode.com/v1/signing_envelopes/env_K6jPcVbN/signers/id_placeholder/decline", headers=headers, json=payload,)resp.raise_for_status()print(resp.json())import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.http.HttpResponse.BodyHandlers;import java.time.Duration;import java.net.http.HttpRequest.BodyPublishers;var body = BodyPublishers.ofString("""{ "reason": "string"}""");HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();HttpRequest.Builder requestBuilder = HttpRequest.newBuilder() .uri(URI.create("https://api.mattermode.com/v1/signing_envelopes/string/signers/string/decline")) .header("Content-Type", "application/json") .POST(body) .build();try { HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString()); System.out.println("Status code: " + response.statusCode()); System.out.println("Response body: " + response.body());} catch (Exception e) { e.printStackTrace();}using System;using System.Net.Http;using System.Text;var body = new StringContent("""{ "reason": "string"}""", Encoding.UTF8, "application/json");var client = new HttpClient();var response = await client.PostAsync("https://api.mattermode.com/v1/signing_envelopes/string/signers/string/decline", body);var responseBody = await response.Content.ReadAsStringAsync();curl --request POST 'https://api.mattermode.com/v1/signing_envelopes/env_K6jPcVbN/signers/id_placeholder/decline' \ --header 'Authorization: Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc' \ --header 'Matter-Version: 2026-06-10' \ --header 'Idempotency-Key: ee7c3a9b-3f1a-4d8e-9b2a-7c5e1f0a2d4b' \ --header 'Content-Type: application/json' \ --data '{ "reason": "string"}'const response = await fetch("https://api.mattermode.com/v1/signing_envelopes/env_K6jPcVbN/signers/id_placeholder/decline", { method: "POST", headers: { "Authorization": "Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc", "Matter-Version": "2026-06-10", "Idempotency-Key": "ee7c3a9b-3f1a-4d8e-9b2a-7c5e1f0a2d4b", "Content-Type": "application/json", }, body: JSON.stringify({ "reason": "string" }),});if (!response.ok) { throw new Error(`Matter API ${response.status}: ${await response.text()}`);}const data = await response.json();console.log(data);Response
application/json{
"id": "env_Qw9xYz8A",
"object": "signing_envelope",
"entity_id": "ent_Nq3KcAbc",
"subject": "Series Seed — board consent + stockholder consent",
"document_ids": [
"string"
],
"signers": [
{
"signer_id": "string",
"status": "pending"
}
],
"routing": "parallel",
"status": "draft",
"sent_at": 0,
"completed_at": 0,
"expires_at": 1745539200,
"last_reminder_at": 0,
"reminder_policy": {},
"message": "string",
"metadata": {},
"created": 1745539200,
"updated": 1745539200,
"livemode": false
}{
"type": "https://mattermode.com/docs/errors/authentication_required",
"title": "Authentication required",
"status": 401,
"code": "authentication_required",
"detail": "No bearer token was supplied. Pass `Authorization: Bearer sk_live_...` on every request.",
"doc_url": "https://mattermode.com/docs/guides/errors#authentication_required",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "No entity with id `ent_Nq3KcAbc` is visible to this token.",
"doc_url": "https://mattermode.com/docs/guides/errors#not_found",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/invalid_state_transition",
"title": "Invalid state transition",
"status": 409,
"code": "invalid_state_transition",
"detail": "Entity ent_Nq3KcAbc is in state `dissolved`; `dissolve` is not a valid transition.",
"doc_url": "https://mattermode.com/docs/guides/errors#invalid_state_transition",
"request_id": "req_Qw9xYz8A",
"current_state": "dissolved",
"attempted_transition": "dissolve",
"allowed_transitions": []
}{
"type": "https://mattermode.com/docs/errors/dissolution_prerequisites_missing",
"title": "Dissolution prerequisites missing",
"status": 409,
"code": "dissolution_prerequisites_missing",
"detail": "Voluntary dissolution requires `board_resolution_id` and `stockholder_consent_id`, or `auto_generate_resolutions: true`.",
"doc_url": "https://mattermode.com/docs/guides/errors#dissolution_prerequisites_missing",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/valuation_stale",
"title": "409A valuation stale",
"status": 409,
"code": "valuation_stale",
"detail": "Active 409A val_AbCd1234 is older than 12 months or superseded by a material event. Issuing ISOs at the prior strike risks IRC §409A violation. Refresh via POST /entities/{id}/valuations/{id}/refresh_request.",
"doc_url": "https://mattermode.com/docs/guides/errors#valuation_stale",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/rate_limit_exceeded",
"title": "Rate limit exceeded",
"status": 429,
"code": "rate_limit_exceeded",
"detail": "Request rate exceeded for this key. Retry after `retry_after` seconds or honor the `Retry-After` header.",
"doc_url": "https://mattermode.com/docs/guides/errors#rate_limit_exceeded",
"request_id": "req_Qw9xYz8A",
"retry_after": 30
}