{"components":{"schemas":{"ProductExample":{"properties":{"example_url":{"format":"uri","type":"string"},"notes":{"maxLength":500,"type":"string"},"product_type":{"enum":["guest_post","homepage_link","sitewide_link","link_insertion","citation"],"type":"string"},"title":{"maxLength":160,"type":"string"}},"required":["product_type","title","example_url"],"type":"object"},"ProductTerm":{"properties":{"link_attribute":{"enum":["dofollow","nofollow","not_applicable"],"type":"string"},"publication_duration_months":{"description":"Use null for permanent publication.","maximum":240,"minimum":1,"type":["integer","null"]},"sponsored_label":{"type":"boolean"}},"type":"object"},"SiteWrite":{"properties":{"advertiser_access":{"enum":["email_verified","vetted_only"],"type":"string"},"citation_price_cents":{"minimum":1,"type":["integer","null"]},"domain":{"example":"publisher.example","type":"string"},"editorial_requirements":{"maxLength":5000,"type":["string","null"]},"homepage_link_price_cents":{"minimum":1,"type":["integer","null"]},"language":{"example":"English","type":"string"},"link_insertion_price_cents":{"minimum":1,"type":["integer","null"]},"niche":{"example":"Technology","type":"string"},"price_cents":{"minimum":1,"type":["integer","null"]},"product_examples":{"items":{"$ref":"#/components/schemas/ProductExample"},"maxItems":50,"type":"array"},"product_terms":{"additionalProperties":{"$ref":"#/components/schemas/ProductTerm"},"type":"object"},"publisher_description":{"maxLength":3000,"type":["string","null"]},"sitewide_link_price_cents":{"minimum":1,"type":["integer","null"]},"special_niche_prices":{"additionalProperties":{"minimum":1,"type":["integer","null"]},"type":"object"},"special_price_cents":{"minimum":1,"type":["integer","null"]}},"type":"object"}},"securitySchemes":{"PublisherKey":{"in":"header","name":"X-Publisher-Key","type":"apiKey"},"PublisherToken":{"scheme":"bearer","type":"http"}}},"info":{"description":"Submit sites, verify ownership, and manage publisher products, pricing, terms, visibility, niches, and examples.","title":"NetPartner Publisher API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/v1/publisher/auctions":{"get":{"responses":{"200":{"description":"Auction list"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"List your inventory auctions"},"post":{"responses":{"201":{"description":"Auction created"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Create an inventory auction with an optional reserve"}},"/api/v1/publisher/auctions/{auction_id}":{"delete":{"responses":{"200":{"description":"Auction cancelled"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Cancel an open auction before the first bid"},"parameters":[{"in":"path","name":"auction_id","required":true,"schema":{"type":"integer"}}],"patch":{"responses":{"200":{"description":"Auction updated"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Update price controls before the first bid"}},"/api/v1/publisher/auctions/{auction_id}/reserve-decision":{"post":{"parameters":[{"in":"path","name":"auction_id","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"action":{"enum":["accept","decline"],"type":"string"}},"required":["action"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Decision recorded; acceptance requests advertiser approval"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Accept or decline the leading bid after the reserve is missed"}},"/api/v1/publisher/opportunities":{"get":{"responses":{"200":{"description":"Opportunity feed"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"List live advertiser opportunities and your bids"}},"/api/v1/publisher/opportunities/{opportunity_id}/bids":{"post":{"parameters":[{"in":"path","name":"opportunity_id","required":true,"schema":{"type":"integer"}}],"responses":{"201":{"description":"Bid saved"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Submit or update an opportunity bid"}},"/api/v1/publisher/site-claims/verify-bulk":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"claim_ids":{"items":{"type":"integer"},"maxItems":100,"type":"array"},"method":{"enum":["auto","dns_txt","dns_cname","html_meta","html_file"],"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Per-claim verification results and promoted sites"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Check up to 100 pending ownership claims in one request"}},"/api/v1/publisher/site-claims/{claim_id}/verify":{"delete":{"parameters":[{"in":"path","name":"claim_id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Claim cancelled"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Cancel an unverified site claim"},"post":{"parameters":[{"in":"path","name":"claim_id","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"method":{"enum":["auto","dns_txt","dns_cname","html_meta","html_file"],"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Verified site"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Verify ownership and promote a claim into the portfolio"}},"/api/v1/publisher/sites":{"get":{"responses":{"200":{"description":"Portfolio and claims"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"List verified sites and pending claims"}},"/api/v1/publisher/sites/bulk":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"sites":{"items":{"$ref":"#/components/schemas/SiteWrite"},"maxItems":500,"type":"array"}},"required":["sites"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Updated sites and pending ownership claims"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Submit or update up to 500 sites atomically"}},"/api/v1/publisher/sites/{site_id}":{"patch":{"parameters":[{"in":"path","name":"site_id","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteWrite"}}},"required":true},"responses":{"200":{"description":"Updated site"},"400":{"description":"Invalid request"},"401":{"description":"Missing, disabled, or invalid API credentials"},"404":{"description":"Resource not found or not owned by this publisher"},"429":{"description":"Rate limit exceeded; honor the Retry-After response header"}},"summary":"Update one verified site"}}},"security":[{"PublisherKey":[],"PublisherToken":[]}],"servers":[{"url":"https://netpartner.com"}]}
