{"openapi":"3.1.0","info":{"title":"Abonnement Goedkoop API","version":"1.0.0","description":"The mobile plans Abonnement Goedkoop compares in the Netherlands, as its pages list them: Sim Only plans, and plans with a phone. Prices are in euros, a month unless said otherwise.\n\nPlans are read from the providers' product feeds every hour (meta.checked_at): a plan that has left its feed is gone after the next read. A provider can change an offer in between, so its page at offer_url is what counts.\n\nThe order is by price, never by commission. Each offer_url redirects to the provider, and Abonnement Goedkoop may earn a commission when a plan is taken through it.\n\nUp to 60 requests a minute; responses may be cached for 15 minutes. Invalid parameters get a 422 with the reasons."},"externalDocs":{"description":"The site for AI agents (llms.txt)","url":"https://www.abonnement-goedkoop.nl/llms.txt"},"servers":[{"url":"https://www.abonnement-goedkoop.nl"}],"paths":{"/api/v1/sim-only":{"get":{"operationId":"listSimOnlyPlans","summary":"Sim Only plans, cheapest first","description":"The plans https://www.abonnement-goedkoop.nl/sim-only lists with every plan on its own, for the same parameters, in the same order: by price_after_promotion (promotional_price with prijs=nu), then by the other price. 24 a page, links.next for the next.","parameters":[{"$ref":"#/components/parameters/prijs"},{"$ref":"#/components/parameters/price_min"},{"$ref":"#/components/parameters/price_max"},{"$ref":"#/components/parameters/data_min"},{"$ref":"#/components/parameters/data_max"},{"$ref":"#/components/parameters/minutes_min"},{"$ref":"#/components/parameters/minutes_max"},{"$ref":"#/components/parameters/contract_duration"},{"$ref":"#/components/parameters/contract_durations"},{"$ref":"#/components/parameters/network"},{"$ref":"#/components/parameters/brand_id"},{"$ref":"#/components/parameters/brand_ids"},{"$ref":"#/components/parameters/page"}],"responses":{"200":{"description":"A page of plans.","content":{"application/json":{"schema":{"type":"object","required":["data","links","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}},"links":{"$ref":"#/components/schemas/Links"},"meta":{"allOf":[{"$ref":"#/components/schemas/PageMeta"},{"type":"object","required":["compared_price","listing_url","last_updated","checked_at","notes"],"properties":{"compared_price":{"type":"string","enum":["nu","na-actie"],"description":"The price the plans are sorted and filtered by (prijs)."},"listing_url":{"type":"string","format":"uri","description":"The page for people with the same plans, to link to."},"last_updated":{"type":["string","null"],"format":"date-time","description":"The latest updated_at of the plans that match."},"checked_at":{"type":["string","null"],"format":"date-time","description":"When the plans were last read from the providers' feeds (every hour): each plan listed was on offer at these prices then."},"notes":{"type":"object","description":"What the fields mean, by field name.","additionalProperties":{"type":"string"}}}}]}}}}}},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/api/v1/phones":{"get":{"operationId":"listPhones","summary":"Phones with a plan, those chosen most first","description":"As https://www.abonnement-goedkoop.nl/mobiele-telefoons lists them, 24 a page. With network or brand_id, only that one's plans count.","parameters":[{"$ref":"#/components/parameters/network"},{"name":"brand_id","in":"query","description":"A provider's id (see listProviders).","schema":{"type":"integer"}},{"$ref":"#/components/parameters/page"}],"responses":{"200":{"description":"A page of phones.","content":{"application/json":{"schema":{"type":"object","required":["data","links","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Phone"}},"links":{"$ref":"#/components/schemas/Links"},"meta":{"allOf":[{"$ref":"#/components/schemas/PageMeta"},{"type":"object","required":["listing_url","checked_at","notes"],"properties":{"listing_url":{"type":"string","format":"uri"},"checked_at":{"type":["string","null"],"format":"date-time","description":"When the plans were last read from the providers' feeds (every hour): each plan listed was on offer at these prices then."},"notes":{"type":"object","description":"What the fields mean, by field name.","additionalProperties":{"type":"string"}}}}]}}}}}},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/api/v1/phones/{phone}":{"get":{"operationId":"listPhonePlans","summary":"A phone's plans, cheapest first","description":"The plans on the phone's page (its url), for the same parameters, in the same order: by what a plan costs a month on average over its contract, the upfront payment and any promotion included (total_contract_cost / contract_months); by promotional_price with prijs=nu. 24 a page.","parameters":[{"name":"phone","in":"path","required":true,"description":"The phone's slug: the end of its plans_api_url and of its page's url.","schema":{"type":"string"}},{"$ref":"#/components/parameters/prijs"},{"$ref":"#/components/parameters/price_min"},{"$ref":"#/components/parameters/price_max"},{"$ref":"#/components/parameters/upfront_min"},{"$ref":"#/components/parameters/upfront_max"},{"$ref":"#/components/parameters/data_min"},{"$ref":"#/components/parameters/data_max"},{"$ref":"#/components/parameters/minutes_min"},{"$ref":"#/components/parameters/minutes_max"},{"$ref":"#/components/parameters/contract_duration"},{"$ref":"#/components/parameters/contract_durations"},{"$ref":"#/components/parameters/network"},{"$ref":"#/components/parameters/brand_id"},{"$ref":"#/components/parameters/brand_ids"},{"$ref":"#/components/parameters/page"}],"responses":{"200":{"description":"A page of the phone's plans.","content":{"application/json":{"schema":{"type":"object","required":["data","links","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PhonePlan"}},"links":{"$ref":"#/components/schemas/Links"},"meta":{"allOf":[{"$ref":"#/components/schemas/PageMeta"},{"type":"object","required":["phone","compared_price","listing_url","checked_at","notes"],"properties":{"phone":{"$ref":"#/components/schemas/PhoneLink"},"compared_price":{"type":"string","enum":["nu","na-actie"]},"listing_url":{"type":"string","format":"uri","description":"The phone's page with the same plans, to link to."},"checked_at":{"type":["string","null"],"format":"date-time","description":"When the plans were last read from the providers' feeds (every hour): each plan listed was on offer at these prices then."},"notes":{"type":"object","description":"What the fields mean, by field name.","additionalProperties":{"type":"string"}}}}]}}}}}},"404":{"description":"No such phone, or none of its plans is on offer."},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/api/v1/providers":{"get":{"operationId":"listProviders","summary":"Every provider, with the id to filter on","responses":{"200":{"description":"Every provider, by name.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Provider"}},"meta":{"type":"object","required":["listing_url"],"properties":{"listing_url":{"type":"string","format":"uri"}}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/api/v1/networks":{"get":{"operationId":"listNetworks","summary":"The Dutch mobile networks and the providers on each","responses":{"200":{"description":"The three networks.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Network"}},"meta":{"type":"object","required":["listing_url"],"properties":{"listing_url":{"type":"string","format":"uri"}}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"}}}},"/api/v1/articles":{"get":{"operationId":"listArticles","summary":"The published articles, newest first","parameters":[{"$ref":"#/components/parameters/page"}],"responses":{"200":{"description":"A page of articles.","content":{"application/json":{"schema":{"type":"object","required":["data","links","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Article"}},"links":{"$ref":"#/components/schemas/Links"},"meta":{"allOf":[{"$ref":"#/components/schemas/PageMeta"},{"type":"object","required":["listing_url"],"properties":{"listing_url":{"type":"string","format":"uri"}}}]}}}}}},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/TooManyRequests"}}}}},"components":{"parameters":{"prijs":{"name":"prijs","in":"query","description":"The price to sort and filter by: na-actie, the price after the promotion (every plan), or nu, the promotional price (only plans with a promotion).","schema":{"type":"string","enum":["nu","na-actie"],"default":"na-actie"}},"price_min":{"name":"price_min","in":"query","description":"At least this much a month, by the price prijs picks.","schema":{"type":"number","minimum":0}},"price_max":{"name":"price_max","in":"query","description":"At most this much a month, by the price prijs picks.","schema":{"type":"number","minimum":0}},"upfront_min":{"name":"upfront_min","in":"query","description":"At least this much upfront for the phone.","schema":{"type":"number","minimum":0}},"upfront_max":{"name":"upfront_max","in":"query","description":"At most this much upfront for the phone.","schema":{"type":"number","minimum":0}},"data_min":{"name":"data_min","in":"query","description":"At least this much data a month, in GB. Unlimited data matches any.","schema":{"type":"number","minimum":0}},"data_max":{"name":"data_max","in":"query","description":"At most this much data a month, in GB. Unlimited data matches none.","schema":{"type":"number","minimum":0}},"minutes_min":{"name":"minutes_min","in":"query","description":"At least this many call minutes a month. Unlimited calling matches any.","schema":{"type":"number","minimum":0}},"minutes_max":{"name":"minutes_max","in":"query","description":"At most this many call minutes a month. Unlimited calling matches none.","schema":{"type":"number","minimum":0}},"contract_duration":{"name":"contract_duration","in":"query","description":"The contract length in months: 1 (cancel monthly), 12 or 24.","schema":{"type":"integer","examples":[1,12,24]}},"contract_durations":{"name":"contract_duration[]","in":"query","description":"Several contract lengths, in months.","schema":{"type":"array","items":{"type":"integer"}},"style":"form","explode":true},"network":{"name":"network","in":"query","description":"Plans on this mobile network, from any provider.","schema":{"type":"string","enum":["kpn","odido","vodafone"]}},"brand_id":{"name":"brand_id","in":"query","description":"A provider's id (see listProviders).","schema":{"type":"integer"}},"brand_ids":{"name":"brand_id[]","in":"query","description":"Several providers' ids.","schema":{"type":"array","items":{"type":"integer"}},"style":"form","explode":true},"page":{"name":"page","in":"query","description":"The page of results.","schema":{"type":"integer","minimum":1,"default":1}}},"schemas":{"ProviderLink":{"type":"object","required":["id","name","url"],"properties":{"id":{"type":"integer","description":"What brand_id filters on."},"name":{"type":"string"},"url":{"type":"string","format":"uri","description":"Its page."}}},"NetworkLink":{"type":"object","required":["slug","name","url"],"properties":{"slug":{"type":"string","description":"What network filters on, for the three networks."},"name":{"type":"string"},"url":{"type":["string","null"],"format":"uri","description":"Its page: null for a network the site has none for."}}},"PhoneLink":{"type":"object","required":["id","name","url"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string","format":"uri","description":"Its page."}}},"Plan":{"type":"object","required":["id","name","provider","network","currency","price_after_promotion","promotional_price","promotion_months","data_gb","unlimited_data","minutes","unlimited_minutes","sms","unlimited_sms","contract_months","total_contract_cost","offer_url","updated_at"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"provider":{"anyOf":[{"$ref":"#/components/schemas/ProviderLink"},{"type":"null"}]},"network":{"anyOf":[{"$ref":"#/components/schemas/NetworkLink"},{"type":"null"}]},"currency":{"type":"string","const":"EUR"},"price_after_promotion":{"type":"number","description":"Monthly price once any promotion is over: what is paid for the rest of the contract, or after it when the promotion lasts all of it. A phone deal's without its upfront payment."},"promotional_price":{"type":["number","null"],"description":"Lower monthly price for the first promotion_months, or null without a promotion."},"promotion_months":{"type":["integer","null"],"description":"How many months promotional_price is paid, from the first month: contract_months when it lasts the whole contract. Null without a promotion, or when the offer does not say."},"data_gb":{"type":["number","null"],"description":"Data a month in GB; null when unlimited or unknown."},"unlimited_data":{"type":"boolean"},"minutes":{"type":["integer","null"],"description":"Call minutes a month; null when unlimited or unknown."},"unlimited_minutes":{"type":"boolean"},"sms":{"type":["integer","null"],"description":"Text messages a month; null when unlimited or unknown."},"unlimited_sms":{"type":"boolean"},"contract_months":{"type":["integer","null"],"description":"The minimum term: 1 for a plan you can cancel monthly."},"total_contract_cost":{"type":["number","null"],"description":"What it costs over its minimum term of contract_months: promotion_months at promotional_price, the rest at price_after_promotion, and for a phone deal upfront_cost. A monthly plan's is its first month. Connection fees for Sim Only are not in it: the offers list none. Null when the length of the contract or of its promotion, or a phone deal's upfront payment, is unknown."},"offer_url":{"type":"string","format":"uri","description":"The provider's offer, through a redirect on this site that may earn it a commission."},"updated_at":{"type":["string","null"],"format":"date-time","description":"When anything in its offer (a price, its data, its promotion) last changed. Older than meta.checked_at for a plan that has not changed since."}}},"PhonePlan":{"allOf":[{"$ref":"#/components/schemas/Plan"},{"type":"object","required":["phone","upfront_cost"],"properties":{"phone":{"$ref":"#/components/schemas/PhoneLink"},"upfront_cost":{"type":["number","null"],"description":"What is paid upfront for the phone with this plan, a connection fee included, or null when the offer does not say."}}}]},"Phone":{"type":"object","required":["id","name","image_url","currency","plans_count","price_from","upfront_from","url","plans_api_url","updated_at"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"image_url":{"type":["string","null"],"format":"uri"},"currency":{"type":"string","const":"EUR"},"plans_count":{"type":"integer","description":"Its plans on offer (on network or of brand_id, when given)."},"price_from":{"type":"number","description":"What its cheapest plan costs a month once any promotion is over, without the upfront payment."},"upfront_from":{"type":["number","null"],"description":"What is paid upfront for the phone with that plan, or null when the offer does not say."},"url":{"type":"string","format":"uri","description":"Its page, with its plans."},"plans_api_url":{"type":"string","format":"uri","description":"Its plans (listPhonePlans)."},"updated_at":{"type":["string","null"],"format":"date-time"}}},"Provider":{"type":"object","required":["id","name","url","network","plans_api_url"],"properties":{"id":{"type":"integer","description":"What brand_id filters on."},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"network":{"anyOf":[{"$ref":"#/components/schemas/NetworkLink"},{"type":"null"}]},"plans_api_url":{"type":"string","format":"uri","description":"Its Sim Only plans (listSimOnlyPlans)."}}},"Network":{"type":"object","required":["slug","name","url","plans_api_url","providers"],"properties":{"slug":{"type":"string","enum":["kpn","odido","vodafone"]},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"plans_api_url":{"type":"string","format":"uri","description":"Its Sim Only plans (listSimOnlyPlans)."},"providers":{"type":"array","items":{"$ref":"#/components/schemas/ProviderLink"}}}},"Article":{"type":"object","required":["id","title","intro","published_on","image_url","url","updated_at"],"properties":{"id":{"type":"integer"},"title":{"type":"string"},"intro":{"type":["string","null"]},"published_on":{"type":["string","null"],"format":"date"},"image_url":{"type":["string","null"],"format":"uri"},"url":{"type":"string","format":"uri"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"Links":{"type":"object","required":["first","last","prev","next"],"properties":{"first":{"type":"string","format":"uri"},"last":{"type":"string","format":"uri"},"prev":{"type":["string","null"],"format":"uri"},"next":{"type":["string","null"],"format":"uri","description":"The next page, or null on the last."}}},"PageMeta":{"type":"object","required":["current_page","from","last_page","path","per_page","to","total"],"properties":{"current_page":{"type":"integer"},"from":{"type":["integer","null"]},"last_page":{"type":"integer"},"path":{"type":"string","format":"uri"},"per_page":{"type":"integer"},"to":{"type":["integer","null"]},"total":{"type":"integer"}}}},"responses":{"ValidationError":{"description":"Invalid parameters, with the reason for each.","content":{"application/json":{"schema":{"type":"object","required":["message","errors"],"properties":{"message":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}}}}},"TooManyRequests":{"description":"Over 60 requests a minute: try again after the Retry-After header's seconds."}}}}