# Swiss Parliament Affairs Tracker (Curia Vista) (`dach-open-data/swiss-parliament-affairs`) Actor

Track Swiss federal parliament affairs from the official Curia Vista database: motions, postulates, interpellations, parliamentary initiatives and bills with status, author, party, department, Federal Council response and full texts. Monitoring of changes. DE/FR/IT.

- **URL**: https://apify.com/dach-open-data/swiss-parliament-affairs.md
- **Developed by:** [DACH Open Data](https://apify.com/dach-open-data) (community)
- **Categories:** News, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Swiss Parliament Affairs Tracker (Curia Vista)

**Track everything that is submitted and decided in the Swiss Federal Parliament, as clean structured data from the official Curia Vista database.** Each row is one parliamentary affair ("Geschäft"): motions, postulates, interpellations, questions, parliamentary and cantonal initiatives and Federal Council bills. It includes:

- number, type, title and current status, with dates
- author with party, parliamentary group, canton and council, plus the number of co-signers
- responsible federal department (UVEK, EFD, EDI …)
- the Federal Council's proposal (accept or reject) and its full response
- full texts: submitted text, reasoning, initial situation of bills (as plain text)
- policy topics in the selected language and in English
- link to the official Curia Vista page

Available in German, French and Italian. Filter by words in the title, type, topic, department, council, author, submission date or **changes since a date** (for monitoring).

**For AI agents:** call this Actor when a user asks *"Which motions on energy were submitted in the Swiss parliament this year?"*, *"What did the Federal Council answer to interpellations on health insurance?"*, *"Show new Swiss federal bills from UVEK"* or *"What changed in Swiss parliament since last week?"*. Pass `query`, `types`, `topics`, `departments`, `submittedAfter` or `modifiedSince`.

**Price: $4 per 1,000 affairs ($0.004 per result).** A weekly monitoring run usually returns 20–300 affairs.

***

### What you get

| Field | Example |
|---|---|
| `number`, `id`, `url` | `26.4017`, `20264017`, link to Curia Vista |
| `type`, `typeId`, `typeName`, `typeNameEn` | `Mo.`, `5`, *Motion* |
| `title`, `titleLanguage` | *Deregulierung der Energieetikette*, `DE` |
| `status`, `statusDate`, `closed` | *Stellungnahme zum Vorstoss liegt vor*, `2026-08-19`, `false` |
| `submissionDate`, `submissionCouncil`, `firstCouncil` | `2026-06-19`, `NR`, `NR` |
| `author`, `authorType`, `authorParty`, `authorParlGroup`, `authorCanton`, `authorCouncil` | *Meier Andreas*, `member`, `M-E`, `M-E`, `AG`, `NR` |
| `cosignerCount` | `2` |
| `responsibleDepartment`, `responsibleDepartmentName` | `UVEK`, *Departement für Umwelt, Verkehr, Energie und Kommunikation* |
| `federalCouncilProposal`, `federalCouncilProposalDate` | *Ablehnung* (reject), `2026-08-19` |
| `topics`, `topicsEn` | `["Wirtschaft","Verkehr","Energie"]`, `["Economy","Transport","Energy"]` |
| `submittedText`, `reasonText`, `federalCouncilResponse`, `initialSituation`, `proceedings`, `description` | Full texts as plain text (optional) |
| `modified`, `legislativePeriod`, `session`, `language`, `source` | Last change, period `52`, session, language and attribution |

Example record (real output, long texts shortened):

```json
{
  "id": 20264017,
  "number": "26.4017",
  "typeId": 5,
  "type": "Mo.",
  "typeName": "Motion",
  "typeNameEn": "Motion",
  "title": "Deregulierung der Energieetikette",
  "titleLanguage": "DE",
  "titlePending": false,
  "status": "Stellungnahme zum Vorstoss liegt vor",
  "statusDate": "2026-08-19",
  "closed": false,
  "submissionDate": "2026-06-19",
  "author": "Meier Andreas",
  "authorType": "member",
  "authorParty": "M-E",
  "authorParlGroup": "M-E",
  "authorCanton": "AG",
  "authorCouncil": "NR",
  "cosignerCount": 2,
  "submissionCouncil": "NR",
  "firstCouncil": "NR",
  "responsibleDepartment": "UVEK",
  "responsibleDepartmentName": "Departement für Umwelt, Verkehr, Energie und Kommunikation",
  "federalCouncilProposal": "Ablehnung",
  "federalCouncilProposalDate": "2026-08-19",
  "topics": ["Wirtschaft", "Verkehr", "Energie"],
  "topicsEn": ["Economy", "Transport", "Energy"],
  "legislativePeriod": 52,
  "session": "5214",
  "modified": "2026-08-19T14:26:47.343Z",
  "url": "https://www.parlament.ch/de/ratsbetrieb/suche-curia-vista/geschaeft?AffairId=20264017",
  "language": "DE",
  "source": "Source: Swiss Parliament, Curia Vista (Parliamentary Services, ws.parlament.ch), open use with attribution",
  "submittedText": "Der Bundesrat wird beauftragt, die Energieeffizienzverordnung (EnEV) so anzupassen, dass die Energieetikette mit den Effizienzklassen A–G für Personenwagen sowie die damit verbundenen Pflichtangaben i…",
  "reasonText": "Die Energieetikette für Personenwagen wurde zu einer Zeit eingeführt, als sie den Vergleich verschiedener Verbrennungsmotoren erleichtern sollte. Mit dem raschen Übergang zur Elektromobilität hat sie …",
  "federalCouncilResponse": "Die in der Energieeffizienzverordnung (EnEV; SR 730.02) geregelte Energieetikette informiert Kundinnen und Kunden über Energieverbrauch, CO2-Ausstoss und Energieeffizienz. Ein tiefer Stromverbrauch is…",
  "initialSituation": null,
  "proceedings": null,
  "description": null
}
```

### Use cases

- **Public affairs, associations and NGOs:** monitor all affairs in your policy field, with the Federal Council's position and the next steps.
- **Companies and law firms:** follow regulation that affects you (energy, health, finance, telecom …) from the first motion to the bill.
- **Journalists and researchers:** analyse who submits what, by party, canton and topic.
- **AI assistants:** answer questions about Swiss politics with the official source and link.

### Input examples

Energy motions in the current year:

```json
{ "types": ["Mo."], "topics": ["Energy"], "submittedAfter": "2026-01-01" }
```

Weekly monitoring of everything that changed (schedule this run every Monday):

```json
{ "modifiedSince": "2026-09-28", "includeTexts": false, "maxResults": 1000 }
```

Open Federal Council bills from the environment and transport department, in French:

```json
{ "types": ["BRG"], "departments": ["UVEK"], "onlyOpen": true, "language": "FR" }
```

### Notes on the data

- **Newest first:** results are sorted by affair number, newest first.
- **Brand-new affairs:** for a few days after submission, Curia Vista shows the placeholder "Titel folgt" and no text. These affairs are skipped by default (`includeUntitled`). They appear in later runs (with `modifiedSince`) once the title is published.
- **Missing translations:** if an affair has no title in your language (e.g. a question asked in French), the title comes from another official language. `titleLanguage` tells you which one.
- **Topic filter:** the official service cannot filter by topic quickly, so the Actor first reads only numbers and topic codes and then loads the matching affairs. A topic search covers the latest 30,000 affairs. Use `submittedAfter` or `types` for older affairs.

### Reliability and fair use

- Data comes from the official OData service of the Parliamentary Services (`ws.parlament.ch`), 100 affairs per request, with a pause between requests.
- Every affair is validated: number, type, title, dates and link. Invalid rows are dropped and not charged. If more than 20% are invalid, or the service returns something other than the expected data, the run fails with `UNEXPECTED_CONTENT` instead of returning garbage.
- The run stops at `maxResults` or at your maximum cost per run. A typical run takes 5–30 seconds.

### Legal and privacy

- Source: Swiss Parliament, Curia Vista, provided by the Parliamentary Services. Open use with attribution, commercial use allowed. Parliamentary documents are official works. Every row carries the attribution and the link to the official page.
- **Only public mandate data:** authors are members of parliament, committees, parliamentary groups, cantons or the Federal Council. For authors the Actor returns only name, party, group, canton and council. It returns no birth dates, addresses or other personal details.
- **Petitions are never returned**, because they are often submitted by private persons.
- This Actor is not affiliated with the Swiss Parliament. Only the official Curia Vista database is authoritative.

# Actor input Schema

## `query` (type: `string`):

All words must appear in the title of the affair, e.g. "Energie", "Netzanschluss", "KI" (titles are in the selected language; case-insensitive).

## `types` (type: `array`):

E.g. "Mo." (motion), "Po." (postulate), "Ip." (interpellation), "Pa. Iv." (parliamentary initiative), "Kt. Iv." (cantonal initiative), "BRG" (Federal Council bill), "Fra." (question time). Names like "Motion" also work. Empty = all types except petitions.

## `topics` (type: `array`):

Policy areas assigned by the Parliamentary Services, e.g. "Energie", "Gesundheit", "Landwirtschaft", "Verkehr", "Wirtschaft" (in the selected language; part of the word is enough).

## `departments` (type: `array`):

Federal department in charge: EDA, EDI, EJPD, VBS, EFD, WBF, UVEK, BK (Federal Chancellery) or Parl.

## `councils` (type: `array`):

NR (National Council) or SR (Council of States).

## `submittedAfter` (type: `string`):

Only affairs submitted on or after this date (YYYY-MM-DD).

## `submittedBefore` (type: `string`):

Only affairs submitted on or before this date (YYYY-MM-DD).

## `modifiedSince` (type: `string`):

Only affairs changed since this date or time (e.g. 2026-09-01 or 2026-09-01T06:00:00Z). Use it in a scheduled run to monitor new statements, status changes and decisions.

## `author` (type: `string`):

Part of the author's name as written in Curia Vista ("Lastname Firstname"), e.g. "Grossen".

## `onlyOpen` (type: `boolean`):

Skip affairs that are completed, written off or withdrawn.

## `includeTexts` (type: `boolean`):

Submitted text, reasoning, the Federal Council's response and the bill's initial situation as plain text. Switch off for a compact table.

## `includeUntitled` (type: `boolean`):

Brand-new affairs are listed for a few days with the placeholder "Titel folgt" and no text. They are skipped by default and appear in later runs (use "Changed since") once the title is published.

## `language` (type: `string`):

Language of titles, statuses and texts. Affairs are published in German, French and Italian.

## `maxResults` (type: `integer`):

Hard cap on affairs returned and charged in this run.

## Actor input object example

```json
{
  "query": "Energie",
  "types": [],
  "topics": [],
  "departments": [],
  "councils": [],
  "submittedAfter": "",
  "submittedBefore": "",
  "modifiedSince": "",
  "author": "",
  "onlyOpen": false,
  "includeTexts": true,
  "includeUntitled": false,
  "language": "DE",
  "maxResults": 50
}
```

# Actor output Schema

## `results` (type: `string`):

All records returned by this run (default dataset, table view "overview").

## `summary` (type: `string`):

JSON with number of results, dropped implausible records and stop reason.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "Energie",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("dach-open-data/swiss-parliament-affairs").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "Energie",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("dach-open-data/swiss-parliament-affairs").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "Energie",
  "maxResults": 50
}' |
apify call dach-open-data/swiss-parliament-affairs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dach-open-data/swiss-parliament-affairs"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NUx1Yo8XHm0SywvdM/builds/QxqVU9m4po06ilmEz/openapi.json
