Find an API

Search public APIs with auth details & Postman guides

← All APIs

Bills API

parliament · Data

Data No Auth Free & Open open_data

API to get and search for information regarding Bills, their stages, associated amendments and publications.

Authentication

No authentication requiredFree to use with no key needed.

Sample Requests

GET Returns a list of Bill types.

Returns a list of Bill types.

https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/BillTypes?Skip=1&Take=1&Category=example

Hover any highlighted part to learn what it does

curl -X GET "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/BillTypes?Skip=1&Take=1&Category=example"
import requests
params = {
    "Skip": "1",
    "Take": "1",
    "Category": "example"
}
response = requests.get(
    "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/BillTypes",
    params=params,
)
print(response.json())
const url = new URL('https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/BillTypes');
url.searchParams.set('Skip', '1');
url.searchParams.set('Take', '1');
url.searchParams.set('Category', 'example');

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/BillTypes")
	q := baseURL.Query()
	q.Set("Skip", "1")
	q.Set("Take", "1")
	q.Set("Category", "example")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/BillTypes")
uri.query = URI.encode_www_form({
  "Skip" => "1",
  "Take" => "1",
  "Category" => "example"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/BillTypes?" . http_build_query([
    "Skip" => "1",
    "Take" => "1",
    "Category" => "example"
]);
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET Returns a list of Bills.

Returns a list of Bills.

https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/Bills?Skip=1&Take=1&BillIds=example&Session=1&BillType=example&MemberId=1&BillStage=example&SortOrder=example&IsDefeated=true&SearchTerm=example&IsWithdrawn=true&CurrentHouse=example&DepartmentId=1&OriginatingHouse=example&BillStagesExcluded=example

Hover any highlighted part to learn what it does

curl -X GET "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/Bills?Skip=1&Take=1&BillIds=example&Session=1&BillType=example&MemberId=1&BillStage=example&SortOrder=example&IsDefeated=true&SearchTerm=example&IsWithdrawn=true&CurrentHouse=example&DepartmentId=1&OriginatingHouse=example&BillStagesExcluded=example"
import requests
params = {
    "Skip": "1",
    "Take": "1",
    "BillIds": "example",
    "Session": "1",
    "BillType": "example",
    "MemberId": "1",
    "BillStage": "example",
    "SortOrder": "example",
    "IsDefeated": "true",
    "SearchTerm": "example",
    "IsWithdrawn": "true",
    "CurrentHouse": "example",
    "DepartmentId": "1",
    "OriginatingHouse": "example",
    "BillStagesExcluded": "example"
}
response = requests.get(
    "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/Bills",
    params=params,
)
print(response.json())
const url = new URL('https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/Bills');
url.searchParams.set('Skip', '1');
url.searchParams.set('Take', '1');
url.searchParams.set('BillIds', 'example');
url.searchParams.set('Session', '1');
url.searchParams.set('BillType', 'example');
url.searchParams.set('MemberId', '1');
url.searchParams.set('BillStage', 'example');
url.searchParams.set('SortOrder', 'example');
url.searchParams.set('IsDefeated', 'true');
url.searchParams.set('SearchTerm', 'example');
url.searchParams.set('IsWithdrawn', 'true');
url.searchParams.set('CurrentHouse', 'example');
url.searchParams.set('DepartmentId', '1');
url.searchParams.set('OriginatingHouse', 'example');
url.searchParams.set('BillStagesExcluded', 'example');

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/Bills")
	q := baseURL.Query()
	q.Set("Skip", "1")
	q.Set("Take", "1")
	q.Set("BillIds", "example")
	q.Set("Session", "1")
	q.Set("BillType", "example")
	q.Set("MemberId", "1")
	q.Set("BillStage", "example")
	q.Set("SortOrder", "example")
	q.Set("IsDefeated", "true")
	q.Set("SearchTerm", "example")
	q.Set("IsWithdrawn", "true")
	q.Set("CurrentHouse", "example")
	q.Set("DepartmentId", "1")
	q.Set("OriginatingHouse", "example")
	q.Set("BillStagesExcluded", "example")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/Bills")
uri.query = URI.encode_www_form({
  "Skip" => "1",
  "Take" => "1",
  "BillIds" => "example",
  "Session" => "1",
  "BillType" => "example",
  "MemberId" => "1",
  "BillStage" => "example",
  "SortOrder" => "example",
  "IsDefeated" => "true",
  "SearchTerm" => "example",
  "IsWithdrawn" => "true",
  "CurrentHouse" => "example",
  "DepartmentId" => "1",
  "OriginatingHouse" => "example",
  "BillStagesExcluded" => "example"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/Bills?" . http_build_query([
    "Skip" => "1",
    "Take" => "1",
    "BillIds" => "example",
    "Session" => "1",
    "BillType" => "example",
    "MemberId" => "1",
    "BillStage" => "example",
    "SortOrder" => "example",
    "IsDefeated" => "true",
    "SearchTerm" => "example",
    "IsWithdrawn" => "true",
    "CurrentHouse" => "example",
    "DepartmentId" => "1",
    "OriginatingHouse" => "example",
    "BillStagesExcluded" => "example"
]);
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET Returns a list of publication types.

Returns a list of publication types.

https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/PublicationTypes?Skip=1&Take=1

Hover any highlighted part to learn what it does

curl -X GET "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/PublicationTypes?Skip=1&Take=1"
import requests
params = {
    "Skip": "1",
    "Take": "1"
}
response = requests.get(
    "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/PublicationTypes",
    params=params,
)
print(response.json())
const url = new URL('https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/PublicationTypes');
url.searchParams.set('Skip', '1');
url.searchParams.set('Take', '1');

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/PublicationTypes")
	q := baseURL.Query()
	q.Set("Skip", "1")
	q.Set("Take", "1")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/PublicationTypes")
uri.query = URI.encode_www_form({
  "Skip" => "1",
  "Take" => "1"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.apis.guru/v2/specs/parliament.uk/bills/v1/api/v1/PublicationTypes?" . http_build_query([
    "Skip" => "1",
    "Take" => "1"
]);
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));

Postman Setup Guide

Get Postman ↗
  1. See official documentation for authentication and setup.

What can you build with Bills API?

Bills API is a Data API. Developers commonly use data APIs for:

  • enriching your app with third-party datasets
  • building data pipelines and ETL workflows
  • querying and searching large datasets
  • powering research, analysis, and reporting tools
  • syncing reference data into your own systems

No authentication required. This API is open — no signup or key needed. Ideal for quick prototypes and public-facing features. Bills API is free to use, making it a low-risk choice to experiment with.

New to APIs? Read our beginner's guide

Open documentation ↗