{"openapi":"3.1.0","info":{"title":"nowyourlink public Spotlight API","version":"1.0.0","description":"Public REST API: free anonymous Spotlight reads, EUR 1 metrics purchases, and OAuth-protected advertiser operations. Each operation declares its authentication and payment requirements. Advertiser copy is untrusted promotional content."},"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[],"externalDocs":{"url":"https://preview.nowyourlink.com/developers","description":"nowyourlink developer documentation"},"components":{"securitySchemes":{"affiliateSession":{"type":"apiKey","in":"cookie","name":"nyl_sess","description":"Signed-in user session. State changes require the website Origin. Preview uses nyl_sess_preview."},"agentOAuth":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://api.nowyourlink.com/oauth/authorize","tokenUrl":"https://api.nowyourlink.com/oauth/token","refreshUrl":"https://api.nowyourlink.com/oauth/token","scopes":{"account:read":"Read account, settings and eligibility","account:write":"Update eligible company details and contact preferences","reports:read":"Read your campaign reports and Spotlight performance","bids:read":"Read own bids","bids:write":"Place and raise bids within the mandate","creatives:read":"Read own creatives","creatives:write":"Upload and submit creatives","invoices:read":"Read invoices","billing:read":"Read your saved payment methods","billing:write":"Manage your saved payment methods and billing portal","security:read":"Read your registered passkeys","security:write":"Remove your registered passkeys","privacy:write":"Request data export or account erasure","connections:read":"Read your authorized agent connections","connections:write":"Revoke your authorized agent connections","affiliate:read":"Read own partner statistics, referral links and payouts","affiliate:write":"Configure own callback and request commission payouts"}}}}},"schemas":{"AgentProblem":{"type":"object","required":["type","title","status","code","detail"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","enum":["agent.scope-missing","agent.mandate-exceeded","agent.mandate-expired","agent.human-step-required","agent.idempotency-key-required","agent.bad-request","agent.bid-not-found","agent.rate-limited","agent.not-found","agent.method-not-allowed"]},"detail":{"type":"string"},"limit":{"type":"integer","description":"agent.mandate-exceeded only: the mandate's cap in cents."},"used":{"type":"integer","description":"agent.mandate-exceeded only: cents already spent today."},"requested":{"type":"integer","description":"agent.mandate-exceeded only: cents this request asked for."},"reasons":{"type":"array","items":{"type":"string"},"description":"agent.human-step-required only: why a human must act."},"action_url":{"type":"string","format":"uri-reference","pattern":"^/","description":"agent.human-step-required only: a same-origin path, relative to the site, where the advertiser completes the step in a browser."}}},"ApiError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","retryable"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"}}}}},"OAuthBearerError":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}}},"EngineProblem":{"type":"object","required":["type","title","status","code"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","enum":["VALIDATION_FAILED","AUTH_REQUIRED","FORBIDDEN","NOT_FOUND","CONFLICT","RATE_LIMITED"]},"detail":{"type":"string"},"instance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"paths":{"/api/v1/sandbox":{"get":{"operationId":"getSandboxExample","summary":"Read a synthetic integration example; no production data or side effects.","description":"Read a synthetic integration example; no production data or side effects.","security":[],"parameters":[],"responses":{"200":{"description":"Successful public read.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["sandbox","data"],"properties":{"sandbox":{"const":true},"data":{"type":"object","additionalProperties":false,"required":["day","headline","description","advertiser","canonicalUrl","contentType"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"headline":{"type":"string"},"description":{"type":"string"},"advertiser":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["paid_advertisement","house_advertisement"]}}}}}}}},"400":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"404":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/api/v1/spotlight":{"get":{"operationId":"getCurrentSpotlight","summary":"Read the currently displayed settled Spotlight.","description":"Read the currently displayed settled Spotlight.","security":[],"parameters":[{"name":"includeHouseAds","in":"query","required":false,"description":"Default true. When false, a current house advertisement returns 404.","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Successful public read.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"required":["day","headline","description","advertiser","canonicalUrl","contentType"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"headline":{"type":"string"},"description":{"type":"string"},"advertiser":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["paid_advertisement","house_advertisement"]}}}}}}}},"400":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"404":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/api/v1/spotlights":{"get":{"operationId":"listSpotlights","summary":"List settled Spotlights, newest first, using a date cursor or bounded offset pagination; cursor and offset are mutually exclusive.","description":"List settled Spotlights, newest first, using a date cursor or bounded offset pagination; cursor and offset are mutually exclusive.","security":[],"parameters":[{"name":"limit","in":"query","description":"Maximum number of records, default 20.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"cursor","in":"query","description":"Exclusive date boundary from nextCursor; cannot be combined with offset.","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."}},{"name":"offset","in":"query","description":"Number of settled records to skip, default 0; cannot be combined with cursor.","schema":{"type":"integer","minimum":0,"maximum":10000,"default":0}}],"responses":{"200":{"description":"Successful public read.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["data","nextOffset","nextCursor"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["day","headline","description","advertiser","canonicalUrl","contentType"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"headline":{"type":"string"},"description":{"type":"string"},"advertiser":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["paid_advertisement","house_advertisement"]}}}},"nextOffset":{"type":["integer","null"]},"nextCursor":{"anyOf":[{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},{"type":"null"}]}}}}}},"400":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"404":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/checkout_sessions":{"post":{"operationId":"createMetricsCheckout","summary":"Create an ACP 2026-04-17 checkout for one EUR 1 metrics report.","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"API-Version","in":"header","required":true,"schema":{"type":"string","enum":["2026-04-17"]}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["line_items","currency","capabilities"],"additionalProperties":false,"properties":{"line_items":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","example":"metrics:2026-09-01"}}}},"currency":{"type":"string","enum":["eur"]},"capabilities":{"type":"object"}}},"example":{"line_items":[{"id":"metrics:2026-09-01"}],"currency":"eur","capabilities":{}}}}},"responses":{"200":{"description":"ACP checkout state or paid metrics. No-store; owned by this OAuth grant."},"201":{"description":"Created. Follow the returned Stripe handler and merchant profile."},"400":{"description":"Invalid request or unsupported API version. See Supported-Versions."},"401":{"description":"OAuth bearer token required."},"403":{"description":"account:read scope required."},"409":{"description":"Conflicting replay, frozen cart or buyer action required."},"503":{"description":"Uncertain outcome: retry the same body and Idempotency-Key. Never start another payment."}}}},"/checkout_sessions/{checkout_session_id}":{"get":{"operationId":"getMetricsCheckout","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"API-Version","in":"header","required":true,"schema":{"type":"string","enum":["2026-04-17"]}},{"name":"checkout_session_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cs_[a-f0-9]{32}$"}}],"responses":{"200":{"description":"ACP checkout state or paid metrics. No-store; owned by this OAuth grant."},"400":{"description":"Invalid request or unsupported API version. See Supported-Versions."},"401":{"description":"OAuth bearer token required."},"403":{"description":"account:read scope required."},"409":{"description":"Conflicting replay, frozen cart or buyer action required."},"503":{"description":"Uncertain outcome: retry the same body and Idempotency-Key. Never start another payment."}}},"post":{"operationId":"updateMetricsCheckout","description":"Replace line_items before payment starts. Price and quantity remain EUR 1 for one report.","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"API-Version","in":"header","required":true,"schema":{"type":"string","enum":["2026-04-17"]}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255}},{"name":"checkout_session_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cs_[a-f0-9]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["line_items"],"properties":{"line_items":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","example":"metrics:2026-09-01"}}}}}}}}},"responses":{"200":{"description":"ACP checkout state or paid metrics. No-store; owned by this OAuth grant."},"400":{"description":"Invalid request or unsupported API version. See Supported-Versions."},"401":{"description":"OAuth bearer token required."},"403":{"description":"account:read scope required."},"409":{"description":"Conflicting replay, frozen cart or buyer action required."},"503":{"description":"Uncertain outcome: retry the same body and Idempotency-Key. Never start another payment."}}}},"/checkout_sessions/{checkout_session_id}/complete":{"post":{"operationId":"completeMetricsCheckout","description":"The buyer-approved Stripe SPT authorizes this EUR 1 charge. OAuth account:read identifies the owner only. Keep the same token, body and key when retrying uncertain outcomes.","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"API-Version","in":"header","required":true,"schema":{"type":"string","enum":["2026-04-17"]}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255}},{"name":"checkout_session_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cs_[a-f0-9]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payment_data"],"properties":{"payment_data":{"type":"object","required":["handler_id","instrument"],"properties":{"handler_id":{"type":"string","enum":["stripe"]},"instrument":{"type":"object","required":["type","credential"],"properties":{"type":{"type":"string","enum":["card"]},"credential":{"type":"object","required":["type","token"],"properties":{"type":{"type":"string","enum":["spt"]},"token":{"type":"string","writeOnly":true,"pattern":"^spt_"}}}}}}}}}}}},"responses":{"200":{"description":"ACP checkout state or paid metrics. No-store; owned by this OAuth grant."},"400":{"description":"Invalid request or unsupported API version. See Supported-Versions."},"401":{"description":"OAuth bearer token required."},"403":{"description":"account:read scope required."},"409":{"description":"Conflicting replay, frozen cart or buyer action required."},"503":{"description":"Uncertain outcome: retry the same body and Idempotency-Key. Never start another payment."}}}},"/checkout_sessions/{checkout_session_id}/cancel":{"post":{"operationId":"cancelMetricsCheckout","description":"Cancel before payment begins. Cannot cancel a payment already in progress.","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"API-Version","in":"header","required":true,"schema":{"type":"string","enum":["2026-04-17"]}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255}},{"name":"checkout_session_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cs_[a-f0-9]{32}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":0}}}},"responses":{"200":{"description":"ACP checkout state or paid metrics. No-store; owned by this OAuth grant."},"400":{"description":"Invalid request or unsupported API version. See Supported-Versions."},"401":{"description":"OAuth bearer token required."},"403":{"description":"account:read scope required."},"409":{"description":"Conflicting replay, frozen cart or buyer action required."},"503":{"description":"Uncertain outcome: retry the same body and Idempotency-Key. Never start another payment."}}}},"/checkout_sessions/{checkout_session_id}/resource":{"get":{"operationId":"getPurchasedMetrics","description":"Retrieve the report after confirmed payment, using the same OAuth grant.","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"API-Version","in":"header","required":true,"schema":{"type":"string","enum":["2026-04-17"]}},{"name":"checkout_session_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cs_[a-f0-9]{32}$"}}],"responses":{"200":{"description":"ACP checkout state or paid metrics. No-store; owned by this OAuth grant."},"400":{"description":"Invalid request or unsupported API version. See Supported-Versions."},"401":{"description":"OAuth bearer token required."},"403":{"description":"account:read scope required."},"409":{"description":"Conflicting replay, frozen cart or buyer action required."},"503":{"description":"Uncertain outcome: retry the same body and Idempotency-Key. Never start another payment."}}}},"/ask":{"get":{"operationId":"askPublicSpotlights","summary":"Look up public Spotlights or documentation with a bounded English query.","description":"Deterministic read-only retrieval, not generated advice. No account access, bidding, payments or conversational state.","security":[],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","examples":["current spotlight","API documentation"]}},{"name":"mode","in":"query","schema":{"type":"string","enum":["list"],"default":"list"}},{"name":"streaming","in":"query","schema":{"type":"boolean","default":false},"description":"true enables finite SSE; false returns JSON."}],"responses":{"200":{"description":"Bounded public retrieval. Streaming returns start, indexed result and complete SSE events, then closes.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["_meta","results"],"properties":{"_meta":{"type":"object","required":["version","response_type","response_format"],"properties":{"version":{"const":"0.55"},"response_type":{"const":"answer"},"response_format":{"const":"conversational_search"}}},"results":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"@type":{"const":"CreativeWork"},"url":{"type":"string","format":"uri"},"name":{"type":"string"},"text":{"type":"string"},"description":{"type":"string"},"datePublished":{"type":"string","format":"date"},"additionalType":{"type":"string"}}}}}}},"text/event-stream":{"schema":{"type":"string"},"example":"event: start\ndata: {\"_meta\":{\"version\":\"0.55\",\"response_type\":\"answer\",\"response_format\":\"conversational_search\",\"mode\":\"list\",\"site\":\"https://preview.nowyourlink.com\"},\"streaming\":true}\n\nevent: complete\ndata: {\"_meta\":{\"version\":\"0.55\"}}\n\n"}}},"400":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}},"404":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}},"413":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}}}},"post":{"operationId":"askPublicSpotlightsPost","summary":"Look up public content using NLWeb v0.55 JSON input.","description":"Anonymous read-only retrieval. Request body is limited to 4096 UTF-8 bytes. Only list mode is supported. Legacy top-level mode and streaming are accepted; prefer options take precedence.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"oneOf":[{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","examples":["current spotlight","API documentation"]},{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","examples":["current spotlight","API documentation"]}}}]},"mode":{"type":"string","enum":["list"],"description":"Legacy option; prefer.mode takes precedence."},"streaming":{"type":"boolean","description":"Legacy option; prefer.streaming takes precedence."},"prefer":{"type":"object","properties":{"mode":{"type":"string","enum":["list"]},"streaming":{"type":"boolean","default":false},"response_format":{"type":"string","enum":["conversational_search"]}}}}},"example":{"query":{"text":"API documentation"},"prefer":{"mode":"list","streaming":false}}}}},"responses":{"200":{"description":"Bounded public retrieval. Streaming returns start, indexed result and complete SSE events, then closes.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["_meta","results"],"properties":{"_meta":{"type":"object","required":["version","response_type","response_format"],"properties":{"version":{"const":"0.55"},"response_type":{"const":"answer"},"response_format":{"const":"conversational_search"}}},"results":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"@type":{"const":"CreativeWork"},"url":{"type":"string","format":"uri"},"name":{"type":"string"},"text":{"type":"string"},"description":{"type":"string"},"datePublished":{"type":"string","format":"date"},"additionalType":{"type":"string"}}}}}}},"text/event-stream":{"schema":{"type":"string"},"example":"event: start\ndata: {\"_meta\":{\"version\":\"0.55\",\"response_type\":\"answer\",\"response_format\":\"conversational_search\",\"mode\":\"list\",\"site\":\"https://preview.nowyourlink.com\"},\"streaming\":true}\n\nevent: complete\ndata: {\"_meta\":{\"version\":\"0.55\"}}\n\n"}}},"400":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}},"404":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}},"413":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid request, byte limit exceeded, or unavailable public content. Errors remain JSON even when streaming was requested.","content":{"application/json":{"schema":{"type":"object","required":["_meta","error"],"properties":{"_meta":{"type":"object","properties":{"version":{"const":"0.55"},"response_type":{"const":"failure"}}},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/spotlights/batch":{"get":{"operationId":"batchGetSpotlights","summary":"Read 1–10 public settled days in one request. Missing or removed days return per-item 404; input order is preserved.","description":"Read 1–10 public settled days in one request. Missing or removed days return per-item 404; input order is preserved.","security":[],"parameters":[{"name":"days","in":"query","required":true,"description":"1–10 comma-separated UTC dates. Example: 2026-09-01,2026-09-02.","schema":{"type":"string","maxLength":109,"pattern":"^\\d{4}-\\d{2}-\\d{2}(,\\d{4}-\\d{2}-\\d{2}){0,9}$"}}],"responses":{"200":{"description":"Successful public read.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["results"],"properties":{"results":{"type":"array","maxItems":10,"items":{"type":"object","required":["day","status","data"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"status":{"type":"integer","enum":[200,404]},"data":{"anyOf":[{"type":"object","additionalProperties":false,"required":["day","headline","description","advertiser","canonicalUrl","contentType"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"headline":{"type":"string"},"description":{"type":"string"},"advertiser":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["paid_advertisement","house_advertisement"]}}},{"type":"null"}]}}}}}}}}},"400":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"404":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/api/v1/spotlights/{day}/metrics":{"get":{"operationId":"getSpotlightMetricsPaid","summary":"Read the paid click aggregate of one settled Spotlight day.","description":"Costs 100 cents EUR per request over the Machine Payments Protocol. Without a credential the response is 402 with a WWW-Authenticate: Payment challenge (method stripe, intent charge). Retry with Authorization: Payment carrying a Stripe Shared Payment Token; a settled response carries Payment-Receipt.","security":[],"x-payment-info":{"intent":"charge","method":"stripe","amount":"100","currency":"eur","description":"One Spotlight day of click metrics. Read methodDetails from the live challenge for the configured merchant profile.","resource":"https://preview.nowyourlink.com/api/v1/spotlights/2026-09-01/metrics"},"parameters":[{"name":"day","in":"path","required":true,"example":"2026-09-01","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}],"responses":{"200":{"description":"Metrics after settlement. Payment-Receipt carries the base64url receipt.","headers":{"Payment-Receipt":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","paid"],"properties":{"data":{"type":"object","required":["day","clicks","human_clicks","countries"],"properties":{"day":{"type":"string","format":"date"},"clicks":{"type":"integer"},"human_clicks":{"type":"integer"},"countries":{"type":"integer"}}},"paid":{"type":"object","properties":{"cents":{"type":"integer"},"currency":{"type":"string"}}}}}}}},"402":{"description":"Payment challenge. WWW-Authenticate: Payment id, realm, method, intent, request, expires, description.","headers":{"WWW-Authenticate":{"schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"type":"object"}}}},"404":{"description":"No settled Spotlight on that day."},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/api/v1/spotlights/{day}":{"get":{"operationId":"getSpotlight","summary":"Read one settled Spotlight by UTC date.","description":"Read one settled Spotlight by UTC date.","security":[],"parameters":[{"name":"day","in":"path","required":true,"description":"Settled UTC auction date.","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."}}],"responses":{"200":{"description":"Successful public read.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"required":["day","headline","description","advertiser","canonicalUrl","contentType"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"headline":{"type":"string"},"description":{"type":"string"},"advertiser":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["paid_advertisement","house_advertisement"]}}}}}}}},"400":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"404":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/api/v1/sandbox/jobs":{"post":{"operationId":"createSandboxJob","summary":"Start a synthetic asynchronous sandbox job.","description":"Integration example for retry and polling logic. Requires Idempotency-Key; the same key always yields the same jobId. Never writes production data.","security":[],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-chosen unique key (1–255 characters). Retries with the same key return the same job.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x21-\\x7e]+$"}}],"responses":{"202":{"description":"Job accepted. Poll the Location header.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Location":{"description":"Job status URL.","schema":{"type":"string","format":"uri"}}},"content":{"application/json":{"schema":{"type":"object","required":["sandbox","jobId","status","statusUrl"],"properties":{"sandbox":{"const":true},"jobId":{"type":"string","pattern":"^sbx_[0-9a-f]{16}$"},"status":{"type":"string","enum":["queued","completed"]},"statusUrl":{"type":"string","format":"uri"},"result":{"type":"object","required":["sandbox","data"],"properties":{"sandbox":{"const":true},"data":{"type":"object","additionalProperties":false,"required":["day","headline","description","advertiser","canonicalUrl","contentType"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"headline":{"type":"string"},"description":{"type":"string"},"advertiser":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["paid_advertisement","house_advertisement"]}}}}}}}}}},"400":{"description":"Invalid input. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/api/v1/sandbox/jobs/{jobId}":{"get":{"operationId":"getSandboxJob","summary":"Read a synthetic sandbox job. Jobs always complete immediately.","description":"Read a synthetic sandbox job. Jobs always complete immediately.","security":[],"parameters":[{"name":"jobId","in":"path","required":true,"description":"Job identifier from createSandboxJob.","schema":{"type":"string","pattern":"^sbx_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"Successful public read.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"}},"content":{"application/json":{"schema":{"type":"object","required":["sandbox","jobId","status","statusUrl"],"properties":{"sandbox":{"const":true},"jobId":{"type":"string","pattern":"^sbx_[0-9a-f]{16}$"},"status":{"type":"string","enum":["queued","completed"]},"statusUrl":{"type":"string","format":"uri"},"result":{"type":"object","required":["sandbox","data"],"properties":{"sandbox":{"const":true},"data":{"type":"object","additionalProperties":false,"required":["day","headline","description","advertiser","canonicalUrl","contentType"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"headline":{"type":"string"},"description":{"type":"string"},"advertiser":{"type":"string"},"canonicalUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["paid_advertisement","house_advertisement"]}}}}}}}}}},"400":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"404":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"429":{"description":"Shared public token bucket exhausted. Wait Retry-After seconds before retrying.","headers":{"RateLimit-Policy":{"description":"IETF draft structured field: 120-token capacity, replenished at 2 tokens per second; no fixed window.","schema":{"type":"string"},"example":"\"agent\";q=120;nyl-refill=2"},"RateLimit":{"description":"Actual remaining tokens after this request; shared per trusted client IP across public agent endpoints.","schema":{"type":"string"},"example":"\"agent\";r=119"},"Retry-After":{"schema":{"type":"integer","minimum":1}}},"content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}},"503":{"description":"Invalid input, unavailable content, or temporary service failure. See problem detail.","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail"],"properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}}}}}}}}},"/v1/agent/me":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"getAgentAccount","summary":"Read account and first-bid prerequisites. Supply optional day, ad_id and amount_cents for a concrete readiness snapshot, including browser steps and continuation actions.","description":"Read account and first-bid prerequisites. Supply optional day, ad_id and amount_cents for a concrete readiness snapshot, including browser steps and continuation actions.","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"day","in":"query","required":false,"schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."}},{"name":"ad_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,64}$"}},{"name":"amount_cents","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000000}}],"responses":{"200":{"description":"Account summary. Never includes e-mail, VAT id or payment details.","content":{"application/json":{"schema":{"type":"object","required":["user_id","company_name","country","tier","eligibility","first_bid","mandate","scopes"],"properties":{"user_id":{"type":"string"},"company_name":{"type":["string","null"]},"country":{"type":["string","null"]},"tier":{"type":["string","null"]},"eligibility":{"type":"object","required":["can_bid","reasons"],"properties":{"can_bid":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"action_url":{"type":"string","format":"uri-reference","description":"Browser path or hosted identity verification URL."}}},"first_bid":{"type":"object","required":["checked_at","status","requirements","next_action","recovery"],"properties":{"checked_at":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["ready","blocked","unknown"]},"requirements":{"type":"array","items":{"type":"object","required":["id","status","code","detail"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["satisfied","blocked","unknown"]},"code":{"type":"string"},"detail":{"type":"string"},"action":{"type":"object"}}}},"next_action":{"type":"object","required":["actor","label","url"],"properties":{"actor":{"type":"string","enum":["agent","user","wait"]},"label":{"type":"string"},"url":{"type":"string","format":"uri-reference"},"tool":{"type":"string"},"arguments":{"type":"object"},"required_scopes":{"type":"array","items":{"type":"string"}},"required_inputs":{"type":"array","items":{"type":"string"}}}},"recovery":{"type":"object","description":"Read list_my_bids for the original day before reusing the original request and idempotency key after an uncertain write. Acceptance is not winning or delivery."}}},"mandate":{"type":["object","null"],"required":["max_bid_cents","daily_cap_cents","valid_until"],"properties":{"max_bid_cents":{"type":"integer"},"daily_cap_cents":{"type":"integer"},"valid_until":{"type":"string","format":"date-time"}}},"scopes":{"type":"array","items":{"type":"string"}}}}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}}},"/v1/agent/bids":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"listAgentBids","summary":"List this advertiser's bids for one auction day.","description":"List this advertiser's bids for one auction day.","security":[{"agentOAuth":["bids:read"]}],"parameters":[{"name":"day","in":"query","required":true,"description":"Auction day to read.","schema":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."}}],"responses":{"200":{"description":"The advertiser's bids for the day.","content":{"application/json":{"schema":{"type":"object","required":["bids"],"properties":{"bids":{"type":"array","items":{"type":"object","required":["id","day","ad_id","amount_cents","currency","status","placed_at"],"properties":{"id":{"type":"string"},"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"ad_id":{"type":["string","null"]},"amount_cents":{"type":"integer"},"currency":{"const":"EUR"},"status":{"type":"string"},"placed_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"day=YYYY-MM-DD is required.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}},"post":{"operationId":"createAgentBid","summary":"Place a sealed bid for an owned, approved creative within the grant's mandate.","description":"Place a sealed bid for an owned, approved creative within the grant's mandate.","security":[{"agentOAuth":["bids:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-chosen unique key, 1-255 visible ASCII characters. The same key returns the same result.","schema":{"type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["day","ad_id","amount_cents","currency"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"ad_id":{"type":"string","description":"Owned, approved creative id."},"amount_cents":{"type":"integer","minimum":100,"maximum":100000000,"description":"Any cent amount in range. The mandate's max_bid_cents caps it further."},"currency":{"type":"string","enum":["EUR"]},"payment_method_id":{"type":"string","maxLength":255,"pattern":"^pm_[A-Za-z0-9_]+$","description":"Optional owned saved card for a new bid. Bid increases use the account default card."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Bid accepted (or replayed for a repeated Idempotency-Key). The body is the auction state.","content":{"application/json":{"schema":{"type":"object","required":["day","phase","bidCount"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"phase":{"type":"string","enum":["IDLE","OPEN","CLOSED"]},"openedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"bidCount":{"type":"integer"},"closesAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Missing Idempotency-Key, a malformed body (agent.idempotency-key-required, agent.bad-request), or a wire-shape rejection from the underlying bid route (auction.bad-body).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, an exceeded or expired mandate, a required human step (agent.scope-missing, agent.mandate-exceeded, agent.mandate-expired, agent.human-step-required), or an unapproved or unowned creative (bid.ad-not-approved).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The auction engine rejected the bid: the wrong phase, not yet initialised, below the minimum bid, or stale under the strict-monotonic rule (CONFLICT).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/EngineProblem"}}}},"422":{"description":"The forwarded bid event failed the auction engine's own shape validation (VALIDATION_FAILED). Unreachable when day, ad_id, amount_cents and currency are already valid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/EngineProblem"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}}},"/v1/agent/bids/{bidId}/increase":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"increaseAgentBid","summary":"Raise an existing sealed bid within the grant's mandate.","description":"Raise an existing sealed bid within the grant's mandate.","security":[{"agentOAuth":["bids:write"]}],"parameters":[{"name":"bidId","in":"path","required":true,"description":"Bid to raise.","schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,128}$"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-chosen unique key, 1-255 visible ASCII characters. The same key returns the same result.","schema":{"type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["day","ad_id","amount_cents","currency"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"ad_id":{"type":"string","description":"Owned, approved creative id."},"amount_cents":{"type":"integer","minimum":100,"maximum":100000000,"description":"Any cent amount in range. The mandate's max_bid_cents caps it further."},"currency":{"type":"string","enum":["EUR"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Bid raised (or replayed for a repeated Idempotency-Key). The body is the auction state.","content":{"application/json":{"schema":{"type":"object","required":["day","phase","bidCount"],"properties":{"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"phase":{"type":"string","enum":["IDLE","OPEN","CLOSED"]},"openedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"bidCount":{"type":"integer"},"closesAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Missing Idempotency-Key, a malformed body (agent.idempotency-key-required, agent.bad-request), or a wire-shape rejection from the underlying bid route (auction.bad-body).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, an exceeded or expired mandate, a required human step (agent.scope-missing, agent.mandate-exceeded, agent.mandate-expired, agent.human-step-required), or an unapproved or unowned creative (bid.ad-not-approved).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No active bid with that id for this advertiser on that day (agent.bid-not-found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The auction engine rejected the increase: the wrong phase, below the minimum increment, or stale under the strict-monotonic rule (CONFLICT).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/EngineProblem"}}}},"422":{"description":"No payment method on file (bid.no-payment-method), or the forwarded bid event failed the auction engine's own shape validation (VALIDATION_FAILED).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/EngineProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}}},"/v1/agent/creatives":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"listAgentCreatives","summary":"List this advertiser's creatives.","description":"List this advertiser's creatives.","security":[{"agentOAuth":["creatives:read"]}],"parameters":[{"name":"cursor","in":"query","description":"Opaque pagination cursor from a prior cursor value.","schema":{"type":"string"}},{"name":"state","in":"query","description":"Filter by moderation state.","schema":{"type":"string","enum":["draft","pending","approved","rejected","revoked"]}}],"responses":{"200":{"description":"Owned creatives, newest first.","content":{"application/json":{"schema":{"type":"object","required":["ads","cursor"],"properties":{"ads":{"type":"array","items":{"type":"object","required":["id","state","headline"],"properties":{"id":{"type":"string"},"state":{"type":"string","enum":["draft","pending","approved","rejected","revoked"]},"headline":{"type":["string","null"]},"asset_id":{"type":["string","null"]},"auto_filter_verdict":{"type":["string","null"]},"submitted_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}},"cursor":{"type":["string","null"]}}}}}},"400":{"description":"Unknown state filter (ads.bad-state).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}},"post":{"operationId":"createAgentCreative","summary":"Create a draft creative from an uploaded asset.","description":"Create a draft creative from an uploaded asset.","security":[{"agentOAuth":["creatives:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"headline":{"type":["string","null"],"maxLength":80},"body":{"type":["string","null"],"maxLength":180},"target_url":{"type":["string","null"],"format":"uri","pattern":"^https://","maxLength":2048},"display_url":{"type":["string","null"],"maxLength":2048},"cta_label":{"type":["string","null"],"enum":["learn-more","shop-now","sign-up","book","download","contact",null]},"clone_from":{"type":"string","description":"Reuse another owned creative's asset."}},"additionalProperties":false}}}},"responses":{"201":{"description":"Draft creative created.","content":{"application/json":{"schema":{"type":"object","required":["ad_id","state"],"properties":{"ad_id":{"type":"string"},"state":{"const":"draft"}}}}}},"400":{"description":"Unknown field or an invalid copy value (ads.bad-body, ads.bad-headline, ads.bad-body-text, ads.bad-target-url, ads.bad-display-url, ads.bad-cta, ads.bad-clone-from).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"404":{"description":"clone_from does not name an owned creative (ads.clone-source-not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}}},"/v1/agent/creatives/upload":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"uploadAgentCreativeAsset","summary":"Upload a creative image, up to 10 MB in jpeg, png, webp or gif.","description":"Upload a creative image, up to 10 MB in jpeg, png, webp or gif.","security":[{"agentOAuth":["creatives:write"]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Draft asset created (or reused by content hash).","content":{"application/json":{"schema":{"type":"object","required":["ad_id","asset_id","deduped"],"properties":{"ad_id":{"type":"string"},"asset_id":{"type":"string"},"deduped":{"type":"boolean"}}}}}},"400":{"description":"No file field, an empty file, or a malformed image (ads.bad-multipart, ads.missing-file, ads.malformed-image).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"413":{"description":"Upload exceeds 10 MB (ads.upload-too-large).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"415":{"description":"Only image/png, image/jpeg, image/webp, image/gif are accepted (ads.unsupported-mime).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}}},"/v1/agent/creatives/{id}":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"getAgentCreative","summary":"Read one owned creative by id.","description":"Read one owned creative by id.","security":[{"agentOAuth":["creatives:read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creative id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The creative.","content":{"application/json":{"schema":{"type":"object","required":["ad"],"properties":{"ad":{"type":"object","required":["id","state","headline"],"properties":{"id":{"type":"string"},"state":{"type":"string","enum":["draft","pending","approved","rejected","revoked"]},"headline":{"type":["string","null"]},"body":{"type":["string","null"]},"target_url":{"type":["string","null"],"format":"uri"},"display_url":{"type":["string","null"]},"cta_label":{"type":["string","null"]},"asset_id":{"type":["string","null"]},"asset_kind":{"type":["string","null"]},"asset_transcode_state":{"type":["string","null"]},"alt_text":{"type":["string","null"]},"auto_filter_verdict":{"type":["string","null"]},"auto_filter_score":{"type":["number","null"]},"submitted_at":{"type":["string","null"],"format":"date-time"},"decided_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"latest_decision":{"type":["object","null"],"required":["to_state","reason_code","created_at"],"properties":{"to_state":{"type":"string"},"reason_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"}}}}}}}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"404":{"description":"No such creative in your library (ads.not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}},"patch":{"operationId":"updateAgentCreative","summary":"Edit the copy of an owned draft creative, or the caption of its image.","description":"Edit the copy of an owned draft creative, or the caption of its image.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creative id.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"At least one field. `null` clears a copy field; `alt_text` edits the attached image's caption and stays editable past the draft state.","properties":{"headline":{"type":["string","null"],"maxLength":80},"body":{"type":["string","null"],"maxLength":180},"target_url":{"type":["string","null"],"format":"uri"},"display_url":{"type":["string","null"],"maxLength":2048},"cta_label":{"type":["string","null"]},"alt_text":{"type":"string","maxLength":160}},"additionalProperties":false}}}},"responses":{"200":{"description":"The creative was updated.","content":{"application/json":{"schema":{"type":"object","required":["ad_id","updated"],"properties":{"ad_id":{"type":"string"},"updated":{"const":true},"alt_text_updated":{"type":"boolean","description":"Present only when alt_text was supplied."}}}}}},"400":{"description":"Unknown field, no updatable field, or an invalid value (ads.bad-body, ads.no-fields, ads.bad-headline, ads.bad-body-text, ads.bad-target-url, ads.bad-display-url, ads.bad-cta, ads.bad-alt-text).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The creative is not a draft, or it has no image to caption (ads.not-draft, ads.no-asset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}},"delete":{"operationId":"delete_creative","summary":"Delete your eligible creative under the website's in-use and shared-asset guards. This removes the creative; it cannot delete another account's media.","description":"Delete your eligible creative under the website's in-use and shared-asset guards. This removes the creative; it cannot delete another account's media.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"Your creative ID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}}},"responses":{"200":{"description":"Delete your eligible creative under the website's in-use and shared-asset guards. This removes the creative; it cannot delete another account's media.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/creatives/{id}/submit":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"submitAgentCreative","summary":"Submit a draft creative for moderation.","description":"Submit a draft creative for moderation.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creative id.","schema":{"type":"string"}}],"responses":{"202":{"description":"Accepted for moderation, or auto-rejected by the keyword filter.","content":{"application/json":{"schema":{"type":"object","required":["ad_id","state"],"properties":{"ad_id":{"type":"string"},"state":{"type":"string","enum":["pending","rejected"]},"reason_code":{"type":"string"}}}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"404":{"description":"No such creative in your library (ads.not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The creative is not a draft, or video processing has not finished (ads.not-draft, ads.state-conflict, media.transcode-failed, media.transcode-pending).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"A required field or the creative asset is missing (ads.incomplete, lists the field names in `missing`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}}},"/v1/agent/invoices":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"listAgentInvoices","summary":"List invoices issued to this advertiser.","description":"List invoices issued to this advertiser.","security":[{"agentOAuth":["invoices:read"]}],"responses":{"200":{"description":"Issued invoices, most recent first.","content":{"application/json":{"schema":{"type":"object","required":["invoices"],"properties":{"invoices":{"type":"array","items":{"type":"object","required":["id","day","invoice_number","amount_cents","currency","status","hosted_invoice_url"],"properties":{"id":{"type":"string"},"day":{"type":"string","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Settled auction date in UTC, YYYY-MM-DD."},"invoice_number":{"type":["string","null"]},"amount_cents":{"type":"integer"},"currency":{"const":"EUR"},"status":{"type":"string","enum":["open","paid"]},"hosted_invoice_url":{"type":["string","null"],"format":"uri"},"finalized_at":{"type":"string","format":"date-time"},"paid_at":{"type":["string","null"],"format":"date-time"}}}}}}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"This grant lacks the scope the operation requires.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}}}}},"/api/affiliate/stats":{"get":{"operationId":"getAffiliateStatsSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["partner","policy","balance","days","referrals","campaigns","commissions","payouts"],"properties":{"partner":{"type":["object","null"],"properties":{"code":{"type":"string"},"display_name":{"type":"string"},"status":{"enum":["active","suspended"]},"postback_url":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}},"policy":{"type":"object","properties":{"audienceBps":{"type":"integer"},"advertiserBps":{"type":"integer"},"minimumPayoutCents":{"type":"integer","minimum":0},"reserveDays":{"type":"integer"}}},"balance":{"type":"object","properties":{"pendingCents":{"type":"integer"},"approvedCents":{"type":"integer"},"reservedCents":{"type":"integer"},"paidCents":{"type":"integer"}}},"days":{"type":"array","items":{"type":"object","properties":{"auctionId":{"type":"string","format":"date"},"netAmountCents":{"type":"integer","minimum":0},"audienceBps":{"type":"integer","minimum":0},"advertiserBps":{"type":"integer","minimum":0},"totalClicks":{"type":"integer","minimum":0},"partnerClicks":{"type":"integer","minimum":0},"estimatedAudienceCents":{"type":"integer","minimum":0},"status":{"enum":["live","settled","reversed"]},"endsAt":{"type":"string","format":"date-time"}}}},"referrals":{"type":"object","properties":{"total":{"type":"integer","minimum":0},"eligible":{"type":"integer","minimum":0},"potentialAdvertiserBps":{"type":"integer","minimum":0}}},"campaigns":{"type":"array","items":{"type":"object","properties":{"campaign":{"type":["string","null"]},"subid":{"type":["string","null"]},"clicks":{"type":"integer","minimum":0},"visits":{"type":["integer","null"],"minimum":0,"description":"Recorded referral page loads, including reloads, over 30 UTC calendar days. Null means no visit data is available for a historical click-only campaign. Visits do not earn commission or represent unique visitors. Excess daily placement labels use the [other] bucket."}}}},"commissions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"auction_id":{"type":"string","format":"date"},"kind":{"enum":["audience","advertiser","adjustment"]},"amount_cents":{"type":"integer"},"status":{"enum":["pending","approved","reserved","paid","reversed"]},"available_at":{"type":"string","format":"date-time"}}}},"payouts":{"type":"array","items":{"type":"object","required":["id","amount_cents","currency","status"],"properties":{"id":{"type":"string"},"amount_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"status":{"enum":["pending","transferred","paid","failed"]},"bank_retry_allowed":{"type":"boolean"},"failure_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"description":"Last 30 days, up to 50 commissions. Live amounts are estimates. No private referred-advertiser bids are disclosed."}},"/api/affiliate/links":{"get":{"operationId":"getAffiliateLinksSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["code","destination","url","bannerHtml"],"properties":{"code":{"type":"string"},"destination":{"enum":["spotlight","advertiser"]},"url":{"type":"string","format":"uri"},"bannerHtml":{"type":"string"}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"parameters":[{"name":"destination","in":"query","required":false,"schema":{"type":"string","enum":["spotlight","advertiser"],"default":"spotlight"},"description":"spotlight opens the homepage; advertiser opens signup."},{"name":"campaign","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,80}$"},"description":"Stable campaign or placement label; never a visitor or click ID."},{"name":"subid","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,80}$"},"description":"Stable campaign or placement label; never a visitor or click ID."}],"description":"Returns a direct / or /signup URL with affiliate_code and optional affiliate_campaign/affiliate_subid labels. GETs do not establish commission attribution. Homepage attribution is optional; signup has a visible optional referral field."}},"/api/affiliate/me":{"get":{"operationId":"getAffiliatePartnerSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"partner":{"type":["object","null"],"properties":{"code":{"type":"string"},"display_name":{"type":"string"},"status":{"enum":["active","suspended"]},"postback_url":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}}},"post":{"operationId":"activateAffiliatePartnerSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"201":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"partner":{"type":["object","null"],"properties":{"code":{"type":"string"},"display_name":{"type":"string"},"status":{"enum":["active","suspended"]},"postback_url":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["termsAccepted"],"properties":{"termsAccepted":{"const":true},"displayName":{"type":"string","minLength":1,"maxLength":120}}}}}}},"patch":{"operationId":"configureAffiliatePostbackSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["postbackUrl","signingSecret","postback_host_approved"],"properties":{"postbackUrl":{"type":["string","null"]},"signingSecret":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"description":"A new callback URL returns a signing secret once. An identical retry returns null for the secret. Never expose it in public tracking links.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["postbackUrl"],"properties":{"postbackUrl":{"type":["string","null"],"maxLength":2048,"description":"Public HTTPS URL. Operator approval of its exact hostname is required before delivery. Null disables postbacks."}}}}}}}},"/api/affiliate/payouts":{"get":{"operationId":"listAffiliatePayoutsSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"minimum_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"items":{"type":"array","items":{"type":"object","required":["id","amount_cents","currency","status"],"properties":{"id":{"type":"string"},"amount_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"status":{"enum":["pending","transferred","paid","failed"]},"bank_retry_allowed":{"type":"boolean"},"failure_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}}},"post":{"operationId":"requestAffiliatePayoutSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"202":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["id","amount_cents","currency","status"],"properties":{"id":{"type":"string"},"amount_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"status":{"enum":["pending","transferred","paid","failed"]},"bank_retry_allowed":{"type":"boolean"},"failure_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{8,128}$"},"description":"Use the same key for retries of one payout request; a new key represents a new request."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"payoutId":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F-]{36}$","description":"Retry this owned returned bank payout using its original Stripe transfer."}}}}}},"description":"Reserves available commissions, or retries the selected owned returned bank payout, and starts an idempotent payout Workflow. Pending/transferred does not mean paid to a bank."}},"/api/affiliate/connect":{"get":{"operationId":"getAffiliateConnectSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"configured":{"type":"boolean"},"account_id":{"type":["string","null"]},"transfers_active":{"type":"boolean"},"payouts_enabled":{"type":"boolean"},"ready":{"type":"boolean"},"requirements_due":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}}},"post":{"operationId":"startAffiliateConnectSession","tags":["Affiliate"],"servers":[{"url":"https://preview.nowyourlink.com"}],"security":[{"affiliateSession":[]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time","description":"Onboarding links only. Express dashboard login links omit this field."}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"country":{"enum":["DE","AT","BE","ES","FI","FR","IE","IT","LU","NL","PT"],"default":"DE"}}}}}},"description":"Returns a fresh Express dashboard login link for a ready owned recipient, otherwise Stripe-hosted onboarding. Country applies only to account creation. Links stay inside the authenticated app and must not be stored or sent by email. A return redirect is not verification evidence."}},"/v1/agent/affiliate/stats":{"get":{"operationId":"getAffiliateStats","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:read"]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["partner","policy","balance","days","referrals","campaigns","commissions","payouts"],"properties":{"partner":{"type":["object","null"],"properties":{"code":{"type":"string"},"display_name":{"type":"string"},"status":{"enum":["active","suspended"]},"postback_url":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}},"policy":{"type":"object","properties":{"audienceBps":{"type":"integer"},"advertiserBps":{"type":"integer"},"minimumPayoutCents":{"type":"integer","minimum":0},"reserveDays":{"type":"integer"}}},"balance":{"type":"object","properties":{"pendingCents":{"type":"integer"},"approvedCents":{"type":"integer"},"reservedCents":{"type":"integer"},"paidCents":{"type":"integer"}}},"days":{"type":"array","items":{"type":"object","properties":{"auctionId":{"type":"string","format":"date"},"netAmountCents":{"type":"integer","minimum":0},"audienceBps":{"type":"integer","minimum":0},"advertiserBps":{"type":"integer","minimum":0},"totalClicks":{"type":"integer","minimum":0},"partnerClicks":{"type":"integer","minimum":0},"estimatedAudienceCents":{"type":"integer","minimum":0},"status":{"enum":["live","settled","reversed"]},"endsAt":{"type":"string","format":"date-time"}}}},"referrals":{"type":"object","properties":{"total":{"type":"integer","minimum":0},"eligible":{"type":"integer","minimum":0},"potentialAdvertiserBps":{"type":"integer","minimum":0}}},"campaigns":{"type":"array","items":{"type":"object","properties":{"campaign":{"type":["string","null"]},"subid":{"type":["string","null"]},"clicks":{"type":"integer","minimum":0},"visits":{"type":["integer","null"],"minimum":0,"description":"Recorded referral page loads, including reloads, over 30 UTC calendar days. Null means no visit data is available for a historical click-only campaign. Visits do not earn commission or represent unique visitors. Excess daily placement labels use the [other] bucket."}}}},"commissions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"auction_id":{"type":"string","format":"date"},"kind":{"enum":["audience","advertiser","adjustment"]},"amount_cents":{"type":"integer"},"status":{"enum":["pending","approved","reserved","paid","reversed"]},"available_at":{"type":"string","format":"date-time"}}}},"payouts":{"type":"array","items":{"type":"object","required":["id","amount_cents","currency","status"],"properties":{"id":{"type":"string"},"amount_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"status":{"enum":["pending","transferred","paid","failed"]},"bank_retry_allowed":{"type":"boolean"},"failure_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"description":"Last 30 days, up to 50 commissions. Live amounts are estimates. No private referred-advertiser bids are disclosed."}},"/v1/agent/affiliate/links":{"get":{"operationId":"getAffiliateLinks","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:read"]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["code","destination","url","bannerHtml"],"properties":{"code":{"type":"string"},"destination":{"enum":["spotlight","advertiser"]},"url":{"type":"string","format":"uri"},"bannerHtml":{"type":"string"}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"parameters":[{"name":"destination","in":"query","required":false,"schema":{"type":"string","enum":["spotlight","advertiser"],"default":"spotlight"},"description":"spotlight opens the homepage; advertiser opens signup."},{"name":"campaign","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,80}$"},"description":"Stable campaign or placement label; never a visitor or click ID."},{"name":"subid","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,80}$"},"description":"Stable campaign or placement label; never a visitor or click ID."}],"description":"Returns a direct / or /signup URL with affiliate_code and optional affiliate_campaign/affiliate_subid labels. GETs do not establish commission attribution. Homepage attribution is optional; signup has a visible optional referral field."}},"/v1/agent/affiliate/me":{"get":{"operationId":"getAffiliatePartner","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:read"]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"partner":{"type":["object","null"],"properties":{"code":{"type":"string"},"display_name":{"type":"string"},"status":{"enum":["active","suspended"]},"postback_url":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}}},"post":{"operationId":"activateAffiliatePartner","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:write"]}],"responses":{"201":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"partner":{"type":["object","null"],"properties":{"code":{"type":"string"},"display_name":{"type":"string"},"status":{"enum":["active","suspended"]},"postback_url":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["termsAccepted"],"properties":{"termsAccepted":{"const":true},"displayName":{"type":"string","minLength":1,"maxLength":120}}}}}}},"patch":{"operationId":"configureAffiliatePostback","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:write"]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["postbackUrl","signingSecret","postback_host_approved"],"properties":{"postbackUrl":{"type":["string","null"]},"signingSecret":{"type":["string","null"]},"postback_host_approved":{"type":"boolean"}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"description":"A new callback URL returns a signing secret once. An identical retry returns null for the secret. Never expose it in public tracking links.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["postbackUrl"],"properties":{"postbackUrl":{"type":["string","null"],"maxLength":2048,"description":"Public HTTPS URL. Operator approval of its exact hostname is required before delivery. Null disables postbacks."}}}}}}}},"/v1/agent/affiliate/payouts":{"get":{"operationId":"listAffiliatePayouts","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:read"]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"minimum_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"items":{"type":"array","items":{"type":"object","required":["id","amount_cents","currency","status"],"properties":{"id":{"type":"string"},"amount_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"status":{"enum":["pending","transferred","paid","failed"]},"bank_retry_allowed":{"type":"boolean"},"failure_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}}},"post":{"operationId":"requestAffiliatePayout","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:write"]}],"responses":{"202":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","required":["id","amount_cents","currency","status"],"properties":{"id":{"type":"string"},"amount_cents":{"type":"integer","minimum":0},"currency":{"const":"eur"},"status":{"enum":["pending","transferred","paid","failed"]},"bank_retry_allowed":{"type":"boolean"},"failure_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{8,128}$"},"description":"Use the same key for retries of one payout request; a new key represents a new request."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"payoutId":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F-]{36}$","description":"Retry this owned returned bank payout using its original Stripe transfer."}}}}}},"description":"Reserves available commissions, or retries the selected owned returned bank payout, and starts an idempotent payout Workflow. Pending/transferred does not mean paid to a bank."}},"/v1/agent/affiliate/connect":{"get":{"operationId":"getAffiliateConnect","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:read"]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"configured":{"type":"boolean"},"account_id":{"type":["string","null"]},"transfers_active":{"type":"boolean"},"payouts_enabled":{"type":"boolean"},"ready":{"type":"boolean"},"requirements_due":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}}},"post":{"operationId":"startAffiliateConnect","tags":["Affiliate"],"servers":[{"url":"https://api.nowyourlink.com"}],"security":[{"agentOAuth":["affiliate:write"]}],"responses":{"200":{"description":"Own partner data. Amounts are EUR cents. Cache-Control: no-store.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time","description":"Onboarding links only. Express dashboard login links omit this field."}}}}}},"400":{"description":"Invalid query, body or idempotency key."},"401":{"description":"Session or delegated OAuth token required."},"403":{"description":"Missing scope, inactive partner, unverified account or invalid Origin."},"404":{"description":"Partner account is not activated."},"409":{"description":"Payout threshold or Stripe verification requirements not met."},"502":{"description":"Stripe unavailable. Retry the same request key after reconciliation."},"503":{"description":"Integration not configured."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"country":{"enum":["DE","AT","BE","ES","FI","FR","IE","IT","LU","NL","PT"],"default":"DE"}}}}}},"description":"Returns a fresh Express dashboard login link for a ready owned recipient, otherwise Stripe-hosted onboarding. Country applies only to account creation. Links stay inside the authenticated app and must not be stored or sent by email. A return redirect is not verification evidence."}},"/api/affiliate/register":{"post":{"operationId":"registerAffiliatePartner","tags":["Affiliate"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","display_name","country","locale","turnstileToken","terms_accepted","terms_version"],"properties":{"email":{"type":"string","format":"email"},"display_name":{"type":"string","minLength":1,"maxLength":120},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"locale":{"enum":["de","en"]},"turnstileToken":{"type":"string"},"terms_accepted":{"const":true},"terms_version":{"const":"2026-10-05"}}}}}},"responses":{"201":{"description":"Confirmation email requested. No commission for registration."},"204":{"description":"Existing account; use sign-in."},"400":{"description":"Invalid signup or terms."},"429":{"description":"Registration rate limit reached."}}}},"/v1/agent/auctions":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"list_auctions","summary":"Read the website's rolling 365-day auction calendar, status, planned close and your own active bid counts. Missing mirror rows remain NOT_CREATED; no competitor amounts.","description":"Read the website's rolling 365-day auction calendar, status, planned close and your own active bid counts. Missing mirror rows remain NOT_CREATED; no competitor amounts.","security":[{"agentOAuth":["bids:read"]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}},{"name":"to","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}}],"responses":{"200":{"description":"Read the website's rolling 365-day auction calendar, status, planned close and your own active bid counts. Missing mirror rows remain NOT_CREATED; no competitor amounts.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/auctions/{day}":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"get_auction","summary":"Read one auction's calendar state, your own bid chain and the same coarse bidder-count bucket as the website. Never returns competitor bids.","description":"Read one auction's calendar state, your own bid chain and the same coarse bidder-count bucket as the website. Never returns competitor bids.","security":[{"agentOAuth":["bids:read"]}],"parameters":[{"name":"day","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}}],"responses":{"200":{"description":"Read one auction's calendar state, your own bid chain and the same coarse bidder-count bucket as the website. Never returns competitor bids.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/bids/history":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"list_bid_history","summary":"Read your bids across days with bounded pagination and the website's payment-failure and cancelled states. The won filter includes failed settlement.","description":"Read your bids across days with bounded pagination and the website's payment-failure and cancelled states. The won filter includes failed settlement.","security":[{"agentOAuth":["bids:read"]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}},{"name":"to","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["all","active","won","lost","superseded","cancelled","payment_failed"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":10000}}],"responses":{"200":{"description":"Read your bids across days with bounded pagination and the website's payment-failure and cancelled states. The won filter includes failed settlement.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/creatives/{id}/download":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"get_creative_download","summary":"Create a private temporary download URL for your creative's website download rendition. The URL expires after 15 minutes; keep it out of public artifacts.","description":"Create a private temporary download URL for your creative's website download rendition. The URL expires after 15 minutes; keep it out of public artifacts.","security":[{"agentOAuth":["creatives:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"Your creative ID."}}],"responses":{"200":{"description":"Create a private temporary download URL for your creative's website download rendition. The URL expires after 15 minutes; keep it out of public artifacts.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/billing/payment-methods":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"list_payment_methods","summary":"Read your saved cards and default payment method. Returns card summaries, never full card numbers or secrets.","description":"Read your saved cards and default payment method. Returns card summaries, never full card numbers or secrets.","security":[{"agentOAuth":["billing:read"]}],"parameters":[],"responses":{"200":{"description":"Read your saved cards and default payment method. Returns card summaries, never full card numbers or secrets.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/billing/payment-methods/{id}/default":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"set_default_payment_method","summary":"Set an owned saved card as your default under existing billing and settlement guards. Does not change the card on an existing bid.","description":"Set an owned saved card as your default under existing billing and settlement guards. Does not change the card on an existing bid.","security":[{"agentOAuth":["billing:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"Your saved payment method ID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}}},"responses":{"200":{"description":"Set an owned saved card as your default under existing billing and settlement guards. Does not change the card on an existing bid.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/billing/payment-methods/{id}":{"servers":[{"url":"https://api.nowyourlink.com"}],"delete":{"operationId":"remove_payment_method","summary":"Remove an owned saved card. The website's last-card and active-settlement guards still apply.","description":"Remove an owned saved card. The website's last-card and active-settlement guards still apply.","security":[{"agentOAuth":["billing:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"Your saved payment method ID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}}},"responses":{"200":{"description":"Remove an owned saved card. The website's last-card and active-settlement guards still apply.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/billing/portal":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"open_billing_portal","summary":"Open the hosted Stripe portal to update your billing address. This portal does not collect a new card; use prepare_account_action for the website's card form.","description":"Open the hosted Stripe portal to update your billing address. This portal does not collect a new card; use prepare_account_action for the website's card form.","security":[{"agentOAuth":["billing:write"]}],"parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false,"required":[]}}}},"responses":{"200":{"description":"Open the hosted Stripe portal to update your billing address. This portal does not collect a new card; use prepare_account_action for the website's card form.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/passkeys":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"list_passkeys","summary":"Read your registered passkey names and dates without private key material.","description":"Read your registered passkey names and dates without private key material.","security":[{"agentOAuth":["security:read"]}],"parameters":[],"responses":{"200":{"description":"Read your registered passkey names and dates without private key material.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/passkeys/{id}":{"servers":[{"url":"https://api.nowyourlink.com"}],"delete":{"operationId":"remove_passkey","summary":"Remove one of your registered passkeys. You must explicitly choose the key; this removes a login method.","description":"Remove one of your registered passkeys. You must explicitly choose the key; this removes a login method.","security":[{"agentOAuth":["security:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"Your passkey ID."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}}},"responses":{"204":{"description":"The account update completed; this response has no body."},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/marketing-consent":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"request_marketing_consent","summary":"Request the existing double-opt-in email for your account. The email recipient must confirm; this call cannot grant marketing consent.","description":"Request the existing double-opt-in email for your account. The email recipient must confirm; this call cannot grant marketing consent.","security":[{"agentOAuth":["account:write"]}],"parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false,"required":[]}}}},"responses":{"202":{"description":"Request the existing double-opt-in email for your account. The email recipient must confirm; this call cannot grant marketing consent.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"withdraw_marketing_consent","summary":"Withdraw your marketing consent using the website's consent, preference and audit transaction. Mandatory service messages remain enabled.","description":"Withdraw your marketing consent using the website's consent, preference and audit transaction. Mandatory service messages remain enabled.","security":[{"agentOAuth":["account:write"]}],"parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false,"required":[]}}}},"responses":{"204":{"description":"The account update completed; this response has no body."},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/data-export":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"request_data_export","summary":"Request the website's data-export action. The current website returns not implemented; report that response honestly and never invent a bundle.","description":"Request the website's data-export action. The current website returns not implemented; report that response honestly and never invent a bundle.","security":[{"agentOAuth":["privacy:write"]}],"parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false,"required":[]}}}},"responses":{"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"501":{"description":"Data export is unavailable in the application.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/data-erasure":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"request_account_erasure","summary":"Queue account erasure through the existing privacy workflow, subject to unpaid-invoice retention guards. Ask for explicit erasure authorization; queue acceptance does not prove deletion.","description":"Queue account erasure through the existing privacy workflow, subject to unpaid-invoice retention guards. Ask for explicit erasure authorization; queue acceptance does not prove deletion.","security":[{"agentOAuth":["privacy:write"]}],"parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false,"required":[]}}}},"responses":{"202":{"description":"Queue account erasure through the existing privacy workflow, subject to unpaid-invoice retention guards. Ask for explicit erasure authorization; queue acceptance does not prove deletion.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/connections":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"list_agent_connections","summary":"Read your OAuth agent connections and their granted scopes and spending limits. Never exposes access tokens or expands a grant.","description":"Read your OAuth agent connections and their granted scopes and spending limits. Never exposes access tokens or expands a grant.","security":[{"agentOAuth":["connections:read"]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":2048}}],"responses":{"200":{"description":"Read your OAuth agent connections and their granted scopes and spending limits. Never exposes access tokens or expands a grant.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/connections/{id}":{"servers":[{"url":"https://api.nowyourlink.com"}],"delete":{"operationId":"revoke_agent_connection","summary":"Revoke a selected owned agent connection and clear its spending tally. Revoking this connection can stop further tool calls. Cannot create a grant or raise a mandate.","description":"Revoke a selected owned agent connection and clear its spending tally. Revoking this connection can stop further tool calls. Cannot create a grant or raise a mandate.","security":[{"agentOAuth":["connections:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"The owned provider grant ID from list_agent_connections."}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}}},"responses":{"204":{"description":"The account update completed; this response has no body."},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/actions":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"prepare_account_action","summary":"Prepare the website step for a device-bound or personally approved action. Returns requires_user_action and the deployment's URL; never claims completion or raises a mandate.","description":"Prepare the website step for a device-bound or personally approved action. Returns requires_user_action and the deployment's URL; never claims completion or raises a mandate.","security":[{"agentOAuth":["account:read"]}],"parameters":[{"name":"action","in":"query","required":false,"schema":{"type":"string","enum":["register_passkey","add_payment_method","first_bid","push_enrollment","authorize_agent"]}}],"responses":{"200":{"description":"Prepare the website step for a device-bound or personally approved action. Returns requires_user_action and the deployment's URL; never claims completion or raises a mandate.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/settings":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"get_account_settings","summary":"Read your company profile, VAT verification state, contact preferences and hosted billing/security links. Preferences do not prove marketing consent or browser push enrollment.","description":"Read your company profile, VAT verification state, contact preferences and hosted billing/security links. Preferences do not prove marketing consent or browser push enrollment.","security":[{"agentOAuth":["account:read"]}],"parameters":[],"responses":{"200":{"description":"Read your company profile, VAT verification state, contact preferences and hosted billing/security links. Preferences do not prove marketing consent or browser push enrollment.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/company-profile":{"servers":[{"url":"https://api.nowyourlink.com"}],"patch":{"operationId":"update_company_profile","summary":"Correct your company name and VAT ID while your account permits correction. Supply both fields; null clears the VAT ID. Existing verification, country and billing locks still apply.","description":"Correct your company name and VAT ID while your account permits correction. Supply both fields; null clears the VAT ID. Existing verification, country and billing locks still apply.","security":[{"agentOAuth":["account:write"]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_name":{"type":"string","maxLength":200},"vat_id":{"type":["string","null"],"maxLength":32}},"required":["company_name","vat_id"],"additionalProperties":false}}}},"responses":{"204":{"description":"The account update completed; this response has no body."},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/account/notification-preferences":{"servers":[{"url":"https://api.nowyourlink.com"}],"patch":{"operationId":"set_notification_preference","summary":"Enable or disable one supported email or push topic for your account. You cannot disable mandatory service messages. Marketing requires existing confirmed consent; push enrollment needs browser permission.","description":"Enable or disable one supported email or push topic for your account. You cannot disable mandatory service messages. Marketing requires existing confirmed consent; push enrollment needs browser permission.","security":[{"agentOAuth":["account:write"]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string","enum":["new_auction_open","outbid_recovery","winback","holiday","product_email","account_security","auction_outcome","payment_receipt","outbid","closing_soon"]},"channel":{"type":"string","enum":["email","push"]},"enabled":{"type":"boolean"}},"required":["topic","channel","enabled"],"additionalProperties":false}}}},"responses":{"204":{"description":"The account update completed; this response has no body."},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/reports":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"list_reports","summary":"List your saved campaign reports by UTC day, newest first, with bounded pagination. Reports preserve historical spend. Missing conversion tracking yields null metrics rather than a claim of zero sales.","description":"List your saved campaign reports by UTC day, newest first, with bounded pagination. Reports preserve historical spend. Missing conversion tracking yields null metrics rather than a claim of zero sales.","security":[{"agentOAuth":["reports:read"]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"before","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}}],"responses":{"200":{"description":"List your saved campaign reports by UTC day, newest first, with bounded pagination. Reports preserve historical spend. Missing conversion tracking yields null metrics rather than a claim of zero sales.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/reports/{day}":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"get_report","summary":"Read your saved campaign report for one UTC auction day, including clicks, observed conversions, revenue, spend and return on ad spend. Unknown tracking stays null; this does not expose another advertiser's report.","description":"Read your saved campaign report for one UTC auction day, including clicks, observed conversions, revenue, spend and return on ad spend. Unknown tracking stays null; this does not expose another advertiser's report.","security":[{"agentOAuth":["reports:read"]}],"parameters":[{"name":"day","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}}],"responses":{"200":{"description":"Read your saved campaign report for one UTC auction day, including clicks, observed conversions, revenue, spend and return on ad spend. Unknown tracking stays null; this does not expose another advertiser's report.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/spotlights/{day}/stats":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"get_spotlight_stats","summary":"Read performance for a Spotlight you own on one UTC day. Statistics exclude bots and withhold aggregates that mix advertisers. Unknown tracking stays null; sealed competitor bids remain private.","description":"Read performance for a Spotlight you own on one UTC day. Statistics exclude bots and withhold aggregates that mix advertisers. Unknown tracking stays null; sealed competitor bids remain private.","security":[{"agentOAuth":["reports:read"]}],"parameters":[{"name":"day","in":"path","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Auction day in UTC, YYYY-MM-DD."}}],"responses":{"200":{"description":"Read performance for a Spotlight you own on one UTC day. Statistics exclude bots and withhold aggregates that mix advertisers. Unknown tracking stays null; sealed competitor bids remain private.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/videos":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"start_video_upload","summary":"Create a video creative draft and multipart upload for your rendered MP4, MOV or WebM. Returns ad_id, asset_id, upload_id, key and part_size. Upload actual bytes directly with signed URLs; this tool does not generate or render video.","description":"Create a video creative draft and multipart upload for your rendered MP4, MOV or WebM. Returns ad_id, asset_id, upload_id, key and part_size. Upload actual bytes directly with signed URLs; this tool does not generate or render video.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mime":{"type":"string","enum":["video/mp4","video/quicktime","video/webm"]},"content_length":{"type":"integer","minimum":1,"maximum":4999999999}},"required":["mime","content_length"],"additionalProperties":false}}}},"responses":{"200":{"description":"Create a video creative draft and multipart upload for your rendered MP4, MOV or WebM. Returns ad_id, asset_id, upload_id, key and part_size. Upload actual bytes directly with signed URLs; this tool does not generate or render video.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/videos/{asset_id}/parts":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"get_video_upload_urls","summary":"Sign up to 50 multipart PUT URLs for your video upload; URLs expire after 15 minutes. Use returned part_size and retain each PUT response ETag. Upload URLs are private temporary capabilities; never publish them.","description":"Sign up to 50 multipart PUT URLs for your video upload; URLs expire after 15 minutes. Use returned part_size and retain each PUT response ETag. Upload URLs are private temporary capabilities; never publish them.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"upload_id":{"type":"string","maxLength":2048},"key":{"type":"string","maxLength":1024},"part_numbers":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"integer","minimum":1,"maximum":299}}},"required":["upload_id","key","part_numbers"],"additionalProperties":false}}}},"responses":{"200":{"description":"Sign up to 50 multipart PUT URLs for your video upload; URLs expire after 15 minutes. Use returned part_size and retain each PUT response ETag. Upload URLs are private temporary capabilities; never publish them.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/videos/{asset_id}/complete":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"complete_video_upload","summary":"Finalize your multipart upload using actual ETags and enqueue metadata validation and video transcoding. Queue acceptance does not complete transcoding, approve the creative or publish the ad. Check get_video_status before submitting the creative.","description":"Finalize your multipart upload using actual ETags and enqueue metadata validation and video transcoding. Queue acceptance does not complete transcoding, approve the creative or publish the ad. Check get_video_status before submitting the creative.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"upload_id":{"type":"string","maxLength":2048},"key":{"type":"string","maxLength":1024},"ad_id":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_-]+$"},"parts":{"type":"array","minItems":1,"maxItems":299,"items":{"type":"object","properties":{"part_number":{"type":"integer","minimum":1,"maximum":299},"etag":{"type":"string","maxLength":128}},"required":["part_number","etag"],"additionalProperties":false}}},"required":["ad_id","upload_id","key","parts"],"additionalProperties":false}}}},"responses":{"202":{"description":"Finalize your multipart upload using actual ETags and enqueue metadata validation and video transcoding. Queue acceptance does not complete transcoding, approve the creative or publish the ad. Check get_video_status before submitting the creative.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/videos/{asset_id}/status":{"servers":[{"url":"https://api.nowyourlink.com"}],"get":{"operationId":"get_video_status","summary":"Read transcoding status for your own video asset. Only ready permits creative submission; a queued, processing or failed upload does not prove readiness or moderation approval.","description":"Read transcoding status for your own video asset. Only ready permits creative submission; a queued, processing or failed upload does not prove readiness or moderation approval.","security":[{"agentOAuth":["creatives:read"]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_-]+$"}}],"responses":{"200":{"description":"Read transcoding status for your own video asset. Only ready permits creative submission; a queued, processing or failed upload does not prove readiness or moderation approval.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/videos/{asset_id}":{"servers":[{"url":"https://api.nowyourlink.com"}],"delete":{"operationId":"abort_video_upload","summary":"Abort your incomplete multipart upload and optionally remove its empty draft ad. Supply the original asset_id, upload_id and key. This cannot withdraw a live ad or undo a completed transcode.","description":"Abort your incomplete multipart upload and optionally remove its empty draft ad. Supply the original asset_id, upload_id and key. This cannot withdraw a live ad or undo a completed transcode.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"upload_id":{"type":"string","maxLength":2048},"key":{"type":"string","maxLength":1024},"ad_id":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["upload_id","key"],"additionalProperties":false}}}},"responses":{"200":{"description":"Abort your incomplete multipart upload and optionally remove its empty draft ad. Supply the original asset_id, upload_id and key. This cannot withdraw a live ad or undo a completed transcode.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/agent/creatives/{id}/video":{"servers":[{"url":"https://api.nowyourlink.com"}],"post":{"operationId":"replace_creative_video","summary":"Start a replacement video upload on your existing draft. This detaches the draft's current media before the new upload completes. Confirm this specific replacement first; a failed upload does not restore the old attachment.","description":"Start a replacement video upload on your existing draft. This detaches the draft's current media before the new upload completes. Confirm this specific replacement first; a failed upload does not restore the old attachment.","security":[{"agentOAuth":["creatives:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mime":{"type":"string","enum":["video/mp4","video/quicktime","video/webm"]},"content_length":{"type":"integer","minimum":1,"maximum":4999999999}},"required":["mime","content_length"],"additionalProperties":false}}}},"responses":{"200":{"description":"Start a replacement video upload on your existing draft. This detaches the draft's current media before the new upload completes. Confirm this specific replacement first; a failed upload does not restore the old attachment.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid arguments or media.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"The bearer token is missing, expired or invalid. A missing Authorization header returns an empty body.","headers":{"WWW-Authenticate":{"description":"Bearer challenge pointing to the protected-resource document.","schema":{"type":"string"},"example":"Bearer resource_metadata=\"https://api.nowyourlink.com/.well-known/oauth-protected-resource\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthBearerError"}}}},"403":{"description":"Missing scope, inactive account, ownership or consent failure.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"No owned record exists for this identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"The path exists but does not accept this method (agent.method-not-allowed).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"409":{"description":"The current account or creative state blocks this operation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Verification or media validation failed.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"This grant's 120-per-minute token bucket is empty. Wait Retry-After seconds before retrying.","headers":{"Retry-After":{"schema":{"type":"integer"},"example":60}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}}}},"503":{"description":"A dependency failed; read current state before retrying a mutation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/AgentProblem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}}}