with one click
billi-cra
// Import CRAs from an Excel file into Billi, or export CRAs from Billi to Excel. Bidirectional sync of activity reports.
// Import CRAs from an Excel file into Billi, or export CRAs from Billi to Excel. Bidirectional sync of activity reports.
Analyse des factures clients Qonto par période de prestation (pas date d'émission) et compte de destination. Sortie HT/TTC, top clients, audit des cas ambigus.
Transcribe audio files using the local `transcribe` CLI (WhisperX large-v3 + diarisation + optional LLM correction).
Write and publish a blog article to Notion based on conversation context, a file, or a topic. Optionally cross-post to LinkedIn, Twitter, and Slack.
Process a "Tech My Breath Away" meeting: move the Fireflies-created Notion page to the Talks database, and upload the video to Google Drive.
Create a new Claude Code skill based on conversation context, a file, or a description of the skill's purpose.
Dossier CII/CIR : accès Finalli, données de référence, extraction temps personnel pour les déclarations de crédit d'impôt innovation.
| name | billi-cra |
| description | Import CRAs from an Excel file into Billi, or export CRAs from Billi to Excel. Bidirectional sync of activity reports. |
| title | /billi-cra |
| parent | Skills |
| permalink | /skills/billi-cra/ |
| nav_order | 12 |
Sync CRAs (Comptes Rendus d'Activité) between an Excel file and the Billi platform API.
/billi-cra import <path-to-excel>
/billi-cra export <path-to-excel> [--year 2025]
If no direction is specified, ask the user.
op item get "Billi Qraft - Agency User" --vault Qraft --fields label=username,label=passwordcurl -s -X POST https://api.billi.so/oauth/token \
-H "Content-Type: application/json" \
-d '{"grant_type":"password","email":"<email>","password":"<password>"}'
Token expires in 7200s.
The expected Excel format has one sheet with:
TOTAL + sum per personDate, then one column per freelancer nameDates are datetime objects in column A. Empty or 0 cells mean no work that day.
Use openpyxl to parse the file. Group entries by person and month. Filter to the target year.
GET /missions with Bearer tokenmission_rate_id from each mission's mission_rates array (is_default: true)Important: activities cannot be added at creation time. Two-step process:
# Step 3a: Create the empty CRA
POST /activity_reports
{"format": "billi", "month": "2025-01-01T00:00:00.000Z", "mission_id": <id>}
# Step 3b: Add activities via update
PUT /activity_reports/<cra_id>
{"activities_attributes": [
{"date": "2025-01-06T00:00:00.000Z", "duration": 0.5, "mission_rate_id": <rate_id>},
{"date": "2025-01-07T00:00:00.000Z", "duration": 1.0, "mission_rate_id": <rate_id>}
]}
duration: only 0, 0.5, or 1.0draft state to add/modify activitiesPrint a summary table: person, month, CRA ID, total duration, number of activities.
GET /activity_reports
Filter by year. Each CRA includes activities[] with date and duration.
openpyxl to write the fileSave to the specified path and print summary.
mission_rates_attributes with at least one default ratemission_rate_id — fetch from GET /missions/:id -> mission_rates[].iduv run --with openpyxl --with requests python3 for Python dependencies~/dev/billi/billi/api/) and Bruno collections (api/bruno/) for the latest API contract if something fails