API · Manage · Authorizations
Deny the authorization.
Reject a pending authorization, halting the dependent cascade. The agent that requested the authorization receives an intent.failed or filing.cancelled event keyed to the underlying request, with the human's reason propagated through to the audit log so the agent can adapt or surface the rejection back to its operator.
Use it whenever the human reviewer disagrees with what the agent has prepared — wrong jurisdiction, wrong founder split, suspicious counterparty, incorrect price, or simple "not yet, come back tomorrow." Denial is non-destructive: the agent can refine and re-request a new authorization without losing earlier work.
Supply a reason string. Matter requires non-empty rejection text — it lands in the audit log and is shown to the requesting agent so the next attempt is informed by the rejection.
Prerequisites - Authorization must be in pending status. Returns 409 authorization_already_resolved otherwise. - The denying caller must be the named approver (or a delegate with authorizations.deny scope).
Idempotent via Idempotency-Key. See idempotency.
See also: Authentication overview, Authorizations API overview.
Last updated
Request 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
Request
curl -X POST "https://api.mattermode.com/v1/authorizations/{id}/deny" \ -H "Content-Type: application/json" \ -d '{ "reason": "string" }'const body = JSON.stringify({ "reason": "string"})fetch("https://api.mattermode.com/v1/authorizations/{id}/deny", { method: "POST", headers: { "Content-Type": "application/json" }, body})package mainimport ( "fmt" "net/http" "io/ioutil" "strings")func main() { url := "https://api.mattermode.com/v1/authorizations/{id}/deny" 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/authorizations/id_placeholder/deny", 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/authorizations/{id}/deny")) .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/authorizations/{id}/deny", body);var responseBody = await response.Content.ReadAsStringAsync();curl --request POST 'https://api.mattermode.com/v1/authorizations/id_placeholder/deny' \ --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/authorizations/id_placeholder/deny", { 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": "string",
"object": "authorization",
"token_id": "tok_4Kj2m8pQ",
"action": "string",
"payload_hash": "string",
"status": "pending",
"expires_at": 1745539200,
"signature_url": "https://your.app/webhooks/matter",
"approved_by_stakeholder_id": "string",
"approved_at": 0,
"denied_reason": "string",
"metadata": {},
"created": 1745539200,
"updated": 1745539200,
"livemode": false
}{
"type": "https://mattermode.com/docs/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "Request body could not be parsed as JSON.",
"doc_url": "https://mattermode.com/docs/guides/errors#invalid_request",
"request_id": "req_Qw9xYz8A"
}{
"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/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
}