Build with Sepolo. Open from the first request.
Explore authentication, endpoints and data contracts without a login. Connect your systems to Sepolo through organization-scoped API requests. Includes customer, vendor and service-parts lookup contracts.
Read, explore and download without an account. API requests use your organization’s key and permissions.
Your field service layer. With or without an ERP.
Give service teams one place to plan work, support technicians and understand asset costs. Connect Sepolo to your financial system, or start with your own service records.
Keep your ERP at the financial center.
Use Sepolo for service planning, mobile reports, parts, time and connected equipment. Bring in master data through the configured ERP integration and prepare financial handover through the supported provider workflow. Agree the required operations and mapping before rollout.
Start with service. Add connections when needed.
Run service operations with local customer, asset and item records in the online portal and mobile app. An ERP connector is optional. Sepolo manages service delivery and operating costs; it is not a complete accounting or ERP replacement.
Choose the right ERP connection
- Microsoft Dynamics 365 Business Central
- Dynamics 365 Business Central has a provider implementation for master-data synchronization and supported financial workflows. Validate the tenant connection, permissions, item mapping and required handover with your implementation team.
- SAP
- Treat SAP as a scoped integration project. The current SAP parts client is a prototype, and automated SAP financial delivery is not ready to promise as a standard connector. Agree the required SAP interfaces, implementation and acceptance tests first.
- e-conomic · Dinero · Uniconta · AutoCount · SQL Account
- Other provider implementations include e-conomic, Dinero, Uniconta, AutoCount and SQL Account. Supported operations and setup differ by provider. Source implementation is not certification of a deployed customer integration.
Decide who owns each record
With an ERP, keep agreed customer, supplier, item and financial master data there. Sepolo connects that context to assets, visits, reports, parts and time. The lookup APIs read your organization’s Sepolo records; freshness follows the configured synchronization, not a live ERP query on every call.
Understand what the lookup APIs return
Customer and parts lookups are read-only. Parts come from the organization’s physical service catalog: local items and mapped ERP parts allowed by its stock/position policy, rather than the entire raw ERP item cache. Service-only items are excluded. Catalog quantity is not a guarantee of current ERP stock availability. These endpoints do not create ERP customers/items or post invoices; confirm the currency of catalog prices during setup.
Use externalSystem plus externalCustomerId for the source identity. customerNumber currently mirrors externalCustomerId; it is not a separately resolved ERP account number. updatedAtUtc is nullable. Reconcile by stable IDs: live paging is not a transactional snapshot or change feed.
Prove one complete service flow
Agree the data owner, target ERP version, credentials and required operations. Validate the key with /api/v1/me, read vendors, customers and eligible parts, then test the selected service-to-finance workflow in your configured environment. Keep operational API keys on trusted servers.
Your first request
Use the base URL of your Sepolo environment. The example below checks the key, organization, client identity and available scopes.
curl "https://app.sepolo.app/api/v1/me" -H "X-Sepolo-Api-Key: YOUR_API_KEY"Authentication and access
Send X-Sepolo-Api-Key: YOUR_API_KEY on each request, or use Authorization: Bearer YOUR_API_KEY. The key determines the organization; it does not grant access to other organizations. Keep keys on your server or in your secret store, not in public frontend code.
Each operation lists its required scope. Impact Mapping additionally requires the organization’s Impact Mapping license. Ask your organization’s administrator for API access.
Requests, dates and pagination
Use UTC ISO 8601 timestamps for date filters. Telemetry and PointGuard cycle lists require from/to (or fromUtc/toUtc), with at most 31 days per request. Movement windows allow up to 366 days. Appointments and service visits default to a 60-day window when omitted, with a 366-day maximum.
Where pageSize and cursor are supported, use the returned nextCursor for the next page and stop when hasMore is false. Page size is capped at 500. Some list endpoints return a single data page and have no cursor parameter; check each operation. Treat cursors as opaque.
Endpoint reference
Browse the implemented v1 operations. Expand an operation for parameters, permissions and request fields. Availability in your environment depends on its deployed version and configuration.
Identity
Confirm the organization and scopes associated with the key.
GET/api/v1/me
Required scope Valid organization API key
Successful response 200 PublicApiMeResponse
Response fields
organizationId·GuidclientId·stringclientName·stringscopes·IReadOnlyList<string>version·stringrateLimit·PublicApiRateLimitDtoallowedGroupIds·IReadOnlyList<int>allowedCustomerIds·IReadOnlyList<string>
Vendors
Read local and external ERP vendors for the organization.
GET/api/v1/vendors
Required scope vendors.read
Successful response 200 PublicApiPage<PublicApiVendorDto>
Response fields
vendorId·Guidname·stringcontactName·stringcontactEmail·stringcontactPhone·stringcity·stringcountry·stringisExternal·boolexternalSystem·stringexternalVendorNumber·stringcreatedOn·DateTimemodifiedOn·DateTimestatus·bool
Customers
Read local and synchronized customer directory records for the key’s organization. Filter by externalSystem and page through the results.
GET/api/v1/customers
Required scope customers.read
Parameters
externalSystem· Query ·string?pageSize· Query ·int· Default 100cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiCustomerDto>
Response fields
customerDirectoryId·Guid?externalSystem·stringexternalCustomerId·stringcustomerNumber·stringname·stringemail·stringphone·stringcity·stringcountry·stringupdatedAtUtc·DateTime?
Items and parts
Read eligible physical service catalog items, including local and mapped ERP parts, with item identifiers, vendor, catalog quantity, prices and ERP references. Filter by vendorId and status.
GET/api/v1/inventory/parts
Required scope inventory.read
Parameters
vendorId· Query ·Guid?status· Query ·string?pageSize· Query ·int· Default 100cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiInventoryPartDto>
Response fields
partId·GuidpartName·stringpartNumber·stringitemNo·stringvendorName·stringquantity·intcostPrice·decimalsalesPrice·decimalstatus·boolexternalSystem·stringexternalPartId·stringisErpManaged·bool
Appointments
Read calendar appointments, optionally filtered by user.
GET/api/v1/appointments
Required scope appointments.read
Parameters
fromUtc· Query ·DateTime?toUtc· Query ·DateTime?userId· Query ·Guid?
Successful response 200 PublicApiPage<PublicApiAppointmentDto>
Response fields
appointmentId·GuiduserId·Guidsubject·stringdescription·stringlocation·stringstartTimeUtc·DateTimeendTimeUtc·DateTimeisAllDay·boolcalendarId·inttimezoneKey·stringrecurrenceRule·stringrecurrenceId·Guid?recurrenceException·stringcreatedUtc·DateTimeupdatedUtc·DateTime
Service visits
Read planned work, status, asset context and available agreement fields.
GET/api/v1/service-visits
Required scope service_visits.read
Parameters
fromUtc· Query ·DateTime?toUtc· Query ·DateTime?
Successful response 200 PublicApiPage<PublicApiServiceVisitDto>
Response fields
serviceVisitId·Guidtitle·stringtype·GuidtypeText·stringstate·intstateText·stringstartDate·DateTime?endDate·DateTime?startTime·TimeSpan?endTime·TimeSpan?assetId·GuidexternalSystem·stringexternalCustomerId·stringestimatedCost·decimal?actualCost·decimal?slaServiceContractId·Guid?slaResponseMinutes·int?slaDueAt·DateTime?maintenanceContractId·Guid?maintenanceContractAssetId·Guid?
Agreements
Read SLA, onsite service and remote support agreements and their coverage.
GET/api/v1/agreements
Required scope agreements.read
Parameters
type· Query ·string?customerId· Query ·string?status· Query ·string?pageSize· Query ·int· Default 100cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiAgreementDto>
Response fields
agreementId·GuidagreementType·stringagreementKind·stringagreementNumber·stringname·stringstatus·stringcustomerDirectoryId·Guid?externalSystem·stringexternalCustomerId·stringcustomerName·stringstartDate·DateTimeendDate·DateTime?contractAmount·decimalincludesLabor·boolincludesTravel·boolincludesRemoteSupport·boolpartsCoverage·stringpartsCoverageLimitText·stringserviceDeliveryManagerName·stringserviceDeliveryManagerEmail·stringproposedAt·DateTime?followUpAt·DateTime?wonAt·DateTime?lostAt·DateTime?createdUtc·DateTimeupdatedUtc·DateTime?
GET/api/v1/agreements/{agreementId}
Required scope agreements.read
Parameters
agreementId· Path ·Guid
Successful response 200 PublicApiAgreementDetailDto
Response fields
agreement·PublicApiAgreementDtosla·PublicApiSlaTermsDto?coverage·IReadOnlyList<PublicApiAgreementCoverageDto>assets·IReadOnlyList<PublicApiAgreementAssetDto>resources·IReadOnlyList<PublicApiAgreementResourceDto>supportHourBuckets·IReadOnlyList<PublicApiAgreementSupportBucketDto>
Remote support
Read support cases, SLA context and recorded time consumption.
GET/api/v1/remote-support-cases
Required scope remote_support.read
Parameters
status· Query ·string?assetId· Query ·Guid?slaOnly· Query ·bool?customer· Query ·string?pageSize· Query ·int· Default 100cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiRemoteSupportCaseDto>
Response fields
serviceReportId·GuidserviceVisitId·GuidassetId·GuidcaseNumber·stringreportNumber·stringtitle·stringreasonForService·stringcustomerName·stringassetName·stringstate·intstateText·stringcreatedAt·DateTimeplannedStart·DateTime?actualStartOfInspection·DateTime?actualEndOfInspection·DateTime?hasActiveTimer·boolactiveTimerStartedAt·DateTime?remoteWorkMinutes·int?closedRemoteWorkMinutes·int?timeEntryCount·intremoteSupporters·stringremoteSupporterCount·intlastRemoteSupporter·stringhasEscalation·boolescalationLevel·stringhasSlaAgreement·boolslaAgreementNumber·stringslaAgreementName·stringslaCoverageScope·stringslaResponseHours·int?slaDueAt·DateTime?slaMinutesRemaining·int?
GET/api/v1/remote-support-cases/{serviceReportId}
Required scope remote_support.read
Parameters
serviceReportId· Path ·Guid
Successful response 200 PublicApiRemoteSupportCaseDetailDto
Response fields
case·PublicApiRemoteSupportCaseDtodescription·stringproblemSummary·stringsolution·stringcustomerEmail·stringcustomerPhone·stringcustomerAddress·stringprimaryContactName·stringprimaryContactJobTitle·stringprimaryContactEmail·stringprimaryContactPhone·stringtimeEntries·IReadOnlyList<PublicApiRemoteSupportTimeEntryDto>
Devices and telemetry
Read devices, telemetry, movements, PointGuard cycles and samples.
GET/api/v1/devices
Required scope devices.read
Parameters
updatedSince· Query ·DateTime?groupId· Query ·int?status· Query ·string?pageSize· Query ·int· Default 100cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiDeviceDto>
Response fields
deviceId·stringdeviceName·stringdeviceType·intorganizationId·GuidgroupId·intdeviceLocation·stringdescription·stringdeviceStatus·intmodelId·GuidmodelName·stringequipmentType·stringcalculatedNextService·DateTimelatitude·doublelongitude·doublelastTelemetryAt·DateTime?temperature·double?humidity·double?batteryVoltage·double?batteryPercentage·double?
GET/api/v1/devices/{deviceId}
Required scope devices.read
Parameters
deviceId· Path ·string
Successful response 200 PublicApiDeviceDto
Response fields
deviceId·stringdeviceName·stringdeviceType·intorganizationId·GuidgroupId·intdeviceLocation·stringdescription·stringdeviceStatus·intmodelId·GuidmodelName·stringequipmentType·stringcalculatedNextService·DateTimelatitude·doublelongitude·doublelastTelemetryAt·DateTime?temperature·double?humidity·double?batteryVoltage·double?batteryPercentage·double?
GET/api/v1/devices/{deviceId}/telemetry
Required scope telemetry.read
Parameters
deviceId· Path ·stringfrom· Query ·DateTime?to· Query ·DateTime?fromUtc· Query ·DateTime?toUtc· Query ·DateTime?metrics· Query ·string?telemetryType· Query ·int?cycleId· Query ·string?pageSize· Query ·int· Default 500cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiTelemetryDto>
Response fields
deviceId·stringstamp·DateTimelatitude·decimallongitude·decimaltemperature·doublehumidity·doublebatteryVoltage·doublebatteryCurrent·doublebatteryPercentage·doublecurrent·doublesignalQuality·doublerailTemperature·doubletiltX·doubletiltY·doubletiltZ·doubledescription·stringtelemetryType·int?cycleId·stringcycleSampleIndex·int?cycleSampleOffsetMs·int?cycleDurationMs·int?cycleSampleCount·int?schemaVersion·stringpressure1Bar·double?pressure2Bar·double?endStop1·bool?endStop2·bool?
GET/api/v1/devices/{deviceId}/movements
Required scope movements.read
Parameters
deviceId· Path ·stringfrom· Query ·DateTime?to· Query ·DateTime?fromUtc· Query ·DateTime?toUtc· Query ·DateTime?minDurationSeconds· Query ·int· Default 0pageSize· Query ·int· Default 500cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiMovementDto>
Response fields
id·GuiddeviceId·stringlocation·stringstart·DateTimestop·DateTimeduration·doublestartCurrent·doublestopCurrent·doubleaverageCurrent·doublepeakCurrent·doublecycleCount·intisAnomalySuggested·boolanomalyScore·double?anomalyReason·stringmodelVersion·stringbaselineMean·double?baselineStd·double?anomalyDecisionLabel·stringanomalyDecisionAction·stringanomalyDecisionConfidence·decimal?anomalyDecisionReason·stringanomalyPatternId·Guid?estimatedNextService·DateTime?currentSignature·PublicApiMovementSignatureDto?
GET/api/v1/devices/{deviceId}/movements/{movementId}/signature
Required scope movements.read
Parameters
deviceId· Path ·stringmovementId· Path ·Guid
Successful response 200 PublicApiMovementSignatureDto
Response fields
movementId·GuiddeviceId·stringstart·DateTimestop·DateTimesampleCount·int?medianSampleIntervalMs·double?averageCurrent·double?peakCurrent·double?currentAreaAmpSeconds·double?currentRms·double?currentStdDev·double?startupSlopeAmpPerSecond·double?earlyMeanCurrent·double?plateauMeanCurrent·double?endMeanCurrent·double?observedDurationSeconds·double?highLoadDurationSeconds·double?peakHoldDurationSeconds·double?lowLoadTailDurationSeconds·double?rampDownSlopeAmpPerSecond·double?currentP10·double?currentP50·double?currentP90·double?clippedSampleRatio·double?shapeJson·string
GET/api/v1/devices/{deviceId}/pointguard/cycles
Required scope telemetry.read
Parameters
deviceId· Path ·stringfrom· Query ·DateTime?to· Query ·DateTime?fromUtc· Query ·DateTime?toUtc· Query ·DateTime?pageSize· Query ·int· Default 500cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiPointGuardCycleDto>
Response fields
deviceId·stringcycleId·stringstart·DateTimestop·DateTimesamples·intcycleDurationMs·int?cycleSampleCount·int?averageCurrent·double?peakCurrent·double?minCurrent·double?
GET/api/v1/devices/{deviceId}/pointguard/cycles/{cycleId}/samples
Required scope telemetry.read
Parameters
deviceId· Path ·stringcycleId· Path ·stringpageSize· Query ·int· Default 500cursor· Query ·string?· Default null
Successful response 200 PublicApiPage<PublicApiTelemetryDto>
Response fields
deviceId·stringstamp·DateTimelatitude·decimallongitude·decimaltemperature·doublehumidity·doublebatteryVoltage·doublebatteryCurrent·doublebatteryPercentage·doublecurrent·doublesignalQuality·doublerailTemperature·doubletiltX·doubletiltY·doubletiltZ·doubledescription·stringtelemetryType·int?cycleId·stringcycleSampleIndex·int?cycleSampleOffsetMs·int?cycleDurationMs·int?cycleSampleCount·int?schemaVersion·stringpressure1Bar·double?pressure2Bar·double?endStop1·bool?endStop2·bool?
Impact Mapping
Read and manage dependencies, business capabilities, impact analysis and imports.
GET/api/v1/impact-mapping/relationship-types
Required scope impact_mapping.read · Impact Mapping license required
Successful response 200 IReadOnlyList<PublicApiImpactRelationshipTypeDto>
Response fields
id·intname·stringdescription·string?directionLabel·string?reverseLabel·string?isSystemDefault·bool
GET/api/v1/impact-mapping/relationships
Required scope impact_mapping.read · Impact Mapping license required
Parameters
assetId· Query ·Guid
Successful response 200 PublicApiPage<PublicApiImpactRelationshipDto>
Response fields
id·GuidsourceAssetId·GuidsourceAssetName·string?targetAssetId·GuidtargetAssetName·string?relationshipTypeId·intrelationshipTypeName·string?impactLevel·intisBlockingDependency·boolhasRedundancy·boolfailureImpactDescription·string?estimatedDowntimeCostPerHour·decimal?notifyRole·string?notifyEmail·string?notes·string?
POST/api/v1/impact-mapping/relationships
Required scope impact_mapping.write · Impact Mapping license required
JSON request body PublicApiCreateImpactRelationshipRequest
Successful response 201 CreatedId
PUT/api/v1/impact-mapping/relationships/{relationshipId}
Required scope impact_mapping.write · Impact Mapping license required
Parameters
relationshipId· Path ·Guid
JSON request body PublicApiCreateImpactRelationshipRequest
Successful response 204
DELETE/api/v1/impact-mapping/relationships/{relationshipId}
Required scope impact_mapping.write · Impact Mapping license required
Parameters
relationshipId· Path ·Guid
Successful response 204
GET/api/v1/impact-mapping/business-capabilities
Required scope impact_mapping.read · Impact Mapping license required
Successful response 200 PublicApiPage<PublicApiBusinessCapabilityDto>
Response fields
id·Guidname·stringdescription·string?criticalityLevel·intestimatedDowntimeCostPerHour·decimal?ownerName·string?ownerEmail·string?
POST/api/v1/impact-mapping/business-capabilities
Required scope impact_mapping.write · Impact Mapping license required
JSON request body PublicApiCreateBusinessCapabilityRequest
Successful response 201 CreatedId
PUT/api/v1/impact-mapping/business-capabilities/{businessCapabilityId}
Required scope impact_mapping.write · Impact Mapping license required
Parameters
businessCapabilityId· Path ·Guid
JSON request body PublicApiCreateBusinessCapabilityRequest
Successful response 204
DELETE/api/v1/impact-mapping/business-capabilities/{businessCapabilityId}
Required scope impact_mapping.write · Impact Mapping license required
Parameters
businessCapabilityId· Path ·Guid
Successful response 204
POST/api/v1/impact-mapping/business-capability-links
Required scope impact_mapping.write · Impact Mapping license required
JSON request body PublicApiLinkAssetCapabilityRequest
Successful response 204
PUT/api/v1/impact-mapping/business-capability-links/{linkId}
Required scope impact_mapping.write · Impact Mapping license required
Parameters
linkId· Path ·Guid
JSON request body PublicApiUpdateAssetCapabilityLinkRequest
Successful response 204
DELETE/api/v1/impact-mapping/business-capability-links/{linkId}
Required scope impact_mapping.write · Impact Mapping license required
Parameters
linkId· Path ·Guid
Successful response 204
GET/api/v1/impact-mapping/asset-capabilities
Required scope impact_mapping.read · Impact Mapping license required
Parameters
assetId· Query ·Guid
Successful response 200 PublicApiPage<PublicApiAssetCapabilityLinkDto>
Response fields
id·GuidassetId·GuidassetName·string?businessCapabilityId·GuidbusinessCapabilityName·string?criticalityLevel·intimpactLevel·intisEssential·boolnotes·string?
GET/api/v1/impact-mapping/analysis/{assetId}
Required scope impact_mapping.read · Impact Mapping license required
Parameters
assetId· Path ·GuidmaxDepth· Query ·int· Default 5
Successful response 200 PublicApiImpactAnalysisDto
Response fields
rootAssetId·GuidrootAssetName·stringimpactedAssets·IReadOnlyList<PublicApiImpactedAssetDto>impactedCapabilities·IReadOnlyList<PublicApiImpactedCapabilityDto>maxImpactLevel·intestimatedTotalDowntimeCostPerHour·decimalrecommendation·PublicApiImpactRecommendationDto?
GET/api/v1/impact-mapping/analysis/{assetId}/graph
Required scope impact_mapping.read · Impact Mapping license required
Parameters
assetId· Path ·GuidmaxDepth· Query ·int· Default 5
Successful response 200 PublicApiImpactGraphDto
Response fields
rootAsset·PublicApiImpactGraphRootDtonodes·IReadOnlyList<PublicApiImpactGraphNodeDto>links·IReadOnlyList<PublicApiImpactGraphLinkDto>summary·PublicApiImpactGraphSummaryDtorecommendation·PublicApiImpactRecommendationDto?
POST/api/v1/impact-mapping/import/validate
Required scope impact_mapping.write · Impact Mapping license required
JSON request body PublicApiImpactMappingImportRequest
Successful response 200 PublicApiImpactMappingImportResponse
Response fields
committed·boolvalidRows·intskippedRows·intbusinessFunctions·intrelationships·intassetBusinessFunctionLinks·introws·IReadOnlyList<PublicApiImpactMappingImportRowResultDto>
POST/api/v1/impact-mapping/import/commit
Required scope impact_mapping.write · Impact Mapping license required
JSON request body PublicApiImpactMappingImportRequest
Successful response 200 PublicApiImpactMappingImportResponse
Response fields
committed·boolvalidRows·intskippedRows·intbusinessFunctions·intrelationships·intassetBusinessFunctionLinks·introws·IReadOnlyList<PublicApiImpactMappingImportRowResultDto>
Response and error handling
- 400
- Invalid request, missing required value or invalid date window. Check the operation’s parameters.
- 401
- Missing or invalid API key. Check the configured environment and organization key.
- 403
- The required scope or license is missing. Request access from your organization’s administrator.
- 404
- The requested record is unavailable or not found in the organization context.
- 503
- The customer or parts data source is temporarily unavailable. Retry later; this response is not an empty successful export.