A Singer tap for extracting data from OpenProject API. Built with the Meltano Singer SDK.
- ✅ Meltano SDK-based - Modern Singer tap implementation
- ✅ Incremental sync - Efficient data extraction using
updatedAttimestamp - ✅ Stream Maps - Built-in inline transformation support
- ✅ Automatic pagination - Handles large datasets seamlessly
- ✅ Schema validation - Full JSON Schema with type checking
- ✅ Rate limiting & retries - Built-in resilience for API calls
- ✅ Cloud & self-hosted - Works with any OpenProject instance
- Python 3.8 or higher
- pip or Poetry
git clone https://github.com/surveilr/tap-openproject.git
cd tap-openproject
# Option 1: Using pip
pip install -e .
# Option 2: Using Poetry
pip install poetry
poetry installCreate a config.json file:
{
"api_key": "your-openproject-api-key",
"base_url": "https://your-instance.openproject.com/api/v3",
"start_date": "2024-01-01T00:00:00Z"
}tap-openproject --config config.json --discover > catalog.jsontap-openproject --config config.json --catalog catalog.json# State is automatically managed
tap-openproject --config config.json --catalog catalog.json --state state.json > output.singerSee QUICKSTART.md for more details.
- Log into your OpenProject instance
- Click your avatar → My Account
- Navigate to Access tokens in the sidebar
- Click + API to generate a new token
- Copy the token immediately (you won't see it again)
- Use it as
api_keyin your configuration
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
api_key |
string | Yes | - | OpenProject API key |
base_url |
string | Yes | - | Base URL of OpenProject instance API (include /api/v3) |
timeout |
integer | No | 30 | HTTP request timeout in seconds |
max_retries |
integer | No | 3 | Maximum retry attempts for failed requests |
start_date |
datetime | No | - | ISO 8601 date for incremental sync starting point |
user_agent |
string | No | tap-openproject/0.3.0 |
User-Agent header value |
This tap extracts data from 12 OpenProject API endpoints, organized into three categories:
| Stream | Endpoint | Replication | Description |
|---|---|---|---|
projects |
/projects |
Incremental | Project metadata with parent relationships |
work_packages |
/work_packages |
Incremental | Tasks, bugs, features with all relationships |
| Stream | Endpoint | Replication | Description |
|---|---|---|---|
statuses |
/statuses |
Full | Work package status definitions |
types |
/types |
Incremental | Work package types (Bug, Task, Feature, etc.) |
priorities |
/priorities |
Full | Priority level definitions |
roles |
/roles |
Full | Role definitions for memberships |
users |
/users |
Incremental | User accounts (may require admin access) |
| Stream | Endpoint | Replication | Description |
|---|---|---|---|
versions |
/versions |
Incremental | Project milestones/releases |
time_entries |
/time_entries |
Incremental | Time tracking data |
relations |
/relations |
Full | Work package dependencies |
memberships |
/memberships |
Incremental | Project membership assignments |
attachments |
/work_packages/{id}/attachments |
Full | File attachments (child of work_packages) |
All streams that reference other entities include flattened fields for easier querying. For example, work_packages includes:
type_id,type_title- Work package typestatus_id,status_title- Current statuspriority_id,priority_title- Priority levelproject_id,project_title- Parent projectassignee_id,assignee_title- Assigned userauthor_id,author_title- Creatorversion_id,version_title- Target versionparent_id- Parent work package ID
The attachments stream includes:
author_id,author_title- User who uploaded the filecontainer_id,container_type,container_title- Parent object (WorkPackage, Meeting, etc.)download_url- Direct download link
This enables direct JOINs between streams without parsing HAL _links objects
This tap is designed to work seamlessly with Meltano:
# Add the tap to your Meltano project
meltano add extractor tap-openproject --custom
# Configure
meltano config tap-openproject set api_key YOUR_API_KEY
meltano config tap-openproject set base_url https://your-instance.openproject.com/api/v3
# Run extraction
meltano run tap-openproject target-jsonlplugins:
extractors:
- name: tap-openproject
pip_url: -e /path/to/tap-openproject
config:
api_key: ${OPENPROJECT_API_KEY}
base_url: https://your-instance.openproject.com/api/v3
start_date: '2024-01-01T00:00:00Z'git clone https://github.com/surveilr/tap-openproject.git
cd tap-openproject
# Using Poetry (recommended)
poetry install
poetry shell
# Or using pip
python -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'poetry run pytest tests/ -v
# With coverage
poetry run pytest tests/ --cov=tap_openproject# Linting
poetry run ruff check .
# Formatting
poetry run ruff format .tap-openproject/
├── pyproject.toml # Poetry dependencies & metadata
├── README.md
├── LICENSE
├── CHANGELOG.md
├── CONTRIBUTING.md
├── QUICKSTART.md
├── meltano-hub.yml # Meltano Hub plugin definition
├── tap_openproject/
│ ├── __init__.py
│ ├── tap.py # Main Tap class with SDK
│ ├── streams.py # Stream definitions (SDK-based)
│ └── schemas/
│ └── projects.json # JSON Schema for projects stream
├── tests/
│ └── test_projects_stream.py
└── examples/
├── config.example.json
└── openproject.surveilr[singer].py
Built with Meltano Singer SDK, this tap supports:
- ✅ catalog - Stream and property selection
- ✅ discover - Automatic schema discovery
- ✅ state - Incremental replication with bookmarks
- ✅ about - Plugin metadata output
- ✅ stream-maps - Inline data transformation
- ✅ schema-flattening - Automatic nested object flattening
- ✅ batch - Efficient batch processing
# Check capabilities
tap-openproject --about --format=json- Verify your API key is correct and hasn't expired
- Ensure the API key has sufficient permissions
- Check that you're using Basic Auth format (handled automatically)
- Verify
base_urlincludes/api/v3at the end - Check that your OpenProject instance is accessible
- Verify network/firewall settings allow outbound HTTPS
- The SDK automatically retries with exponential backoff
- Adjust
max_retriesif needed - Contact your OpenProject admin if limits persist
Contributions are welcome! See CONTRIBUTING.md for guidelines.
See CHANGELOG.md for version history.
MIT License - see LICENSE file for details.
Built with the Meltano Singer SDK