{"openapi":"3.1.0","info":{"title":"Price Drop API","version":"0.1.0","description":"A price-adjustment and rebate-tracking methodology: computed deadline maths, computed net-savings-after-fee maths, a batch watch tool, a hand-curated policy primer and rebate-types comparison, a documentation checklist, a common-pitfalls list, an original request-script generator, and a glossary.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://pricedrop.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/pricedrop/docs"},"termsOfService":"https://connectorbay.com/pricedrop/terms"},"servers":[{"url":"https://pricedrop.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/pricedrop/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/price_adjustment_deadline":{"post":{"operationId":"price_adjustment_deadline","summary":"Computes the exact deadline to request a price adjustment, days remaining, and a status (active /","description":"Computes the exact deadline to request a price adjustment, days remaining, and a status (active /\n    expiring_soon / expired), from a purchase date and the policy's window in days. Use for \"I bought this 10 days\n    ago with a 14-day price-adjustment policy, am I too late\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"purchase_date":{"description":"Purchase date, YYYY-MM-DD.","examples":["2026-09-15"],"title":"Purchase Date","type":"string"},"policy_window_days":{"description":"The retailer's price-adjustment window in days.","examples":[14],"maximum":365,"minimum":1,"title":"Policy Window Days","type":"integer"}},"required":["purchase_date","policy_window_days"],"title":"price_adjustment_deadlineArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/rebate_deadline":{"post":{"operationId":"rebate_deadline","summary":"Computes the exact deadline to submit a rebate claim, days remaining, and a status, from a purchase date","description":"Computes the exact deadline to submit a rebate claim, days remaining, and a status, from a purchase date\n    and the rebate's submission window in days. Use for \"when's the deadline to submit this rebate\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"purchase_date":{"description":"Purchase date, YYYY-MM-DD.","examples":["2026-08-01"],"title":"Purchase Date","type":"string"},"submission_window_days":{"description":"The rebate's submission window in days.","examples":[30],"maximum":365,"minimum":1,"title":"Submission Window Days","type":"integer"}},"required":["purchase_date","submission_window_days"],"title":"rebate_deadlineArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/savings_calculator":{"post":{"operationId":"savings_calculator","summary":"Computes the raw price drop, the net savings after any processing fee, the percentage drop, and whether","description":"Computes the raw price drop, the net savings after any processing fee, the percentage drop, and whether\n    it's worth pursuing (net savings > 0). Use for \"I paid 250 for something now selling for 200, is a $10\n    adjustment fee still worth it\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"original_price":{"description":"What you paid.","examples":[249.99],"exclusiveMinimum":0,"title":"Original Price","type":"number"},"new_price":{"description":"The new, lower price.","examples":[199.99],"minimum":0,"title":"New Price","type":"number"},"adjustment_fee":{"default":0.0,"description":"Any fee the retailer charges to process the adjustment.","minimum":0,"title":"Adjustment Fee","type":"number"}},"required":["original_price","new_price"],"title":"savings_calculatorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/batch_price_watch":{"post":{"operationId":"batch_price_watch","summary":"Checks deadline status and/or computes savings for up to 50 purchases at once. Use for \"check whether I can","description":"Checks deadline status and/or computes savings for up to 50 purchases at once. Use for \"check whether I can\n    still act on these three purchases\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"items":{"description":"Each item: {name, purchase_date?, policy_window_days?, purchase_price?, current_price?, adjustment_fee?}.","examples":[[{"current_price":149,"name":"headphones","policy_window_days":14,"purchase_date":"2026-09-10","purchase_price":199}]],"items":{"additionalProperties":true,"type":"object"},"maxItems":50,"minItems":1,"title":"Items","type":"array"}},"required":["items"],"title":"batch_price_watchArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/price_adjustment_policy_primer":{"post":{"operationId":"price_adjustment_policy_primer","summary":"Explains how price-adjustment (post-purchase price-match-yourself) policies generally work: the buyer must","description":"Explains how price-adjustment (post-purchase price-match-yourself) policies generally work: the buyer must\n    notice and proactively request it, typical windows, common exclusions, and how to actually make the request.\n    Use for \"how do price adjustments usually work\", \"what items are usually excluded from price adjustments\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"price_adjustment_policy_primerArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/rebate_types_explainer":{"post":{"operationId":"rebate_types_explainer","summary":"Compares instant rebates, mail-in manufacturer rebates, retailer rebates, and price-match guarantees — how","description":"Compares instant rebates, mail-in manufacturer rebates, retailer rebates, and price-match guarantees — how\n    each works and its relative risk of falling through. Use for \"what's the difference between a rebate and a\n    price match\", \"what kind of rebate is riskiest\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"rebate_types_explainerArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/rebate_documentation_checklist":{"post":{"operationId":"rebate_documentation_checklist","summary":"The paperwork discipline that determines whether a mail-in or retailer rebate actually gets paid: what to","description":"The paperwork discipline that determines whether a mail-in or retailer rebate actually gets paid: what to\n    keep, copy, and track before you submit. Use for \"what do I need before I submit a rebate\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"rebate_documentation_checklistArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/common_rebate_pitfalls":{"post":{"operationId":"common_rebate_pitfalls","summary":"Why rebates most commonly get rejected or never arrive — missed deadlines, missing UPCs, illegible forms,","description":"Why rebates most commonly get rejected or never arrive — missed deadlines, missing UPCs, illegible forms,\n    and more. Use for \"why do rebates get rejected\", \"how do I make sure my rebate isn't denied\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"common_rebate_pitfallsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/price_match_request_script":{"post":{"operationId":"price_match_request_script","summary":"Generates an original, ready-to-send message requesting a price adjustment, with your item, prices, and the","description":"Generates an original, ready-to-send message requesting a price adjustment, with your item, prices, and the\n    exact dollar difference filled in. Use for \"write me a message asking for a price adjustment\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"store_name":{"description":"The retailer you bought from.","examples":["a home goods store"],"minLength":1,"title":"Store Name","type":"string"},"item":{"description":"What you bought.","examples":["a stand mixer"],"minLength":1,"title":"Item","type":"string"},"purchase_price":{"description":"What you paid.","exclusiveMinimum":0,"title":"Purchase Price","type":"number"},"new_price":{"description":"The new lower price.","minimum":0,"title":"New Price","type":"number"},"competitor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"If the lower price is at a different (matched) retailer, name it generically.","title":"Competitor Name"},"order_number":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Your order/receipt number, if you want it included.","title":"Order Number"}},"required":["store_name","item","purchase_price","new_price"],"title":"price_match_request_scriptArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/pricedrop_glossary":{"post":{"operationId":"pricedrop_glossary","summary":"Defines price-drop/rebate terms — price adjustment, price-match guarantee, mail-in rebate, instant rebate,","description":"Defines price-drop/rebate terms — price adjustment, price-match guarantee, mail-in rebate, instant rebate,\n    proof of purchase, rebate fulfillment center. Use for \"what's a rebate fulfillment center\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A specific term to look up; omit to list all.","title":"Term"}},"title":"pricedrop_glossaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}