- Legion API
- Feed Data
- Upload feed file data
Upload feed file data
const url = 'https://api.hopper.west.prod.govcloud.legion.picogrid.com/v3/feeds/files';const form = new FormData();form.append('fileContent', 'file');form.append('metadata_json_payload', '{ "blob_metadata": {}, "entity_id": "c3d4e5f6-a1b2-7890-1234-567890abcdef", "feed_definition_id": "f7a8b9c0-d1e2-3f4a-5b6c-7d8e9f0a1b2c", "file_content_type": "example", "recorded_at": "2024-02-16T21:45:33Z" }');
const options = {method: 'POST'};
options.body = form;
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.hopper.west.prod.govcloud.legion.picogrid.com/v3/feeds/files \ --header 'Content-Type: multipart/form-data' \ --form fileContent=@file \ --form 'metadata_json_payload={ "blob_metadata": {}, "entity_id": "c3d4e5f6-a1b2-7890-1234-567890abcdef", "feed_definition_id": "f7a8b9c0-d1e2-3f4a-5b6c-7d8e9f0a1b2c", "file_content_type": "example", "recorded_at": "2024-02-16T21:45:33Z" }'Upload file-based feed data using multipart/form-data. The request must contain a ‘metadata_json_payload’ form field with JSON metadata matching the IngestFeedFileDataRequest schema, and a ‘fileContent’ form field with the binary file content. Note: The stored file name, size and mime_type are computed by the server from client-supplied inputs: the file name is a sanitized form of the multipart filename, the size is measured from the uploaded bytes, and the content type is taken from file_content_type, then the part’s Content-Type header. A supplied value of application/octet-stream is replaced by the type implied by the filename extension when the extension is recognized. When no value is supplied, or the supplied value cannot be parsed as a media type, the filename extension is tried first and detection from the file content is used only when the extension is not recognized. A value that parses to any other media type is used as-is: if it is unsupported it is rejected rather than passed to detection. The resulting content type must be one of application/json, application/octet-stream, application/pdf, application/zip, image/gif, image/jpeg, image/png, image/webp, text/csv, text/plain, video/mp4. Anything else is rejected with 400.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Binary file content
object
object
Example
c3d4e5f6-a1b2-7890-1234-567890abcdefExample
f7a8b9c0-d1e2-3f4a-5b6c-7d8e9f0a1b2cExample
2024-02-16T21:45:33ZResponses
Section titled “Responses”Successful response
object
Example
{ "entity_id": "c3d4e5f6-a1b2-7890-1234-567890abcdef", "feed_definition_id": "f7a8b9c0-d1e2-3f4a-5b6c-7d8e9f0a1b2c", "file_storage_type": "S3", "recorded_at": "2024-02-16T21:45:33Z", "uploaded_at": "2024-02-16T21:45:40Z"}Bad Request
object
object
Example
{ "code": 400, "details": [ { "Field": "organization_id", "Issue": "must be a valid UUID format" } ], "message": "Request cannot be processed due to invalid input", "status": "error", "timestamp": "2026-01-15T14:32:45Z", "trace_id": "req_2J9K8L7M6N5P4Q3R"}Unauthorized
object
object
Example
{ "code": 401, "details": [ { "Field": "authorization_header", "Issue": "Bearer token is expired or malformed" } ], "message": "Authentication credentials are missing or invalid", "status": "error", "timestamp": "2026-01-15T14:32:45Z", "trace_id": "req_2J9K8L7M6N5P4Q3R"}Forbidden
object
object
Example
{ "code": 403, "details": [ { "Field": "required_scope", "Issue": "requires 'orion:settings:write' scope, but token only has 'orion:settings:read'" } ], "message": "Access denied: insufficient permissions for this resource", "status": "error", "timestamp": "2026-01-15T14:32:45Z", "trace_id": "req_2J9K8L7M6N5P4Q3R"}Not Found
object
object
Example
{ "code": 404, "details": [ { "Field": "organization_id", "Issue": "organization with ID 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' not found" } ], "message": "The requested resource could not be found", "status": "error", "timestamp": "2026-01-15T14:32:45Z", "trace_id": "req_2J9K8L7M6N5P4Q3R"}Payload Too Large
object
object
Example
{ "category": "PAYLOAD_TOO_LARGE", "code": 413, "details": [ { "field": "field_name", "issue": "Field validation issue" } ], "message": "Payload Too Large", "status": "error", "timestamp": "2024-03-15T10:30:00Z", "trace_id": "b7c5e4d3-a2b1-4f0e-8d9c-1a2b3c4d5e6f"}Unsupported Media Type
object
object
Example
{ "category": "UNSUPPORTED_MEDIA_TYPE", "code": 415, "details": [ { "field": "field_name", "issue": "Field validation issue" } ], "message": "Unsupported Media Type", "status": "error", "timestamp": "2024-03-15T10:30:00Z", "trace_id": "b7c5e4d3-a2b1-4f0e-8d9c-1a2b3c4d5e6f"}Internal Server Error
object
The category of the error
The HTTP status code
Additional details about the error
object
The field that caused the error
The specific issue with the field
A human-readable error message
The status of the response, always ‘error’ for error responses
The timestamp when the error occurred
A unique identifier for tracing the error
Example
{ "category": "server_error", "code": 500, "details": [ { "field": "field_name", "issue": "Field validation issue" } ], "message": "Internal Server Error", "status": "error", "timestamp": "2024-03-15T10:30:00Z", "trace_id": "b7c5e4d3-a2b1-4f0e-8d9c-1a2b3c4d5e6f"}Version 3.20.2 · commit 933724e
