{"name":"Diretsa data model","version":"2026-11-04","description":"The main things Diretsa, South Africa's media marketplace, keeps; how they relate; and every controlled vocabulary with the industry standard it maps to. Describes kinds of data, never anyone's records.","docs":"https://diretsa.com/docs/data-model","standards":[{"id":"adcp","name":"Ad Context Protocol (AdCP)","version":"3.1","url":"https://adcontextprotocol.org","used_for":"Products, formats, pricing, media buys, accounts and the 20 media channels"},{"id":"openooh","name":"OpenOOH Venue Taxonomy","version":"1.2","url":"https://github.com/openooh/venue-taxonomy","used_for":"Venue types of screens and billboards"},{"id":"iab_content","name":"IAB Tech Lab Content Taxonomy","version":"3.1","url":"https://github.com/InteractiveAdvertisingBureau/Taxonomies","used_for":"Audience interests (tier 1)"},{"id":"iab_ad_product","name":"IAB Tech Lab Ad Product Taxonomy","version":"2.0","url":"https://github.com/InteractiveAdvertisingBureau/Taxonomies","used_for":"Sensitive ad categories"},{"id":"iso_3166","name":"ISO 3166-1 and 3166-2","version":"","url":"https://www.iso.org/iso-3166-country-codes.html","used_for":"Country (ZA) and provinces (ZA-GP, ZA-WC ...)"},{"id":"iso_4217","name":"ISO 4217","version":"","url":"https://www.iso.org/iso-4217-currency-codes.html","used_for":"Currency (ZAR)"},{"id":"schema_org","name":"schema.org","version":"","url":"https://schema.org","used_for":"Organization, Place and Offer in the data model"}],"entities":[{"name":"Organisation","description":"A business on Diretsa: an advertiser (buys media) or a publisher (sells it). People are members with roles.","key":"org_id","schema_org":"Organization","adcp":"Account (for advertisers buying over AdCP)","fields":[{"name":"kind","type":"enum","description":"advertiser or publisher"},{"name":"brand_domain","type":"domain","description":"Advertisers: the brand's verified website; ads may only link there or to approved pages"},{"name":"ad_categories","type":"list","description":"Advertisers: sensitive categories the brand declares","vocabulary":"ad_categories"},{"name":"ad_policy","type":"object","description":"Publishers: blocked categories and brands, whether each ad is reviewed, auto-accept of orders"},{"name":"trust_level","type":"enum","description":"Sets booking limits; grows with verified history"}],"relations":[{"to":"Site","kind":"has_many","description":"A publisher owns sites"},{"to":"Campaign","kind":"has_many","description":"An advertiser runs campaigns"},{"to":"Payout","kind":"has_many","description":"A publisher is paid monthly"}]},{"name":"Site","description":"A property a publisher sells: a website, newsletter, screen network, radio station, publication or any of the 20 channels. Verified before it can sell.","key":"site_id","schema_org":"WebSite (web), Periodical (newsletter, print), Organization (networks)","adcp":"Property (in adagents.json and publisher_properties)","fields":[{"name":"domain","type":"domain","description":"The site or network domain"},{"name":"channel","type":"enum","description":"The media channel","vocabulary":"channels","standard":"adcp"},{"name":"verified","type":"boolean","description":"Ownership proven (meta tag, DNS or file)"},{"name":"audience","type":"AudienceProfile","description":"The publisher's description of its audience, dated"}],"relations":[{"to":"Placement","kind":"has_many","description":"Spaces for sale on the site"},{"to":"AudienceProfile","kind":"has_one","description":"Who the site reaches"}]},{"name":"AudienceProfile","description":"Who a site reaches, in the publisher's words and dated; Diretsa adds counted impressions for websites and newsletters.","key":"site_id","fields":[{"name":"regions","type":"list","description":"\"national\" or provinces","vocabulary":"provinces","standard":"iso_3166"},{"name":"languages","type":"list","description":"Languages of the audience","vocabulary":"languages"},{"name":"age_groups","type":"list","description":"Age bands","vocabulary":"age_groups"},{"name":"income_groups","type":"list","description":"Income bands","vocabulary":"income_groups"},{"name":"interests","type":"list","description":"Interests","vocabulary":"interests","standard":"iab_content"},{"name":"monthly_reach","type":"integer","description":"People reached a month (publisher figure)"}],"relations":[{"to":"Site","kind":"belongs_to","description":"Describes one site"}]},{"name":"Placement","description":"One space for sale: an ad size on a website, a slot in a newsletter, a screen or set of screens, a radio spot. Sold to buyers as an AdCP product.","key":"product_id","schema_org":"Offer","adcp":"Product","fields":[{"name":"pricing_model","type":"enum","description":"How it is priced","vocabulary":"pricing_models","standard":"adcp"},{"name":"price","type":"money (ZAR)","description":"Price under the pricing model","standard":"iso_4217"},{"name":"min_spend","type":"money (ZAR)","description":"Smallest booking"},{"name":"format","type":"object","description":"Size or material it takes (image, video, audio, document, text, brief)","standard":"adcp"},{"name":"proof_level","type":"enum","description":"How strongly delivery can be checked","vocabulary":"proof_levels"},{"name":"listed","type":"boolean","description":"On sale"}],"relations":[{"to":"Site","kind":"belongs_to","description":"On one site"},{"to":"ScreenLocation","kind":"has_one","description":"Screens and billboards: where it is"},{"to":"Package","kind":"has_many","description":"Booked in packages"}]},{"name":"ScreenLocation","description":"Where a screen or billboard placement is, and what kind of venue.","key":"product_id","schema_org":"Place","fields":[{"name":"lat, lng","type":"coordinates","description":"WGS84"},{"name":"city, province","type":"text","description":"Province from the nine","vocabulary":"provinces","standard":"iso_3166"},{"name":"venue_type","type":"enum","description":"Kind of venue","vocabulary":"venue_types","standard":"openooh"},{"name":"screen_ids","type":"list","description":"The network's own ids for each physical screen"},{"name":"impressions_per_play","type":"number","description":"The network's estimate of people who see one play"}],"relations":[{"to":"Placement","kind":"belongs_to","description":"Locates one placement"}]},{"name":"Campaign","description":"An advertiser's plan: the brief, budget ceiling, dates, what it wants, and its artwork slots.","key":"campaign_id","fields":[{"name":"brief","type":"text","description":"Audience, goal, anything to avoid, in words"},{"name":"objective","type":"enum","description":"What the campaign is for","vocabulary":"objectives"},{"name":"target_audience","type":"object","description":"Languages, age groups, income groups, interests: the same vocabularies as AudienceProfile","standard":"iab_content"},{"name":"regions","type":"list","description":"Provinces (empty: all of South Africa)","vocabulary":"provinces","standard":"iso_3166"},{"name":"categories","type":"list","description":"Sensitive categories declared","vocabulary":"ad_categories","standard":"iab_ad_product"},{"name":"max_total_budget","type":"money (ZAR)","description":"Ceiling across all its bookings"}],"relations":[{"to":"Organisation","kind":"belongs_to","description":"Of one advertiser"},{"to":"Creative","kind":"has_many","description":"Artwork slots"},{"to":"MediaBuy","kind":"has_many","description":"Bookings made for it, after a draft is approved"}]},{"name":"Creative","description":"Approved material for a slot: an image, video, audio, document, text or brief, with its click-through on the brand's domain.","key":"creative_id","adcp":"Creative","fields":[{"name":"kind","type":"enum","description":"image, video, audio, document, text or brief"},{"name":"click_url","type":"url","description":"On the brand's domain or an approved destination"}],"relations":[{"to":"Package","kind":"many_to_many","description":"Assigned to packages"}]},{"name":"MediaBuy","description":"A booking: made in the console from an approved draft, or by an AI agent over AdCP. Prepaid or within a credit line.","key":"media_buy_id","adcp":"Media buy","fields":[{"name":"start, end","type":"datetime","description":"Flight, Africa/Johannesburg"},{"name":"total_budget","type":"money (ZAR)","description":"Reserved when booked"},{"name":"status","type":"enum","description":"pending_creatives, pending_start, active, paused, completed, rejected, canceled","standard":"adcp"}],"relations":[{"to":"Package","kind":"has_many","description":"One package per placement booked"},{"to":"Organisation","kind":"belongs_to","description":"Paid by one advertiser"}]},{"name":"Package","description":"One placement within a booking, with its budget, price and creatives.","key":"package_id","adcp":"Package","fields":[{"name":"budget","type":"money (ZAR)","description":"Spend on this placement"},{"name":"pricing_option_id","type":"id","description":"Which price applies","standard":"adcp"}],"relations":[{"to":"Placement","kind":"belongs_to","description":"Of one placement"},{"to":"Order","kind":"has_one","description":"Channels the publisher runs: the order they accept and report on"},{"to":"DeliveryReport","kind":"has_many","description":"Counted delivery"}]},{"name":"Order","description":"A package a publisher runs themselves (screens, radio, print ...): accepted or declined, then reported with proof.","key":"order_id","fields":[{"name":"status","type":"enum","description":"awaiting_material, new, accepted, declined, canceled"},{"name":"proof","type":"list","description":"Play logs, tear sheets, photos, platform reports","vocabulary":"proof_levels"}],"relations":[{"to":"Package","kind":"belongs_to","description":"Runs one package"}]},{"name":"DeliveryReport","description":"What ran: impressions and clicks counted by Diretsa's ad server, or units (plays, spots, screen-days) reported with proof. Earnings are settled after a dispute window.","key":"package_id + date","fields":[{"name":"impressions, clicks, units","type":"integer","description":"By day"},{"name":"spend","type":"money (ZAR)","description":"At the booked price"}],"relations":[{"to":"Package","kind":"belongs_to","description":"For one package"}]},{"name":"Search","description":"What an advertiser or its AI agent asked Diretsa for (brief and filters), kept 180 days, seen only by that advertiser and, in aggregate, by Diretsa.","key":"search_id","fields":[{"name":"brief","type":"text","description":"Private to the advertiser"},{"name":"read","type":"object","description":"Provinces, languages and interests Diretsa read from it","standard":"iab_content"},{"name":"matched","type":"integer","description":"Placements that fit"}],"relations":[{"to":"Organisation","kind":"belongs_to","description":"Of one advertiser"}]},{"name":"Payout","description":"A publisher's monthly payment of settled earnings, by Paystack transfer.","key":"payout_id","fields":[{"name":"amount","type":"money (ZAR)","description":"Earnings after the dispute window, 70% of media revenue by default"}],"relations":[{"to":"Organisation","kind":"belongs_to","description":"To one publisher"}]}],"vocabularies":{"channels":{"standard":"adcp","values":[{"id":"display","label":"Website display","proof_level":"measured"},{"id":"olv","label":"Online video","proof_level":"machine"},{"id":"social","label":"Social media","proof_level":"machine"},{"id":"search","label":"Search","proof_level":"machine"},{"id":"ctv","label":"Connected TV / streaming TV","proof_level":"machine"},{"id":"linear_tv","label":"Broadcast TV","proof_level":"self_reported"},{"id":"radio","label":"Radio","proof_level":"self_reported"},{"id":"streaming_audio","label":"Streaming audio","proof_level":"machine"},{"id":"podcast","label":"Podcast","proof_level":"machine"},{"id":"dooh","label":"Digital screens (DOOH)","proof_level":"machine"},{"id":"ooh","label":"Billboards and outdoor","proof_level":"self_reported"},{"id":"print","label":"Print (newspapers and magazines)","proof_level":"self_reported"},{"id":"cinema","label":"Cinema","proof_level":"self_reported"},{"id":"email","label":"Newsletter / email","proof_level":"measured"},{"id":"gaming","label":"Gaming","proof_level":"machine"},{"id":"retail_media","label":"Retail media","proof_level":"machine"},{"id":"influencer","label":"Creators and influencers","proof_level":"self_reported"},{"id":"affiliate","label":"Affiliate","proof_level":"self_reported"},{"id":"product_placement","label":"Product placement","proof_level":"self_reported"},{"id":"sponsored_intelligence","label":"Sponsored AI answers","proof_level":"machine"}]},"pricing_models":{"standard":"adcp","values":[{"id":"cpm","label":"per 1 000 impressions"},{"id":"vcpm","label":"per 1 000 viewable impressions"},{"id":"cpc","label":"per click"},{"id":"cpcv","label":"per completed view"},{"id":"cpv","label":"per view"},{"id":"cpp","label":"per rating point"},{"id":"cpa","label":"per sale or sign-up"},{"id":"revenue_share","label":"% of sales revenue"},{"id":"flat_rate","label":"per unit"},{"id":"time","label":"per period"}]},"proof_levels":{"values":[{"id":"measured","label":"Verified by Diretsa"},{"id":"machine","label":"Publisher's system report"},{"id":"self_reported","label":"Publisher's own report"}]},"venue_types":{"standard":"openooh","values":[{"id":"mall","label":"Mall","openooh":{"id":205,"value":"retail.mall","name":"Mall"}},{"id":"roadside","label":"Roadside","openooh":{"id":301,"value":"outdoor.billboard","name":"Billboard"}},{"id":"airport","label":"Airport","openooh":{"id":101,"value":"transit.airports","name":"Airport"}},{"id":"taxi_rank","label":"Taxi rank","openooh":{"id":10202,"value":"transit.bus.terminal","name":"Terminal"}},{"id":"in_taxi","label":"Inside taxis","openooh":{"id":103,"value":"transit.taxi_rideshare_tv","name":"Taxi & Rideshare TV"}},{"id":"train_station","label":"Train station","openooh":{"id":10604,"value":"transit.train.station","name":"Station"}},{"id":"bus_station","label":"Bus station","openooh":{"id":10202,"value":"transit.bus.terminal","name":"Terminal"}},{"id":"petrol_station","label":"Petrol station","openooh":{"id":201,"value":"retail.gas_stations","name":"Fueling Station"}},{"id":"retail","label":"Shop","openooh":{"id":216,"value":"retail.other","name":"Retail Other"}},{"id":"grocery","label":"Grocery store","openooh":{"id":203,"value":"retail.grocery","name":"Grocery"}},{"id":"pharmacy","label":"Pharmacy","openooh":{"id":207,"value":"retail.pharmacies","name":"Pharmacy"}},{"id":"gym","label":"Gym","openooh":{"id":401,"value":"health_beauty.gym","name":"Gym"}},{"id":"salon","label":"Salon","openooh":{"id":402,"value":"health_beauty.salon","name":"Salon"}},{"id":"clinic","label":"Clinic or doctor's rooms","openooh":{"id":501,"value":"point_care.doctor_office","name":"Doctor’s Office"}},{"id":"hospital","label":"Hospital","openooh":{"id":504,"value":"point_care.hospital","name":"Hospital"}},{"id":"office","label":"Office building","openooh":{"id":701,"value":"office_building.office_building","name":"Office Building"}},{"id":"school","label":"School","openooh":{"id":601,"value":"education.schools","name":"School"}},{"id":"campus","label":"College or university","openooh":{"id":602,"value":"education.college","name":"College and University"}},{"id":"bar","label":"Bar or tavern","openooh":{"id":804,"value":"entertainment.bars","name":"Bar"}},{"id":"restaurant","label":"Restaurant","openooh":{"id":805,"value":"entertainment.casual_dining","name":"Casual Dining"}},{"id":"hospitality","label":"Hotel","openooh":{"id":807,"value":"entertainment.hotels","name":"Hotel"}},{"id":"stadium","label":"Stadium or sports venue","openooh":{"id":803,"value":"entertainment.sports","name":"Sports Entertainment"}},{"id":"other","label":"Other","openooh":null}],"accepts":"Any OpenOOH 1.2 enumeration id or string value at any level; it is turned into the nearest Diretsa venue type."},"interests":{"standard":"iab_content","values":[{"id":"Attractions","label":"Attractions","iab_id":"150"},{"id":"Automotive","label":"Automotive","iab_id":"1"},{"id":"Books and Literature","label":"Books and Literature","iab_id":"42"},{"id":"Business and Finance","label":"Business and Finance","iab_id":"52"},{"id":"Careers","label":"Careers","iab_id":"123"},{"id":"Communication","label":"Communication","iab_id":"80DV8O"},{"id":"Crime","label":"Crime","iab_id":"380"},{"id":"Disasters","label":"Disasters","iab_id":"381"},{"id":"Education","label":"Education","iab_id":"132"},{"id":"Entertainment","label":"Entertainment","iab_id":"JLBCU7"},{"id":"Events","label":"Events","iab_id":"8VZQHL"},{"id":"Family and Relationships","label":"Family and Relationships","iab_id":"186"},{"id":"Fine Art","label":"Fine Art","iab_id":"201"},{"id":"Food & Drink","label":"Food & Drink","iab_id":"210"},{"id":"Healthy Living","label":"Healthy Living","iab_id":"223"},{"id":"Hobbies & Interests","label":"Hobbies & Interests","iab_id":"239"},{"id":"Holidays","label":"Holidays","iab_id":"1KXCLD"},{"id":"Home & Garden","label":"Home & Garden","iab_id":"274"},{"id":"Law","label":"Law","iab_id":"383"},{"id":"Medical Health","label":"Medical Health","iab_id":"286"},{"id":"Personal Celebrations & Life Events","label":"Personal Celebrations & Life Events","iab_id":"163"},{"id":"Personal Finance","label":"Personal Finance","iab_id":"391"},{"id":"Pets","label":"Pets","iab_id":"422"},{"id":"Politics","label":"Politics","iab_id":"386"},{"id":"Pop Culture","label":"Pop Culture","iab_id":"432"},{"id":"Real Estate","label":"Real Estate","iab_id":"441"},{"id":"Religion & Spirituality","label":"Religion & Spirituality","iab_id":"453"},{"id":"Science","label":"Science","iab_id":"464"},{"id":"Shopping","label":"Shopping","iab_id":"473"},{"id":"Sports","label":"Sports","iab_id":"483"},{"id":"Style & Fashion","label":"Style & Fashion","iab_id":"552"},{"id":"Technology & Computing","label":"Technology & Computing","iab_id":"596"},{"id":"Travel","label":"Travel","iab_id":"653"},{"id":"Video Gaming","label":"Video Gaming","iab_id":"680"},{"id":"War and Conflicts","label":"War and Conflicts","iab_id":"389"}]},"ad_categories":{"standard":"iab_ad_product","values":[{"id":"alcohol","label":"Alcohol","iab_ids":["1002"],"iab_names":["Alcohol"]},{"id":"gambling","label":"Gambling and betting","iab_ids":["1361"],"iab_names":["Gambling"]},{"id":"tobacco","label":"Tobacco and vaping","iab_ids":["1544"],"iab_names":["Tobacco"]},{"id":"dating","label":"Dating","iab_ids":["1259"],"iab_names":["Dating"]},{"id":"crypto","label":"Crypto and trading","iab_ids":["1448"],"iab_names":["Non-Fiat Currency"]},{"id":"loans","label":"Loans and debt","iab_ids":["1349","1338"],"iab_names":["Finance and Insurance / Payday and Emergency Loans","Finance and Insurance / Credit and Debt Repair/Credit Reporting"]},{"id":"weight_loss","label":"Weight loss and supplements","iab_ids":["1291","1255"],"iab_names":["Dieting and Weightloss","Consumer Packaged Goods / Vitamins and Supplements / Weightloss Supplements"]},{"id":"politics","label":"Political","iab_ids":["1474"],"iab_names":["Politics"]},{"id":"religion","label":"Religious","iab_ids":["1487"],"iab_names":["Religion and Spirituality"]}],"accepts":"Diretsa ids, or IAB Ad Product Taxonomy 2.0 ids (\"1361\" or \"iab:1361\")."},"provinces":{"standard":"iso_3166","values":[{"id":"Eastern Cape","label":"Eastern Cape","iso_3166_2":"ZA-EC"},{"id":"Free State","label":"Free State","iso_3166_2":"ZA-FS"},{"id":"Gauteng","label":"Gauteng","iso_3166_2":"ZA-GP"},{"id":"KwaZulu-Natal","label":"KwaZulu-Natal","iso_3166_2":"ZA-KZN"},{"id":"Limpopo","label":"Limpopo","iso_3166_2":"ZA-LP"},{"id":"Mpumalanga","label":"Mpumalanga","iso_3166_2":"ZA-MP"},{"id":"North West","label":"North West","iso_3166_2":"ZA-NW"},{"id":"Northern Cape","label":"Northern Cape","iso_3166_2":"ZA-NC"},{"id":"Western Cape","label":"Western Cape","iso_3166_2":"ZA-WC"}]},"languages":{"values":[{"id":"English","label":"English"},{"id":"Afrikaans","label":"Afrikaans"},{"id":"isiZulu","label":"isiZulu"},{"id":"isiXhosa","label":"isiXhosa"},{"id":"Sepedi","label":"Sepedi"},{"id":"Setswana","label":"Setswana"},{"id":"Sesotho","label":"Sesotho"},{"id":"Xitsonga","label":"Xitsonga"},{"id":"siSwati","label":"siSwati"},{"id":"Tshivenda","label":"Tshivenda"},{"id":"isiNdebele","label":"isiNdebele"},{"id":"South African Sign Language","label":"South African Sign Language"}],"note":"South Africa's official languages"},"age_groups":{"values":[{"id":"under_18","label":"under 18"},{"id":"18_24","label":"18–24"},{"id":"25_34","label":"25–34"},{"id":"35_49","label":"35–49"},{"id":"50_64","label":"50–64"},{"id":"65_plus","label":"65+"}]},"income_groups":{"values":[{"id":"lower","label":"lower"},{"id":"lower_middle","label":"lower middle"},{"id":"middle","label":"middle"},{"id":"upper_middle","label":"upper middle"},{"id":"upper","label":"upper"}],"note":"Plain bands; the licensed SAARF/MAPS segments are not used"},"objectives":{"values":[{"id":"awareness","label":"Get known (reach and impressions)"},{"id":"visits","label":"Website visits (clicks)"},{"id":"signups","label":"Sign-ups or leads"},{"id":"sales","label":"Sales"}]},"currencies":{"standard":"iso_4217","values":[{"id":"ZAR","label":"South African rand"}]},"countries":{"standard":"iso_3166","values":[{"id":"ZA","label":"South Africa"}]}},"@context":{"@vocab":"https://diretsa.com/docs/data-model#","schema":"https://schema.org/","Organisation":"schema:Organization","Placement":"schema:Offer","ScreenLocation":"schema:Place","price":"schema:price","lat":"schema:latitude","lng":"schema:longitude"}}