Integration details
Description
DocHub for ChatGPT helps you handle document work — from creation to sign requests — without switching tools. Use natural language to create ready-to-use PDFs and refine them. Fill form fields, prepare and send sign requests, and track progress — all in one conversation. No paid DocHub subscription is required to get started — ideal for individuals and teams looking for a simpler way to get documents done.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- PDF Editing & Conversion Tools
- Secondary Subcategories
- None listed
- Brand
- DocHub
- Access
- Account optional
- First tracked
- 2026-09-04
- Tool count
- 15
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT PDF Editing & Conversion Tools
View Category15 tools agents can invoke
Assign an existing form field to a document role so that role's signer fills it. Side effects: changes field ownership only; never touches the field's value. Works for any field type, including signature fields. Primary use: resolving a PREPARING sign request draft when send validation reports that a recipient "must be assigned at least one field or have annotations enabled" — assigning an unassigned (or wrongly assigned) field to the signer's role clears that blocker. Required inputs: - documentId: the draft's document id (not the template id). - formfieldId: a field id on that document. - documentRoleId: a role id on the same document. If the role does not exist or belongs to a different document, the call fails with a not-found error. Returns: {"status": "success", "formfield": { ... }} — same field shape as the form-field listing, with documentRole updated. Use when: a draft's fields are unassigned or assigned to the wrong recipient. Not for: setting field values, or creating new fields (place those in the DocHub editor).
dochub_assign_formfield
Create a DocHub sign request draft from a template document. Side effects: creates a draft only. No emails are sent to signers until the draft is finalized and sent. Required inputs: - documentId: a template document id (isTemplate=true). - documentRoles: one entry per template role, each with id and email. Role ids come from the template's roles; signer emails come from the user. Name, queue order, and signer type come from the template. Each entry accepts optional canAnnotate: true to grant the role's signer free annotation of the document (write/draw anywhere as free content — it does not make the template's fields fillable for them); omit it to keep the template's stored role configuration. Creation fails with "must be assigned at least one field or have annotations enabled" when a role has neither assigned fields nor annotations — resolvable by re-calling with canAnnotate: true for that role, or by assigning fields to the role in the template (fullUrl). Optional inputs: - title: sign request title. Default: the template document's title. - emailContent: invitation subject and/or body overrides. Any omitted field falls back to its default; omitting emailContent entirely applies both. Default subject: "ACTION NEEDED: {title}". Default body: "Please review, sign, and complete this document." {title} resolves to the effective title (custom if given, otherwise the template title); pass plain values, not pre-interpolated strings. Returns: Success: { "status": "success", "signRequestId": str, "documentUrl": str, "title": str, "emailSubject": str, "emailBody": str } documentUrl is a link to review the draft before it is sent. Use when: starting a role-based sign request from an existing template — sending a templated contract or form out for electronic signature (esign). Not for: regular imported/generated documents.
dochub_create_sign_request_draft_from_template
Create a DocHub sign request from a regular (non-template) document. Side effects: creates a sign request, usually in PREPARING/draft mode when preparingEnabled is true; it is not sent until finalized. Constraint: a regular document can have at most one sign request ever — including one already sent, in progress, or completed. The DocHub API enforces this and rejects a second attempt with a validation error. The existing request appears in the sign-request listing under the same document id. The same content can be reused by copying the document in the DocHub web app, or via a template flow. Required inputs: - documentId: a regular imported/generated document id. - signers: one or more signer email assignments; optional name and queuePosition when provided. Optional canAnnotate (no default) grants the signer free annotation — writing, drawing, or signing anywhere as free content; it does not make form fields fillable, since a field can be completed only by the signer whose role it is assigned to. A PREPARING draft may be created with signers that have neither assigned fields nor the grant — its roles are created with it, and sending stays blocked until every recipient has at least one field or annotations enabled. Immediate sends (preparingEnabled=false) require each signer to carry canAnnotate=true or match an existing role with assigned fields at creation time; older DocHub servers enforce this for drafts as well. Optional inputs: - ownerEntityId: inferred from the authenticated DocHub user when omitted. - title: sign request title. Default: the document's title. - emailContent: invitation subject and/or body overrides. Any omitted field falls back to its default; omitting emailContent entirely applies both. Default subject: "ACTION NEEDED: {title}". Default body: "Please review, sign, and complete this document." {title} resolves to the effective title (custom if given, otherwise the document title); pass plain values, not pre-interpolated strings. - preparingEnabled: defaults to true (review before sending). Returns: Success: { "status": "success", "signRequestId": str, "signRequestStatus": str, "documentUrl": str | null, "documentId": str | null, "signerIds": [str], "title": str, "emailSubject": str, "emailBody": str } DocHub validation errors (signer emails, missing fields, document state) are returned in the response. Use when: sending a regular generated/imported document for signature or esign — "send this for signature", "get this contract e-signed" — when it does not have a sign request yet. Not for: template role-based flows, or a document that already has a sign request (see Constraint).
dochub_create_sign_request_from_document
Set the value of a fillable form field (PUT /api/v2/formfields/:formfield_id). Side effects: overwrites the field's current value (idempotent for the same value). Only fields marked ``isFillable: true`` in the form-field listing can be updated: ``ftText`` and ``dhAutoDate`` (string ``value``) or ``ftCheckBox`` (boolean ``value``). Pass ``ffType`` exactly as returned for that field. Permissions: ``isFillable: true`` fields may be filled when ``documentRole`` is null (unassigned) or when ``documentRole.email`` matches the authenticated user's email. Fields assigned to a different email are rejected by the API. Role assignment is not a prerequisite for filling. Returns: {"status": "success", "formfield": { ... }} — same field shape as the form-field listing. After success, present `documentUrl` from the prior form-field listing as a clickable link. Use when: setting text, auto-date display text, or checkbox state on a fillable field — "fill out this form", "complete my part of the document". Not for: non-fillable field types (signatures, radio groups); fields assigned to a different signer.
dochub_fill_formfield
Generate a professional PDF document from a natural-language request — contract, agreement, invoice, lease, NDA, letter, receipt, or a custom type. On success the document is saved to DocHub and its URL and an inline PDF preview are returned. Response `status` is one of: - "needs_more_info": required details are missing. `fields` lists the information still needed; a retry supplies those values in `sourceFacts`, repeats the same `request`, and sets `previousRunId` to the returned `runId`. - "success": contains `documentId`, `documentUrl`, and `pdfUrl`. - "error": contains a user-ready `message` and an `errorCode`. `upgrade_required` means a free/basic-plan limit was reached; `ai_rate_limit_exceeded` means a paid plan's AI allowance is used up; `documentProduced: true` means the PDF was produced but could not be saved to DocHub. Use when: the user asks for any drafted document — "draft a contract", "write up a lease", "make me an invoice". Not for: retrieving or editing existing DocHub documents.
dochub_generate_document
Get the current authenticated user's profile from DocHub. Returns: {"status": "success", "user": {"id": str, "name": str, "email": str, "createdAt": str | null, "entityId": str, "timezone": str | null}} "timezone" is the IANA timezone saved in the user's DocHub preferences; null when unset. Use when: checking who is logged in, verifying authentication, or looking up the saved timezone for presenting timestamps. Not for: looking up other users.
dochub_get_current_user
Get a document from DocHub by its ID. Fetches document metadata and a signed PDF download URL in parallel. Returns: Text JSON: {"status": "success", "document": {"id": str, "title": str, "fullUrl": str | null, "isTemplate": bool, ...}} structured_content: same document fields plus {"pdfUrl": str, "pdfUrlExpiresIn": int} for the PDF viewer widget. Use when: retrieving a specific document by a known ID. Not for: unknown document IDs — find one via a document listing first.
dochub_get_document
Fetch detailed info on a single DocHub sign request. Returns per-signer status, viewedAt / signedAt timestamps, signer emails, and queue positions in addition to the list-view fields. Returns: { "status": "success", "signRequest": { "id": str, "status": str, "createdAt": str, "updatedAt": str, "sender": "me" | "others", "document": {"id": str, "title": str, "fullUrl": str}, "signers": [{ "name": str, "email": str, "isCurrentUser": bool, "status": str, "viewedAt": str | null, "signedAt": str | null, "queuePosition": int | null, }], } } Use when: answering "who hasn't signed yet?", "when did X sign?", or any question needing per-signer timestamps. Not for: listing multiple sign requests.
dochub_get_sign_request
Grant or revoke free document annotation (write/draw anywhere) for a role's signer. Annotation is free-form content only — it does NOT make form fields fillable. A field can be completed only by the signer whose role it is assigned to (via field assignment); granting annotations leaves unassigned fields read-only for the signer. Side effects: changes what the signer is allowed to do in the document. Granting annotations is one way to resolve a send_blocked "must be assigned at least one field or have annotations enabled" finding. Required inputs: - documentId: the document the role belongs to — for a sign request draft, the draft's own documentId, not the template id. - documentRoleId: a role id from a send preview's recipients or a blocker's affectedRecipients. - canAnnotate: true to grant, false to revoke. No default. Returns: {"status": "success", "documentRoleId": str, "canAnnotate": bool} Use when: enabling or disabling free annotation for a signer on a draft. Not for: assigning specific fields to a role.
dochub_update_document_role
List documents from DocHub with optional filters. Supports filtering by title substring, labels (AND logic), privacy level, ownership, date range, and template vs non-template documents. Returns paginated results sorted by createdAt descending by default, so newly created/imported documents appear first. Returns: { "status": "success", "documents": [ { "id": str, "title": str, "fullUrl": str, "isTemplate": bool, "documentRolesData": [ { "id": str, "name": str | null, "email": str | null, "queuePosition": int | null, "signerType": "default" | "in_person", } ], } ], "pagination": { "currentPage": int, "nextPage": int | null, "prevPage": int | null, "totalCount": int, }, "warnings": [str] } warnings: non-fatal notices (for example, label names that were not found and were skipped). Template documents (isTemplate=true) expose documentRolesData role ids used when creating a template-based sign request draft. Use when: searching or browsing documents, filtering by labels/privacy/owner/dates/templates. Not for: looking up a specific document by a known ID.
dochub_list_documents
List form fields for a document. isFillable marks fields whose value can be set; the listing exposes each field's id, type, and role assignment. documentUrl is the DocHub link for the document (null when unavailable). Returns: { "status": "success", "documentUrl": str | null, "formfields": [ { "id": str, "ffType": str, "isRequired": bool, "isFillable": bool, "isChecked": bool | null, "choices": list | null, "fieldTitle": str | null, "value": any | null, "pageNumber": int, "documentRole": { "id": str, "name": str, "email": str | null, "queuePosition": int | null, "signerType": "default" | "in_person", } | null, } ], } Use when: Inspecting document fields for signing/setup flows. Not for: general document metadata, or listing documents.
dochub_list_formfields
List sign requests from DocHub with optional filters. Supports filtering by status, sender, and date range. Returns paginated results. Returns: { "status": "success", "signRequests": [{ "id": str, "status": str, "createdAt": str, "sender": "me" | "others", "signers": [{"name": str, "isCurrentUser": bool, "status": str}], "document": {"id": str, "title": str, "fullUrl": str} }], "pagination": { "currentPage": int, "prevPage": int | null, "nextPage": int | null, "totalCount": int, } } Use when: checking pending/completed/failed sign requests, filtering by status or date. Not for: looking up a specific sign request by ID, or importing files.
dochub_list_sign_requests
Modify a previously generated document by applying changes to its template and/or data and recompiling to PDF. Requires the `runId` from a previous generation response. On success the modified document is saved to DocHub and its URL and an inline PDF preview are returned. Parameters: - runId: the runId from a previous generation response - modification: natural-language description of the change - additionalFacts (optional): new data fields the modification needs - filename (optional): preferred output filename Response `status` is "success" (contains `documentId`, `documentUrl`, and `pdfUrl`) or "error" (contains a user-ready `message` and an `errorCode`; `upgrade_required` and `ai_rate_limit_exceeded` indicate plan/allowance limits). Use when: changing a document that was just generated — e.g. adjusting a value, adding or removing a section, or adding a signer line. Not for: creating a new document or editing arbitrary DocHub documents.
dochub_modify_document
Send/finalize a prepared DocHub sign request draft. Sending triggers DocHub's signer notification flow. The call proceeds through up to three stages, reflected by `status`: - "send_blocked": DocHub's send dry-run found blockers; nothing is sent. `blockers` lists each one with a `reasonCode`, a human-readable `message`, and its `affectedRecipients`. `documentFields` lists the draft's fields (type, page, assignment) for field-assignment blockers. A re-call without confirmationToken re-runs validation. - "confirmation_required": validation passed. The response carries a one-time `confirmationToken` and a `preview` of exactly what will be sent (recipients with assignedFields and canAnnotate, invitation `emailSubject`/`emailBody`, and any `warnings`). `reason` is "missing" when no token was supplied, or "invalid" when a supplied token was expired, already used, or no longer matches the draft. A re-call with the same parameters plus a current token and confirmRecipientEmails (the recipient emails from the preview, order-free) performs the send. A mismatched or missing confirmRecipientEmails returns reason "invalid" with a fresh token and preview; the previous token stays usable. When the preview lists no recipient emails (in-person signing), confirmRecipientEmails may be omitted. - "success": the request was sent. Required inputs: - signRequestId: sign request draft id from a create response or a list/get lookup. - confirmRecipientEmails: on the confirm call, the recipient emails shown in the preview (not required when the preview lists no recipient emails). Returns (by status): Send blocked: { "status": "send_blocked", "action": "dochub_send_sign_request", "message": str, "documentTitle": str | null, "blockers": [{"reasonCode": str, "message": str, "affectedRecipients": [{"name": str | null, "email": str | null, "queuePosition": int | null, "documentRoleId": str | null}]}], "warnings": [same shape as blockers], "instructions": str, "documentFields": [{"id": str, "ffType": str | null, "pageNumber": int | null, "isRequired": bool | null, "assignedRoleName": str | null}] } Confirmation required: { "status": "confirmation_required", "action": "dochub_send_sign_request", "reason": "missing" | "invalid", "message": str, "confirmationToken": str, "instructions": str, "preview": { "documentTitle": str | null, "recipients": [{"name": str | null, "email": str | null, "queuePosition": int | null, "canAnnotate": bool | null, "documentRoleId": str | null, "assignedFields": int | null}], "emailSubject": str | null, "emailBody": str | null, "warnings": [{"reasonCode": str, "message": str}] } | null } Success: { "status": "success", "signRequestId": str, "signRequestStatus": str, "documentUrl": str } Use when: finalizing and sending an existing draft sign request — the e-signature invitation goes out to the signers. Not for: creating a sign request draft.
dochub_send_sign_request
Update a PREPARING sign request draft: its title and/or invitation email content. Side effects: none toward signers — drafts send nothing. Sent requests cannot be updated (the API returns a validation error). Required inputs: - signRequestId: the draft's id, returned by creation and by the sign-request listing and details. Plus at least one of: - title: new title for the draft's document — what signers see and what the default invitation subject interpolates. - emailContent: invitation overrides with subject and/or body. Partial update: a provided field replaces the stored value, an omitted field keeps its current value. Returns: Success: { "status": "success", "signRequestId": str, "title": str | null, "emailSubject": str | null, "emailBody": str | null } emailSubject/emailBody are the effective invitation content after the update as stored by DocHub (authoritative — both are returned even when only one was changed). title echoes the requested value when it was part of the update, null otherwise. A pending send confirmation token is invalidated when the invitation email changes — the send flow then shows a fresh preview and asks for approval again. Use when: the user wants a different title or invitation wording on a draft before sending (e.g. after seeing the applied defaults or the send preview). Not for: sent/in-progress requests; changing recipients (done in the DocHub editor at the draft's documentUrl); assigning fields or granting annotations — the field-assignment and role-annotation tools cover those.
dochub_update_sign_request
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are DocHub alternatives on ChatGPT?
As of 2026-09-11, DocHub competes with Adobe Acrobat, AnyPDF - Your PDF Converter, CloudConvert, ConvertAPI, Edito-Pdf, Foxit PDF Editor, iLovePDF, KDAN PDF, Ofia Doc Maker, PDF Editor by PDF net, PDF Editor PRO by Playgram, PDF Reader Pro, PDF Translator, PDF4me, Private PDF Tools, Smallpdf, Strive PDF Generator in ChatGPT PDF Editing & Conversion Tools, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.