Skip to content
Docs
foxborne.comRequest a pilot

Push bundles with the Ingest API

Let test rigs and CI pipelines push signed bundles to Foxborne over HTTPS, with a service token scoped to ingest. The files in each bundle are hashed on arrival and matched to runs like files from any other source.

How-toEvery deploymentAdminMarkdown
On this page8

Test rigs and pipelines produce logs on their own schedule. The Ingest API source lets them push those files to Foxborne as signed bundles, so nobody has to import them by hand. In the example dataset, a bench rig pushes its perception soak tests this way.

Before you start#

  • You need the Admin role.
  • The HTTPS ingest API reads Listening on the Ingest tab of Integrations.
  • The sender reaches your deployment over HTTPS on port 443.
  • The sender holds a device certificate for mutual TLS. Each push authenticates with that certificate and a short-lived bearer token.
  • The sender can write a SHA-256 manifest of the files it sends.

Add the source#

  1. Choose Ingest API

    In Sources, select Add source. Under Automation, pick Ingest API: Your test rigs and pipelines push signed bundles with a scoped service token. Select Continue.

  2. Describe the token

    FieldExample in the consoleWhat to enter
    NameFor example: Fleet log archive, west rangeA name for the sender, such as Bench rig uploads.
    Token nametest-rig-ciA name for the sender's service token.
    ScopeIngest onlyWhat the token may do. Ingest only allows pushing bundles and nothing else.
    Expires31 Dec 2026The date the token expires.
  3. Test and add

    Select Test connection, wait for the fourth check, then select Add source. The toast names the source and says The first sync is running.

The endpoint#

The source uses the HTTPS ingest API endpoint, which the Ingest tab of Integrations lists at /app/integrations/ingest. The Sources page points there too: "Endpoints that accept pushed evidence, such as the HTTPS ingest API, are listed under Integrations, Ingest."

Row in the drawerValue in the example dataset
StateListening
Listens onHTTPS 443, /api/fx/v1/ingest
Used byBench rig uploads
ProtocolHTTPS POST, chunked and resumable, Content-Digest
AuthmTLS device certificates plus short-lived bearer tokens
Air-gappedYes

What a push carries#

Senders push to POST /api/fx/v1/ingest. Nothing is fetched on a schedule: the source's Schedule reads Push, and bundles arrive when the sender sends them.

PartWhat the API expects
EndpointPOST /api/fx/v1/ingest, over HTTPS
BodyA signed multipart bundle
TransferChunked and resumable, so an interrupted upload picks up where it stopped
IntegrityA Content-Digest header, and the sender's SHA-256 manifest of the files
AuthenticationMutual TLS with the sender's device certificate, plus a short-lived bearer token that can be bound to the certificate (RFC 8705)
Token scopeIngest only

Content-Digest is the HTTP digest field defined in RFC 9530, and each upload carries it as sha-256. Foxborne also hashes each file with SHA-256 on arrival and checks it against the sender's manifest before it is parsed.

The IETF "Resumable Uploads for HTTP" specification is still an Internet-Draft, not an RFC. Foxborne therefore "keeps chunk-and-resume behind its own stable API for multi-GB bags."

A sender's "bundle complete" call is one of the triggers for automation A1. A1 closes the sortie out once every source on the test card has arrived, or after 30 minutes with nothing new. See Automations.

Check the result#

The example dataset's Bench rig uploads source shows what a working push source looks like in its drawer.

RowValue
LocationPOST /api/fx/v1/ingest
AccessService token, ingest scope only
Credentialbench-rig-ci (expires 31 Dec 2026)
MatchesSigned multipart bundles
SchedulePush
Files read77, 2.3 GB

Runs built from pushed bundles name the source on the run page. Run R-0908, a perception soak on the bench, came in through Bench rig uploads with a companion journal and process samples. The audit log records the new source as Added source, with a detail such as Ingest API, read-only test passed.

Troubleshoot#

  • Status shows Needs attention or Error. Open the source's drawer and read the note at the top.
  • Senders cannot connect. Check that the HTTPS ingest API reads Listening on the Ingest tab, and that the sender presents a device certificate your deployment trusts.
  • Files land on the wrong vehicle. Check the MAVLink system ID in each flight log the bundle carries.

Beyond ingest#

The Ingest API accepts bundles and nothing else. Planned A general Foxborne API is planned.

Next#