Skip to content

Set a supplier's exception (by a person; an owner to loosen, an admin to tighten)

PUT
/suppliers/{supplierId}/control-overrides
curl --request PUT \
--url https://api.invogi.com/v1/suppliers/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/control-overrides \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "overrides": { "actions": { "FUZZY_DUPLICATE": "INFORM" } }, "reason": "Fixed monthly retainer, always the same amount.", "expires_in_days": 90 }'

Thresholds and finding actions for one supplier, laid over the workspace settings. A finding may be relaxed to INFORM but never OFF; the checks that protect against payment redirection and impersonation (exact duplicate, changed or invalid bank details, inactive supplier, identity mismatch) can only be made stricter. A reason is required and the exception expires (default 90 days, at most 365). Replaces any existing exception. Audited, including what it replaced.

An exception that makes any check less strict than the workspace settings, or than the supplier’s current exception, needs an OWNER (403 for an admin); one that only adds scrutiny is open to an ADMIN. An exception an owner did not grant is held to “not looser than the workspace settings” when applied, even if the workspace is tightened later. Merging suppliers is judged the same way.

supplierId
required
string format: uuid
Media typeapplication/json
object
overrides
required
object
duplicates
object
anomalies
object
purchaseOrders
object
actions
object
key
additional properties
string
Allowed values: INFORM REVIEW BLOCK
reason
required
string
>= 5 characters <= 500 characters
expires_in_days
integer
default: 90 >= 1 <= 365

Example

{
"overrides": {
"actions": {
"FUZZY_DUPLICATE": "INFORM"
}
},
"reason": "Fixed monthly retainer, always the same amount.",
"expires_in_days": 90
}

Exception saved

Media typeapplication/json
object
overrides
required
object
reason
required
string
expiresAt
required
string format: date-time
active
required
boolean
grantedByOwner
required
boolean

Example

{
"overrides": {
"actions": {
"FUZZY_DUPLICATE": "INFORM"
}
},
"reason": "Fixed monthly retainer, always the same amount.",
"expiresAt": "2027-01-13T00:00:00.000Z",
"active": true,
"grantedByOwner": true
}

Invalid request

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: NOT_FOUND UNAUTHORIZED FORBIDDEN INVALID_REQUEST CONFLICT RATE_LIMITED USAGE_LIMIT_EXCEEDED PROCESSING_FAILED
message
required
string
request_id
required
string

Example

{
"error": {
"code": "NOT_FOUND"
}
}

Missing or invalid API key

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: NOT_FOUND UNAUTHORIZED FORBIDDEN INVALID_REQUEST CONFLICT RATE_LIMITED USAGE_LIMIT_EXCEEDED PROCESSING_FAILED
message
required
string
request_id
required
string

Example

{
"error": {
"code": "NOT_FOUND"
}
}

API key lacks required scope/role

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: NOT_FOUND UNAUTHORIZED FORBIDDEN INVALID_REQUEST CONFLICT RATE_LIMITED USAGE_LIMIT_EXCEEDED PROCESSING_FAILED
message
required
string
request_id
required
string

Example

{
"error": {
"code": "NOT_FOUND"
}
}

Resource not found

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: NOT_FOUND UNAUTHORIZED FORBIDDEN INVALID_REQUEST CONFLICT RATE_LIMITED USAGE_LIMIT_EXCEEDED PROCESSING_FAILED
message
required
string
request_id
required
string

Example

{
"error": {
"code": "NOT_FOUND"
}
}

The supplier has been merged into another