Documentation
Account data export format
Everything your practice puts into SurveyDock can be pulled out again, in full, by one of your own admins. This page documents exactly what comes out and what every column means, so your BI team can plan against it without a call with us — before you buy, not just after.
Format version 1.0
How to get one
1 — Run it yourself
In SurveyDock, an admin opens Settings → Data and builds an export. There is no request form, no support ticket and no charge, on every plan.
2 — Two archives
The data archive holds every record as CSV and JSON and is small. The photo archive holds the original images and is split into parts, because that is where the gigabytes are.
3 — Joined by files.csv
Each image's path inside the photo archive is listed in files.csv in the data archive, with a SHA-256 digest. So the records are complete and useful on their own, and the images re-link exactly.
Archive layout
surveydock-<practice>-<date>-data.zip
├── README.txt what this is, in plain English
├── manifest.json format version, row counts, file paths
├── csv/<file>.csv one per record type, for spreadsheets and BI
└── json/<file>.json the same data, losslessly
└── rca-assessment-calc.json RCA calculator working, keyed by assessment
surveydock-<practice>-<date>-photos[-part-N-of-M].zip
├── MANIFEST.txt contents of this part, with digests
├── photos/soc/<report>/… site photography, by report
├── photos/rca/job-<no>/… assessment photography, by job
└── branding/logo.<ext> your logoConventions
These hold across every file below. The one worth reading twice is money.
Encoding
UTF-8 with no byte-order mark. CSV follows RFC 4180: comma-separated, CRLF line endings, and any value containing a quote, comma or newline is wrapped in double quotes with internal quotes doubled.
Stable columns
The header row is fixed by this document, not by the data. A column you never filled in is still present and simply empty, so a pipeline built against one export keeps working against the next.
Identifiers
Every _id is an opaque string, unique across the whole account and stable for the life of the record. Join on them exactly as given; do not parse them.
Timestamps
Columns typed timestamp are epoch milliseconds UTC and may carry a fractional part. Columns typed date are ISO yyyy-mm-dd strings. Both are stated per column below.
Money
Units differ by module and every column says which it uses. PPM figures are in PENCE because they are summed across a thirty-year programme where integers avoid drift. RCA figures are in POUNDS because the calculator is pounds throughout. Never sum across the two without converting.
Empty values
An empty CSV field means the value was never set. In the JSON copy the same thing is null, so the two are unambiguous — an empty string in JSON is genuinely an empty string.
Spreadsheet safety
In CSV only, a text value beginning with =, +, - or @ is prefixed with an apostrophe so a spreadsheet treats it as text rather than a formula. Numbers are never altered, and the JSON copy is untouched. Use the JSON if you need values byte-for-byte.
Unexpected fields
If a record ever carries something this contract does not describe, it is written to an extra _extra column as JSON rather than dropped. You should not normally see one; it exists so an export can never quietly lose data.
Files
26 files, each present in both csv/ and json/ whether or not you have any rows of it.
Organisation
csv/organization.csv · json/organization.json
Exactly one row: your account, its address, its plan and its practice-wide report settings.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| name | string | Practice name as it appears on reports. |
| addressLine1 | string | First line of the address. |
| addressLine2 | string | Second line of the address. |
| town | string | Town or city. |
| county | string | County. |
| postcode | string | Postcode. |
| phone | string | Practice phone number. |
| contactEmail | string | Practice contact address (not a login). |
| preambleText | string | Boilerplate prepended to generated PDFs. |
| enabledModules | json | Modules licensed to the account, as a JSON array. |
| visibleModules | json | Modules shown in staff navigation, as a JSON array. |
| requireDirectorApproval | boolean | Whether RCAs need Director sign-off. |
| allowSurveyorPdfPreview | boolean | Whether surveyors may preview an unapproved RCA PDF. |
| plan | string | Commercial plan name. Empty where none was ever set. |
| seatLimit | number | Negotiated seat allowance, overriding the plan default. |
| pricePerSeatPence | number · pence | Agreed per-seat price per billing interval. |
| priceTotalPence | number · pence | Agreed flat account price per billing interval, where the deal is a lump sum. |
| billingInterval | string | "monthly" or "annual". |
| planStartedAt | timestamp | When the current plan began. |
| logoStorageId | id | Logo file id. Resolve via files.csv. → files |
| createdAt | timestamp | When the account was created. |
Offices
csv/offices.csv · json/offices.json
Your own offices or branches. Staff are assigned to one via memberships; reports print the drafting and issuing office.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| name | string | Office name. |
| addressLine1 | string | First line of the address. |
| addressLine2 | string | Second line of the address. |
| town | string | Town or city. |
| county | string | County. |
| postcode | string | Postcode. |
| phone | string | Office phone number. |
| createdAt | timestamp | When the office was added. |
Users
csv/users.csv · json/users.json
The people in your account, with the professional details reports quote. Deliberately limited to these fields: authentication data (password hashes, sessions, tokens) is never exported, and users outside your account never appear.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| name | string | Display name, as printed on reports. |
| string | Sign-in address. | |
| jobTitle | string | Job title. |
| ricsNumber | string | RICS membership number, as printed on reports. |
| qualifications | string | Post-nominals, e.g. "BSc (Hons) MRICS". |
Memberships
csv/memberships.csv · json/memberships.json
Joins users to the account: their role, and which office they work out of.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| userId | id | The person. → users |
| role | enum | "surveyor", "director" or "company_admin" (shown in the app as Admin). |
| officeId | id | Their office. Empty where none is assigned. → offices |
| createdAt | timestamp | When they were added to the account. |
Parties
csv/parties.csv · json/parties.json
Every organisation you deal with — clients, landlords, tenants, managing agents, insurers — in one directory. What each one IS to you lives in party-roles, because a single party can hold several relationships at once.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| name | string | Organisation name. |
| contactName | string | Named day-to-day contact. |
| string | Contact email address. | |
| phone | string | Contact phone number. |
| addressLine1 | string | First line of the address. |
| addressLine2 | string | Second line of the address. |
| town | string | Town or city. |
| county | string | County. |
| postcode | string | Postcode. |
| notes | string | Free-text notes. |
| createdBy | id | User who added the record. → users |
| createdAt | timestamp | When the record was added. |
| updatedAt | timestamp | When the record was last edited. |
Party roles
csv/party-roles.csv · json/party-roles.json
One row per relationship a party holds. Directory-level where propertyId is empty ("we deal with them as a client"), property-specific where it is set ("they are the landlord of Riverside Court").
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| partyId | id | The party holding the role. → parties |
| role | enum | One of "owner", "landlord", "tenant", "managingAgent", "surveyingClient", "insurer", "freeholder", "leaseholder", "other". |
| propertyId | id | Property the role is specific to. Empty for a directory-level role. → properties |
| createdAt | timestamp | When the role was recorded. |
Properties
csv/properties.csv · json/properties.json
Every property on your books. All three modules hang off this table.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| name | string | Building or property name, e.g. "Riverside Court". |
| clientId | id | Primary commissioning client. Richer relationships live in party-roles. → parties |
| addressLine1 | string | First line of the address. |
| addressLine2 | string | Second line of the address. |
| town | string | Town or city. |
| county | string | County. |
| postcode | string | Postcode. |
| udprn | string | Unique Delivery Point Reference Number, where captured. |
| createdBy | id | User who added the property. → users |
| createdAt | timestamp | When the property was added. |
Schedule of Condition — reports
csv/soc-reports.csv · json/soc-reports.json
One row per Schedule of Condition report.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| propertyId | id | Property surveyed. → properties |
| tenantFullName | string | Tenant name. Free text — tenants are not directory records. |
| landlordFullName | string | Landlord name as printed on the report. |
| landlordPartyId | id | Directory entry for the landlord, where linked. → parties |
| dateOfSurvey | timestamp | Date the property was inspected. |
| weather | string | Weather at inspection. |
| buildingOwnerAddress | string | Where works are carried out, for party-wall surveys, when that differs from the surveyed address. |
| status | enum | "draft", "in_progress", "submitted", "reviewed" or "finalized". |
| createdBy | id | User who created the report. → users |
| assignedTo | id | Surveyor the report is assigned to. Empty on older reports, which are assigned to createdBy. → users |
| clientPartyId | id | Commissioning client. → parties |
| photoMode | enum | "reference" or "include" — how photos appear in the PDF. |
| signatureMode | enum | "none", "agreed" or "two". |
| preambleOverride | string | Per-report replacement for the practice preamble. Empty means the practice default was used. |
| clientId | string | Offline-sync idempotency key generated by the mobile app. NOT a customer reference — see clientPartyId. |
| createdAt | timestamp | When the report was created. |
| updatedAt | timestamp | When the report was last edited. |
| landlordId | id | Legacy link into legacy-landlords, pre-parties. → legacy-landlords |
| customerId | id | Legacy link into legacy-clients, pre-parties. → legacy-clients |
Schedule of Condition — items
csv/soc-report-items.csv · json/soc-report-items.json
The observations within each report. Items nest one level: a room is a top-level item, and its ceiling/walls/floor are children pointing back via parentItemId.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| reportId | id | Owning report. → soc-reports |
| parentItemId | id | Parent item. Empty for a top-level item (a room). → soc-report-items |
| internalExternal | enum | "internal" or "external". |
| name | string | Item name. |
| floor | string | Floor the item sits on. |
| order | number | Sort position within its parent. |
| condition | enum | "poor", "fair", "satisfactory" or "good". |
| description | string | Description of the element. |
| comment | string | Surveyor's comment on its condition. |
| deletedAt | timestamp | Soft-delete marker. Rows with a value here are deleted and excluded from reports; they are exported so nothing is hidden from you. |
| clientId | string | Offline-sync idempotency key from the mobile app. |
| createdAt | timestamp | When the item was created. |
| updatedAt | timestamp | When the item was last edited. |
Schedule of Condition — photos
csv/soc-photos.csv · json/soc-photos.json
One row per site photograph, with the path to the image inside the photo archive. The image bytes are not in this archive — see files.csv and the photo archive.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| reportItemId | id | Item the photo belongs to. → soc-report-items |
| order | number | Sort position within the item. |
| takenAt | timestamp | When the photo was taken on site. |
| storageId | id | File id of the full-size image. → files |
| thumbnailStorageId | id | File id of the device-generated thumbnail, where one exists. → files |
| exportPath | string | Path of the full-size image inside the photo archive. |
| contentType | string | MIME type of the full-size image. |
| sizeBytes | number · bytes | Size of the full-size image. |
| clientId | string | Offline-sync idempotency key from the mobile app. |
| createdAt | timestamp | When the photo was uploaded. |
Planned Preventative Maintenance — surveys
csv/ppm-surveys.csv · json/ppm-surveys.json
One row per PPM survey: the programme window, the inflation basis and its status.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| propertyId | id | Property surveyed. → properties |
| clientPartyId | id | Commissioning client. → parties |
| title | string | Survey title. |
| baseYear | number | Programme year 1 — the today's-prices baseline. |
| programmeLengthYears | number · years | Length of the programme. |
| inflationRatePct | number · percent | Annual inflation applied. Empty means today's prices. |
| currency | string | Currency code, "GBP" throughout. |
| status | enum | "draft", "inspected", "issued" or "superseded". |
| supersededBySurveyId | id | Survey that replaced this one. → ppm-surveys |
| scopeNotes | string | Scope and caveats for the survey. |
| surveyorName | string | Surveyor name as recorded on the survey. |
| inspectionDate | timestamp | Date of inspection. |
| createdBy | id | User who created the survey. → users |
| createdAt | timestamp | When the survey was created. |
| updatedAt | timestamp | When the survey was last edited. |
| customerId | id | Legacy link into legacy-clients, pre-parties. → legacy-clients |
Planned Preventative Maintenance — items
csv/ppm-items.csv · json/ppm-items.json
One row per observed element. Element code and name are denormalised copies taken at the time of writing, so later edits to your element library never alter an issued survey.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| surveyId | id | Owning survey. → ppm-surveys |
| elementLibraryId | id | Element library entry this came from. → element-library |
| elementCode | string | Element code, as recorded at the time. |
| elementName | string | Element name, as recorded at the time. |
| location | string | Where in the building. |
| description | string | Description of the observation. |
| conditionGrade | enum | "good", "fair", "poor" or "hazardous". |
| priority | enum | "1_urgent", "2_essential", "3_desirable" or "4_cyclical". |
| timeframe | enum | "urgent", "immediate_within_1yr", "short_1_2yrs", "medium_3_5yrs" or "long_6_10yrs". |
| remedialAction | string | Recommended remedial action. |
| hsRiskFlag | boolean | Whether a health and safety risk was flagged. |
| hsRiskNotes | string | Notes on the flagged risk. |
| remainingLifeYears | number · years | Estimated remaining life. |
| sortOrder | number | Sort position within the survey. |
| createdAt | timestamp | When the item was created. |
| updatedAt | timestamp | When the item was last edited. |
Planned Preventative Maintenance — cost lines
csv/ppm-cost-lines.csv · json/ppm-cost-lines.json
Costs sit on their own rows so one observation can carry several dated cost events. All figures are base-year and exclude VAT. IMPORTANT: PPM money is in PENCE, whereas RCA money is in POUNDS — never sum the two without converting first.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| itemId | id | Item the cost belongs to. → ppm-items |
| surveyId | id | Owning survey, denormalised for whole-survey queries. → ppm-surveys |
| description | string | What the cost covers. |
| costType | enum | "one_off" or "cyclical". |
| amountPence | number · pence | Total cost, base-year, excluding VAT. |
| quantity | number | Quantity, where the cost is built from quantity x rate. |
| unit | string | Unit of measure for the quantity. |
| ratePence | number · pence | Rate per unit, base-year, excluding VAT. |
| startYear | number | Programme year the cost first falls, 1-based against the survey's baseYear. |
| cycleYears | number · years | Repeat interval, for a cyclical cost. |
| endYear | number | Programme year the cost stops recurring. |
| createdAt | timestamp | When the cost line was created. |
| updatedAt | timestamp | When the cost line was last edited. |
| amount | number · pence | Legacy column, same unit as amountPence. Superseded; present only on older rows. |
| rate | number · pence | Legacy column, same unit as ratePence. Superseded; present only on older rows. |
Reinstatement Cost Assessment — assessments
csv/rca-assessments.csv · json/rca-assessments.json
One row per RCA. The calculator working is NOT in this file: it is a nested, versioned structure that a flat column set cannot represent honestly, so it is exported whole to json/rca-assessment-calc.json, keyed by the _id here. IMPORTANT: RCA money is in POUNDS, whereas PPM money is in PENCE.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| jobNo | number | Job number, allocated per account. |
| status | enum | "Draft RCAs", "Pending Approval" or "Approved". Note that "Updates Due" is not a stored status — it is derived from review dates. |
| date | date | Date of inspection, ISO yyyy-mm-dd. Often not the date the record was created — see createdAt. |
| assessmentType | enum | "full" or "annual". |
| basedOnAssessmentId | id | Assessment this one was rolled forward from. → rca-assessments |
| clientPartyId | id | Commissioning client. → parties |
| clientName | string | Client name snapshot, as printed on the report. |
| propertyId | id | Property assessed. → properties |
| propName | string | Property name snapshot. |
| town | string | Town or city. Snapshot taken at the time of writing. |
| county | string | County. Snapshot taken at the time of writing. |
| postcode | string | Postcode. Snapshot taken at the time of writing. |
| propertyType | string | Property type. Free text — the option list is expected to change. |
| areaSource | string | Where the floor area came from. Free text. |
| description | string | Property description. |
| notesHtml | string | Report notes, as HTML. |
| surveyorUserId | id | Surveyor who carried out the assessment. → users |
| surveyorName | string | Surveyor name snapshot. |
| surveyorEmail | string | Surveyor email snapshot. |
| issuingOfficeId | id | Issuing office, set only where it differs from the surveyor's own office. → offices |
| dayOneCostPounds | number · pounds | Day-one reinstatement cost, denormalised from the calculator for reporting. |
| surveyFee | number · pounds | Fee charged for the assessment. |
| buildCostsReviewedQuarter | string | Quarter the build-cost rates were last checked against a cost index. |
| buildCostsReviewedYear | number | Year the build-cost rates were last checked. |
| reviewPeriodMonths | number · months | Review cadence for this assessment, overriding the 12-month default. |
| aiUsed | boolean | Whether AI played a part, as RICS expects reports to state. |
| aiUseNotes | string | Explanation of how AI was used. |
| specificExclusions | string | Per-job exclusions. Empty means the practice default in rca-settings applied. |
| contaminationCommentary | string | Per-job contamination commentary, or empty for the practice default. |
| costDataSource | string | Per-job cost data source, or empty for the practice default. |
| otherAssumptions | string | Per-job assumptions, or empty for the practice default. |
| limitations | string | Per-job limitations, or empty for the practice default. |
| approvalRequestedAt | timestamp | When it was sent for Director approval. |
| approvalRequestedByUserId | id | Who sent it for approval. → users |
| approvalRequestedByName | string | Name snapshot of who sent it for approval. |
| approverUserIds | json | Directors nominated to sign it off, as a JSON array of user ids. |
| approvedAt | timestamp | When it was approved. |
| approvedByUserId | id | Director who approved it. → users |
| approvedByName | string | Name snapshot of the approving Director. |
| photoIds | json | Photo file ids, as a JSON array. Resolve via files.csv. → files |
| createdBy | id | User who created the assessment. → users |
| createdAt | timestamp | When the assessment was created. |
| updatedAt | timestamp | When the assessment was last edited. |
| clientId | id | Legacy link into legacy-clients, pre-parties. → legacy-clients |
| locationId | id | Legacy link into legacy-rca-locations, pre-merge into properties. → legacy-rca-locations |
| dayOneCost | number · pounds | Legacy column, same unit as dayOneCostPounds. Present only on older rows. |
Reinstatement Cost Assessment — review thread
csv/rca-comments.csv · json/rca-comments.json
The review conversation on each RCA, including who sent one back and why, and who signed it off.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| assessmentId | id | Assessment being discussed. → rca-assessments |
| authorUserId | id | Who wrote the comment. → users |
| authorName | string | Author name snapshot, so the thread still reads correctly after someone leaves. |
| body | string | Comment text. |
| kind | enum | "comment" for a plain reply, "sent_back" for the comment that returned it to draft, "approved" for sign-off. |
| createdAt | timestamp | When the comment was posted. |
Reinstatement Cost Assessment — practice settings
csv/rca-settings.csv · json/rca-settings.json
One row: your practice-wide RCA defaults, rates and standing report text.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| nextJobNumber | number | Next job number to be allocated. |
| vatPct | number · percent | VAT rate applied. |
| profPct | number · percent | Professional fees percentage applied. |
| defaultFullSurveyFee | number · pounds | Default fee for a full survey. |
| defaultAnnualSurveyFee | number · pounds | Default fee for an annual review. |
| defaultNotesHtml | string | Default report notes, as HTML. |
| declarationText | string | Boilerplate for the declaration page. |
| liabilityCapBasis | string | Basis on which liability is capped. |
| aiNotUsedStatement | string | Printed when a report declares no AI involvement. |
| caveatCondition | string | Fixed caveat: condition. |
| caveatNotMarketValue | string | Fixed caveat: not a market valuation. |
| caveatInsuranceOnly | string | Fixed caveat: insurance purposes only. |
| caveatBuildingInsuranceOnly | string | Fixed caveat: building insurance only. |
| defaultSpecificExclusions | string | Practice default for per-job specific exclusions. |
| defaultContaminationCommentary | string | Practice default for contamination commentary. |
| defaultCostDataSource | string | Practice default for the cost data source. |
| defaultOtherAssumptions | string | Practice default for other assumptions. |
| defaultLimitations | string | Practice default for limitations. |
Element library
csv/element-library.csv · json/element-library.json
Your own additions to the PPM element library. The built-in library shipped with SurveyDock is not exported — it is not your data, and every item that used it carries its own denormalised copy of the code and name anyway.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| parentId | id | Parent element, for a sub-element. → element-library |
| code | string | Element code. |
| name | string | Element name. |
| defaultLifespanYears | number · years | Default expected lifespan. |
| defaultCycleYears | number · years | Default replacement cycle. |
| defaultUnit | string | Default unit of measure. |
| isUserCustom | boolean | True for entries your practice added. |
| order | number | Sort position. |
| createdAt | timestamp | When the entry was added. |
Floor presets
csv/floor-presets.csv · json/floor-presets.json
Custom floor names your surveyors added. The built-in defaults are not stored and so are not exported.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| name | string | Floor name. |
| order | number | Sort position. |
| createdAt | timestamp | When it was added. |
Pinned reports
csv/pins.csv · json/pins.json
Which reports each surveyor pinned to take out on site. Operational rather than survey data, exported for completeness.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| userId | id | Who pinned it. → users |
| reportId | id | Report pinned. → soc-reports |
| createdAt | timestamp | When it was pinned. |
Feature requests
csv/feature-requests.csv · json/feature-requests.json
Requests your team raised from inside the app, and any reply from SurveyDock.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| userId | id | Who raised it. → users |
| module | string | Module the request relates to. |
| details | string | What was asked for. |
| status | string | Current status. |
| statusChangedAt | timestamp | When the status last moved off the initial state. |
| statusChangedByUserId | id | Who moved the status. → users |
| response | string | Reply written back to the practice. |
| respondedAt | timestamp | When the reply was written. |
| respondedByUserId | id | Who replied. → users |
| createdAt | timestamp | When it was raised. |
Plan requests
csv/plan-requests.csv · json/plan-requests.json
Upgrade and extra-seat requests raised from the in-app plan screen.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| userId | id | Who raised it. → users |
| kind | string | What kind of request it is. |
| requestedPlan | string | Target plan, for an upgrade request. |
| requestedSeats | number | Total seats wanted, for a seats request. |
| note | string | Accompanying note. |
| status | string | Current status. |
| createdAt | timestamp | When it was raised. |
Audit trail
csv/audit-events.csv · json/audit-events.json
The append-only record of every edit, approval and export across the account. Never updated or deleted — including by this export, which appends an entry of its own.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| actorUserId | id | Who performed the action. → users |
| actorName | string | Their display name at the time, snapshotted so the log stays accurate after a rename. |
| module | enum | "soc", "ppm", "rca", or "account" for account-level actions such as this export. |
| action | enum | "created", "updated", "status_changed", "submitted_for_approval", "sent_back", "approved", "exported" or "deleted". |
| entityId | id | The record acted on. Join against whichever file the module implies. |
| entityLabel | string | Human label for the record at the time, e.g. "Job 507". |
| details | string | Extra context, where the action recorded any. |
| createdAt | timestamp | When the action happened. |
File manifest
csv/files.csv · json/files.json
Every binary file belonging to your account — site photographs, their thumbnails and your logo — with the path it occupies inside the photo archive and a SHA-256 digest you can verify against. This file is what makes the two archives joinable, and it is generated by the export rather than being a table in its own right.
| Column | Type | Meaning |
|---|---|---|
| storageId | id | File id, as referenced from the other files. |
| kind | enum | "soc_photo", "soc_photo_thumbnail", "rca_photo" or "org_logo". |
| ownerId | id | Record the file belongs to — a SOC photo row, an RCA assessment, or the organisation. |
| exportPath | string | Path inside the photo archive. |
| contentType | string | MIME type. |
| sizeBytes | number · bytes | File size. |
| sha256 | string | Base64 SHA-256 digest, for verifying the file arrived intact. |
Clients (legacy)
Legacycsv/legacy-clients.csv · json/legacy-clients.json
Superseded by parties plus a surveyingClient role. Exported so that an account not yet migrated leaves nothing behind. Expect this to be empty on a current account; prefer parties.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| name | string | Organisation name. |
| contactName | string | Named day-to-day contact. |
| string | Contact email address. | |
| phone | string | Contact phone number. |
| addressLine1 | string | First line of the address. |
| addressLine2 | string | Second line of the address. |
| town | string | Town or city. |
| county | string | County. |
| postcode | string | Postcode. |
| notes | string | Free-text notes. |
| createdBy | id | User who added the record. → users |
| createdAt | timestamp | When the record was added. |
| updatedAt | timestamp | When the record was last edited. |
Landlords (legacy)
Legacycsv/legacy-landlords.csv · json/legacy-landlords.json
Superseded by parties plus a landlord role. Exported so that an account not yet migrated leaves nothing behind. Expect this to be empty on a current account; prefer parties.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| name | string | Organisation name. |
| contactName | string | Named day-to-day contact. |
| string | Contact email address. | |
| phone | string | Contact phone number. |
| addressLine1 | string | First line of the address. |
| addressLine2 | string | Second line of the address. |
| town | string | Town or city. |
| county | string | County. |
| postcode | string | Postcode. |
| notes | string | Free-text notes. |
| createdBy | id | User who added the record. → users |
| createdAt | timestamp | When the record was added. |
| updatedAt | timestamp | When the record was last edited. |
RCA locations (legacy)
Legacycsv/legacy-rca-locations.csv · json/legacy-rca-locations.json
Superseded by properties, which absorbed this table. Exported so that an account not yet migrated leaves nothing behind. Expect this to be empty on a current account; prefer properties.
| Column | Type | Meaning |
|---|---|---|
| _id | id | Primary key. Opaque and stable for the life of the record. |
| _creationTime | timestamp | When the row was first written. Epoch milliseconds, may be fractional. |
| organizationId | id | Owning account. Constant across a single export. → organization |
| clientId | id | Owning client. → legacy-clients |
| propName | string | Property name. Became properties.name. |
| town | string | Town or city. |
| county | string | County. |
| postcode | string | Postcode. |
| createdAt | timestamp | When the location was added. |
What is deliberately not included
Stated plainly, because an export that quietly omits things is worse than one that tells you what it left out.
Authentication data
Sessions, password hashes, refresh tokens and verification codes are credentials, not records. Exporting them would create a liability rather than hand you anything useful.
Users outside your account
The users file is limited to people who hold a membership of your account.
SurveyDock's built-in libraries
The shipped element library and item presets are part of the product, not your data. Anything of yours that used them carries its own copy of the code and name.
Sales enquiries
Enquiries submitted through the public SurveyDock website belong to SurveyDock and are not scoped to any account.
Generated PDFs
Every report and assessment regenerates its PDF on demand from the data in this export, and a stored copy may be older than the record. Export the PDFs you want from the app.
Versioning
Every archive states its format version in manifest.json. Adding a column is a minor change and will not move an existing one. Renaming or removing a column, or changing what one means, is a major change: we would publish the new version alongside this page rather than swap it underneath you.
If you are building against this and something here is ambiguous, tell us and we will fix the wording — support@surveydock.co.uk.