Jira
Jira is a proprietary issue tracking product developed by Atlassian that allows bug tracking and agile project management.
ingestr supports Jira as a source through Jira's REST API v3.
URI format
The URI format for Jira is:
jira://your-domain.atlassian.net?email=<email>&api_token=<api_token>URI parameters:
email: the email address used for authentication with the Jira APIapi_token: the API token for authentication (required for Jira Cloud)cloud_id(optional): your Atlassian site's cloud ID. Only needed for service accounts, and ingestr detects it automatically when it's not set
Example usage
Assuming your Jira domain is company.atlassian.net, email is user@company.com, and API token is ATATT3xFfGF0..., you can ingest issues into DuckDB using:
ingestr ingest \
--source-uri 'jira://company.atlassian.net?email=user@company.com&api_token=ATATT3xFfGF0...' \
--source-table 'issues' \
--dest-uri duckdb:///jira.duckdb \
--dest-table 'dest.issues'Authentication
To connect to Jira, you need:
- Email: Your Atlassian account email
- API Token: Create one from your Atlassian Account Settings
Service accounts
Service accounts are the recommended way to connect for data fetching. Create one in Atlassian Administration under Directory → Service accounts, give it the User role on Jira, and create an API token for it with the read:jira-work and read:jira-user scopes. The events, issue_custom_field_contexts and issue_custom_field_options tables also need the manage:jira-configuration scope and the Jira Administration role. Then use the service account's email and token in the URI as usual:
jira://company.atlassian.net?email=<service-account-email>&api_token=<api_token>ingestr detects your site's cloud ID automatically. If that fails, set it explicitly with cloud_id. You can find it by opening https://company.atlassian.net/_edge/tenant_info in your browser.
Tables
Jira source allows ingesting the following tables:
| Table | PK | Inc Key | Inc Strategy | Details |
|---|---|---|---|---|
projects | id | - | replace | Fetches all projects from your Jira instance. |
issues | id | fields.updated | merge | Fetches all issues with support for incremental loading based on updated timestamp. |
users | accountId | - | replace | Fetches users from your Jira instance. |
issue_types | id | - | replace | Fetches all issue types configured in your Jira instance. |
statuses | id | - | replace | Fetches all workflow statuses from your Jira instance. |
priorities | id | - | replace | Fetches all issue priorities from your Jira instance. |
resolutions | id | - | replace | Fetches all issue resolutions from your Jira instance. |
project_versions | id | - | replace | Fetches versions for each project. |
project_components | id | - | replace | Fetches components for each project. |
issue_changelogs | id | - | replace | Fetches changelog entries for all issues across all projects. |
Use these as the --source-table parameter in the ingestr ingest command.
Filtering archived projects
projects, project_versions and project_components can be suffixed with :skip_archived to filter out archived projects.
For instance:
ingestr ingest \
--source-uri 'jira://company.atlassian.net?email=user@company.com&api_token=ATATT3xFfGF0...' \
--source-table 'project_versions:skip_archived' \
--dest-uri duckdb:///jira.duckdb \
--dest-table 'dest.live_project_versions'Will only load versions of non-archived projects.
Incremental Loading
The issues table supports incremental loading based on the updated field. This means subsequent runs will only fetch issues that have been modified since the last run, making the data ingestion more efficient for large Jira instances.
NOTE
Most tables use "replace" write disposition, meaning they will overwrite existing data on each run. Only the issues table supports incremental loading with "merge" disposition.