{"info":{"_postman_id":"ca7fc443-d7a0-4eec-b685-c167bb9d2298","name":"CERTInext API v2","description":"<html><head></head><body><h1 id=\"certinext-api-v2-customer-rest-apis\">CERTInext API v2 — Customer REST APIs</h1>\n<p>RESTful API for CERTInext certificate lifecycle management — issue, track, validate, renew, and revoke certificates programmatically.</p>\n<hr>\n<h2 id=\"getting-started-three-steps\">Getting started (three steps)</h2>\n<ol>\n<li><strong>Pick your environment.</strong> Use the environment dropdown (top-right in Postman) — Production (India / US), Sandbox, Demo, QA, or Localhost.</li>\n<li><strong>Fill in credentials.</strong> Set the <code>appCode</code> and <code>accessKey</code> environment variables. Both are generated in the CERTInext portal under <strong>Integration → REST APIs</strong>.</li>\n<li><strong>Get a token.</strong> Open <strong>Authentication → Get Bearer Token</strong> and hit <strong>Send</strong>. The response's <code>tokenDetails.accessToken</code> is auto-captured into <code></code> — every other request uses it.</li>\n</ol>\n<p>After that, run any folder top-to-bottom. The test scripts auto-capture <code>orderId</code>, <code>requestId</code>, etc. so the next request in the flow works without editing.</p>\n<hr>\n<h2 id=\"workflow-cheat-sheet\">Workflow cheat sheet</h2>\n<h3 id=\"ssl--tls-dv-example\">SSL / TLS (DV example)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>1. Authentication → Get Bearer Token\n2. SSL/TLS → 1. Create Order          → captures orderId\n3. SSL/TLS → 2. Get DCV Challenges    → returns HTTP / DNS / email proofs\n4. (publish the challenge on your domain)\n5. SSL/TLS → 3. Verify DCV            → CA re-checks\n6. SSL/TLS → 4. Submit CSR\n7. SSL/TLS → 5. Accept Agreement\n8. SSL/TLS → 6. Download Certificate\n</code></pre><p>Optional alternatives:</p>\n<ul>\n<li><strong>Cancel</strong> before issuance → <code>7. Cancel Order</code></li>\n<li><strong>Revoke</strong> after issuance → <code>8. Revoke Certificate</code></li>\n</ul>\n<h3 id=\"document-signer\">Document Signer</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>1. Authentication → Get Bearer Token\n2. Document Signer → 1. Create Order         → captures orderId\n3. Document Signer → 2. Upload Documents (pending — use v1 /SubmitDocument)\n4. Document Signer → 3. Submit CSR\n5. Document Signer → 4. Accept Agreement\n6. Document Signer → 5. Download Certificate\n</code></pre><h3 id=\"private-pki\">Private PKI</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>1. Authentication → Get Bearer Token\n2. Private PKI → 1. Create Order   → captures orderId\n3. Private PKI → 2. Submit CSR\n4. Private PKI → 3. Download Certificate\n</code></pre><h3 id=\"reconnaissance-call-once-per-integration-deploy-cache-client-side\">Reconnaissance (call once per integration deploy, cache client-side)</h3>\n<ul>\n<li><strong>Catalog → List Products</strong> — stable <code>productCode</code> per family (use in <code>X-Product-Code</code>)</li>\n<li><strong>Accounts → List Organizations / Domains / Groups</strong> — pre-vetted entitlements</li>\n</ul>\n<hr>\n<h2 id=\"conventions-used-across-the-api\">Conventions used across the API</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Aspect</th>\n<th>Standard</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Auth</td>\n<td><code>Authorization: Bearer &lt;jwt&gt;</code> on every call</td>\n</tr>\n<tr>\n<td>Idempotency</td>\n<td><code>Idempotency-Key</code> header on every unsafe POST (auto-populated with <code>0fb5a44a-09a2-406d-bfd6-75868f716a0c</code> below)</td>\n</tr>\n<tr>\n<td>Timestamps</td>\n<td>RFC 3339 UTC with <code>Z</code></td>\n</tr>\n<tr>\n<td>Phones</td>\n<td>E.164 — e.g. <code>+919481081094</code></td>\n</tr>\n<tr>\n<td>Countries</td>\n<td>ISO 3166-1 alpha-2 — e.g. <code>IN</code>, <code>US</code></td>\n</tr>\n<tr>\n<td>IDs</td>\n<td>Opaque strings — do not parse</td>\n</tr>\n<tr>\n<td>Errors</td>\n<td>RFC 7807 <code>application/problem+json</code> with <code>type</code>, <code>title</code>, <code>status</code>, <code>detail</code>, <code>instance</code>, <code>code</code></td>\n</tr>\n<tr>\n<td>Pagination</td>\n<td><code>?page=0&amp;size=50</code> where applicable</td>\n</tr>\n</tbody>\n</table>\n</div><hr>\n<h2 id=\"environment-variables-auto-managed\">Environment variables (auto-managed)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variable</th>\n<th>Filled by</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>appCode</code></td>\n<td>You (once)</td>\n<td>Account identifier from portal</td>\n</tr>\n<tr>\n<td><code>accessKey</code></td>\n<td>You (once)</td>\n<td>Plain-text access key from portal</td>\n</tr>\n<tr>\n<td><code>accessToken</code></td>\n<td><code>Get Bearer Token</code> test script</td>\n<td>Bearer JWT on every call</td>\n</tr>\n<tr>\n<td><code>refreshToken</code></td>\n<td><code>Get Bearer Token</code> test script</td>\n<td>Future token refresh</td>\n</tr>\n<tr>\n<td><code>orderId</code></td>\n<td><code>Create *</code> test scripts</td>\n<td>Reused by subsequent lifecycle calls</td>\n</tr>\n<tr>\n<td><code>requestId</code></td>\n<td><code>Create *</code> test scripts</td>\n<td>Draft-only orders</td>\n</tr>\n<tr>\n<td><code>productCodeSslDv / Ov / Ev</code></td>\n<td>Pre-filled per env</td>\n<td><code>X-Product-Code</code> header for SSL</td>\n</tr>\n<tr>\n<td><code>productCodeDocSignerNp1Y / Lp1Y / Le1Y</code></td>\n<td>Pre-filled per env</td>\n<td><code>X-Product-Code</code> header for Document Signer</td>\n</tr>\n<tr>\n<td><code>productCodePkiIntranet / Igtf</code></td>\n<td>Pre-filled per env</td>\n<td><code>X-Product-Code</code> header for Private PKI</td>\n</tr>\n<tr>\n<td><code>caProfileId</code>, <code>masterProductId</code></td>\n<td>You (Private PKI orders)</td>\n<td>CA template + subscription slot</td>\n</tr>\n</tbody>\n</table>\n</div><p>Send any request with <strong>Send</strong> — all boilerplate (auth header, idempotency key, token refresh, state capture) runs automatically.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"CERTInext API v2 — Customer REST APIs","slug":"certinext-api-v2-customer-rest-apis"}],"owner":"40123569","collectionId":"ca7fc443-d7a0-4eec-b685-c167bb9d2298","publishedId":"2sBXqJJLFh","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-04-28T03:13:17.000Z"},"item":[{"name":"Authentication","item":[{"name":"Get Bearer Token","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Build ts + txn + SHA256(accessKey + ts + txn) → authKey.","// The v1 auth layer (which v2 reuses at the crypto level) expects this hashed form.","const ts  = new Date().toISOString().replace(/\\.\\d{3}Z$/, '+00:00');","const txn = 'pm' + Date.now() + Math.floor(Math.random() * 1e6);","const accessKey = pm.environment.get('accessKey');","if (!accessKey || accessKey.startsWith('<')) {","    throw new Error('Set accessKey in the environment (CERTInext portal → Integration → REST APIs).');","}","const hash = CryptoJS.SHA256(accessKey + ts + txn).toString(CryptoJS.enc.Hex);","pm.variables.set('_ts', ts);","pm.variables.set('_txn', txn);","pm.variables.set('_hash', hash);"],"id":"67a650bf-1711-4e31-8716-e1d2755b53ac"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","const body = pm.response.json();","const tok = body && body.tokenDetails ? body.tokenDetails.accessToken : null;","const ref = body && body.tokenDetails ? body.tokenDetails.refreshToken : null;","if (tok) {","    pm.collectionVariables.set('accessToken', tok);","    pm.collectionVariables.set('refreshToken', ref || '');","    pm.test('accessToken captured', () => pm.expect(tok).to.be.a('string').and.not.empty);","    console.log('Bearer token saved to  — valid for', body.tokenDetails.expiresIn, 'seconds.');","} else {","    const err = (body && (body.meta || body)) || {};","    pm.test('Token request failed: ' + (err.errorMessage || err.error_description || err.error || JSON.stringify(err)), () => false);","}"],"id":"63bdb361-db3e-4665-8676-c4039d6fa5e4"}}],"id":"9d2a1764-1df6-40b8-95d7-805e76a342b3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"grant_type\": \"client_credentials\",\n    \"accountNumber\": \"{{appCode}}\",\n    \"authKey\": \"{{_hash}}\",\n    \"ver\": \"1.0\",\n    \"ts\": \"{{_ts}}\",\n    \"txn\": \"{{_txn}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/oauth/token","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Exchanges your <code>appCode</code> + <code>accessKey</code> for a short-lived Bearer token.</p>\n<h3 id=\"when-to-call\">When to call</h3>\n<ul>\n<li>At the start of every session.</li>\n<li>When the previous token expires (1 hour lifetime).</li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Value</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>grant_type</code></td>\n<td><code>client_credentials</code></td>\n<td>Always this for machine-to-machine</td>\n</tr>\n<tr>\n<td><code>accountNumber</code></td>\n<td><code>{{appCode}}</code></td>\n<td>Your account identifier</td>\n</tr>\n<tr>\n<td><code>authKey</code></td>\n<td><code>SHA256(accessKey + ts + txn)</code></td>\n<td>The pre-request script computes this — you don't need to</td>\n</tr>\n<tr>\n<td><code>ver</code></td>\n<td><code>1.0</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>ts</code></td>\n<td>RFC 3339 UTC</td>\n<td>Generated by script</td>\n</tr>\n<tr>\n<td><code>txn</code></td>\n<td>Unique ID</td>\n<td>Generated by script</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"meta\": { \"status\": \"1\", \"ts\": \"...\", \"txn\": \"...\" },\n  \"tokenDetails\": {\n    \"accessToken\": \"&lt;JWT&gt;\",\n    \"tokenType\": \"Bearer\",\n    \"expiresIn\": 3600,\n    \"refreshToken\": \"&lt;opaque&gt;\"\n  }\n}\n</code></pre>\n<p>The test script captures <code>accessToken</code> into <code></code> — every downstream request uses it automatically.</p>\n<h3 id=\"next\">Next</h3>\n<p>→ Pick a product family folder (SSL/TLS, Document Signer, Private PKI) and call its <strong>1. Create Order</strong> request.</p>\n<h3 id=\"common-errors\">Common errors</h3>\n<ul>\n<li><code>400 EMS-2028</code> — meta field missing. Check <code>appCode</code> is set in the environment.</li>\n<li><code>401 EMS-2037</code> — access key mismatch. Regenerate in portal if needed.</li>\n<li><code>403 EMS-2022</code> — OAuth2 not enabled on this client. Contact support.</li>\n</ul>\n","urlObject":{"path":["oauth","token"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9d2a1764-1df6-40b8-95d7-805e76a342b3"},{"name":"Refresh Token","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const ts  = new Date().toISOString().replace(/\\.\\d{3}Z$/, '+00:00');","const txn = 'pm' + Date.now() + Math.floor(Math.random() * 1e6);","const accessKey = pm.environment.get('accessKey');","if (!accessKey || accessKey.startsWith('<')) { throw new Error('Set accessKey in the environment.'); }","const hash = CryptoJS.SHA256(accessKey + ts + txn).toString(CryptoJS.enc.Hex);","pm.variables.set('_ts', ts);","pm.variables.set('_txn', txn);","pm.variables.set('_hash', hash);"],"id":"ff32f20c-309b-4c46-b0bf-1a8cd3a65c32"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('200 OK', () => pm.response.to.have.status(200));","const body = pm.response.json();","const tok = body && body.tokenDetails ? body.tokenDetails.accessToken : null;","const ref = body && body.tokenDetails ? body.tokenDetails.refreshToken : null;","if (tok) {","    pm.collectionVariables.set('accessToken', tok);","    pm.collectionVariables.set('refreshToken', ref || '');","    pm.test('accessToken refreshed', () => pm.expect(tok).to.be.a('string').and.not.empty);","} else {","    const err = (body && (body.meta || body)) || {};","    pm.test('Refresh failed: ' + (err.errorMessage || err.error_description || JSON.stringify(err)), () => false);","}"],"id":"faf84432-8cbf-4028-af80-fd2540a1cbc4"}}],"id":"1cc82c34-747e-473c-bf58-a8607e1bfd16","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"grant_type\": \"refresh_token\",\n    \"accountNumber\": \"{{appCode}}\",\n    \"authKey\": \"{{_hash}}\",\n    \"refresh_token\": \"\",\n    \"ver\": \"1.0\",\n    \"ts\": \"{{_ts}}\",\n    \"txn\": \"{{_txn}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/oauth/token","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Exchanges a <code>refreshToken</code> for a fresh <code>accessToken</code> — no need to re-hash your accessKey from scratch.</p>\n<h3 id=\"when-to-call\">When to call</h3>\n<p>When <code></code> is close to expiry (default TTL is 3600 seconds) but <code></code> is still valid. Use this to avoid interactive re-auth.</p>\n<h3 id=\"response\">Response</h3>\n<p>Same shape as <strong>Get Bearer Token</strong>. The test script replaces both <code></code> and <code></code>.</p>\n<h3 id=\"common-errors\">Common errors</h3>\n<ul>\n<li><code>401 EMS-2038</code> — refresh token expired or revoked. Call <strong>Get Bearer Token</strong> to re-authenticate.</li>\n</ul>\n","urlObject":{"path":["oauth","token"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"1cc82c34-747e-473c-bf58-a8607e1bfd16"}],"id":"6ea8d347-37da-47c4-9fef-d64b175b916d","description":"<p>Run <strong>Get Bearer Token</strong> once at the start of every session. The test script captures the JWT into <code></code> so every other request can use it via <code>Authorization: Bearer </code>. Tokens expire in 1 hour — either re-run Get Bearer Token or use <strong>Refresh Token</strong>.</p>\n","_postman_id":"6ea8d347-37da-47c4-9fef-d64b175b916d"},{"name":"SSL/TLS Certificates","item":[{"name":"1. Create Order","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const body = pm.response.json();","if (pm.response.code === 201 && body.orderId) {","    pm.collectionVariables.set('orderId', body.orderId);","    pm.collectionVariables.set('requestId', body.requestId || '');","    pm.test('SSL order created, orderId=' + body.orderId, () => pm.expect(body.orderId).to.be.a('string'));","    console.log('Next: run \"2. Get DCV Challenges\" to fetch the domain-validation proofs.');","} else {","    pm.test('Create FAILED: ' + (body.detail || body.title || JSON.stringify(body)), () => false);","}"],"id":"d96ad120-723a-4ee0-bde1-6e7ea6b733fc"}}],"id":"6ae18adc-22a1-479c-9f2b-c1a878343273","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"e1b26fb3-faf9-4719-bfd8-b8434a009ecc","description":"<p>Auto-generated — same key + body replays the original response.</p>\n"},{"key":"X-Product-Code","value":"{{productCodeSslDv}}","description":"<p>842=DV, 846=OV, 850=EV. Discover via Catalog → List Products.</p>\n"}],"body":{"mode":"raw","raw":"{\n    \"productVariant\": \"dv\",\n    \"emailNotifications\": \"all\",\n    \"requestor\": {\n        \"name\": \"John Smith\",\n        \"email\": \"john@example.com\",\n        \"phone\": \"+19481081094\",\n        \"designation\": \"IT Administrator\"\n    },\n    \"certificate\": {\n        \"domain\": \"example.com\",\n        \"autoSecureWww\": true\n    },\n    \"subscription\": {\n        \"validityYears\": 1,\n        \"autoRenew\": true,\n        \"renewBeforeDays\": 30\n    },\n    \"agreement\": {\n        \"signerName\": \"John Smith\",\n        \"signerIp\": \"10.24.108.199\",\n        \"signerPlace\": \"New York\",\n        \"accepted\": true\n    },\n    \"remarks\": \"Postman test run\"\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Creates a new SSL/TLS certificate order.</p>\n<h3 id=\"when-to-call\">When to call</h3>\n<p>At the very start of every new SSL issuance.</p>\n<h3 id=\"headers\">Headers</h3>\n<ul>\n<li><code>X-Product-Code</code> — which variant (842 DV, 846 OV, 850 EV, etc.)</li>\n<li><code>Idempotency-Key</code> — safe retries</li>\n</ul>\n<h3 id=\"body\">Body</h3>\n<ul>\n<li><code>productVariant</code> — <code>dv</code>, <code>ov</code>, or <code>ev</code></li>\n<li><code>requestor</code> — who to contact about this order</li>\n<li><code>certificate.domain</code> — primary domain; <code>autoSecureWww</code> adds <code>www.&lt;domain&gt;</code> automatically</li>\n<li><code>subscription.validityYears</code> — 1, 2, or 3</li>\n<li><code>agreement.accepted</code> — must be <code>true</code> to place a public-CA order</li>\n</ul>\n<h3 id=\"response-201-created\">Response (201 Created)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"orderId\": \"ord_abc123\",\n  \"requestId\": \"req_def456\",\n  \"status\": \"pending-dcv\",\n  \"productVariant\": \"dv\",\n  \"domain\": \"example.com\",\n  \"_links\": {\n    \"self\":        { \"href\": \"/api/certinext/v2/ssl-certificates/ord_abc123\" },\n    \"dcv\":         { \"href\": \"/api/certinext/v2/ssl-certificates/ord_abc123/dcv\" },\n    \"csr\":         { \"href\": \"/api/certinext/v2/ssl-certificates/ord_abc123/csr\" },\n    \"agreement\":   { \"href\": \"/api/certinext/v2/ssl-certificates/ord_abc123/agreement\" },\n    \"certificate\": { \"href\": \"/api/certinext/v2/ssl-certificates/ord_abc123/certificate\" },\n    \"cancel\":      { \"href\": \"/api/certinext/v2/ssl-certificates/ord_abc123/cancel\" },\n    \"revoke\":      { \"href\": \"/api/certinext/v2/ssl-certificates/ord_abc123/revoke\" }\n  }\n}\n</code></pre>\n<p><code>orderId</code> is auto-captured into <code></code> — next requests use it.</p>\n<h3 id=\"next\">Next</h3>\n<p>→ <strong>2. Get DCV Challenges</strong> (for public DV/OV/EV SSL)</p>\n<h3 id=\"common-errors-422\">Common errors (422)</h3>\n<ul>\n<li><code>EMS-915</code> invalid product code</li>\n<li><code>EMS-916</code> missing requestor info</li>\n<li><code>EMS-917</code> missing certificate info</li>\n<li><code>EMS-918</code> missing additional info</li>\n</ul>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6ae18adc-22a1-479c-9f2b-c1a878343273"},{"name":"2. Get DCV Challenges","id":"acb2c1a1-35cd-4204-9b53-420a450f12b3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates//dcv?domain=example.com","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Returns the three DCV methods — HTTP file, DNS TXT, email — with the exact artifact to publish.</p>\n<h3 id=\"when-to-call\">When to call</h3>\n<p>Immediately after <strong>1. Create Order</strong> for public DV/OV/EV SSL.</p>\n<h3 id=\"query-parameters\">Query parameters</h3>\n<ul>\n<li><code>domain</code> — <strong>required</strong>. Use the same domain from your create request.</li>\n</ul>\n<h3 id=\"response-200-ok\">Response (200 OK)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"domains\": [{\n    \"domain\": \"example.com\",\n    \"methods\": {\n      \"http-url\": {\n        \"path\": \"/.well-known/pki-validation/emudhra-&lt;token&gt;.txt\",\n        \"expectedContent\": \"&lt;random-hex&gt;\"\n      },\n      \"dns-txt\": {\n        \"host\": \"_emudhra-challenge.example.com\",\n        \"expectedValue\": \"emudhra-dcv-&lt;random&gt;\"\n      },\n      \"email\": {\n        \"sendTo\": [\"admin@example.com\", \"webmaster@example.com\"]\n      }\n    }\n  }]\n}\n</code></pre>\n<h3 id=\"next\">Next</h3>\n<p>→ Publish the challenge on your server (host the file, create the TXT record, or reply to the email)\n→ Then call <strong>3. Verify DCV</strong></p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","","dcv"],"host":["{{v2BaseURL}}"],"query":[{"description":{"content":"<p>Required. Domain on the order to fetch challenges for.</p>\n","type":"text/plain"},"key":"domain","value":"example.com"}],"variable":[]}},"response":[],"_postman_id":"acb2c1a1-35cd-4204-9b53-420a450f12b3"},{"name":"3. Verify DCV","id":"ebb9da7f-eff7-4ec7-8638-aa9dd385d437","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"domain\": \"example.com\",\n    \"method\": \"http-url\"\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates//dcv/verify","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Asks the CA to re-check the DCV artifact you just published.</p>\n<h3 id=\"body\">Body</h3>\n<ul>\n<li><code>domain</code> — same domain as on the order</li>\n<li><code>method</code> — <code>http-url</code>, <code>dns-txt</code>, or <code>email</code> (match what you actually published)</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — DCV passed; order advances to <code>pending-csr</code></li>\n<li><code>422</code> — CA couldn't find / match the artifact; check the file path or DNS propagation</li>\n</ul>\n<h3 id=\"next\">Next</h3>\n<p>→ <strong>4. Submit CSR</strong></p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","","dcv","verify"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ebb9da7f-eff7-4ec7-8638-aa9dd385d437"},{"name":"4. Submit CSR","id":"550f5832-7676-4010-8132-b5372ab25c54","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"csr\": \"-----BEGIN CERTIFICATE REQUEST-----\\n<paste-your-PEM-here>\\n-----END CERTIFICATE REQUEST-----\",\n    \"attested\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates//csr","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Attaches a PEM-encoded Certificate Signing Request to the order.</p>\n<h3 id=\"body\">Body</h3>\n<ul>\n<li><code>csr</code> — full PEM including the BEGIN/END markers. Generate with <code>openssl req -new -newkey rsa:2048 -nodes -keyout key.pem -out csr.pem</code>.</li>\n<li><code>attested</code> — <code>true</code> only when the key was produced by an attested/HSM-backed generator.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — CSR accepted</li>\n<li><code>422</code> — CSR malformed, or order not in a state that accepts a CSR</li>\n</ul>\n<h3 id=\"next\">Next</h3>\n<p>→ <strong>5. Accept Agreement</strong></p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","","csr"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"550f5832-7676-4010-8132-b5372ab25c54"},{"name":"5. Accept Agreement","id":"57242ca2-f319-4c2b-8a8d-b1a579636f8b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"agreement\": {\n        \"signerName\": \"John Smith\",\n        \"signerIp\": \"10.24.108.199\",\n        \"signerPlace\": \"New York\",\n        \"accepted\": true\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates//agreement","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Records the Subscriber Agreement acceptance.</p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — recorded; the CA now issues</li>\n</ul>\n<h3 id=\"next\">Next</h3>\n<p>→ Poll <strong>Track Order</strong> until <code>status=issued</code>, then <strong>6. Download Certificate</strong></p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","","agreement"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"57242ca2-f319-4c2b-8a8d-b1a579636f8b"},{"name":"6. Download Certificate","id":"a0aff4ee-b1da-4fb6-9c17-6ba1f6b3ef43","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "},{"key":"Accept","value":"application/json","description":"<p>Use application/x-pem-file for PEM text, application/pkix-cert for DER bytes.</p>\n"}],"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates//certificate","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Returns the issued certificate.</p>\n<h3 id=\"content-negotiation\">Content negotiation</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Accept header</th>\n<th>Response body</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>application/json</code> (default)</td>\n<td>JSON envelope with PEM + metadata (serial, subject, issuer, validity)</td>\n</tr>\n<tr>\n<td><code>application/x-pem-file</code></td>\n<td>Plain PEM text</td>\n</tr>\n<tr>\n<td><code>application/pkix-cert</code></td>\n<td>Binary DER</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-json\">Response (JSON)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"orderId\": \"ord_abc123\",\n  \"serialNumber\": \"0A1B2C3D4E...\",\n  \"subject\": \"CN=example.com\",\n  \"issuer\": \"CN=CERTInext TLS Intermediate\",\n  \"notBefore\": \"2026-04-24T10:00:00Z\",\n  \"notAfter\":  \"2027-04-24T10:00:00Z\",\n  \"certificatePem\": \"-----BEGIN CERTIFICATE-----\\n...\\n-----END CERTIFICATE-----\"\n}\n</code></pre>\n<h3 id=\"when-it-fails\">When it fails</h3>\n<p><code>422</code> if the order is not yet <code>issued</code>. Poll <strong>Track Order</strong> first.</p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","","certificate"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"a0aff4ee-b1da-4fb6-9c17-6ba1f6b3ef43"},{"name":"Track Order","id":"7126d3ef-e2b3-4586-92d1-dcd64ac7227a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates/","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Returns the current state of an SSL order.</p>\n<h3 id=\"status-values\">Status values</h3>\n<p><code>pending-dcv</code> → <code>pending-csr</code> → <code>pending-agreement</code> → <code>issued</code> (or <code>cancelled</code> / <code>revoked</code>)</p>\n<p>Poll this between lifecycle steps. Use the <code>_links</code> in the response to discover the next allowed operation.</p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates",""],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"7126d3ef-e2b3-4586-92d1-dcd64ac7227a"},{"name":"7. Cancel Order","id":"caf73a31-5059-4566-9ea8-20970390d1a8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{ \"reason\": \"No longer required\" }","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates//cancel","description":"<h3 id=\"when-to-use\">When to use</h3>\n<p>Withdraw an order <strong>before</strong> it has been issued. Once issued, use <strong>Revoke Certificate</strong> instead.</p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — cancelled</li>\n<li><code>422</code> — order is in a state that cannot be cancelled (e.g. already revoked)</li>\n</ul>\n<p>The order remains visible via <strong>Track Order</strong> with <code>status=cancelled</code>.</p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","","cancel"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"caf73a31-5059-4566-9ea8-20970390d1a8"},{"name":"Reject Draft Request","id":"e948f4e3-cd38-47c0-8337-7f257cdf966d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{ \"reason\": \"Draft no longer needed\" }","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates/requests//cancel","description":"<h3 id=\"when-to-use\">When to use</h3>\n<p>Only for draft requests (<code>saveAsDraft=true</code>) that returned a <code>requestId</code> but no <code>orderId</code>. If the draft has been promoted to a real order, use <strong>Cancel Order</strong> with the <code>orderId</code> instead.</p>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","requests","","cancel"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e948f4e3-cd38-47c0-8337-7f257cdf966d"},{"name":"8. Revoke Certificate","id":"65ec4451-56d7-45f3-ab73-b0b1eeecd2b9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"7eb7e971-dbd8-4772-8d91-0c16cb6c1ffd"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"superseded\",\n    \"note\": \"Replaced by a newer certificate\"\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/ssl-certificates//revoke","description":"<h3 id=\"when-to-use\">When to use</h3>\n<p>Permanently revoke an <strong>issued</strong> certificate.</p>\n<h3 id=\"reason-values-rfc-5280\">Reason values (RFC 5280)</h3>\n<ul>\n<li><code>unspecified</code></li>\n<li><code>keyCompromise</code></li>\n<li><code>caCompromise</code></li>\n<li><code>affiliationChanged</code></li>\n<li><code>superseded</code></li>\n<li><code>cessationOfOperation</code></li>\n<li><code>privilegeWithdrawn</code></li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — revocation queued; CRL / OCSP reflect this on next publish.</li>\n<li><code>422</code> — order not yet issued, or already revoked.</li>\n</ul>\n","urlObject":{"path":["api","certinext","v2","ssl-certificates","","revoke"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"65ec4451-56d7-45f3-ab73-b0b1eeecd2b9"}],"id":"c290592a-6b90-4d84-a0d5-51ba7e644cd5","description":"<p>Public SSL/TLS certificate lifecycle — DV, OV, EV, plus wildcard and UCC variants.</p>\n<p><strong>Typical flow:</strong> Create → Get DCV → Verify DCV → Submit CSR → Accept Agreement → Download Certificate.</p>\n<p>Use <strong>Cancel</strong> to withdraw before issuance and <strong>Revoke</strong> to invalidate an already-issued cert.</p>\n<p>The first request (Create Order) captures the <code></code> into the collection so every subsequent request uses it without editing.</p>\n","_postman_id":"c290592a-6b90-4d84-a0d5-51ba7e644cd5"},{"name":"Document Signer Certificates","item":[{"name":"1. Create Order (Natural Person)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const body = pm.response.json();","if (pm.response.code === 201 && body.orderId) {","    pm.collectionVariables.set('orderId', body.orderId);","    pm.collectionVariables.set('requestId', body.requestId || '');","    pm.test('Signature order created, orderId=' + body.orderId, () => pm.expect(body.orderId).to.be.a('string'));","    console.log('Next: run \"2. Upload Documents\" once the v2 endpoint lands (today still returns 501 — use v1 /emSignHub-API/SubmitDocument).');","} else {","    pm.test('Create FAILED: ' + (body.detail || body.title || JSON.stringify(body)), () => false);","}"],"id":"4e8a44b8-8915-4c5c-a0a0-bd3b11ecd5b6"}}],"id":"1b3e93ae-48f9-48b2-ab75-345c9ce54611","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"55e6e35d-092f-4d11-bff1-60b53c23680c"},{"key":"X-Product-Code","value":"{{productCodeDocSignerNp1Y}}","description":"<p>819=NP 1Y, 822=LP 1Y, 825=LE 1Y.</p>\n"}],"body":{"mode":"raw","raw":"{\n    \"subjectType\": \"natural-person\",\n    \"emailNotifications\": \"all\",\n    \"requestor\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane@example.com\",\n        \"phone\": \"+19481081094\",\n        \"designation\": \"Signer\"\n    },\n    \"subject\": {\n        \"givenName\": \"Jane\",\n        \"surname\": \"Doe\",\n        \"email\": \"jane@example.com\",\n        \"countryCode\": \"IN\"\n    },\n    \"subscription\": { \"validityYears\": 1, \"autoRenew\": false },\n    \"agreement\": {\n        \"signerName\": \"Jane Doe\",\n        \"signerIp\": \"10.24.108.199\",\n        \"signerPlace\": \"Bangalore\",\n        \"accepted\": true\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Creates a Document Signer order.</p>\n<h3 id=\"subjecttype-values\"><code>subjectType</code> values</h3>\n<ul>\n<li><code>natural-person</code> — individual signer</li>\n<li><code>legal-person</code> — employee signing on behalf of an org</li>\n<li><code>legal-entity</code> — the org itself</li>\n</ul>\n<h3 id=\"next\">Next</h3>\n<p>→ <strong>2. Upload Documents</strong> (currently pending, use v1 <code>/emSignHub-API/SubmitDocument</code> until v2 ships)</p>\n","urlObject":{"path":["api","certinext","v2","signature-certificates"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"1b3e93ae-48f9-48b2-ab75-345c9ce54611"},{"name":"Track Order","id":"9051e4a4-79d0-4145-b04e-de42cd4fe46c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates/","description":"<p>Returns the current state. Expected sequence: <code>pending-documents</code> → <code>pending-vetting</code> → <code>pending-csr</code> → <code>pending-agreement</code> → <code>issued</code>.</p>\n","urlObject":{"path":["api","certinext","v2","signature-certificates",""],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9051e4a4-79d0-4145-b04e-de42cd4fe46c"},{"name":"2. Upload Documents (pending v2 wiring)","id":"dab87546-9ace-472b-866b-02dda17742dc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "}],"body":{"mode":"formdata","formdata":[{"key":"identityProof","type":"file","description":"<p>PAN / Aadhaar / passport scan.</p>\n","value":null},{"key":"addressProof","type":"file","description":"<p>Utility bill, bank statement, etc.</p>\n","value":null}]},"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates//documents","description":"<p>Currently returns <code>501 Not Implemented</code>. Workaround until v2 multipart forwarder ships: use v1 <code>POST /emSignHub-API/SubmitDocument</code> with the same account credentials.</p>\n","urlObject":{"path":["api","certinext","v2","signature-certificates","","documents"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"dab87546-9ace-472b-866b-02dda17742dc"},{"name":"3. Submit CSR","id":"fc2152c6-5c88-44f0-bd05-fca7ac7a2384","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"csr\": \"-----BEGIN CERTIFICATE REQUEST-----\\n<paste-your-PEM-here>\\n-----END CERTIFICATE REQUEST-----\",\n    \"attested\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates//csr","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Attaches a PEM-encoded CSR to the Document Signer order so the CA can issue the certificate against it.</p>\n<h3 id=\"body\">Body</h3>\n<ul>\n<li><code>csr</code> — full PEM with <code>-----BEGIN CERTIFICATE REQUEST-----</code> / <code>-----END CERTIFICATE REQUEST-----</code> markers. Generate with <code>openssl req -new -newkey rsa:2048 -nodes -keyout key.pem -out csr.pem</code>.</li>\n<li><code>attested</code> — <code>true</code> only when the key was generated by an attested/HSM-backed module.</li>\n</ul>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — CSR accepted; order advances to <code>pending-agreement</code>.</li>\n<li><code>422</code> — CSR malformed or order not in a CSR-acceptable state.</li>\n</ul>\n<h3 id=\"next\">Next</h3>\n<p>→ <strong>4. Accept Agreement</strong></p>\n","urlObject":{"path":["api","certinext","v2","signature-certificates","","csr"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"fc2152c6-5c88-44f0-bd05-fca7ac7a2384"},{"name":"4. Accept Agreement","id":"202e1315-1270-40a1-b1c8-dfefa5ee9c8b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"agreement\": {\n        \"signerName\": \"Jane Doe\",\n        \"signerIp\": \"10.24.108.199\",\n        \"signerPlace\": \"Bangalore\",\n        \"accepted\": true\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates//agreement","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Records the Subscriber Agreement acceptance for the Document Signer order. Required before the CA will issue the certificate.</p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — recorded; order advances toward issuance.</li>\n<li><code>422</code> — order not in a state that accepts an agreement yet.</li>\n</ul>\n<h3 id=\"next\">Next</h3>\n<p>→ Poll <strong>Track Order</strong> until <code>status=issued</code>, then <strong>5. Download Certificate</strong></p>\n","urlObject":{"path":["api","certinext","v2","signature-certificates","","agreement"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"202e1315-1270-40a1-b1c8-dfefa5ee9c8b"},{"name":"Cancel Order","id":"99c19b26-ac06-43d2-8257-60f952d3d591","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{ \"reason\": \"No longer required\" }","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates//cancel","description":"<p>Withdraw a Document Signer order before issuance. Use <strong>Revoke</strong> after issuance.</p>\n","urlObject":{"path":["api","certinext","v2","signature-certificates","","cancel"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"99c19b26-ac06-43d2-8257-60f952d3d591"},{"name":"Revoke Certificate","id":"bae9b905-7c8d-44f5-865b-8db36eedd80a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"09882081-d6dd-4456-83c9-b1cdc0ba9fd5"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"keyCompromise\",\n    \"note\": \"Private key reported leaked\"\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates//revoke","description":"<h3 id=\"when-to-use\">When to use</h3>\n<p>Permanently revoke an <strong>issued</strong> Document Signer certificate. Revoked certs surface in CRL / OCSP on the next publication cycle.</p>\n<h3 id=\"reason-values-rfc-5280\">Reason values (RFC 5280)</h3>\n<p><code>unspecified</code>, <code>keyCompromise</code>, <code>affiliationChanged</code>, <code>superseded</code>, <code>cessationOfOperation</code>, <code>privilegeWithdrawn</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — revocation queued.</li>\n<li><code>422</code> — order not issued yet, or already revoked.</li>\n</ul>\n","urlObject":{"path":["api","certinext","v2","signature-certificates","","revoke"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bae9b905-7c8d-44f5-865b-8db36eedd80a"},{"name":"5. Download Certificate","id":"28e70d21-baac-4523-a720-f28431e40f0f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "},{"key":"Accept","value":"application/json"}],"url":"{{v2BaseURL}}/api/certinext/v2/signature-certificates//certificate","description":"<p>Download the issued signature certificate. JSON / PEM / DER via <code>Accept</code> header.</p>\n","urlObject":{"path":["api","certinext","v2","signature-certificates","","certificate"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"28e70d21-baac-4523-a720-f28431e40f0f"}],"id":"2e01710c-33b9-4ecd-8dd7-604739dfb839","description":"<p>Digital-signature certificates for <strong>Natural Person</strong> (individuals), <strong>Legal Person</strong> (employees), and <strong>Legal Entity</strong> (organizations).</p>\n<p><strong>Typical flow:</strong> Create → Upload Documents → Submit CSR → Accept Agreement → Download Certificate.</p>\n<p>Unlike SSL there is no DCV step — instead the CA vets uploaded identity documents.</p>\n","_postman_id":"2e01710c-33b9-4ecd-8dd7-604739dfb839"},{"name":"Private PKI Certificates","item":[{"name":"1. Create Order","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const body = pm.response.json();","if (pm.response.code === 201 && body.orderId) {","    pm.collectionVariables.set('orderId', body.orderId);","    pm.collectionVariables.set('requestId', body.requestId || '');","    pm.test('PKI order created, orderId=' + body.orderId, () => pm.expect(body.orderId).to.be.a('string'));","    console.log('Next: run \"2. Submit CSR\".');","} else {","    pm.test('Create FAILED: ' + (body.detail || body.title || JSON.stringify(body)), () => false);","}"],"id":"6e105734-b5cb-4136-93d5-6de942f72910"}}],"id":"0583dfec-5754-4ba2-ad4f-5269d2fb5879","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"35967bdb-8089-4e71-b562-be8b32fcef16"},{"key":"X-Product-Code","value":"{{productCodePkiIntranet}}","description":"<p>From your private catalog.</p>\n"}],"body":{"mode":"raw","raw":"{\n    \"variant\": \"intranet-ssl\",\n    \"caProfileId\": \"{{caProfileId}}\",\n    \"masterProductId\": \"{{masterProductId}}\",\n    \"hostname\": \"intranet.example.local\",\n    \"additionalHosts\": [\"portal.example.local\"],\n    \"emailNotifications\": \"all\",\n    \"subscription\": { \"validityYears\": 1 },\n    \"requestor\": {\n        \"name\": \"Ops Team\",\n        \"email\": \"ops@example.com\",\n        \"phone\": \"+19481081094\",\n        \"designation\": \"Infra\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/private-pki-certificates","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Creates an order against your own PKI CA.</p>\n<h3 id=\"required-fields\">Required fields</h3>\n<ul>\n<li><code>variant</code> — <code>intranet-ssl</code> or <code>igtf-host</code></li>\n<li><code>caProfileId</code> — CA template (set in portal)</li>\n<li><code>masterProductId</code> — subscription slot</li>\n<li><code>hostname</code> — primary CN</li>\n<li><code>additionalHosts[]</code> — SANs (DNS names or IPs)</li>\n</ul>\n<h3 id=\"next\">Next</h3>\n<p>→ <strong>2. Submit CSR</strong></p>\n","urlObject":{"path":["api","certinext","v2","private-pki-certificates"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0583dfec-5754-4ba2-ad4f-5269d2fb5879"},{"name":"Track Order","id":"f8b84179-c720-4f0e-8fdb-6f17dd05d070","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/private-pki-certificates/","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Returns the current state of a Private PKI order.</p>\n<h3 id=\"status-values\">Status values</h3>\n<p><code>pending-csr</code> → <code>issued</code> (or <code>cancelled</code> / <code>revoked</code>). Private PKI orders usually skip long vetting stages because the CA is customer-owned.</p>\n<p>Poll this between <strong>Submit CSR</strong> and <strong>Download Certificate</strong> to confirm issuance.</p>\n","urlObject":{"path":["api","certinext","v2","private-pki-certificates",""],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f8b84179-c720-4f0e-8fdb-6f17dd05d070"},{"name":"2. Submit CSR","id":"2d2c863e-4335-43dc-a1ed-f6810ba4473a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"csr\": \"-----BEGIN CERTIFICATE REQUEST-----\\n<paste-your-PEM-here>\\n-----END CERTIFICATE REQUEST-----\",\n    \"attested\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/private-pki-certificates//csr","description":"<p>Attach a PEM CSR. The customer CA signs immediately. <code>204 No Content</code> on success.</p>\n","urlObject":{"path":["api","certinext","v2","private-pki-certificates","","csr"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2d2c863e-4335-43dc-a1ed-f6810ba4473a"},{"name":"Cancel Order","id":"157b389d-f320-41d8-8829-f73825585aa1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{ \"reason\": \"No longer required\" }","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/private-pki-certificates//cancel","description":"<h3 id=\"when-to-use\">When to use</h3>\n<p>Withdraw a Private PKI order <strong>before</strong> issuance. After issuance, use <strong>Revoke Certificate</strong>.</p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — cancelled; order remains visible via <strong>Track Order</strong> with <code>status=cancelled</code>.</li>\n<li><code>422</code> — order already issued / revoked / cancelled.</li>\n</ul>\n","urlObject":{"path":["api","certinext","v2","private-pki-certificates","","cancel"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"157b389d-f320-41d8-8829-f73825585aa1"},{"name":"Revoke Certificate","id":"0c511f7d-8b3b-4d07-b515-4721b7cb0c47","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "},{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"9b090acf-1bce-47fd-a608-aae2eacc9829"}],"body":{"mode":"raw","raw":"{\n    \"reason\": \"superseded\",\n    \"note\": \"Replaced by newer cert\"\n}","options":{"raw":{"language":"json"}}},"url":"{{v2BaseURL}}/api/certinext/v2/private-pki-certificates//revoke","description":"<h3 id=\"when-to-use\">When to use</h3>\n<p>Permanently revoke an issued Private PKI certificate.</p>\n<h3 id=\"reason-values-rfc-5280\">Reason values (RFC 5280)</h3>\n<p><code>unspecified</code>, <code>keyCompromise</code>, <code>affiliationChanged</code>, <code>superseded</code>, <code>cessationOfOperation</code>, <code>privilegeWithdrawn</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><code>204 No Content</code> — revocation recorded on the customer CA.</li>\n<li><code>422</code> — order not issued yet, or already revoked.</li>\n</ul>\n","urlObject":{"path":["api","certinext","v2","private-pki-certificates","","revoke"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0c511f7d-8b3b-4d07-b515-4721b7cb0c47"},{"name":"3. Download Certificate","id":"fb75f24b-8892-4da5-945b-96135168ed99","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "},{"key":"Accept","value":"application/json"}],"url":"{{v2BaseURL}}/api/certinext/v2/private-pki-certificates//certificate","description":"<p>Download the issued Private PKI cert. JSON / PEM / DER via <code>Accept</code>.</p>\n","urlObject":{"path":["api","certinext","v2","private-pki-certificates","","certificate"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"fb75f24b-8892-4da5-945b-96135168ed99"}],"id":"28ea7a1c-47a4-45e4-8da0-32b253de21c9","description":"<p>Certificates issued from a <strong>customer-owned</strong> PKI CA — Intranet SSL and IGTF Host variants.</p>\n<p><strong>Typical flow:</strong> Create → Submit CSR → Download Certificate.</p>\n<p>No DCV (CA is yours) and no Subscriber Agreement.</p>\n","_postman_id":"28ea7a1c-47a4-45e4-8da0-32b253de21c9"},{"name":"Accounts","item":[{"name":"Who am I (from token)","id":"d3bd8ef6-0f0a-4510-bc1e-1e3e915e22aa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/auth/me","description":"<h3 id=\"what-it-does\">What it does</h3>\n<p>Returns the account context the Bearer token resolves to — <code>appCode</code>, internal <code>accountId</code>, <code>accountUserId</code>, <code>authType</code>.</p>\n<h3 id=\"when-to-call\">When to call</h3>\n<p>As a post-login sanity check, or to confirm the token you're about to use is still valid.</p>\n","urlObject":{"path":["api","certinext","v2","auth","me"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d3bd8ef6-0f0a-4510-bc1e-1e3e915e22aa"},{"name":"List Groups","id":"45fb8128-2f37-4aea-ae1c-86223e8b9f6f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/groups","description":"<p>Billing groups accessible to your account. Use a <code>groupNumber</code> from here in order bodies to charge a specific cost centre.</p>\n","urlObject":{"path":["api","certinext","v2","groups"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"45fb8128-2f37-4aea-ae1c-86223e8b9f6f"},{"name":"List Organizations","id":"46ff8a12-ec9e-435d-b276-4eff0eb64639","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/organizations","description":"<p>Pre-vetted organizations available for OV/EV SSL. Reference an <code>organizationNumber</code> in order bodies to skip re-vetting.</p>\n","urlObject":{"path":["api","certinext","v2","organizations"],"host":["{{v2BaseURL}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional — filter to a group.</p>\n","type":"text/plain"},"key":"groupNumber","value":""}],"variable":[]}},"response":[],"_postman_id":"46ff8a12-ec9e-435d-b276-4eff0eb64639"},{"name":"Get Organization","id":"7e49fb0f-ab56-4a72-bf52-9c97f6d01840","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/organizations/{{organizationNumber}}","description":"<p>Full details for a single organization: address, representatives, linked domains, agreement status.</p>\n","urlObject":{"path":["api","certinext","v2","organizations","{{organizationNumber}}"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"7e49fb0f-ab56-4a72-bf52-9c97f6d01840"},{"name":"List Domains","id":"147dcd5f-6ca9-437b-b526-fae90fd5fc25","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/domains","description":"<p>Domains already pre-validated under your account — DCV does not need to be repeated for these.</p>\n","urlObject":{"path":["api","certinext","v2","domains"],"host":["{{v2BaseURL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"147dcd5f-6ca9-437b-b526-fae90fd5fc25"}],"id":"4375aa7d-fa38-4fa4-959d-5cc4da1a4584","description":"<p>Cross-cutting reads — identity, billing groups, pre-vetted organizations, and registered domains. Call these <strong>before</strong> placing orders to discover your entitlements.</p>\n","_postman_id":"4375aa7d-fa38-4fa4-959d-5cc4da1a4584"},{"name":"Catalog","item":[{"name":"List Products","id":"89f1055c-be02-4d8d-9592-3c12bb8410ca","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/catalog/products","description":"<p>Returns every SSL / Document Signer / Private PKI product your account can order. Each entry has a stable <code>productCode</code> + <code>productType</code> + variant metadata.</p>\n","urlObject":{"path":["api","certinext","v2","catalog","products"],"host":["{{v2BaseURL}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional — scope to a billing group.</p>\n","type":"text/plain"},"key":"groupNumber","value":""}],"variable":[]}},"response":[],"_postman_id":"89f1055c-be02-4d8d-9592-3c12bb8410ca"},{"name":"Get Custom Fields for Product","id":"3f5c1802-c105-48f9-b237-a90ed81b6d3c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/catalog/products/{{productCodeSslDv}}/custom-fields","description":"<p>Returns mandatory + optional <code>customFields</code> for the given product. Include these in the <code>customFields[]</code> array on order creation.</p>\n","urlObject":{"path":["api","certinext","v2","catalog","products","{{productCodeSslDv}}","custom-fields"],"host":["{{v2BaseURL}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional — scope to an organization.</p>\n","type":"text/plain"},"key":"organizationNumber","value":"{{organizationNumber}}"}],"variable":[]}},"response":[],"_postman_id":"3f5c1802-c105-48f9-b237-a90ed81b6d3c"}],"id":"74deaa60-90de-4ab2-a01a-63c504f609fa","description":"<p>Products you are entitled to order + their custom-field definitions. Call <code>List Products</code> once per integration build and cache the <code>productCode</code> values — they are the source of truth for the <code>X-Product-Code</code> header.</p>\n","_postman_id":"74deaa60-90de-4ab2-a01a-63c504f609fa"},{"name":"Reports","item":[{"name":"Orders Report","id":"8707e240-f277-4780-9fd7-1041e6de33d6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/reports/orders?page=0&size=50","description":"<p>Paginated, filterable order history. <strong>Note:</strong> currently returns <code>501 Not Implemented</code>. Use v1 <code>POST /emSignHub-API/GetOrderReport</code> meanwhile.</p>\n","urlObject":{"path":["api","certinext","v2","reports","orders"],"host":["{{v2BaseURL}}"],"query":[{"disabled":true,"description":{"content":"<p>ssl | signature | private-pki</p>\n","type":"text/plain"},"key":"productType","value":"ssl"},{"disabled":true,"description":{"content":"<p>Filter by order status.</p>\n","type":"text/plain"},"key":"status","value":"issued"},{"disabled":true,"description":{"content":"<p>Start date (RFC 3339).</p>\n","type":"text/plain"},"key":"from","value":"2026-01-01T00:00:00Z"},{"disabled":true,"description":{"content":"<p>End date (RFC 3339).</p>\n","type":"text/plain"},"key":"to","value":"2026-04-24T23:59:59Z"},{"key":"page","value":"0"},{"key":"size","value":"50"}],"variable":[]}},"response":[],"_postman_id":"8707e240-f277-4780-9fd7-1041e6de33d6"},{"name":"Ledger Statement","id":"062d05e0-0a98-4309-a74b-0a13edeeb203","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"{{v2BaseURL}}/api/certinext/v2/reports/ledger?page=0&size=50","description":"<p>Debit / credit ledger movements for the account, with pagination. Pair with <code>groupNumber</code> to isolate a cost centre.</p>\n","urlObject":{"path":["api","certinext","v2","reports","ledger"],"host":["{{v2BaseURL}}"],"query":[{"disabled":true,"description":{"content":"<p>Optional — filter to a billing group.</p>\n","type":"text/plain"},"key":"groupNumber","value":""},{"key":"page","value":"0"},{"key":"size","value":"50"}],"variable":[]}},"response":[],"_postman_id":"062d05e0-0a98-4309-a74b-0a13edeeb203"}],"id":"9b659a27-344e-4920-9f48-aea74a95714b","description":"<p>Operational + financial reports.</p>\n","_postman_id":"9b659a27-344e-4920-9f48-aea74a95714b"},{"name":"Reference","item":[{"name":"Error Codes","id":"2b03b4a9-2b51-4fce-8765-2feb17cdd04d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"about:reference/error-codes","description":"<h2 id=\"certinext-api-v2--error-codes\">CERTInext API v2 — Error Codes</h2>\n<p>Every error response follows <strong>RFC 7807</strong> and carries an <code>EMS-xxxx</code> code in <code>detail</code>. Use this table to diagnose failures quickly.</p>\n<h3 id=\"authentication-oauthtoken\">Authentication (<code>/oauth/token</code>)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>HTTP</th>\n<th>Meaning</th>\n<th>Fix</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>EMS-2006</code></td>\n<td>401</td>\n<td>Invalid access key</td>\n<td>Regenerate in portal → Integration → REST APIs</td>\n</tr>\n<tr>\n<td><code>EMS-2007</code></td>\n<td>422</td>\n<td>No active API access key provisioned</td>\n<td>Activate a key under the account</td>\n</tr>\n<tr>\n<td><code>EMS-2022</code></td>\n<td>403</td>\n<td>OAuth2 not enabled for this client</td>\n<td>Ask an admin to enable OAuth2 auth_type</td>\n</tr>\n<tr>\n<td><code>EMS-2028</code></td>\n<td>400</td>\n<td>Missing required meta (grant_type / ts / txn / accountNumber / authKey)</td>\n<td>Populate the token body with all required fields</td>\n</tr>\n<tr>\n<td><code>EMS-2036</code></td>\n<td>401</td>\n<td>App code not found</td>\n<td>Check <code>appCode</code> env variable</td>\n</tr>\n<tr>\n<td><code>EMS-2037</code></td>\n<td>401</td>\n<td>Access key mismatch (SHA256 hash doesn't match)</td>\n<td>Re-hash; make sure <code>ts</code> matches what you send</td>\n</tr>\n<tr>\n<td><code>EMS-2038</code></td>\n<td>401</td>\n<td>Refresh token expired/revoked</td>\n<td>Call <code>Get Bearer Token</code> to re-authenticate</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"order-creation-post-product-certificates\">Order creation (<code>POST /{product}-certificates</code>)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>HTTP</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>EMS-915</code></td>\n<td>422</td>\n<td>Invalid / unknown product code</td>\n</tr>\n<tr>\n<td><code>EMS-916</code></td>\n<td>422</td>\n<td>Requestor info missing</td>\n</tr>\n<tr>\n<td><code>EMS-917</code></td>\n<td>422</td>\n<td>Certificate info missing</td>\n</tr>\n<tr>\n<td><code>EMS-918</code></td>\n<td>422</td>\n<td>Additional information missing</td>\n</tr>\n<tr>\n<td><code>EMS-919</code></td>\n<td>422</td>\n<td>Subscription info missing</td>\n</tr>\n<tr>\n<td><code>EMS-920</code></td>\n<td>422</td>\n<td>Agreement not accepted</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"order-lifecycle-dcv--csr--agreement--cancel--revoke\">Order lifecycle (DCV / CSR / Agreement / Cancel / Revoke)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>HTTP</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>EMS-1157</code></td>\n<td>422</td>\n<td>Domain name cannot be empty (pass <code>?domain=</code> on <code>GET /dcv</code>)</td>\n</tr>\n<tr>\n<td><code>EMS-1158</code></td>\n<td>422</td>\n<td>Invalid DCV method</td>\n</tr>\n<tr>\n<td><code>EMS-1160</code></td>\n<td>422</td>\n<td>DCV challenge not found at expected location</td>\n</tr>\n<tr>\n<td><code>EMS-921</code></td>\n<td>422</td>\n<td>CSR format invalid</td>\n</tr>\n<tr>\n<td><code>EMS-922</code></td>\n<td>422</td>\n<td>CSR subject doesn't match order</td>\n</tr>\n<tr>\n<td><code>EMS-930</code></td>\n<td>422</td>\n<td>Order not in cancellable state</td>\n</tr>\n<tr>\n<td><code>EMS-931</code></td>\n<td>422</td>\n<td>Order not issued (revoke unavailable)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"transport--content-negotiation-rfc-7807\">Transport / content negotiation (RFC 7807)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP</th>\n<th>Condition</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400</code></td>\n<td>Body malformed, required header/param missing, field validation failed (see <code>errors[]</code>)</td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Missing or invalid Bearer token</td>\n</tr>\n<tr>\n<td><code>403</code></td>\n<td>Caller lacks permission</td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td>Resource or handler doesn't exist</td>\n</tr>\n<tr>\n<td><code>405</code></td>\n<td>Method not supported on resource (<code>Allow</code> header lists supported methods)</td>\n</tr>\n<tr>\n<td><code>406</code></td>\n<td>Accept header can't be satisfied</td>\n</tr>\n<tr>\n<td><code>409</code></td>\n<td>Idempotency-Key conflict (same key, different body)</td>\n</tr>\n<tr>\n<td><code>415</code></td>\n<td>Content-Type not supported</td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Body parsed but failed business validation</td>\n</tr>\n<tr>\n<td><code>429</code></td>\n<td>Too many requests (<code>Retry-After</code> header)</td>\n</tr>\n<tr>\n<td><code>500</code></td>\n<td>Internal error</td>\n</tr>\n<tr>\n<td><code>501</code></td>\n<td>Endpoint exists but not yet wired in v2 — fallback to v1 handler mentioned in the response</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"response-body-shape\">Response body shape</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"type\": \"https://api.certinext.io/errors/&lt;slug&gt;\",\n  \"title\": \"Human-readable title\",\n  \"status\": 422,\n  \"detail\": \"[EMS-918] Additional information cannot be empty\",\n  \"instance\": \"/api/certinext/v2/ssl-certificates\",\n  \"errors\": [\n    { \"field\": \"certificate.domain\", \"message\": \"must not be blank\" }\n  ]\n}\n</code></pre>\n","urlObject":{"port":"reference","path":["error-codes"],"host":["about"],"query":[],"variable":[]}},"response":[],"_postman_id":"2b03b4a9-2b51-4fce-8765-2feb17cdd04d"},{"name":"Product Codes","id":"0c4e801f-6a96-40ec-a7f9-fdd40b766e77","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"about:reference/product-codes","description":"<h2 id=\"product-codes\">Product Codes</h2>\n<p>The numeric <code>productCode</code> goes in the <code>X-Product-Code</code> header on every order-create request. The canonical source is <strong>Catalog → List Products</strong> — these values match most environments but are authoritative only in the catalog response.</p>\n<h3 id=\"ssl--tls\">SSL / TLS</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Product</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>842</code></td>\n<td>SSL DV</td>\n</tr>\n<tr>\n<td><code>843</code></td>\n<td>SSL DV Wildcard</td>\n</tr>\n<tr>\n<td><code>844</code></td>\n<td>SSL DV UCC</td>\n</tr>\n<tr>\n<td><code>845</code></td>\n<td>SSL DV Wildcard UCC</td>\n</tr>\n<tr>\n<td><code>846</code></td>\n<td>SSL OV</td>\n</tr>\n<tr>\n<td><code>847</code></td>\n<td>SSL OV Wildcard</td>\n</tr>\n<tr>\n<td><code>848</code></td>\n<td>SSL OV UCC</td>\n</tr>\n<tr>\n<td><code>849</code></td>\n<td>SSL OV Wildcard UCC</td>\n</tr>\n<tr>\n<td><code>850</code></td>\n<td>SSL EV</td>\n</tr>\n<tr>\n<td><code>851</code></td>\n<td>SSL EV UCC</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"document-signer\">Document Signer</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Product</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>819</code></td>\n<td>Document Signer — Natural Person, 1 year</td>\n</tr>\n<tr>\n<td><code>820</code></td>\n<td>Document Signer — Natural Person, 2 year</td>\n</tr>\n<tr>\n<td><code>821</code></td>\n<td>Document Signer — Natural Person, 3 year</td>\n</tr>\n<tr>\n<td><code>822</code></td>\n<td>Document Signer — Legal Person, 1 year</td>\n</tr>\n<tr>\n<td><code>823</code></td>\n<td>Document Signer — Legal Person, 2 year</td>\n</tr>\n<tr>\n<td><code>824</code></td>\n<td>Document Signer — Legal Person, 3 year</td>\n</tr>\n<tr>\n<td><code>825</code></td>\n<td>Document Signer — Legal Entity, 1 year</td>\n</tr>\n<tr>\n<td><code>826</code></td>\n<td>Document Signer — Legal Entity, 2 year</td>\n</tr>\n<tr>\n<td><code>827</code></td>\n<td>Document Signer — Legal Entity, 3 year</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"private-pki\">Private PKI</h3>\n<p>Private PKI product codes vary per customer catalog. Query <strong>Catalog → List Products</strong> with your token; the entries with <code>productType=private-pki</code> will list the codes available to your account.</p>\n<h3 id=\"environment-variables\">Environment variables</h3>\n<p>The environment files expose these as <code>{{productCodeSslDv}}</code>, <code>{{productCodeDocSignerNp1Y}}</code>, etc. — the requests in the lifecycle folders already reference them so you don't have to edit headers.</p>\n","urlObject":{"port":"reference","path":["product-codes"],"host":["about"],"query":[],"variable":[]}},"response":[],"_postman_id":"0c4e801f-6a96-40ec-a7f9-fdd40b766e77"},{"name":"Country Codes","id":"9fe4fe24-be69-4ea1-b6dd-fb4563092261","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"about:reference/country-codes","description":"<h2 id=\"country-codes\">Country Codes</h2>\n<p>All <code>countryCode</code> fields in request bodies use <strong>ISO 3166-1 alpha-2</strong> (two-letter uppercase). Common values:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Country</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>AE</code></td>\n<td>United Arab Emirates</td>\n</tr>\n<tr>\n<td><code>AU</code></td>\n<td>Australia</td>\n</tr>\n<tr>\n<td><code>BH</code></td>\n<td>Bahrain</td>\n</tr>\n<tr>\n<td><code>BR</code></td>\n<td>Brazil</td>\n</tr>\n<tr>\n<td><code>CA</code></td>\n<td>Canada</td>\n</tr>\n<tr>\n<td><code>CH</code></td>\n<td>Switzerland</td>\n</tr>\n<tr>\n<td><code>CN</code></td>\n<td>China</td>\n</tr>\n<tr>\n<td><code>DE</code></td>\n<td>Germany</td>\n</tr>\n<tr>\n<td><code>EG</code></td>\n<td>Egypt</td>\n</tr>\n<tr>\n<td><code>ES</code></td>\n<td>Spain</td>\n</tr>\n<tr>\n<td><code>FR</code></td>\n<td>France</td>\n</tr>\n<tr>\n<td><code>GB</code></td>\n<td>United Kingdom</td>\n</tr>\n<tr>\n<td><code>HK</code></td>\n<td>Hong Kong</td>\n</tr>\n<tr>\n<td><code>IN</code></td>\n<td>India</td>\n</tr>\n<tr>\n<td><code>IT</code></td>\n<td>Italy</td>\n</tr>\n<tr>\n<td><code>JP</code></td>\n<td>Japan</td>\n</tr>\n<tr>\n<td><code>KE</code></td>\n<td>Kenya</td>\n</tr>\n<tr>\n<td><code>KR</code></td>\n<td>South Korea</td>\n</tr>\n<tr>\n<td><code>KW</code></td>\n<td>Kuwait</td>\n</tr>\n<tr>\n<td><code>LK</code></td>\n<td>Sri Lanka</td>\n</tr>\n<tr>\n<td><code>MX</code></td>\n<td>Mexico</td>\n</tr>\n<tr>\n<td><code>MY</code></td>\n<td>Malaysia</td>\n</tr>\n<tr>\n<td><code>NG</code></td>\n<td>Nigeria</td>\n</tr>\n<tr>\n<td><code>NL</code></td>\n<td>Netherlands</td>\n</tr>\n<tr>\n<td><code>NO</code></td>\n<td>Norway</td>\n</tr>\n<tr>\n<td><code>NZ</code></td>\n<td>New Zealand</td>\n</tr>\n<tr>\n<td><code>OM</code></td>\n<td>Oman</td>\n</tr>\n<tr>\n<td><code>PH</code></td>\n<td>Philippines</td>\n</tr>\n<tr>\n<td><code>QA</code></td>\n<td>Qatar</td>\n</tr>\n<tr>\n<td><code>SA</code></td>\n<td>Saudi Arabia</td>\n</tr>\n<tr>\n<td><code>SE</code></td>\n<td>Sweden</td>\n</tr>\n<tr>\n<td><code>SG</code></td>\n<td>Singapore</td>\n</tr>\n<tr>\n<td><code>TH</code></td>\n<td>Thailand</td>\n</tr>\n<tr>\n<td><code>TR</code></td>\n<td>Turkey</td>\n</tr>\n<tr>\n<td><code>US</code></td>\n<td>United States</td>\n</tr>\n<tr>\n<td><code>VN</code></td>\n<td>Vietnam</td>\n</tr>\n<tr>\n<td><code>ZA</code></td>\n<td>South Africa</td>\n</tr>\n</tbody>\n</table>\n</div><p>The full ISO 3166-1 alpha-2 list: <a href=\"https://www.iso.org/obp/ui/#search\">https://www.iso.org/obp/ui/#search</a></p>\n","urlObject":{"port":"reference","path":["country-codes"],"host":["about"],"query":[],"variable":[]}},"response":[],"_postman_id":"9fe4fe24-be69-4ea1-b6dd-fb4563092261"},{"name":"Migration Guide — v1 → v2","id":"576d3717-081a-4fff-ab1b-e536f94e455a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"about:reference/migration-v1-to-v2","description":"<h2 id=\"migrating-from-v1-emsignhub-api-to-v2-apicertinextv2\">Migrating from v1 (<code>/emSignHub-API/*</code>) to v2 (<code>/api/certinext/v2/*</code>)</h2>\n<p>The v1 endpoints remain live — v2 is additive. Every v1 response now carries <code>Deprecation: true</code> and <code>Link: rel=\"successor-version\"</code> headers pointing at its v2 equivalent.</p>\n<h3 id=\"1-auth-changes\">1. Auth changes</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>v1</th>\n<th>v2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Body contains <code>meta { ver, ts, txn, accountNumber, authKey }</code></td>\n<td>Body carries business fields only</td>\n</tr>\n<tr>\n<td><code>authKey = SHA256(accessKey + ts + txn)</code> on <strong>every</strong> call</td>\n<td><code>authKey</code> only on <code>POST /oauth/token</code>; every other call uses <code>Authorization: Bearer &lt;jwt&gt;</code></td>\n</tr>\n<tr>\n<td>No token; credentials re-hashed per request</td>\n<td>Short-lived JWT (1 hour); refresh via <code>grant_type=refresh_token</code></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"2-endpoint-map\">2. Endpoint map</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>v1 RPC</th>\n<th>v2 REST</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>POST /GenerateOrderSSL</code></td>\n<td><code>POST /api/certinext/v2/ssl-certificates</code></td>\n</tr>\n<tr>\n<td><code>POST /GenerateOrderSignature</code></td>\n<td><code>POST /api/certinext/v2/signature-certificates</code></td>\n</tr>\n<tr>\n<td><code>POST /GenerateOrderPrivatePKI</code></td>\n<td><code>POST /api/certinext/v2/private-pki-certificates</code></td>\n</tr>\n<tr>\n<td><code>POST /TrackOrder</code></td>\n<td><code>GET /{product}-certificates/{orderId}</code></td>\n</tr>\n<tr>\n<td><code>POST /GetDcv</code></td>\n<td><code>GET /ssl-certificates/{orderId}/dcv?domain=…</code></td>\n</tr>\n<tr>\n<td><code>POST /VerifyDcv</code></td>\n<td><code>POST /ssl-certificates/{orderId}/dcv/verify</code></td>\n</tr>\n<tr>\n<td><code>POST /SubmitCSR</code></td>\n<td><code>PUT /{product}-certificates/{orderId}/csr</code></td>\n</tr>\n<tr>\n<td><code>POST /SubmitDocument</code></td>\n<td><code>POST /signature-certificates/{orderId}/documents</code> (<em>pending — keep using v1 until wired</em>)</td>\n</tr>\n<tr>\n<td><code>POST /AgreementAcceptance</code></td>\n<td><code>POST /{product}-certificates/{orderId}/agreement</code></td>\n</tr>\n<tr>\n<td><code>POST /RejectOrder</code></td>\n<td><code>POST /{product}-certificates/{orderId}/cancel</code></td>\n</tr>\n<tr>\n<td><code>POST /RejectRequest</code></td>\n<td><code>POST /ssl-certificates/requests/{requestId}/cancel</code></td>\n</tr>\n<tr>\n<td><code>POST /GetCertificate</code></td>\n<td><code>GET /{product}-certificates/{orderId}/certificate</code></td>\n</tr>\n<tr>\n<td><code>POST /RevokeOrder</code></td>\n<td><code>POST /{product}-certificates/{orderId}/revoke</code></td>\n</tr>\n<tr>\n<td><code>POST /ValidateCredentials</code></td>\n<td><code>GET /auth/me</code></td>\n</tr>\n<tr>\n<td><code>POST /GetGroupDetails</code> + <code>GetGroupDetailsV2</code></td>\n<td><code>GET /groups</code></td>\n</tr>\n<tr>\n<td><code>POST /GetOrganizationDetails</code></td>\n<td><code>GET /organizations[/{orgNumber}]</code></td>\n</tr>\n<tr>\n<td><code>POST /GetDomainDetails</code></td>\n<td><code>GET /domains</code></td>\n</tr>\n<tr>\n<td><code>POST /GetProductDetails</code></td>\n<td><code>GET /catalog/products</code></td>\n</tr>\n<tr>\n<td><code>POST /GetFieldDetails</code></td>\n<td><code>GET /catalog/products/{code}/custom-fields</code></td>\n</tr>\n<tr>\n<td><code>POST /GetLedgerStatementDetails</code></td>\n<td><code>GET /reports/ledger</code></td>\n</tr>\n<tr>\n<td><code>POST /GetOrderReport</code></td>\n<td><code>GET /reports/orders</code> (<em>pending — keep using v1 until wired</em>)</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"3-shape-changes\">3. Shape changes</h3>\n<ul>\n<li><strong>No <code>meta</code> envelope.</strong> Requests carry business fields at the top level. Successful responses return the resource directly, not wrapped.</li>\n<li><strong>Types:</strong> booleans are real <code>true</code>/<code>false</code> (v1 used <code>\"0\"</code>/<code>\"1\"</code>). Enums are lowercase-hyphenated (<code>dv</code>, <code>natural-person</code>, <code>intranet-ssl</code>). Product code is a header (<code>X-Product-Code</code>), not a body field.</li>\n<li><strong>Phone numbers</strong> are <strong>E.164</strong> single field (<code>+919481081094</code>) — no more <code>isdCode</code>/<code>mobileNumber</code> split.</li>\n<li><strong>IDs</strong> are opaque strings — do not parse.</li>\n<li><strong>Errors</strong> are <strong>RFC 7807</strong> <code>application/problem+json</code> with <code>type</code>, <code>title</code>, <code>status</code>, <code>detail</code>, <code>instance</code>, <code>code</code>, <code>errors[]</code>.</li>\n<li><strong>Pagination</strong> uses <code>?page=0&amp;size=50</code>.</li>\n</ul>\n<h3 id=\"4-idempotency\">4. Idempotency</h3>\n<p>Every unsafe <code>POST</code> accepts an <code>Idempotency-Key</code> header. Re-sending the same key with the same body returns the original response. Different body with the same key returns <code>409 Conflict</code> with <code>code=idempotency_conflict</code>.</p>\n<h3 id=\"5-migration-checklist\">5. Migration checklist</h3>\n<ol>\n<li>Replace the hash-per-request loop with a single <code>POST /oauth/token</code> call at session start.</li>\n<li>Strip the <code>meta</code> envelope out of every request body.</li>\n<li>Rewrite URLs from <code>/emSignHub-API/&lt;Verb&gt;</code> to <code>/api/certinext/v2/&lt;resource&gt;/&lt;id&gt;/&lt;sub&gt;</code>.</li>\n<li>Convert <code>\"0\"</code>/<code>\"1\"</code> booleans to <code>true</code>/<code>false</code> and numeric product codes to the <code>X-Product-Code</code> header.</li>\n<li>Handle RFC 7807 error shape instead of parsing <code>meta.errorCode</code> / <code>meta.errorMessage</code>.</li>\n<li>Add an <code>Idempotency-Key</code> per logical retry.</li>\n<li>Start using the <code>_links</code> map in responses to drive the next lifecycle step.</li>\n</ol>\n","urlObject":{"port":"reference","path":["migration-v1-to-v2"],"host":["about"],"query":[],"variable":[]}},"response":[],"_postman_id":"576d3717-081a-4fff-ab1b-e536f94e455a"}],"id":"671fcd9f-adaa-4fcf-97fb-090593339a35","description":"<p>Read-only reference material. The requests in this folder are not real HTTP calls — they're stubs that exist to anchor the detailed tables in their descriptions. Open any item to see the reference content.</p>\n","_postman_id":"671fcd9f-adaa-4fcf-97fb-090593339a35"}],"variable":[{"key":"accessToken","value":""},{"key":"refreshToken","value":""},{"key":"orderId","value":""},{"key":"requestId","value":""}]}