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 logo

Conventions

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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
namestringPractice name as it appears on reports.
addressLine1stringFirst line of the address.
addressLine2stringSecond line of the address.
townstringTown or city.
countystringCounty.
postcodestringPostcode.
phonestringPractice phone number.
contactEmailstringPractice contact address (not a login).
preambleTextstringBoilerplate prepended to generated PDFs.
enabledModulesjsonModules licensed to the account, as a JSON array.
visibleModulesjsonModules shown in staff navigation, as a JSON array.
requireDirectorApprovalbooleanWhether RCAs need Director sign-off.
allowSurveyorPdfPreviewbooleanWhether surveyors may preview an unapproved RCA PDF.
planstringCommercial plan name. Empty where none was ever set.
seatLimitnumberNegotiated seat allowance, overriding the plan default.
pricePerSeatPencenumber · penceAgreed per-seat price per billing interval.
priceTotalPencenumber · penceAgreed flat account price per billing interval, where the deal is a lump sum.
billingIntervalstring"monthly" or "annual".
planStartedAttimestampWhen the current plan began.
logoStorageIdidLogo file id. Resolve via files.csv. files
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
namestringOffice name.
addressLine1stringFirst line of the address.
addressLine2stringSecond line of the address.
townstringTown or city.
countystringCounty.
postcodestringPostcode.
phonestringOffice phone number.
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
namestringDisplay name, as printed on reports.
emailstringSign-in address.
jobTitlestringJob title.
ricsNumberstringRICS membership number, as printed on reports.
qualificationsstringPost-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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
userIdidThe person. users
roleenum"surveyor", "director" or "company_admin" (shown in the app as Admin).
officeIdidTheir office. Empty where none is assigned. offices
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
namestringOrganisation name.
contactNamestringNamed day-to-day contact.
emailstringContact email address.
phonestringContact phone number.
addressLine1stringFirst line of the address.
addressLine2stringSecond line of the address.
townstringTown or city.
countystringCounty.
postcodestringPostcode.
notesstringFree-text notes.
createdByidUser who added the record. users
createdAttimestampWhen the record was added.
updatedAttimestampWhen 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").

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
partyIdidThe party holding the role. parties
roleenumOne of "owner", "landlord", "tenant", "managingAgent", "surveyingClient", "insurer", "freeholder", "leaseholder", "other".
propertyIdidProperty the role is specific to. Empty for a directory-level role. properties
createdAttimestampWhen the role was recorded.

Properties

csv/properties.csv · json/properties.json

Every property on your books. All three modules hang off this table.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
namestringBuilding or property name, e.g. "Riverside Court".
clientIdidPrimary commissioning client. Richer relationships live in party-roles. parties
addressLine1stringFirst line of the address.
addressLine2stringSecond line of the address.
townstringTown or city.
countystringCounty.
postcodestringPostcode.
udprnstringUnique Delivery Point Reference Number, where captured.
createdByidUser who added the property. users
createdAttimestampWhen the property was added.

Schedule of Condition — reports

csv/soc-reports.csv · json/soc-reports.json

One row per Schedule of Condition report.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
propertyIdidProperty surveyed. properties
tenantFullNamestringTenant name. Free text — tenants are not directory records.
landlordFullNamestringLandlord name as printed on the report.
landlordPartyIdidDirectory entry for the landlord, where linked. parties
dateOfSurveytimestampDate the property was inspected.
weatherstringWeather at inspection.
buildingOwnerAddressstringWhere works are carried out, for party-wall surveys, when that differs from the surveyed address.
statusenum"draft", "in_progress", "submitted", "reviewed" or "finalized".
createdByidUser who created the report. users
assignedToidSurveyor the report is assigned to. Empty on older reports, which are assigned to createdBy. users
clientPartyIdidCommissioning client. parties
photoModeenum"reference" or "include" — how photos appear in the PDF.
signatureModeenum"none", "agreed" or "two".
preambleOverridestringPer-report replacement for the practice preamble. Empty means the practice default was used.
clientIdstringOffline-sync idempotency key generated by the mobile app. NOT a customer reference — see clientPartyId.
createdAttimestampWhen the report was created.
updatedAttimestampWhen the report was last edited.
landlordIdidLegacy link into legacy-landlords, pre-parties. legacy-landlords
customerIdidLegacy 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
reportIdidOwning report. soc-reports
parentItemIdidParent item. Empty for a top-level item (a room). soc-report-items
internalExternalenum"internal" or "external".
namestringItem name.
floorstringFloor the item sits on.
ordernumberSort position within its parent.
conditionenum"poor", "fair", "satisfactory" or "good".
descriptionstringDescription of the element.
commentstringSurveyor's comment on its condition.
deletedAttimestampSoft-delete marker. Rows with a value here are deleted and excluded from reports; they are exported so nothing is hidden from you.
clientIdstringOffline-sync idempotency key from the mobile app.
createdAttimestampWhen the item was created.
updatedAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
reportItemIdidItem the photo belongs to. soc-report-items
ordernumberSort position within the item.
takenAttimestampWhen the photo was taken on site.
storageIdidFile id of the full-size image. files
thumbnailStorageIdidFile id of the device-generated thumbnail, where one exists. files
exportPathstringPath of the full-size image inside the photo archive.
contentTypestringMIME type of the full-size image.
sizeBytesnumber · bytesSize of the full-size image.
clientIdstringOffline-sync idempotency key from the mobile app.
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
propertyIdidProperty surveyed. properties
clientPartyIdidCommissioning client. parties
titlestringSurvey title.
baseYearnumberProgramme year 1 — the today's-prices baseline.
programmeLengthYearsnumber · yearsLength of the programme.
inflationRatePctnumber · percentAnnual inflation applied. Empty means today's prices.
currencystringCurrency code, "GBP" throughout.
statusenum"draft", "inspected", "issued" or "superseded".
supersededBySurveyIdidSurvey that replaced this one. ppm-surveys
scopeNotesstringScope and caveats for the survey.
surveyorNamestringSurveyor name as recorded on the survey.
inspectionDatetimestampDate of inspection.
createdByidUser who created the survey. users
createdAttimestampWhen the survey was created.
updatedAttimestampWhen the survey was last edited.
customerIdidLegacy 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
surveyIdidOwning survey. ppm-surveys
elementLibraryIdidElement library entry this came from. element-library
elementCodestringElement code, as recorded at the time.
elementNamestringElement name, as recorded at the time.
locationstringWhere in the building.
descriptionstringDescription of the observation.
conditionGradeenum"good", "fair", "poor" or "hazardous".
priorityenum"1_urgent", "2_essential", "3_desirable" or "4_cyclical".
timeframeenum"urgent", "immediate_within_1yr", "short_1_2yrs", "medium_3_5yrs" or "long_6_10yrs".
remedialActionstringRecommended remedial action.
hsRiskFlagbooleanWhether a health and safety risk was flagged.
hsRiskNotesstringNotes on the flagged risk.
remainingLifeYearsnumber · yearsEstimated remaining life.
sortOrdernumberSort position within the survey.
createdAttimestampWhen the item was created.
updatedAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
itemIdidItem the cost belongs to. ppm-items
surveyIdidOwning survey, denormalised for whole-survey queries. ppm-surveys
descriptionstringWhat the cost covers.
costTypeenum"one_off" or "cyclical".
amountPencenumber · penceTotal cost, base-year, excluding VAT.
quantitynumberQuantity, where the cost is built from quantity x rate.
unitstringUnit of measure for the quantity.
ratePencenumber · penceRate per unit, base-year, excluding VAT.
startYearnumberProgramme year the cost first falls, 1-based against the survey's baseYear.
cycleYearsnumber · yearsRepeat interval, for a cyclical cost.
endYearnumberProgramme year the cost stops recurring.
createdAttimestampWhen the cost line was created.
updatedAttimestampWhen the cost line was last edited.
amountnumber · penceLegacy column, same unit as amountPence. Superseded; present only on older rows.
ratenumber · penceLegacy 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
jobNonumberJob number, allocated per account.
statusenum"Draft RCAs", "Pending Approval" or "Approved". Note that "Updates Due" is not a stored status — it is derived from review dates.
datedateDate of inspection, ISO yyyy-mm-dd. Often not the date the record was created — see createdAt.
assessmentTypeenum"full" or "annual".
basedOnAssessmentIdidAssessment this one was rolled forward from. rca-assessments
clientPartyIdidCommissioning client. parties
clientNamestringClient name snapshot, as printed on the report.
propertyIdidProperty assessed. properties
propNamestringProperty name snapshot.
townstringTown or city. Snapshot taken at the time of writing.
countystringCounty. Snapshot taken at the time of writing.
postcodestringPostcode. Snapshot taken at the time of writing.
propertyTypestringProperty type. Free text — the option list is expected to change.
areaSourcestringWhere the floor area came from. Free text.
descriptionstringProperty description.
notesHtmlstringReport notes, as HTML.
surveyorUserIdidSurveyor who carried out the assessment. users
surveyorNamestringSurveyor name snapshot.
surveyorEmailstringSurveyor email snapshot.
issuingOfficeIdidIssuing office, set only where it differs from the surveyor's own office. offices
dayOneCostPoundsnumber · poundsDay-one reinstatement cost, denormalised from the calculator for reporting.
surveyFeenumber · poundsFee charged for the assessment.
buildCostsReviewedQuarterstringQuarter the build-cost rates were last checked against a cost index.
buildCostsReviewedYearnumberYear the build-cost rates were last checked.
reviewPeriodMonthsnumber · monthsReview cadence for this assessment, overriding the 12-month default.
aiUsedbooleanWhether AI played a part, as RICS expects reports to state.
aiUseNotesstringExplanation of how AI was used.
specificExclusionsstringPer-job exclusions. Empty means the practice default in rca-settings applied.
contaminationCommentarystringPer-job contamination commentary, or empty for the practice default.
costDataSourcestringPer-job cost data source, or empty for the practice default.
otherAssumptionsstringPer-job assumptions, or empty for the practice default.
limitationsstringPer-job limitations, or empty for the practice default.
approvalRequestedAttimestampWhen it was sent for Director approval.
approvalRequestedByUserIdidWho sent it for approval. users
approvalRequestedByNamestringName snapshot of who sent it for approval.
approverUserIdsjsonDirectors nominated to sign it off, as a JSON array of user ids.
approvedAttimestampWhen it was approved.
approvedByUserIdidDirector who approved it. users
approvedByNamestringName snapshot of the approving Director.
photoIdsjsonPhoto file ids, as a JSON array. Resolve via files.csv. files
createdByidUser who created the assessment. users
createdAttimestampWhen the assessment was created.
updatedAttimestampWhen the assessment was last edited.
clientIdidLegacy link into legacy-clients, pre-parties. legacy-clients
locationIdidLegacy link into legacy-rca-locations, pre-merge into properties. legacy-rca-locations
dayOneCostnumber · poundsLegacy 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
assessmentIdidAssessment being discussed. rca-assessments
authorUserIdidWho wrote the comment. users
authorNamestringAuthor name snapshot, so the thread still reads correctly after someone leaves.
bodystringComment text.
kindenum"comment" for a plain reply, "sent_back" for the comment that returned it to draft, "approved" for sign-off.
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
nextJobNumbernumberNext job number to be allocated.
vatPctnumber · percentVAT rate applied.
profPctnumber · percentProfessional fees percentage applied.
defaultFullSurveyFeenumber · poundsDefault fee for a full survey.
defaultAnnualSurveyFeenumber · poundsDefault fee for an annual review.
defaultNotesHtmlstringDefault report notes, as HTML.
declarationTextstringBoilerplate for the declaration page.
liabilityCapBasisstringBasis on which liability is capped.
aiNotUsedStatementstringPrinted when a report declares no AI involvement.
caveatConditionstringFixed caveat: condition.
caveatNotMarketValuestringFixed caveat: not a market valuation.
caveatInsuranceOnlystringFixed caveat: insurance purposes only.
caveatBuildingInsuranceOnlystringFixed caveat: building insurance only.
defaultSpecificExclusionsstringPractice default for per-job specific exclusions.
defaultContaminationCommentarystringPractice default for contamination commentary.
defaultCostDataSourcestringPractice default for the cost data source.
defaultOtherAssumptionsstringPractice default for other assumptions.
defaultLimitationsstringPractice 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
parentIdidParent element, for a sub-element. element-library
codestringElement code.
namestringElement name.
defaultLifespanYearsnumber · yearsDefault expected lifespan.
defaultCycleYearsnumber · yearsDefault replacement cycle.
defaultUnitstringDefault unit of measure.
isUserCustombooleanTrue for entries your practice added.
ordernumberSort position.
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
namestringFloor name.
ordernumberSort position.
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
userIdidWho pinned it. users
reportIdidReport pinned. soc-reports
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
userIdidWho raised it. users
modulestringModule the request relates to.
detailsstringWhat was asked for.
statusstringCurrent status.
statusChangedAttimestampWhen the status last moved off the initial state.
statusChangedByUserIdidWho moved the status. users
responsestringReply written back to the practice.
respondedAttimestampWhen the reply was written.
respondedByUserIdidWho replied. users
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
userIdidWho raised it. users
kindstringWhat kind of request it is.
requestedPlanstringTarget plan, for an upgrade request.
requestedSeatsnumberTotal seats wanted, for a seats request.
notestringAccompanying note.
statusstringCurrent status.
createdAttimestampWhen 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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
actorUserIdidWho performed the action. users
actorNamestringTheir display name at the time, snapshotted so the log stays accurate after a rename.
moduleenum"soc", "ppm", "rca", or "account" for account-level actions such as this export.
actionenum"created", "updated", "status_changed", "submitted_for_approval", "sent_back", "approved", "exported" or "deleted".
entityIdidThe record acted on. Join against whichever file the module implies.
entityLabelstringHuman label for the record at the time, e.g. "Job 507".
detailsstringExtra context, where the action recorded any.
createdAttimestampWhen 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.

ColumnTypeMeaning
storageIdidFile id, as referenced from the other files.
kindenum"soc_photo", "soc_photo_thumbnail", "rca_photo" or "org_logo".
ownerIdidRecord the file belongs to — a SOC photo row, an RCA assessment, or the organisation.
exportPathstringPath inside the photo archive.
contentTypestringMIME type.
sizeBytesnumber · bytesFile size.
sha256stringBase64 SHA-256 digest, for verifying the file arrived intact.

Clients (legacy)

Legacy

csv/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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
namestringOrganisation name.
contactNamestringNamed day-to-day contact.
emailstringContact email address.
phonestringContact phone number.
addressLine1stringFirst line of the address.
addressLine2stringSecond line of the address.
townstringTown or city.
countystringCounty.
postcodestringPostcode.
notesstringFree-text notes.
createdByidUser who added the record. users
createdAttimestampWhen the record was added.
updatedAttimestampWhen the record was last edited.

Landlords (legacy)

Legacy

csv/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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
namestringOrganisation name.
contactNamestringNamed day-to-day contact.
emailstringContact email address.
phonestringContact phone number.
addressLine1stringFirst line of the address.
addressLine2stringSecond line of the address.
townstringTown or city.
countystringCounty.
postcodestringPostcode.
notesstringFree-text notes.
createdByidUser who added the record. users
createdAttimestampWhen the record was added.
updatedAttimestampWhen the record was last edited.

RCA locations (legacy)

Legacy

csv/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.

ColumnTypeMeaning
_ididPrimary key. Opaque and stable for the life of the record.
_creationTimetimestampWhen the row was first written. Epoch milliseconds, may be fractional.
organizationIdidOwning account. Constant across a single export. organization
clientIdidOwning client. legacy-clients
propNamestringProperty name. Became properties.name.
townstringTown or city.
countystringCounty.
postcodestringPostcode.
createdAttimestampWhen 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.

Back to data ownership