REST API
Plan, currency and billing
The company's plan, the currency it sees prices in and the billing details.
- Plan and currency (the Company → Plan screen; admins and owners only, 403 for others). Nothing is charged during the beta. Each company has a currency (
BRL,USD,EUR,GBP,MXN,ARS,CLPorCOP), set at creation from the country it was created in (without one, BRL), and each plan has a price defined in each currency, monthly and yearly, with no conversion. Amounts come inamount_minor, an integer in the currency's smallest unit (4990 is R$ 49.90; the Chilean peso has no decimals), withamountandformatted(as the screen shows it) next to it. GET /billing(tracker:read):currency,currency_locked(with billing on, only the Aquarela team changes the currency),currencies,plan(key,name,description,ai_credits_per_cycle,nullfor the server default,storage_gb, file storage in GB,nullfor the default,features, what the plan includes, andpricesin the company's currency),plan_source(subscription, ordefaultwhen the default plan applies),price(the current one),subscription(status:trialing,active,past_dueorcanceled;interval:monthoryear;current_period_start,current_period_end,trial_ends_atandbilling_provider,nullwhile there's no billing),plans(the ones the company can have, with the price in its currency),billing_detailsandplan_request(the paid plan request waiting for the Aquarela team:plan,interval,requested_byandcreated_at;nullwithout a request).PATCH /billing(tracker:write), in JSON:{"currency": "USD"}changes the currency;{"billing_details": {...}}changes the billing details, only the fields sent (nullclears):kind(companyorindividual),legal_name,email,country(two-letter ISO),address_line1,address_line2,city,state,postal_code,tax_id_typeandtax_id. The tax id follows the country, with Stripe's types:br_cnpj(company) andbr_cpf(individual), with the check digits verified,us_ein,eu_vat,gb_vat,mx_rfc,ar_cuit,cl_tinandco_nit; withouttax_id_type, the country's applies. Returns the same as the GET; a refused rule returns 422.POST /billing/plan(tracker:write), in JSON:{"plan": "pro", "interval": "year"}(planis thekeyoridof one of theplans;interval,monthby default). A free plan in the company's currency changes immediately (outcome:changed); a paid plan, or one without a price in the currency, becomes a request to the Aquarela team (requested), who arranges payment and puts the company on the plan; the current one returnsunchanged. Asking for another plan replaces the request. Returnsoutcome,plan,intervalandbilling(the same as the GET).DELETE /billing/plan-request(tracker:write) cancels the request ({"cancelled": true};falsewithout a request). In the MCP:get_billing,update_billing,change_planandcancel_plan_request.- File storage: each plan gives the company space for attachments (
storage_gb; the default is 10 GB), adding up the attachments on tasks (including the ones on comments and the approval versions), the help desk and Chats, direct messages too. Profile photos, logos and project icons don't count. When the storage runs out, sending a new attachment (screen, API and MCP) returns 422 with the limit message; files a customer sends to the help desk still go in, so no ticket is lost.GET /billingbringsstorage:used_bytes,limit_bytes,plan_storage_gb(nullon the default),state(ok,warningat 90% or more,full) and the total per place intasks,tickets,chatanddirect_messages(bytesandfiles). - Company files (the Company → Files screen; admins and owners only, 403 for others):
GET /files(tracker:read) returnsstorage(as inGET /billing),total,has_moreandfiles, newest first (?sort=size, largest first), each withid,origin(task,ticketorchat),name,type,size_bytes,created_at,uploaded_by,project(id,slug,name),issue(id,code,title,comment_id),ticket(id,number,subject) orchat_message(id,thread_id), depending on the origin,url(where it is in tracker),download_url,can_deleteandlocked(proof: a version sent for approval;trash: a task or project in the trash;nullwhen it can be deleted). Filters:?origin=,?query=(part of the name),?limit=up to 100 and?offset=. Files in direct messages count toward the storage but aren't listed: only the two people in the conversation can see them.GET /files/{id}(tracker:read) downloads the file;DELETE /files/{id}(tracker:write) deletes the file from where it is and frees the space ({"deleted": true, "origin": ..., "name": ...}; a locked file returns 422). In the MCP:list_filesanddelete_file.