> ## Documentation Index
> Fetch the complete documentation index at: https://docs.instantcompliance.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a client's verification certificate

> Ensure a current verification certificate exists for a verified
individual and return a 10-minute download link to its one-page PDF.
Reuses the latest certificate unless what it shows has changed;
otherwise issues a new one (201). Repeat calls are safe and return a freshly
signed link. `Idempotency-Key` is ignored on this route.

Requires the `certificates:write` scope. Individuals and sole traders
only.


Returns a link to the client's Verification Certificate: a one-page PDF
showing that the client is verified, and the result of each check. Use it to
file the certificate automatically, for example to Google Drive. Your team's
full audit record stays in the app (**Download Certificate**).

## What you get

* **201** when this call issued a new certificate, **200** when the latest one
  is still current. Calling again is always safe.
* `download_url` works for **10 minutes** and needs no login: treat it like a
  password until it expires. Each call signs a fresh link.
* `filename` is unique per certificate — use it to avoid filing the same
  certificate twice.

## When it isn't available

| `details.reason` | Meaning |
| - | - |
| `not_verified` | The client hasn't finished verification, a step is still open, a check hasn't passed or been completed, or enhanced due diligence is outstanding. Try again later. |
| `not_available` | Check the client in Instant Compliance. |

A reviewed PEP or adverse-media match does not stop the certificate: it reads
**Match found — reviewed by the firm**. What the certificate contains is listed
under [Data minimisation](/concepts/data-minimisation#verification-certificate).

Use `details.reason` to decide when to retry. Don't pass it on to the
client: whether and how a client is told about their verification is your
compliance team's call.


## OpenAPI

````yaml POST /customers/{id}/certificate
openapi: 3.1.0
info:
  title: Instant Compliance API
  version: 1.0.0
  summary: External integration API for Instant Compliance.
  description: |
    The Instant Compliance v1 API lets your systems push customers into
    Instant Compliance and pull their verification / AML status back out.
    Designed for server-to-server use (CRMs, Zapier, internal back-office
    tools).

    **Base URL:** `https://app.instantcompliance.ai/api/v1`

    **Authentication:** Bearer API key — `Authorization: Bearer ic_live_…`
    Issue keys from **Settings → Developers** in your Instant Compliance
    organisation.

    **Scope:** individual customers (`INDIVIDUAL` and `SOLE_TRADER`, KYC)
    live on `/customers`; entity customers (companies, trusts,
    partnerships, SMSFs — KYB) live on `/entities`.
  contact:
    name: Instant Compliance Support
    email: support@instantcompliance.ai
    url: https://instantcompliance.ai
  license:
    name: Proprietary
servers:
  - url: https://app.instantcompliance.ai/api/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Customers
    description: |
      Create, read, and update individual customer records ingested through
      the external API.
  - name: Entities
    description: |
      Create, read, and update entity customer records (companies, trusts,
      partnerships, SMSFs). Entities verify via KYB instead of KYC; the API
      ingests the record and reports status — verification is started by
      your back-office team in-app.
  - name: Designated services
    description: |
      Read-only catalog of the designated-service codes accepted when
      creating customers.
  - name: Groups
    description: |
      Create group workspaces (multi-party deals/matters — e.g. one per
      property for real-estate integrators) and discover the group
      templates available to your organisation. Requires the Groups
      feature to be enabled for your organisation.
paths:
  /customers/{id}/certificate:
    parameters:
      - in: path
        name: id
        required: true
        schema:
          type: string
        description: |
          Customer identifier. Accepts either Instant Compliance's UUID or your
          own `external_id`.
    post:
      tags:
        - Customers
      summary: Get a client's verification certificate
      description: >
        Ensure a current verification certificate exists for a verified

        individual and return a 10-minute download link to its one-page PDF.

        Reuses the latest certificate unless what it shows has changed;

        otherwise issues a new one (201). Repeat calls are safe and return a
        freshly

        signed link. `Idempotency-Key` is ignored on this route.


        Requires the `certificates:write` scope. Individuals and sole traders

        only.
      operationId: ensureCustomerCertificate
      responses:
        '200':
          description: An existing, still-current certificate.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerCertificate'
        '201':
          description: A certificate issued by this call.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerCertificate'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ForbiddenScope'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: >
            Not available for this client right now. `error.details.reason` is

            `not_verified` (verification not complete, a step still open, a
            check

            not passed or not completed, or enhanced due diligence outstanding —

            try again later) or `not_available` (check the client in Instant

            Compliance).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          $ref: '#/components/responses/RateLimited'
      security:
        - bearerAuth: []
components:
  schemas:
    CustomerCertificate:
      type: object
      required:
        - certificate_id
        - created
        - issued_at
        - outcome
        - verification_url
        - download_url
        - download_url_expires_at
        - filename
        - content_type
      properties:
        certificate_id:
          type: string
          example: IC-7F3K-9QP2
          description: Public certificate code.
        created:
          type: boolean
          description: True when this call issued the certificate.
        issued_at:
          type: string
          format: date-time
        outcome:
          type: string
          enum:
            - VERIFIED
        verification_url:
          type: string
          format: uri
          description: Public page confirming the certificate is genuine.
        download_url:
          type: string
          format: uri
          description: >-
            Download link for the PDF. Expires after 10 minutes; anyone holding
            it can download until then.
        download_url_expires_at:
          type: string
          format: date-time
        filename:
          type: string
          example: verification-certificate-jane-citizen-IC-7F3K-9QP2.pdf
          description: Suggested file name; unique per certificate.
        content_type:
          type: string
          enum:
            - application/pdf
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              enum:
                - unauthorized
                - forbidden_scope
                - not_found
                - validation_failed
                - conflict
                - insufficient_credits
                - rate_limited
                - idempotency_conflict
                - feature_disabled
                - internal
            message:
              type: string
            details:
              type: object
              additionalProperties: true
  responses:
    Unauthorized:
      description: Missing, invalid, expired, or revoked API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: unauthorized
              message: Invalid or revoked API key.
    ForbiddenScope:
      description: API key lacks the required scope.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: forbidden_scope
              message: This API key does not have the required scope. customers:write
              details:
                required_scope: customers:write
    NotFound:
      description: No customer matching the supplied id in this organisation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: not_found
              message: Customer not found.
    RateLimited:
      description: Burst or daily rate limit exceeded for this API key.
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds to wait before retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: rate_limited
              message: Rate limit exceeded. Slow down and retry shortly.
              details:
                limit: 60
                window_seconds: 60
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: |
        Bearer API key issued from **Settings → Developers** in your
        Instant Compliance organisation. Format: `ic_live_…`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.