API Reference · Certificate

Run Final Check

Re-check everything the issuer will verify

POST/v1/applications/{application_id}/certificate/check
Paid plan requiredMCP:run_final_check

Runs automatically right before the order is submitted (it's never submitted while anything fails) and daily while the issuer reviews it. Failures mark the affected steps attention.

cURL example

cURL request
curl -X POST "https://api.verifiedinbox.ai/v1/applications/0192a5e0-1234-7000-8000-000000000001/certificate/check" \
  -H "Authorization: Bearer vi_live_YOUR_API_KEY"

Parameters

ParameterTypeDescription
application_idpathrequired
string (uuid)Application id.
VI-Environmentheader
string`live` (default) or `test`. Used for anonymous callers and OAuth access tokens; API keys and web sessions carry their own environment.

Response

200 OKCertificate state with the new `final_check`.
application/json
FieldTypeDescription
certificaterequired
Certificate | null—
Nested fields (27)
  • created_at (string (date-time))
  • customer_actions (object[]): What the issuer needs from the customer.
  • days_remaining (integer)
  • id (string (uuid))
  • issued_at (string (date-time))
  • issuer (string)
  • issuer_mode (string)
  • issuer_order_id (string)
  • kind (string)
  • not_after (string (date-time))
  • not_before (string (date-time))
  • pem_url (string)
  • prerequisites (Prerequisite[])
  • reissue_of (string (uuid))
  • rejected_at (string (date-time))
  • rejection_reason (string)
  • renewal_of (string (uuid))
  • renewal_starts_on (string (date))
  • revocation_reason (string)
  • revoked_at (string (date-time))
  • serial (string)
  • status (string)
  • status_detail (string)
  • submitted_at (string (date-time))
  • test_mode (boolean)
  • timeline (object[])
  • updated_at (string (date-time))
final_checkrequired
FinalCheck | null

Latest comprehensive re-check (null until the first one).

Nested fields (5)
  • created_at (string (date-time))
  • id (string (uuid))
  • ok (boolean)
  • results (FinalCheckItem[])
  • trigger (string)
historyrequired
Certificate[]—
Nested fields (27)
  • created_at (string (date-time))
  • customer_actions (object[]): What the issuer needs from the customer.
  • days_remaining (integer)
  • id (string (uuid))
  • issued_at (string (date-time))
  • issuer (string)
  • issuer_mode (string)
  • issuer_order_id (string)
  • kind (string)
  • not_after (string (date-time))
  • not_before (string (date-time))
  • pem_url (string)
  • prerequisites (Prerequisite[])
  • reissue_of (string (uuid))
  • rejected_at (string (date-time))
  • rejection_reason (string)
  • renewal_of (string (uuid))
  • renewal_starts_on (string (date))
  • revocation_reason (string)
  • revoked_at (string (date-time))
  • serial (string)
  • status (string)
  • status_detail (string)
  • submitted_at (string (date-time))
  • test_mode (boolean)
  • timeline (object[])
  • updated_at (string (date-time))
prerequisitesrequired
Prerequisite[]—
Nested fields (4)
  • id (string)
  • label (string)
  • met (boolean)
  • step (string)
prerequisites_metrequired
boolean—
Example 200 response (CertificateState)
{
  "certificate": {
    "created_at": "2026-10-31T12:00:00Z",
    "customer_actions": [],
    "days_remaining": 1,
    "id": "0192a5e0-1234-7000-8000-000000000001",
    "issued_at": "2026-10-31T12:00:00Z",
    "issuer": "string",
    "issuer_mode": "string",
    "issuer_order_id": "0192a5e0-1234-7000-8000-000000000001",
    "kind": "vmc",
    "not_after": "2026-10-31T12:00:00Z",
    "not_before": "2026-10-31T12:00:00Z",
    "pem_url": "https://verifiedinbox.ai/verify/0192a5e0-1234-7000-8000-000000000001/domain",
    "prerequisites": [],
    "reissue_of": "0192a5e0-1234-7000-8000-000000000001",
    "rejected_at": "2026-10-31T12:00:00Z",
    "rejection_reason": "string",
    "renewal_of": "0192a5e0-1234-7000-8000-000000000001",
    "renewal_starts_on": "2026-10-31",
    "revocation_reason": "string",
    "revoked_at": "2026-10-31T12:00:00Z",
    "serial": "string",
    "status": "waiting_prerequisites",
    "status_detail": "string",
    "submitted_at": "2026-10-31T12:00:00Z",
    "test_mode": true,
    "timeline": [],
    "updated_at": "2026-10-31T12:00:00Z"
  },
  "final_check": {
    "created_at": "2026-10-31T12:00:00Z",
    "id": "0192a5e0-1234-7000-8000-000000000001",
    "ok": true,
    "results": [],
    "trigger": "submission"
  },
  "history": [
    {
      "created_at": "2026-10-31T12:00:00Z",
      "customer_actions": [],
      "days_remaining": 1,
      "id": "0192a5e0-1234-7000-8000-000000000001",
      "issued_at": "2026-10-31T12:00:00Z",
      "issuer": "string",
      "issuer_mode": "string",
      "issuer_order_id": "0192a5e0-1234-7000-8000-000000000001",
      "kind": "vmc",
      "not_after": "2026-10-31T12:00:00Z",
      "not_before": "2026-10-31T12:00:00Z",
      "pem_url": "https://verifiedinbox.ai/verify/0192a5e0-1234-7000-8000-000000000001/domain",
      "prerequisites": [],
      "reissue_of": "0192a5e0-1234-7000-8000-000000000001",
      "rejected_at": "2026-10-31T12:00:00Z",
      "rejection_reason": "string",
      "renewal_of": "0192a5e0-1234-7000-8000-000000000001",
      "renewal_starts_on": "2026-10-31",
      "revocation_reason": "string",
      "revoked_at": "2026-10-31T12:00:00Z",
      "serial": "string",
      "status": "waiting_prerequisites",
      "status_detail": "string",
      "submitted_at": "2026-10-31T12:00:00Z",
      "test_mode": true,
      "timeline": [],
      "updated_at": "2026-10-31T12:00:00Z"
    }
  ],
  "prerequisites": [
    {
      "id": "paid",
      "label": "string",
      "met": true,
      "step": "domain"
    }
  ],
  "prerequisites_met": true
}

Other responses & possible errors

Expand a status code below to see the error code, description, and example error payload.

400 (invalid_request)`invalid_request` — the request is malformed.

`invalid_request` — the request is malformed.

Example 400 error response
{
  "error": {
    "code": "invalid_request",
    "message": "Please provide a valid domain name."
  }
}
401 (unauthenticated)`unauthenticated` — sign in / send a valid credential. `next_action.kind = sign_in`.

`unauthenticated` — sign in / send a valid credential. `next_action.kind = sign_in`.

Example 401 error response
{
  "error": {
    "code": "unauthenticated",
    "message": "Sign in or provide an API key to continue.",
    "next_action": {
      "kind": "sign_in",
      "title": "Sign in or create an account",
      "url": "/login"
    }
  }
}
402 (payment_required)`payment_required` — this step needs a paid plan. `next_action.kind = checkout`.

`payment_required` — this step needs a paid plan. `next_action.kind = checkout`.

Example 402 error response
{
  "error": {
    "code": "payment_required",
    "message": "This step requires an active paid plan for this domain.",
    "next_action": {
      "kind": "checkout",
      "title": "Continue to checkout"
    }
  }
}
404 (not_found)`not_found` — doesn't exist or isn't accessible to you (never 403).

`not_found` — doesn't exist or isn't accessible to you (never 403).

Example 404 error response
{
  "error": {
    "code": "not_found",
    "message": "We couldn't find that resource."
  }
}
422 (unprocessable)`unprocessable` / `blocked_provider` — understood but can't be done (plain-English reason).

`unprocessable` / `blocked_provider` — understood but can't be done (plain-English reason).

Example 422 error response
{
  "error": {
    "code": "unprocessable",
    "message": "Shared mailbox providers like gmail.com cannot be verified."
  }
}
429 (rate_limited)`rate_limited` — retry after `Retry-After` seconds (`details.retry_after_seconds`). `limit_reached` — a quota is used up; `details.limit` names it and `next_action` offers support.

`rate_limited` — retry after `Retry-After` seconds (`details.retry_after_seconds`). `limit_reached` — a quota is used up; `details.limit` names it and `next_action` offers support.

Example 429 error response
{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Please wait a moment and try again."
  }
}
Was it helpful?