Clment Conversion API

Standalone document conversion utilities (not tied to a contract). PDF-to-Word conversion is high-fidelity — layout, tables, and styles are preserved.

GitHub OpenAPI

Operations 2

POST /convert/pdf-to-word Convert a PDF (file) to Word #
POST /convert/pdf-url-to-word Convert a PDF (from URL) to Word #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/clment-com:clment-com-conversion-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

clment-com-conversion-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Clment REST Conversion API
  version: 1.0.0
  termsOfService: https://clment.com/terms-of-service
  contact:
    name: Clment developer support
    url: https://clment.com/developers
  description: 'The Clment REST API gives your services programmatic access to the

    same contract workspace you use in the app — contracts, AI reviews,

    rulebooks, key dates, and search. ## Authentication


    Every request carries a bearer token in the `Authorization` header:


    ```

    Authorization: Bearer clm_REDACTED_STRIPE_KEY

    ```


    Generate a key in the app under **Settings → API & Integrations →

    API keys**. The secret is shown **once** at creation — store it in a

    secret manager. A key is scoped to the organization it was created

    in and inherits that workspace''s data residency region. ## What a key can and can''t do


    An API key can read and write everything a member can in the app:

    upload contracts, run reviews, edit rulebooks, manage key dates,

    search. It **cannot** touch settings — billing, members, SSO,

    integrations, organization config, or webhook subscriptions. Those

    require a human admin signed in to the app. ## Regions & base URL


    Use your organization''s home region''s base URL. A key only works

    against the region it belongs to — calling another region returns

    401. (This is the same list as the **Servers** dropdown above; both

    are generated from our live region catalog.)


    | Region | Base URL |

    |----------------|--------------------------------|

    | United States | `https://api-us.clment.com/v1` |

    | European Union | `https://api-eu.clment.com/v1` |

    | Australia | `https://api-au.clment.com/v1` |

    | New Zealand | `https://api-nz.clment.com/v1` |

    | United Kingdom | `https://api-uk.clment.com/v1` |

    | Canada | `https://api-ca.clment.com/v1` |


    ## Response envelope


    Successful responses wrap their payload in a `data` object:


    ```json

    { "data": { "contract": { "id": "…" } } }

    ```


    Errors return an `error` object with a stable machine-readable

    `code` and a human `message`:


    ```json

    { "error": { "code": "NOT_FOUND", "message": "Contract not found" } }

    ```


    ## Pagination


    List endpoints page with `skip` and `take` (max 100). The response

    carries the page plus a `total` count so you can compute whether

    more pages remain. ## Long-running operations (jobs)


    Uploads, reviews, and redlines run as background jobs. The kick-off

    endpoint returns a **job id** immediately; poll the matching job

    endpoint until it reports `complete`, then fetch the result. | Action | Start | Poll | Result |

    |--------|-------|------|--------|

    | Upload | `POST /contracts/upload` | `GET /contracts/upload/jobs/{jobId}` | `GET /contracts/{id}` |

    | Review | `POST /contracts/{id}/review` | `GET /jobs/review/{id}` | `GET /reviews/{reviewId}` |

    | Redline | `POST /contracts/{id}/generate-redline` | `GET /jobs/redline/{id}` | `GET /contracts/download/{token}` |


    An API key always gets the job id back as JSON — the live

    Server-Sent Events variant of the review and redline start

    endpoints belongs to first-party app sessions. Polling is the

    right shape for a server-to-server integration anyway: simpler

    than holding a stream open, and it survives the process that

    started the job going away. ## Rate limits & credits


    Two independent limits apply:


    - **Credits.** AI operations (reviews, redlines, conversions) consume

    credits from your plan''s monthly allowance, then any credit packs. Read operations are free. A `402 INSUFFICIENT_CREDITS` indicates an

    exhausted balance. - **Request rate.** Requests are rate-limited per organization on a

    rolling hourly window sized to your plan. Every AUTHENTICATED

    response carries `X-RateLimit-Limit` and `X-RateLimit-Remaining`

    (the limiter is per-organization, so it runs only once the key has

    resolved to one — a 401 carries neither); exceed the window

    and you get a `429 RATE_LIMITED` with a `Retry-After` header (in

    seconds) — back off for that long, then retry. ## Plan & access


    The API is available on the **Business** and **Enterprise** plans. A

    call from an org without API access returns `403 API_ACCESS_NOT_IN_PLAN`;

    a call from an org whose subscription has lapsed returns

    `403 SUBSCRIPTION_SUSPENDED`.'
servers:
- url: https://api-us.clment.com/v1
  description: United States
- url: https://api-eu.clment.com/v1
  description: European Union
- url: https://api-au.clment.com/v1
  description: Australia
- url: https://api-nz.clment.com/v1
  description: New Zealand
- url: https://api-uk.clment.com/v1
  description: United Kingdom
- url: https://api-ca.clment.com/v1
  description: Canada
security:
- bearerAuth: []
tags:
- name: Conversion
  description: Standalone document conversion utilities (not tied to a contract). PDF-to-Word conversion is high-fidelity — layout, tables, and styles are preserved.
paths:
  /convert/pdf-to-word:
    post:
      tags:
      - Conversion
      operationId: convertPdfToWord
      summary: Convert a PDF (file) to Word
      description: 'Convert an uploaded PDF to a Word (.docx) document — a one-off

        conversion that does **not** create a contract or version.

        Conversion produces a high-fidelity `.docx`, preserving

        layout, tables, and styles.

        Upload the bytes as `multipart/form-data` (field `file`,

        **≤ 100 MB** — the same cap as contract uploads).


        Returns a short-lived `downloadToken`; fetch the DOCX with

        `GET /contracts/download/{downloadToken}` (bearer-authenticated).

        Charged per 50-page block (5 credits per block); re-converting

        identical bytes is free (cached).


        The URL-based twin (`POST /convert/pdf-url-to-word`) is handy

        when the PDF already lives at a reachable address.'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
              - file
              properties:
                file:
                  type: string
                  format: binary
                  description: The PDF to convert (≤ 100 MB).
                filename:
                  type: string
                  maxLength: 200
                  description: Optional name for the resulting DOCX. Defaults to the upload's name with a .docx extension.
      responses:
        '200':
          description: Conversion complete; download with the token.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      downloadToken:
                        type: string
                        description: Use with GET /contracts/download/{downloadToken}.
                      expiresAt:
                        type: string
                        format: date-time
                      pages:
                        type: integer
                      ocrApplied:
                        type: boolean
                      creditsCharged:
                        type: integer
                        description: 0 when served from the conversion cache.
        '400':
          description: No file, or the upload isn't a PDF.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '413':
          description: File exceeds the 100 MB limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /convert/pdf-url-to-word:
    post:
      tags:
      - Conversion
      operationId: convertPdfUrlToWord
      summary: Convert a PDF (from URL) to Word
      description: 'Convert a PDF at a public HTTPS URL to a Word (.docx) document —

        a one-off conversion that does **not** create a contract or any

        document version. Like its file-upload twin, it produces a high-fidelity

        `.docx` (layout, tables, and styles preserved). (To convert a PDF that''s

        already a contract version and store the result on the contract,

        use `POST /contracts/{id}/versions/{versionId}/convert-to-word`.)


        The API downloads the PDF server-side (so the URL must be

        reachable from our infrastructure, ≤ 50 MB), converts it, and

        returns a short-lived `downloadToken`. Fetch the DOCX with

        `GET /contracts/download/{downloadToken}` (bearer-authenticated,

        same as redline downloads); the token is valid for 30 minutes.


        Charged per 50-page block: 5 credits up to 50 pages, +5 per

        additional 50. Same SHA-256 cache as the rest of the platform —

        re-converting identical bytes is free (`creditsCharged: 0`).'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - pdfUrl
              properties:
                pdfUrl:
                  type: string
                  format: uri
                  description: Public HTTPS URL of the PDF (≤ 50 MB, reachable from our servers).
                filename:
                  type: string
                  maxLength: 200
                  description: Optional name for the resulting DOCX (path components stripped). Defaults to "converted.docx".
      responses:
        '200':
          description: Conversion complete; download with the token.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      downloadToken:
                        type: string
                        description: Use with GET /contracts/download/{downloadToken}.
                      expiresAt:
                        type: string
                        format: date-time
                        description: After this the token stops working (~30 min).
                      pages:
                        type: integer
                      ocrApplied:
                        type: boolean
                        description: Whether OCR was applied (image-only PDF).
                      creditsCharged:
                        type: integer
                        description: 0 when served from the conversion cache.
        '400':
          description: Bad input, fetch failed, or the URL didn't return a PDF.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '413':
          description: PDF exceeds the 50 MB limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  responses:
    Unauthorized:
      description: Missing, malformed, revoked, or wrong-region key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            unauthorized:
              value:
                error:
                  code: UNAUTHORIZED
                  message: Invalid API key
    PaymentRequired:
      description: "Payment-gated failure, told apart by the error `code`:\n  - `INSUFFICIENT_CREDITS` — the org's credit balance can't cover\n    this AI operation. Top up or upgrade, then retry.\n  - `USAGE_LIMIT_EXCEEDED` — a plan stock cap was hit (e.g. the\n    plan's contract limit on upload). Upgrade the plan.\n"
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            insufficientCredits:
              value:
                error:
                  code: INSUFFICIENT_CREDITS
                  message: Not enough credits
            usageLimitExceeded:
              value:
                error:
                  code: USAGE_LIMIT_EXCEEDED
                  message: Contract limit reached (25/25)
    Forbidden:
      description: "The request isn't allowed — one of three cases, told apart by the\nerror `code`:\n  - `API_ACCESS_NOT_IN_PLAN` — the API is a Business / Enterprise\n    feature and this organization isn't on a qualifying plan.\n  - `SUBSCRIPTION_SUSPENDED` — the org's subscription has lapsed;\n    API access is paused until billing is resolved.\n  - `API_KEY_FORBIDDEN` — an API key tried to reach a settings\n    surface (billing, members, SSO, integrations, org config,\n    webhooks); those require a human admin signed in to the app.\n"
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            notInPlan:
              value:
                error:
                  code: API_ACCESS_NOT_IN_PLAN
                  message: The Clment API is available on the Business and Enterprise plans.
            suspended:
              value:
                error:
                  code: SUBSCRIPTION_SUSPENDED
                  message: API access requires an active subscription.
            settingsBlocked:
              value:
                error:
                  code: API_KEY_FORBIDDEN
                  message: API keys cannot access settings
    TooManyRequests:
      description: 'The per-organization request rate limit was exceeded. Wait the

        number of seconds in the `Retry-After` header, then retry. Every

        authenticated response (not just this one) carries

        `X-RateLimit-Limit` and `X-RateLimit-Remaining` so you can pace

        yourself before hitting it.

        '
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
        X-RateLimit-Limit:
          description: Requests allowed per window.
          schema:
            type: integer
        X-RateLimit-Remaining:
          description: Requests remaining in the current window.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            rateLimited:
              value:
                error:
                  code: RATE_LIMITED
                  message: Too many requests. Please try again in a few minutes.
  schemas:
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: object
          required:
          - code
          - message
          properties:
            code:
              type: string
              description: Stable machine-readable error code.
            message:
              type: string
              description: Human-readable explanation.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: clm_sk_live_*
      description: 'A Clment API key. Format `clm_sk_live_` followed by a

        URL-safe-base64 random string. Created in **Settings → API &

        Integrations**.

        '