This documentation is currently under development. Certain sections are not yet complete and will be added shortly.
For the complete documentation index, see llms.txt. This page is also available as Markdown.

Sftp

List files in a tenant's SFTP inbox

get
/api/{tenantId}/admin/sftp/files

Returns every file currently visible in the tenant's SFTP inbox, each tagged with its status. Returns an empty list — not an error — when the tenant has no SFTP inbox.

Authorization

Requires tenant.sftp:read scope.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
statusstringOptional

Optional filter: pending, processed, or error.

Responses
200

File list returned.

One file sitting in the tenant's SFTP inbox.

fileNamestringRequired

Original file name (stripped of any internal timestamp prefix).

statusstringRequired

One of pending, processed, or error.

sizeInBytesinteger · int64Required

File size in bytes.

lastModifiedstring · date-timeRequired

When the file was last written, in UTC.

blobPathstringRequired

Stable identifier for this specific file run. Pass this to the import-log endpoint. Unlike Neo.Web.Api.Admin.Controllers.Sftp.SftpController.SftpFileResponse.FileName, this is unique even when the same file name is re-imported multiple times: each run produces a distinct blob path.

get/api/{tenantId}/admin/sftp/files
GET /api/{tenantId}/admin/sftp/files HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
[
  {
    "fileName": "text",
    "status": "text",
    "sizeInBytes": 1,
    "lastModified": "2026-01-01T00:00:00.000Z",
    "blobPath": "text"
  }
]

Download one SFTP-dropped file

get
/api/{tenantId}/admin/sftp/files/content

Streams the file exactly as the customer dropped it — no parsing, no reformatting — as an attachment named after the file itself.

The body is gzip-compressed on the fly whenever the caller advertises Accept-Encoding: gzip, which every browser does: these drops are overwhelmingly CSV, where gzip cuts the transfer by roughly an order of magnitude. This is transport compression, not a different artifact — the client decompresses transparently and ends up with the original file, byte for byte, under its original name. A caller that does not advertise gzip gets the bytes uncompressed.

Authorization

Requires tenant.sftp:download scope — deliberately separate from tenant.sftp:read, which exposes file names, row counts and pass identifiers but never the customer data in the file.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
blobPathstringOptional

Blob path, exactly as returned by the blobPath field in the files list endpoint.

Responses
200

File content returned as an attachment.

string · binaryOptional
get/api/{tenantId}/admin/sftp/files/content
GET /api/{tenantId}/admin/sftp/files/content HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
binary

Get the import log for one SFTP-dropped file

get
/api/{tenantId}/admin/sftp/files/log

Returns the full story of what happened when this file was imported: whether the import function itself ran cleanly, aggregate row counts, and a per-pass breakdown of which customer passes were touched and which failed, with the reason.

Authorization

Requires tenant.sftp:read scope.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Query parameters
blobPathstringOptional

Blob path, exactly as returned by the blobPath field in the files list endpoint. Uniquely identifies one file run even when the same file name is re-imported multiple times.

Responses
200

Import log returned.

Full story of what happened when one SFTP-dropped file was imported.

statusstringRequired

Current status of the file: pending, processed, or error.

fileRunFoundbooleanRequired

Whether a matching import run was found in the log store. false while the file is pending.

fileRunSuccessboolean · nullableOptional

Whether the import function itself completed successfully. null when not found.

batchCountinteger · nullableOptional

Number of batches sent to the wallet update pipeline.

rowCountinteger · nullableOptional

Total rows read from the file.

successCountinteger · nullableOptional

Rows that resolved to at least one pass and were queued for update.

noMatchCountinteger · nullableOptional

Rows whose identifiers matched no pass at all — a data-quality signal, not a technical failure.

errorCountinteger · nullableOptional

Rows that threw while being transformed.

get/api/{tenantId}/admin/sftp/files/log
GET /api/{tenantId}/admin/sftp/files/log HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
{
  "status": "text",
  "fileRunFound": true,
  "fileRunSuccess": null,
  "batchCount": null,
  "rowCount": null,
  "successCount": null,
  "noMatchCount": null,
  "errorCount": null,
  "passOutcomes": [
    {
      "passId": null,
      "success": true,
      "errorMessage": null
    }
  ]
}

Get SFTP status for a tenant

get
/api/{tenantId}/admin/sftp/status

Reports whether SFTP (Triglav) file import is enabled for the tenant, and a quick activity summary. A tenant with no SFTP inbox simply has the feature disabled — this is the normal case for most tenants, reflected as sftpEnabled: false, never a 404.

Authorization

Requires tenant.sftp:read scope.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Responses
200

Status returned.

Quick-glance SFTP activity summary for a tenant.

sftpEnabledbooleanRequired

false when the tenant has no SFTP inbox at all — the normal case for most tenants, not an error. Every other field is null in that case.

pendingCountinteger · nullableOptional

Files dropped but not yet processed.

processedCountinteger · nullableOptional

Files successfully processed.

errorCountinteger · nullableOptional

Files that failed processing.

lastActivitystring · nullableOptional

Timestamp of the most recently modified file across all folders.

get/api/{tenantId}/admin/sftp/status
GET /api/{tenantId}/admin/sftp/status HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
{
  "sftpEnabled": true,
  "pendingCount": null,
  "processedCount": null,
  "errorCount": null,
  "lastActivity": null
}

Last updated