ReferenceReference by module

Document requests API

Every Document requests action (7) and data model (3): endpoints, scopes, input, preconditions, events and examples.

Ask a lead for documents with a link — no sign-in needed.

Module code lead_documents · 7 actions · 3 data models · 6 events. A key or token never does more here than the person behind it can; row-level security applies exactly as in the app. Scopes: lead_documents (everything), lead_documents:read (read only) or lead_documents:<capability>.

Resources

ResourceTableList and readPOSTPATCHDELETE
lead_document_linkslead_document_link/api/v1/lead_document_links
lead_document_requestslead_document_request/api/v1/lead_document_requests
lead_documentslead_document/api/v1/lead_documents

Lists take limit (up to 200), cursor, order (e.g. -created_at), fields and q; every other query parameter is a column filter: ?status=paid, ?total[gte]=100, ?id[in]=a,b, ?x=null.

Actions

ActionNeedsWhat it does
lead_documents.issue_linklead_documents:writeAsk a lead for documents
lead_documents.renew_linklead_documents:writeGive a lead’s document link more time
lead_documents.reviewlead_documents:writeAccept or reject a document
lead_documents.revoke_linklead_documents:writeClose a lead’s document link
lead_documents.set_requestlead_documents:manageAdd or change a document request
lead_documents.set_request_activelead_documents:manageOpen or close a document request
lead_documents.submitlead_documents:writeFile a document a lead sent

Ask a lead for documents — Opens a files upload link for one lead (as the platform, so a rep needs no Files permission) and ties it to the documents it asks for.

Needs lead_documents:write · changes data

POSThttps://app.getera.io/api/v1/lead_document_links/actions/issue_link
API key or OAuth token · lead_documents:write
  • Canonical address: POST /api/v1/actions/lead_documents.issue_link
FieldTypeRequiredNotes
leadIduuidyesLead · id of lead
fileUploadLinkIduuidUpload link · Leave empty and the link is opened here. · id of file_upload_link
requestIdsobject / arrayDocuments
expiresInDaysnumberOpen for (days) · min 1 · max 90

The action is refused with 409 and one of these codes:

CodeRefused when
lead_not_foundThe lead must exist.
lead_archivedAn archived lead is not asked for anything.
no_requestsAt least one open document request must exist or be picked.
request_not_availableEvery picked request must be open.
upload_link_not_openThe files upload link must exist and be open.
upload_link_takenOne upload link serves one lead.

Events it publishes: lead_documents.link_issued

What it writes: lead_document_link (insert) — Ties the link to the lead and retires the previous one

curl -X POST https://app.getera.io/api/v1/lead_document_links/actions/issue_link \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"leadId":"LEAD_ID"}'
Response
{
  "ok": true,
  "result": "…",
  "events": [
    "lead_documents.link_issued"
  ]
}
import { createEra } from "@getera/sdk"

const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.leadDocumentLinks.issueLink({
  leadId: "LEAD_ID"
})
era lead_document_links issue_link \
  --lead-id "LEAD_ID"
tools/call
{
  "name": "era__lead_documents__issue_link",
  "arguments": {
    "leadId": "LEAD_ID"
  }
}

Errors: 401 no or expired credential · 403 the credential does not hold lead_documents:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 lead_not_found, lead_archived, no_requests, request_not_available, upload_link_not_open, upload_link_taken · 429 slow down

Give a lead’s document link more time — Moves the expiry of the link a lead was sent, keeping the address they already have.

Needs lead_documents:write · changes data

POSThttps://app.getera.io/api/v1/actions/lead_documents.renew_link
API key or OAuth token · lead_documents:write
FieldTypeRequiredNotes
leadIduuidyesLead · id of lead
daysnumberyesOpen for (days from now) · min 1 · max 90

The action is refused with 409 and one of these codes:

CodeRefused when
lead_not_foundThe lead must exist.
lead_archivedAn archived lead is restored first.
no_open_linkThe lead must have an open document link.

Events it publishes: lead_documents.link_renewed

curl -X POST https://app.getera.io/api/v1/actions/lead_documents.renew_link \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"leadId":"LEAD_ID","days":1}'
Response
{
  "ok": true,
  "result": "…",
  "events": [
    "lead_documents.link_renewed"
  ]
}
import { createEra } from "@getera/sdk"

const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.actions.run("lead_documents.renew_link", {
  leadId: "LEAD_ID",
  days: 1
})
era run lead_documents.renew_link \
  --lead-id "LEAD_ID" \
  --days 1
tools/call
{
  "name": "era__lead_documents__renew_link",
  "arguments": {
    "leadId": "LEAD_ID",
    "days": 1
  }
}

Errors: 401 no or expired credential · 403 the credential does not hold lead_documents:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 lead_not_found, lead_archived, no_open_link · 429 slow down

lead_documents.review

Accept or reject a document — Records a decision about what was sent; a rejection tells the person why.

Needs lead_documents:write · changes data

POSThttps://app.getera.io/api/v1/lead_documents/{id}/actions/review
API key or OAuth token · lead_documents:write
  • Canonical address: POST /api/v1/actions/lead_documents.review

Input

FieldTypeRequiredNotes
iduuidyesFilled from the path {id} · Document · id of lead_document
decisionstring (enum)yesDecision · Allowed values: accepted, rejected
reasonstringWhy · max 2000

Preconditions

The action is refused with 409 and one of these codes:

CodeRefused when
not_foundThe document must exist.
already_in_that_stateThe decision must change something.
reason_requiredA rejection carries the reason the person is shown.

Events it publishes: lead_documents.reviewed

What it writes: lead_document (update) — Records the decision

curl -X POST https://app.getera.io/api/v1/lead_documents/LEAD_DOCUMENT_ID/actions/review \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"decision":"accepted"}'
Response
{
  "ok": true,
  "result": "…",
  "events": [
    "lead_documents.reviewed"
  ]
}
import { createEra } from "@getera/sdk"

const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.leadDocuments.review("LEAD_DOCUMENT_ID", {
  decision: "accepted"
})
era lead_documents review LEAD_DOCUMENT_ID \
  --decision "accepted"
tools/call
{
  "name": "era__lead_documents__review",
  "arguments": {
    "id": "LEAD_DOCUMENT_ID",
    "decision": "accepted"
  }
}

Errors: 401 no or expired credential · 403 the credential does not hold lead_documents:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 not_found, already_in_that_state, reason_required · 429 slow down

Close a lead’s document link — Stops the link a lead was sent from working. What they already sent stays.

Needs lead_documents:write · removes or cannot be undone · asks a person to confirm when Era runs it

POSThttps://app.getera.io/api/v1/lead_document_links/actions/revoke_link
API key or OAuth token · lead_documents:write
  • Canonical address: POST /api/v1/actions/lead_documents.revoke_link
FieldTypeRequiredNotes
leadIduuidyesLead · id of lead

The action is refused with 409 and one of these codes:

CodeRefused when
lead_not_foundThe lead must exist.
lead_archivedAn archived lead is restored first.
no_open_linkThe lead must have an open document link.

Events it publishes: lead_documents.link_revoked

What it writes: lead_document_link (update) — Retires the join; files closes the link

curl -X POST https://app.getera.io/api/v1/lead_document_links/actions/revoke_link \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"leadId":"LEAD_ID"}'
Response
{
  "ok": true,
  "result": "…",
  "events": [
    "lead_documents.link_revoked"
  ]
}
import { createEra } from "@getera/sdk"

const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.leadDocumentLinks.revokeLink({
  leadId: "LEAD_ID"
})
era lead_document_links revoke_link \
  --lead-id "LEAD_ID"
tools/call
{
  "name": "era__lead_documents__revoke_link",
  "arguments": {
    "leadId": "LEAD_ID"
  }
}

Errors: 401 no or expired credential · 403 the credential does not hold lead_documents:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 lead_not_found, lead_archived, no_open_link · 429 slow down

lead_documents.set_request

Add or change a document request — What the business asks a lead to send — a passport, a diploma — and what files it accepts.

Needs lead_documents:manage · changes data

POSThttps://app.getera.io/api/v1/lead_document_requests/{id}/actions/set_request
API key or OAuth token · lead_documents:manage
  • Canonical address: POST /api/v1/actions/lead_documents.set_request

Input

FieldTypeRequiredNotes
iduuidFilled from the path {id} · Request · id of lead_document_request
namestringyesName · max 255
descriptionstringInstructions · max 2000
isRequiredbooleanRequired
sortOrdernumberOrder · min 0
allowedTypesobject / arrayAccepted files
maxFileSizeMbnumberLargest file (MB) · min 1 · max 50

Preconditions

The action is refused with 409 and one of these codes:

CodeRefused when
not_foundThe request being changed must exist.
name_takenTwo requests may not share a name.

Events it publishes: lead_documents.request_changed

What it writes: lead_document_request (upsert) — Writes the request

curl -X POST https://app.getera.io/api/v1/lead_document_requests/LEAD_DOCUMENT_REQUEST_ID/actions/set_request \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"name":"Name"}'
Response
{
  "ok": true,
  "result": "…",
  "events": [
    "lead_documents.request_changed"
  ]
}
import { createEra } from "@getera/sdk"

const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.leadDocumentRequests.setRequest("LEAD_DOCUMENT_REQUEST_ID", {
  name: "Name"
})
era lead_document_requests set_request LEAD_DOCUMENT_REQUEST_ID \
  --name "Name"
tools/call
{
  "name": "era__lead_documents__set_request",
  "arguments": {
    "id": "LEAD_DOCUMENT_REQUEST_ID",
    "name": "Name"
  }
}

Errors: 401 no or expired credential · 403 the credential does not hold lead_documents:manage · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 not_found, name_taken · 429 slow down

lead_documents.set_request_active

Open or close a document request — Stops asking for a document without touching what was already sent.

Needs lead_documents:manage · changes data

POSThttps://app.getera.io/api/v1/lead_document_requests/{id}/actions/set_request_active
API key or OAuth token · lead_documents:manage
  • Canonical address: POST /api/v1/actions/lead_documents.set_request_active

Input

FieldTypeRequiredNotes
iduuidyesFilled from the path {id} · Request · id of lead_document_request
activebooleanyesOpen

Preconditions

The action is refused with 409 and one of these codes:

CodeRefused when
not_foundThe request must exist.
already_in_that_stateIt is already open, or already closed.

Events it publishes: lead_documents.request_changed

What it writes: lead_document_request (update) — Opens or closes it

curl -X POST https://app.getera.io/api/v1/lead_document_requests/LEAD_DOCUMENT_REQUEST_ID/actions/set_request_active \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"active":true}'
Response
{
  "ok": true,
  "result": "…",
  "events": [
    "lead_documents.request_changed"
  ]
}
import { createEra } from "@getera/sdk"

const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.leadDocumentRequests.setRequestActive("LEAD_DOCUMENT_REQUEST_ID", {
  active: true
})
era lead_document_requests set_request_active LEAD_DOCUMENT_REQUEST_ID \
  --active true
tools/call
{
  "name": "era__lead_documents__set_request_active",
  "arguments": {
    "id": "LEAD_DOCUMENT_REQUEST_ID",
    "active": true
  }
}

Errors: 401 no or expired credential · 403 the credential does not hold lead_documents:manage · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 not_found, already_in_that_state · 429 slow down

lead_documents.submit

File a document a lead sent — Attaches an uploaded file to the lead, against the document it was sent for.

Needs lead_documents:write · reaches outside (sends, publishes or charges)

POSThttps://app.getera.io/api/v1/lead_documents/actions/submit
API key or OAuth token · lead_documents:write
  • Canonical address: POST /api/v1/actions/lead_documents.submit

Input

FieldTypeRequiredNotes
tokenstringyesLink token · max 128
requestIduuidyesDocument · id of lead_document_request
fileIduuidyesFile · id of file
uploaderNamestringSent by · max 200
uploaderNotestringNote · max 2000

Preconditions

The action is refused with 409 and one of these codes:

CodeRefused when
link_unknownThe link must exist and be open.
link_expiredThe link must not have expired.
request_not_on_linkThe link must ask for that document.
file_not_foundThe file must have come in through this link and not be filed already.

Events it publishes: lead_documents.submitted

What it writes: lead_document (insert) — Files the document; lead_document_link (update) — Stamps when the link was last used

curl -X POST https://app.getera.io/api/v1/lead_documents/actions/submit \
  -H "Authorization: Bearer $ERA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"token":"Link token","requestId":"LEAD_DOCUMENT_REQUEST_ID","fileId":"FILE_ID"}'
Response
{
  "ok": true,
  "result": "…",
  "events": [
    "lead_documents.submitted"
  ]
}
import { createEra } from "@getera/sdk"

const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.leadDocuments.submit({
  token: "Link token",
  requestId: "LEAD_DOCUMENT_REQUEST_ID",
  fileId: "FILE_ID"
})
era lead_documents submit \
  --token "Link token" \
  --request-id "LEAD_DOCUMENT_REQUEST_ID" \
  --file-id "FILE_ID"
tools/call
{
  "name": "era__lead_documents__submit",
  "arguments": {
    "token": "Link token",
    "requestId": "LEAD_DOCUMENT_REQUEST_ID",
    "fileId": "FILE_ID"
  }
}

Errors: 401 no or expired credential · 403 the credential does not hold lead_documents:write · 404 the record or module is outside what it may reach · 422 invalid input (problems[]) · 409 link_unknown, link_expired, request_not_on_link, file_not_found · 429 slow down

Data models

Table lead_document_link · Resource lead_document_links

  • GET /api/v1/lead_document_links
  • GET /api/v1/lead_document_links/{id}
ColumnTypeNullableAllowed valuesReferences
idstring (uuid) · uuid
organization_idstring (uuid) · uuidorganization
workspace_idstring (uuid) · uuidworkspace
lead_idstring (uuid) · uuidlead
is_activeboolean · bool
expires_atstring (date-time) · timestamptzyes
created_by_user_idstring (uuid) · uuidyesapp_user
created_atstring (date-time) · timestamptz
request_idsstring[] · uuid[]
last_used_atstring (date-time) · timestamptzyes
updated_atstring (date-time) · timestamptz
file_upload_link_idstring (uuid) · uuidyesfile_upload_link

Primary key: id

LeadDocumentRequest

Table lead_document_request · Resource lead_document_requests

  • GET /api/v1/lead_document_requests
  • GET /api/v1/lead_document_requests/{id}
ColumnTypeNullableAllowed valuesReferences
idstring (uuid) · uuid
organization_idstring (uuid) · uuidorganization
workspace_idstring (uuid) · uuidworkspace
namestring · text
descriptionstring · textyes
is_requiredboolean · bool
sort_orderinteger · int4
allowed_typesstring[] · text[]
max_file_size_mbinteger · int4
is_activeboolean · bool
created_atstring (date-time) · timestamptz
updated_atstring (date-time) · timestamptz

Primary key: id

Checks:

  • CHECK ((max_file_size_mb > 0))

LeadDocument

Table lead_document · Resource lead_documents

  • GET /api/v1/lead_documents
  • GET /api/v1/lead_documents/{id}
ColumnTypeNullableAllowed valuesReferences
idstring (uuid) · uuid
organization_idstring (uuid) · uuidorganization
workspace_idstring (uuid) · uuidworkspace
lead_idstring (uuid) · uuidlead
document_request_idstring (uuid) · uuidyeslead_document_request
link_idstring (uuid) · uuidyeslead_document_link
file_idstring (uuid) · uuidfile
uploader_namestring · textyes
uploader_notestring · textyes
uploaded_atstring (date-time) · timestamptz
statusstring · textreceived, accepted, rejected
reviewed_by_user_idstring (uuid) · uuidyesapp_user
reviewed_atstring (date-time) · timestamptzyes
rejection_reasonstring · textyes
updated_atstring (date-time) · timestamptz

Primary key: id

Events

Workflows and webhooks react to these events.

EventWhat happensPayload
lead_documents.link_issuedA lead was asked for documents through an upload link.id, leadId, fileUploadLinkId, requestIds
lead_documents.link_renewedA lead’s document link was given more time.id, leadId, expiresAt
lead_documents.link_revokedA lead’s document link was closed.id, leadId
lead_documents.request_changedWhat the business asks for changed.id
lead_documents.reviewedA sent document was accepted or rejected.id, leadId, decision
lead_documents.submittedA lead sent a document.id, leadId, requestId, fileId, person, document, fileName, ownerUserId
Was this page helpful?