When to use this endpoint

This is the browser destination in a signature-request email, not a JSON lookup for integrators. Open the full link supplied by the request workflow.

Authentication and permissions

Public bearer-token route: it does not require Core_requireLogin or an API key. pid selects the tenant and md5 selects a pending request in that tenant. The dispatcher exempts this route from session CSRF checks.

Do not publish or log working tokens. Possession of the token—not recipient login or an existing signing session—is the effective authorization.

Parameters

ParameterTypeRequiredDescription
pidInteger stringYesPositive tenant ID from the emailed link; explicit cross-tenant database routing uses it.
md5StringYesExactly 32 lowercase hexadecimal characters. Must identify an unexpired pending request of the selected document type.
obj_typeInteger stringNoDefault 0 for job; 3 for quote. These public document types must match the token’s stored Job/Quote request type; other values are rejected.

Example request

// Public browser request using the token from the received email.
GET /a/Job_signatureCustomerView/pid=123/md5=0123456789abcdef0123456789abcdef

Example response

<html><head>...</head><body>
<p>Please view the document that we are asking you to sign: ...</p>
<button style="padding:1em">Sign Document</button>
<script>window.fmsign={"pid":123,"md5":"0123456789abcdef0123456789abcdef","obj_type":0};</script>
...
</body></html>

Abbreviated HTML. For an unknown/consumed request, prints signature request not found, or expired, or has been signed already as text under the HTML content type. Invalid parameter guards return JSON through the dispatcher.

Errors and unusual responses

ResponseCondition
{"error":"missing or invalid parameter: md5"}Token is not exactly 32 lowercase hexadecimal characters.
{"error":"missing or invalid parameter: pid"}Tenant ID is nonpositive.
signature request not found, or expired, or has been signed alreadyNo unexpired pending request of the matching document type, or its target job/quote is missing/deleted.
{"error":"missing or invalid parameter: obj_type"}Public document type is not 0 (Job) or 3 (Quote). A supported but token-mismatched type returns the unavailable-request response instead.

Legacy application errors may be returned with HTTP 200. Check the decoded response for error, not only the HTTP status.

Behaviour and edge cases

  • Selects an unexpired pending token bound to the selected Job/Quote type and requires an active target. Recipient login is not required; possession of the token is authorization. Current form/field validation occurs during save.
  • Every successful view inserts a separate shareable-document link for the token’s bound object and type, expiring at the signature request’s expiry_date. The signing token itself is not reused as a document link.
  • The shared page loads the signature pad and application-sign.js. That script submits pid, md5, obj_type and v to the compatibility route Appointment_signatureCustomerSave, which dispatches to Job_signatureCustomerSave.
  • The view does not consume the request. Multiple views remain possible before save; new document links are capped at the request’s expiry.
  • No filtering or pagination applies. A single unexpired token and matching document type determine the request.

Side effects

  • Installs the request’s job ID, signature field, token and tenant into legacy signing-session keys and session.userid.
  • Inserts a links_shareable row, builds the isolated document-service URL and outputs the HTML signing UI. Does not write the job signature or request status.

See it in Fieldmotion

CRM1

Follow the email generated by Job_signatureRequest. This page is outside the logged-in CRM; inspect Job_signatureCustomerView and the subsequent compatibility save request in the recipient browser.

CRM2

The job email widget produces the same public-link workflow. There is no separate CRM2 signature-view implementation.

Related endpoints