prebid / prebid-mobile-android

Prebid Mobile SDK for Android applications
Apache License 2.0
58 stars 84 forks source link

Intent to Implement - Prebid Mobile Banner Native #136

Closed anwzhang closed 4 years ago

anwzhang commented 5 years ago

Use DFP Native Styles and MoPub Custom Banner as the container of native assets.

Proposed APIs for Android is as following: To create a Native Ad Unit:

NativeAdUnit nativeAdUnit = new NativeAdUnit("config-id");

To configure a Native request:

 public enum CONTEXT_TYPE {
        CONTENT_CENTRIC(1),
        SOCIAL_CENTRIC(2),
        PRODUCT(3),
        CUSTOM(500);
        private int id;

        CONTEXT_TYPE(final int id) {
            this.id = id;
        }

        public int getID() {
            return this.id;
        }

        public void setID(int id) {
            if (this.equals(CUSTOM) && id >= 500) {
                this.id = id;
            }
        }
    }

    public void setContextType(CONTEXT_TYPE type) ;

    public enum CONTEXT_SUB_TYPE {
        GENERAL(10),
        ARTICAL(11),
        VIDEO(12),
        AUDIO(13),
        IMAGE(14),
        USER_GENERATED(15),
        GENERAL_SOCIAL(20),
        EMAIL(21),
        CHAT_IM(22),
        SELLING(30),
        APPLICATION_STORE(31),
        PRODUCT_REVIEW_SITES(32),
        CUSTOM(500);
        private int id;

        CONTEXT_SUB_TYPE(final int id) {
            this.id = id;
        }

        public int getID() {
            return this.id;
        }

        public void setID(int id) {
            if (this.equals(CUSTOM) && id >= 500) {
                this.id = id;
            }
        }
    }

    public void setContextSubType(CONTEXT_SUB_TYPE type) ;

    public enum PLACEMENT_TYPE {
        CONTENT_FEED(1),
        CONTENT_ATOMIC_UNIT(2),
        OUTSIDE_CORE_CONTENT(3),
        RECOMMENDATION_WIDGET(4),
        CUSTOM(500);
        private int id;

        PLACEMENT_TYPE(final int id) {
            this.id = id;
        }

        public int getID() {
            return this.id;
        }

        public void setID(int id) {
            if (this.equals(CUSTOM) && id >= 500) {
                this.id = id;
            }
        }

    }

    public void setPlacementType(PLACEMENT_TYPE placementType) ;

    public void setPlacementCount(Integer placementCount);

    public void setSeq(Integer seq) ;

    public void setAUrlSupport(boolean support) ;

    public void setDUrlsSupport(boolean support) ;

    public void setPrivacy(boolean privacy);

    public void setExt(Object jsonObject);

    public enum EVENT_TYPE {
        IMPRESSION(1),
        VIEWABLE_MRC50(2),
        VIEWABLE_MRC100(3),
        VIEWABLE_VIDEO50(4),
        CUSTOM(500);
        private int id;

        EVENT_TYPE(final int id) {
            this.id = id;
        }

        public int getID() {
            return this.id;
        }

        public void setID(int id) {
            if (this.equals(CUSTOM) && id >= 500) {
                this.id = id;
            }
        }
    }

    public enum EVENT_TRACKING_METHOD {
        IMAGE(1),
        JS(2),
        CUSTOM(500);
        private int id;

        EVENT_TRACKING_METHOD(final int id) {
            this.id = id;
        }

        public int getID() {
            return this.id;
        }

        public void setID(int id) {
            if (this.equals(CUSTOM) && id >= 500) {
                this.id = id;
            }
        }
    }

    public void addEventTracker(EVENT_TYPE event, ArrayList<EVENT_TRACKING_METHOD> methods, Object extObject) throws Exception ;

    public void addTitle(Integer len, Boolean required, Object assetExt, Object titleExt);

    public enum IMAGE_TYPE {
        ICON(1),
        MAIN(3),
        CUSTOM(500);
        private int id;

        IMAGE_TYPE(final int id) {
            this.id = id;
        }

        public int getID() {
            return this.id;
        }

        public void setID(int id) {
            if (this.equals(CUSTOM) && id >= 500) {
                this.id = id;
            }
        }
    }

    public void addImage(IMAGE_TYPE type, Integer wmin, Integer hmin, Integer w, Integer h, ArrayList<String> mimes, Boolean required, Object assetExt, Object imageExt) ;

    public enum DATA_TYPE {
        SPONSORED(1),
        DESC(2),
        RATING(3),
        LIKES(4),
        DOWNLOADS(5),
        PRICE(6),
        SALEPRICE(7),
        PHONE(8),
        ADDRESS(9),
        DESC2(10),
        DESPLAYURL(11),
        CTATEXT(12),
        CUSTOM(500);
        private int id;

        DATA_TYPE(final int id) {
            this.id = id;
        }

        public int getID() {
            return this.id;
        }

        public void setID(int id) {
            if (this.equals(CUSTOM) && id >= 500) {
                this.id = id;
            }
        }
    }

    public void addData(DATA_TYPE type, Integer len, Boolean required, Object assetExt, Object dataExt) ;

For example, calling the APIs like the following:

NativeAdUnit adUnit = new NativeAdUnit("25e17008-5081-4676-94d5-923ced4359d3");
        adUnit.setContext(2);
        adUnit.setPlacementType(1);
        adUnit.setContextSubType(20);
        adUnit.addTitle(90, true, null, null);
        ArrayList<Integer> methods = new ArrayList<>();
        methods.add(1);
        try {
            adUnit.addEventTracker(1, methods, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
       adUnit.addImage(NativeAdUnit.IMAGE_TYPE.ICON, 20, 20, -1, -1, null, true, null, null);
        adUnit.addImage(NativeAdUnit.IMAGE_TYPE.MAIN, 200, 200, -1, -1, null, true, null, null);
        adUnit.addData(NativeAdUnit.DATA_TYPE.SPONSORED, 90, true, null, null);

Will result in a request to PBS like the following:

{
  "id": "a68d89f4-5c6c-4a87-9267-e417d6e57d87",
  "source": {
    "tid": "a68d89f4-5c6c-4a87-9267-e417d6e57d87"
  },
  "imp": [
    {
      "id": "PrebidMobile",
      "secure": 1,
      "native": {
        "request": "{\"context\":2,\"contextsubtype\":20,\"plcmttype\":1,\"eventtrackers\":[{\"event\":1,\"methods\":[1]}],\"assets\":[{\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200},\"required\":1},{\"title\":{\"len\":90},\"required\":1},{\"data\":{\"type\":1,\"len\":90},\"required\":1}],\"ver\":\"1.2\"}",
        "ver": "1.2"
      },
      "ext": {
        "prebid": {
          "storedrequest": {
            "id": "25e17008-5081-4676-94d5-923ced4359d3"
          }
        }
      }
    }
  ],
  "device": {
    "make": "Google",
    "model": "Android SDK built for x86",
    "lmt": 0,
    "os": "android",
    "osv": "28",
    "language": "en",
    "w": 411,
    "h": 659,
    "pxratio": 2.625,
    "mccmnc": "310-260",
    "carrier": "Android",
    "connectiontype": 1
  },
  "app": {
    "bundle": "org.prebid.mobile.api1demo",
    "ver": "1.1.2",
    "name": "API1.0Demo",
    "publisher": {
      "id": "bfa84af2-bd16-4d35-96ad-31c6bb888df0"
    },
    "ext": {
      "prebid": {
        "source": "prebid-mobile",
        "version": "1.1.2"
      }
    }
  },
  "user": {
    "gender": "O"
  },
  "ext": {
    "prebid": {
      "cache": {
        "bids": {}
      },
      "storedrequest": {
        "id": "bfa84af2-bd16-4d35-96ad-31c6bb888df0"
      },
      "targeting": {}
    }
  }
}
anwzhang commented 5 years ago

Open questions:

bszekely1 commented 5 years ago

Should we only use version 1.1 or 1.2? The difference is that for 1.2, AppNexus require request to include event trackers:

Can you provide a better spec of how this would work, meaning the components of how this would flow from the API of the SDK (that you have outlined) to the Prebid Sever communication part, expected request and response values. It's also not clear what would be different in Native 1.1 version 1.2.

Should we pass a PrebidCache id for native assets for PUC to parse, or pass directly on the requesti with native assets (need to test keyword length limitation with imp trackers)?

Prebid SDK today only supports calling the cache server. We would have to modify the PUC if we were add support of not calling cache server for native.

We should really have a conversation about the timelines and design. In the next release after Prebid SDK 1.2, we are building support for video and are seeking modularize the SDK into feature / format components. That could impact how you are building. Ideally our product builds are in sync.

anwzhang commented 5 years ago

Hi @bszekely1 ,

Here's a sample ORTB request for native:

{
  "id": "3dc76667-a500-4e01-a43b-368e36d6c7cc",
  "source": {
    "tid": "3dc76667-a500-4e01-a43b-368e36d6c7cc"
  },
  "imp": [
    {

      "id": "Banner_300x250",
      "ext": {
        "prebid": {
          "storedrequest": {
            "id": "25e17008-5081-4676-94d5-923ced4359d3"
          }
        }
      },
      "native": {
        "request": "{\"ver\":\"1.1\",\"context\":2,\"contextsubtype\":20,\"plcmttype\":1,\"assets\":[{\"required\":1,\"title\":{\"len\":90}},{\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}},{\"required\":1,\"data\":{\"type\":1,\"len\":25}}]}",
        "ver": "1.1"
      }
    }
  ],
  "device": {
    "make": "unknown",
    "model": "Android SDK built for x86",
    "ua": "Mozilla/5.0 (Linux; Android 6.0; Android SDK built for x86 Build/MASTER; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.119 Mobile Safari/537.36",
    "w": 360,
    "h": 568,
    "pxratio": 3,
    "mccmnc": "310-260",
    "carrier": "Android",
    "connectiontype": 2,
    "lmt": 0,
    "ifa": "baa7acdc-b7de-48c2-91f7-d0343a74ae68",
    "os": "android",
    "osv": "23",
    "language": "en",
    "ip": "207.237.150.246"
  },
  "app": {
    "bundle": "org.prebid.mobile.demoapp",
    "ver": "0.3",
    "name": "DemoApp",
    "privacypolicy": 0,
    "publisher": {
      "id": "bfa84af2-bd16-4d35-96ad-31c6bb888df0"
    },
    "ext": {
      "prebid": {
        "source": "prebid-mobile",
        "version": "0.3"
      }
    }
  },
  "user": {
    "yob": 1992,
    "gender": "F",
    "keywords": "PrebidKey=PrebidValue,PrebidKey2,"
  },
  "regs": {
    "ext": {}
  },
  "ext": {
    "prebid": {
      "storedrequest": {
        "id": "bfa84af2-bd16-4d35-96ad-31c6bb888df0"
      },
      "cache": {
        "bids": {}
      }
    }
  }
}

Cached response will be as following:

{
  "assets": [
    {
      "id": 1,
      "img": {
        "url": "https://vcdn.adnxs.com/p/creative-image/7e/71/90/27/7e719027-80ef-4664-9b6d-a763da4cea4e.png",
        "w": 300,
        "h": 250,
        "ext": {
          "appnexus": {
            "prevent_crop": 0
          }
        }
      }
    },
    {
      "id": 0,
      "title": {
        "text": "This is an RTB ad"
      }
    },
    {
      "id": 2,
      "data": {
        "value": "AppNexus"
      }
    }
  ],
  "link": {
    "url": "https://nym1-ib.adnxs.com/click?exSuR-F6hD97FK5H4XqEPwAAAAAAAAAAexSuR-F6hD97FK5H4XqEPzjJ3fTMleMehvxebRKgw28tzE1dAAAAAHu99gBuJwAAbicAAAIAAACRL6wJ-MwcAAAAAABVU0QAVVNEAAEAAQDILwAAAAABAgMCAAAAAMYA3yNIVAAAAAA./bcr=AAAAAAAA8D8=/pp=${AUCTION_PRICE}/cnd=%21AxLW5Aimo8AOEJHfsE0Y-JlzIAQoADF7FK5H4XqEPzoJTllNMjo0NjIyQJUQSQAAAAAAAPA_UQAAAAAAAAAAWQAAAAAAAAAAYQAAAAAAAAAAaQAAAAAAAAAAcQAAAAAAAAAAeAA./cca=MTAwOTQjTllNMjo0NjIy/bn=77812/clickenc=http%3A%2F%2Fappnexus.com"
  },
  "imptrackers": [
    "https://nym1-ib.adnxs.com/it?an_audit=0&e=wqT_3QKpCOgpBAAAAwDWAAUBCK2Yt-oFELiS96bPueXxHhiG-fvqpoLo4W8qNgl7FK5H4XqEPxF7FK5H4XqEPxkAAAkCACERGwApEQkAMQkZsAAAMPv62gc47k5A7k5IAlCR37BNWPiZc2AAaMjfjAF49N8EgAEBigEDVVNEkgUG8FWYAQGgAQGoAQGwAQC4AQLAAQPIAQLQAQLYARvgAQDwAQCKAjx1ZignYScsIDMzOTM1MjAsIDE1NjUzNzk2MjkpO3VmKCdyJywgMTYyMjc5MzEzLCAxNRkf8LCSArECIXJVQ2FEUWltbzhBT0VKSGZzRTBZQUNENG1YTXdBRGdBUUFSSTdrNVEtX3JhQjFnQVlPNEdhQUJ3Vm5pd1JJQUJ6QUdJQWJCRWtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFlTHFGUlE2OWRJXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFQZ0JBSmdDQUtBQ0FMVUMFJQhMMEMFCPBMTUFDQU1nQ0FPQUNBT2dDQVBnQ05vQURCSkFEQUpnREFhZ0RwcVBBRHJvRENVNVpUVEk2TkRZeU11QURsUkNRQkFDWUJBSEJCQUFBQUEJAwh5UVEJCQEBGE5nRUFQRUUBCwkBQEQ0QkFBLpoCiQEhQXhMVzVBNjUBQC1KbHpJQVFvQURGN0ZLNUg0AfVMem9KVGxsTk1qbzBOakl5UUpVUVMRZAxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYx0M9EgBZUFBLtgCAOACyqhNgAMAiAMBkAMAmAMUoAMBqgMAwAPgqAHIAwDSAyoIChIkYmFhN2FjZGMtYjdkZS00OGMyLTkxZjctZDAzNDNhNzRhZTY4GAHYAwDgAwDoAwL4AwCABACSBAkvb3BlbnJ0YjKYBACiBA8yMDcuMjM3LjE1MC4yNDaoBMqkBbIEDAgAEAAYACAAMAA4ALgEAMAEAMgEANIEDzEwMDk0I05ZTTI6NDYyMtoEAggB4AQA8ASR37BNggUZb3JnLnByZWJpZC5tb2JpbGUuZGVtb2FwcIgFAZgFAKAF____________AaoFJDNkYzc2NjY3LWE1MDAtNGUwMS1hNDNiLTM2OGUzNmQ2YzdjY8AFAMkFAAAAAAAA8D_SBQkJAAAAAAAAAADYBQHgBQHwBQH6BQQIABAAkAYBmAYAuAYAwQZpnzTwP8gGANAG1jPaBhYKEAkUGQFEEAAYAOAGDPIGAggAgAcBiAcA&s=22a3ef24348db8bef73dbc632c545607e28669d3&pp=${AUCTION_PRICE}"
  ],
  "jstracker": "<script type=\"text/javascript\" async=\"true\" src=\"https://cdn.adnxs.com/v/app/173/trk.js#app;vk=appnexus.com-omid;tv=app-native-23hs;dom_id=%native_dom_id%;st=2;d=1x1;vc=iab;vid_ccr=1;tag_id=16170363;cb=https%3A%2F%2Fnym1-ib.adnxs.com%2Fvevent%3Fan_audit%3D0%26e%3DwqT_3QKpCOgpBAAAAwDWAAUBCK2Yt-oFELiS96bPueXxHhiG-fvqpoLo4W8qNgl7FK5H4XqEPxF7FK5H4XqEPxkAAAkCACERGwApEQkAMQkZsAAAMPv62gc47k5A7k5IAlCR37BNWPiZc2AAaMjfjAF49N8EgAEBigEDVVNEkgUG8FWYAQGgAQGoAQGwAQC4AQLAAQPIAQLQAQLYARvgAQDwAQCKAjx1ZignYScsIDMzOTM1MjAsIDE1NjUzNzk2MjkpO3VmKCdyJywgMTYyMjc5MzEzLCAxNRkf8LCSArECIXJVQ2FEUWltbzhBT0VKSGZzRTBZQUNENG1YTXdBRGdBUUFSSTdrNVEtX3JhQjFnQVlPNEdhQUJ3Vm5pd1JJQUJ6QUdJQWJCRWtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFlTHFGUlE2OWRJXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFQZ0JBSmdDQUtBQ0FMVUMFJQhMMEMFCPBMTUFDQU1nQ0FPQUNBT2dDQVBnQ05vQURCSkFEQUpnREFhZ0RwcVBBRHJvRENVNVpUVEk2TkRZeU11QURsUkNRQkFDWUJBSEJCQUFBQUEJAwh5UVEJCQEBGE5nRUFQRUUBCwkBQEQ0QkFBLpoCiQEhQXhMVzVBNjUBQC1KbHpJQVFvQURGN0ZLNUg0AfVMem9KVGxsTk1qbzBOakl5UUpVUVMRZAxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYx0M9EgBZUFBLtgCAOACyqhNgAMAiAMBkAMAmAMUoAMBqgMAwAPgqAHIAwDSAyoIChIkYmFhN2FjZGMtYjdkZS00OGMyLTkxZjctZDAzNDNhNzRhZTY4GAHYAwDgAwDoAwL4AwCABACSBAkvb3BlbnJ0YjKYBACiBA8yMDcuMjM3LjE1MC4yNDaoBMqkBbIEDAgAEAAYACAAMAA4ALgEAMAEAMgEANIEDzEwMDk0I05ZTTI6NDYyMtoEAggB4AQA8ASR37BNggUZb3JnLnByZWJpZC5tb2JpbGUuZGVtb2FwcIgFAZgFAKAF____________AaoFJDNkYzc2NjY3LWE1MDAtNGUwMS1hNDNiLTM2OGUzNmQ2YzdjY8AFAMkFAAAAAAAA8D_SBQkJAAAAAAAAAADYBQHgBQHwBQH6BQQIABAAkAYBmAYAuAYAwQZpnzTwP8gGANAG1jPaBhYKEAkUGQFEEAAYAOAGDPIGAggAgAcBiAcA%26s%3D22a3ef24348db8bef73dbc632c545607e28669d3;ts=1565379629;cet=0;cecb=\"></script>"
}

For version 1.2, you would change the native request to the following:

      "native": {
        "request": "{\"ver\":\"1.2\",\"context\":2,\"contextsubtype\":20,\"plcmttype\":1,\"eventtrackers\":[{\"event\":1,\"methods\":[1]}],\"assets\":[{\"required\":1,\"title\":{\"len\":90}},{\"required\":1,\"img\":{\"type\":3,\"wmin\":200,\"hmin\":200}},{\"required\":1,\"data\":{\"type\":1,\"len\":25}}]}",
        "ver": "1.2"
      }

Cached response will be as following:

{
  "ver": "1.2",
  "assets": [
    {
      "id": 1,
      "img": {
        "url": "https://vcdn.adnxs.com/p/creative-image/7e/71/90/27/7e719027-80ef-4664-9b6d-a763da4cea4e.png",
        "w": 300,
        "h": 250,
        "ext": {
          "appnexus": {
            "prevent_crop": 0
          }
        }
      }
    },
    {
      "id": 0,
      "title": {
        "text": "This is an RTB ad"
      }
    },
    {
      "id": 2,
      "data": {
        "value": "AppNexus"
      }
    }
  ],
  "link": {
    "url": "https://nym1-ib.adnxs.com/click?exSuR-F6hD97FK5H4XqEPwAAAAAAAAAAexSuR-F6hD97FK5H4XqEP47fglK67itfhvxebRKgw2-2y01dAAAAAHu99gBuJwAAbicAAAIAAACRL6wJ-MwcAAAAAABVU0QAVVNEAAEAAQDILwAAAAABAgMCAAAAAMYApiPLOwAAAAA./bcr=AAAAAAAA8D8=/pp=${AUCTION_PRICE}/cnd=%21BxLG5Qimo8AOEJHfsE0Y-JlzIAQoADF7FK5H4XqEPzoJTllNMjo0NDY0QJUQSQAAAAAAAPA_UQAAAAAAAAAAWQAAAAAAAAAAYQAAAAAAAAAAaQAAAAAAAAAAcQAAAAAAAAAAeAA./cca=MTAwOTQjTllNMjo0NDY0/bn=87154/clickenc=http%3A%2F%2Fappnexus.com"
  },
  "eventtrackers": [
    {
      "event": 1,
      "method": 1,
      "url": "https://nym1-ib.adnxs.com/it?an_audit=0&e=wqT_3QKpCOgpBAAAAwDWAAUBCLaXt-oFEI6_i5Sl1_uVXxiG-fvqpoLo4W8qNgl7FK5H4XqEPxF7FK5H4XqEPxkAAAkCACERGwApEQkAMQkZsAAAMPv62gc47k5A7k5IAlCR37BNWPiZc2AAaMjfjAF48qgFgAEBigEDVVNEkgUG8FWYAQGgAQGoAQGwAQC4AQLAAQPIAQLQAQLYARvgAQDwAQCKAjx1ZignYScsIDMzOTM1MjAsIDE1NjUzNzk1MTApO3VmKCdyJywgMTYyMjc5MzEzLCAxNRkf8LCSArECIXUwSEtsUWltbzhBT0VKSGZzRTBZQUNENG1YTXdBRGdBUUFSSTdrNVEtX3JhQjFnQVlPNEdhQUJ3Vm5pc1JJQUJ6QUdJQWF4RWtBRUJtQUVCb0FFQnFBRURzQUVBdVFHUjd3cnc0WHFFUDhFQmtlOEs4T0Y2aERfSkFaaTFySDNCX2RRXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFQZ0JBSmdDQUtBQ0FMVUMFJQhMMEMFCPBMTUFDQU1nQ0FPQUNBT2dDQVBnQ05vQURCSkFEQUpnREFhZ0RwcVBBRHJvRENVNVpUVEk2TkRRMk5PQURsUkNRQkFDWUJBSEJCQUFBQUEJAwh5UVEJCQEBGE5nRUFQRUUBCwkBPEQ0QkFBLpoCiQEhQnhMRzU6NQFALUpseklBUW9BREY3Rks1SDQB9Ux6b0pUbGxOTWpvME5EWTBRSlVRUxFkDFBBX1URDAxBQUFXHQwAWR0MAGEdDABjHQz0SAFlQUEu2AIA4ALKqE2AAwCIAwGQAwCYAxSgAwGqAwDAA-CoAcgDANIDKggKEiRiYWE3YWNkYy1iN2RlLTQ4YzItOTFmNy1kMDM0M2E3NGFlNjgYAdgDAOADAOgDAvgDAIAEAJIECS9vcGVucnRiMpgEAKIEDzIwNy4yMzcuMTUwLjI0NqgEyKQFsgQMCAAQABgAIAAwADgAuAQAwAQAyAQA0gQPMTAwOTQjTllNMjo0NDY02gQCCAHgBADwBJHfsE2CBRlvcmcucHJlYmlkLm1vYmlsZS5kZW1vYXBwiAUBmAUAoAX___________8BqgUkM2RjNzY2NjctYTUwMC00ZTAxLWE0M2ItMzY4ZTM2ZDZjN2NjwAUAyQUAAAAAAADwP9IFCQkAAAAAAAAAANgFAeAFAfAFAfoFBAgAEACQBgGYBgC4BgDBBmmfNPA_yAYA0AbWM9oGFgoQCRQZAUQQABgA4AYM8gYCCACABwGIBwA.&s=4b7e0a8dd4d99349bb87c51b1a58f7a2c1122b93&pp=${AUCTION_PRICE}"
    }
  ]
}

The main difference is imptrackers are changed into eventtrackers.

Prebid SDK today only supports calling the cache server. We would have to modify the PUC if we were add support of not calling cache server for native.

PUC doesn't need change if we don't use Prebid Cache. The publisher would get the assets just by using hb_ keys, like on the ones on this page: http://prebid.org/dev-docs/show-native-ads.html#2-add-native-ad-units

Xandr team is actively developing this, let's schedule a time to discuss the details.

anwzhang commented 5 years ago

See PR #140