Outbound Post URL

Edgeflow post URL responses

Each application can be provisioned with a list of HTTP URLs. Detection outputs will be sent to these URLs if any output subject crosses a detection threshold.
The POST URL can be configured via the Web-App or through the applications API.
Results of the post URL are shown below.

Post URL Results

A dictionary of values is returned.

ValueDescriptionDetails
app_id
string
application id reporting the assertion
assertions
list
A list of assertions generated by the app_id.see Assertion Format below
previous_assertions
list
Assertions accumulated by upstream apps.List of assertions.
mediamedia data associated with this assertionsee Media format below

Assertion format

KeyDescriptionExample
app_id
string
application which generated this post URL response
assertion_id
string
identifier associated with assertion. Usually prefixed by "EF"EF:quUAdVKp:XGULMXFFIG:1
assertion_prefix
string
Prefix used by all downstream apps in a pipelineEF:quUAdVKp:XGULMXFFIG
media_md5
string
md5 of base64 encoded image
model_id
string
model which generated detection.IVAC_Hpo-d-9g49-DmD42hkuJLSiFuWOge-YN-OW_mtsv1_INT_10000.tgz
probability
float
detection probability
subject_uid
string
subject which crossed detection threshold.

Note that the media_md5 in previous assertions could differ if an application generated new media.

Media format

KeyDescription
capture_timestamp
float
timestamp when the media was captured.
domain_unit
string
domain information associated with media
media_md5
string
md5 of base64 encoded image
media_type
string
'image' or 'video'
media_bytes
string
base64 encoded image.
custom_data
dict
optional custom data accompanying media.

To decode the media_bytes, a receiver of the post_url should use a base64 decoder library and pass in the media_bytes. The resultant output will be a JPEG string.

The example below illustrates the response sent to a URL from Edgeflow.
The image which generated the assertion from this app is base64 encoded in the media dictionary.

{'app_id':'8H88vm4v',
'assertions': [{'app_id':'8H88vm4v',
                 'assertion_id':'EF:quUAdVKp:XGULMXFFIG:1',
                 'assertion_prefix':'EF:quUAdVKp:XGULMXFFIG',
                 'media_md5':'c02525004c40575ff4131131ad44a072',
                 'model_id':'Hpo-m-2d25-KHkIx4sG43EYsU5PzZ-GN-rf_224_224_mtsv1_2.tgz',
                 'probability': 4.3752895142460235e-27,
                 'subject_uid':'vehiclestestoutput_6jo'}],
'media': {'capture_timestamp': 1604537749.76,
           'domain_unit':'1604537749',
           'external_media_id':'x1abcde.jpg',
           'media_md5':'c02525004c40575ff4131131ad44a072',
           'media_type':'image',
           'media_bytes': <redacted>,
           'upload_timestamp': 1604537749.827434,
           'user_id':'[email protected]'},
'previous_assertions': [{'app_data': None,
                          'app_data_type': None,
                          'assertion_id':'EF:quUAdVKp:RDTAHRWSHT:0',
                          'assertion_prefix':'EF:quUAdVKp:RDTAHRWSHT',
                          'focus': None,
                          'media_md5':'c02525004c40575ff4131131ad44a072',
                          'subject_uid':'drone_photos_6op'},
                          {'app_data': [{'box': {'x0': 995,
                                                  'x1': 1112,
                                                  'y0': 1579,
                                                  'y1': 1665},
                                         'probability': 0.91259765625},
                                         {'box': {'x0': 1535,
                                                  'x1': 1697,
                                                  'y0': 2014,
                                                  'y1': 2118},
                                         'probability': 0.82861328125},
                                         {'box': {'x0': 3306,
                                                  'x1': 3401,
                                                  'y0': 542,
                                                  'y1': 627},
                                         'probability': 1.806020736694336e-05}],
                          'app_data_type':'box_set',
                          'app_id':'kHG1csvg',
                          'assertion_id':'EF:quUAdVKp:QVPBRLPJZZ:1',
                          'assertion_prefix':'EF:quUAdVKp:QVPBRLPJZZ',
                          'media_md5':'c02525004c40575ff4131131ad44a072',
                          'model_id':'donor_IVAC_Hpo-d-8e49-DmDT9hhuJLSiFuWOge-YN-OW_mtsv1_INT_10000.tgz',
                          'probability': 0.91259765625,
                          'subject_uid':'vehicles_carbox_3gu'}]}

Example decoding media

Note that a 200 code is required to be sent to the EdgeFlow by the receiver of the POST URL.

import traceback
import base64
import json
from flask_restful import reqparse
from flask import Flask
from flask import request
from werkzeug.serving import WSGIRequestHandler
from pprint import pprint

WSGIRequestHandler.protocol_version = "HTTP/1.1"
app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def rec_lc():
    if request.method == 'POST':
        request_data = request.data
        try:
            msg = json.loads(request_data)
            if 'media' in msg and 'media_bytes' in msg['media']:
                img_str = base64.b64decode(msg['media']['media_bytes'])
                print("size of image=%d" %(len(img_str)))
                with open('/tmp/image_test.jpg', 'wb') as fh:
                    fh.write(img_str)
            return '200'
        except Exception as ex:
            print(traceback.format_exc())
            return '404'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5002)

Response to POST URL

The Edgeflow expects a '200' status response to each post URL. The Edgeflow will make multiple attempts to send the assertion to the post URL.

If '200' is not sent, the destination URL is placed in a deny list for 90seconds and no further assertions will be sent to the URL.