Official Python SDK for the Proiect.ro API
Project description
proiectro
Official Python SDK for the Proiect.ro API.
Fully typed with sync and async support via httpx.
Installation
pip install proiectro
Quick Start
from proiectro.client import AuthenticatedClient
from proiectro.api.orgs import tenant_orgs
# Authenticate (base_url defaults to https://proiect.ro)
client = AuthenticatedClient(
base_url="https://proiect.ro",
token="your_api_key_here",
)
# List customers
response = tenant_orgs.sync_detailed(
tenant_path="my-workspace",
client=client,
)
if response.status_code == 200:
print(response.parsed)
Authentication
Create an API key in your workspace under Settings > API Keys. The SDK sends it as a Bearer token automatically.
from proiectro.client import AuthenticatedClient
client = AuthenticatedClient(
base_url="https://proiect.ro",
token="your_api_key_here",
)
Sync and Async
Every endpoint has four variants:
from proiectro.api.orgs import tenant_orgs
# Sync — returns parsed model or None
data = tenant_orgs.sync(tenant_path="my-workspace", client=client)
# Sync — returns full httpx.Response with .parsed, .status_code, .headers
response = tenant_orgs.sync_detailed(tenant_path="my-workspace", client=client)
# Async
data = await tenant_orgs.asyncio(tenant_path="my-workspace", client=client)
# Async — detailed
response = await tenant_orgs.asyncio_detailed(tenant_path="my-workspace", client=client)
Usage Examples
Customers
from proiectro.api.orgs import tenant_orgs, add_subtenant, edit_subtenant, delete_subtenant
from proiectro.models import AddSubtenant, EditSubtenant
# List all customers
customers = tenant_orgs.sync(tenant_path="my-workspace", client=client)
# Create a customer
add_subtenant.sync_detailed(
tenant_path="my-workspace",
client=client,
body=AddSubtenant(
name="Acme Corp",
parent_id="org-uuid",
timezone="Europe/Berlin",
default_currency="EUR",
country="DE",
manager="member-uuid",
),
)
# Update a customer
edit_subtenant.sync_detailed(
tenant_path="my-workspace",
subtenant_id="customer-uuid",
client=client,
body=EditSubtenant(
name="Acme Corporation",
timezone="Europe/Berlin",
default_currency="EUR",
country="DE",
manager="member-uuid",
),
)
# Delete a customer
delete_subtenant.sync_detailed(
tenant_path="my-workspace",
subtenant_id="customer-uuid",
client=client,
)
Proposals
from proiectro.api.proposals import add_proposal, org_proposals, change_proposal_stage
from proiectro.models import AddProposal, ChangeProposalStage
# List proposals for a customer
proposals = org_proposals.sync(
tenant_path="my-workspace",
org_id="customer-uuid",
client=client,
)
# Create a proposal
add_proposal.sync_detailed(
tenant_path="my-workspace",
client=client,
body=AddProposal(
name="Q1 Consulting",
description="Consulting engagement for Q1",
customer="customer-uuid",
owner="member-uuid",
manager="member-uuid",
sales_stage="stage-uuid",
proposal_currency="EUR",
wbsconfiguration="wbs-uuid",
),
)
# Move a proposal to the next stage
change_proposal_stage.sync_detailed(
tenant_path="my-workspace",
proposal_id="proposal-uuid",
stage_id="next-stage-uuid",
client=client,
body=ChangeProposalStage(),
)
Projects
from proiectro.api.projects import list_projects, project_work_items, add_work_item
from proiectro.models import AddWorkItem
# List all projects
projects = list_projects.sync(tenant_path="my-workspace", client=client)
# Get work items for a project
work_items = project_work_items.sync(
tenant_path="my-workspace",
project_id="project-uuid",
client=client,
)
# Create a work item
add_work_item.sync_detailed(
tenant_path="my-workspace",
client=client,
body=AddWorkItem(
name="Design mockups",
project_id="project-uuid",
work_item_type_id="type-uuid",
),
)
Payments
from proiectro.api.proposals import add_payment, mark_payment_paid
from proiectro.models import AddPayment, MarkPaymentPaid
# Create a payment
add_payment.sync_detailed(
tenant_path="my-workspace",
client=client,
body=AddPayment(
payment_schedule_block_id="block-uuid",
name="First milestone",
due_date="2026-03-15",
amount="5000.00",
),
)
# Mark a payment as paid
mark_payment_paid.sync_detailed(
tenant_path="my-workspace",
payment_id="payment-uuid",
client=client,
body=MarkPaymentPaid(paid_date="2026-03-15"),
)
Tags
from proiectro.api.tags import tenant_tags, add_tag, tag_org, untag_org
from proiectro.models import AddTag
# List all tags
tags = tenant_tags.sync(tenant_path="my-workspace", client=client)
# Create a tag
add_tag.sync_detailed(
tenant_path="my-workspace",
client=client,
body=AddTag(name="VIP", color="#ff0000"),
)
# Tag a customer
tag_org.sync_detailed(
tenant_path="my-workspace",
org_id="customer-uuid",
tag_id="tag-uuid",
client=client,
)
Team
from proiectro.api.team import tenant_team, invite_to_team
from proiectro.models import InviteMemberToTenant
# List team members
team = tenant_team.sync(tenant_path="my-workspace", client=client)
# Invite someone to the team
invite_to_team.sync_detailed(
tenant_path="my-workspace",
client=client,
body=InviteMemberToTenant(email="colleague@example.com"),
)
Error Handling
Use sync_detailed / asyncio_detailed to inspect status codes:
response = tenant_orgs.sync_detailed(
tenant_path="my-workspace",
client=client,
)
if response.status_code == 200:
print("Success:", response.parsed)
else:
print("Error:", response.status_code, response.content)
Or enable automatic exceptions for unexpected status codes:
client = AuthenticatedClient(
base_url="https://proiect.ro",
token="your_api_key_here",
raise_on_unexpected_status=True,
)
Context Manager
The client can be used as a context manager to ensure connections are properly closed:
with AuthenticatedClient(
base_url="https://proiect.ro",
token="your_api_key_here",
) as client:
data = tenant_orgs.sync(tenant_path="my-workspace", client=client)
Async:
async with AuthenticatedClient(
base_url="https://proiect.ro",
token="your_api_key_here",
) as client:
data = await tenant_orgs.asyncio(tenant_path="my-workspace", client=client)
Requirements
- Python >= 3.10
- httpx >= 0.23.0
API Documentation
Full API reference is available at proiect.ro/api/v1/docs.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file proiectro-0.1.1.tar.gz.
File metadata
- Download URL: proiectro-0.1.1.tar.gz
- Upload date:
- Size: 533.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
631398c5137129239acce7450d7e4c3d6d46155ea626e6ac9bf990cf003af3a7
|
|
| MD5 |
0eae648c5e482d5a74aa635618cf241f
|
|
| BLAKE2b-256 |
d2222c96ce78fa04e2e45100b3706cecc1c1d3ae5c148280e9d2f732de8b3849
|
Provenance
The following attestation bundles were made for proiectro-0.1.1.tar.gz:
Publisher:
publish.yml on Online-Projects-EU/proiectro-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
proiectro-0.1.1.tar.gz -
Subject digest:
631398c5137129239acce7450d7e4c3d6d46155ea626e6ac9bf990cf003af3a7 - Sigstore transparency entry: 991826618
- Sigstore integration time:
-
Permalink:
Online-Projects-EU/proiectro-python@2cd1fa781b056e26000f34ba7e53e0eb99762066 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Online-Projects-EU
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2cd1fa781b056e26000f34ba7e53e0eb99762066 -
Trigger Event:
release
-
Statement type:
File details
Details for the file proiectro-0.1.1-py3-none-any.whl.
File metadata
- Download URL: proiectro-0.1.1-py3-none-any.whl
- Upload date:
- Size: 1.9 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0115b6dfef5997f50be050675c418b3a9d0e4d4ade077b1fd51a02d6d2f36eca
|
|
| MD5 |
812f0ada0be2dc3ad53b53f25b3fc7c0
|
|
| BLAKE2b-256 |
7b45c9f9f974581ef9e17c9485910edf2e8c89e15aedbbd33237ae54e22bd5e4
|
Provenance
The following attestation bundles were made for proiectro-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Online-Projects-EU/proiectro-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
proiectro-0.1.1-py3-none-any.whl -
Subject digest:
0115b6dfef5997f50be050675c418b3a9d0e4d4ade077b1fd51a02d6d2f36eca - Sigstore transparency entry: 991826621
- Sigstore integration time:
-
Permalink:
Online-Projects-EU/proiectro-python@2cd1fa781b056e26000f34ba7e53e0eb99762066 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Online-Projects-EU
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2cd1fa781b056e26000f34ba7e53e0eb99762066 -
Trigger Event:
release
-
Statement type: