API REST
Plan, moneda y facturación
El plan de la empresa, la moneda en que ve los precios y los datos de facturación.
- Plan y moneda (la pantalla Empresa → Plan; solo admins y dueños, para los demás 403). Durante la beta no se cobra nada. Cada empresa tiene una moneda (
BRL,USD,EUR,GBP,MXN,ARS,CLPoCOP), que nace del país desde donde se creó (sin él, BRL), y cada plan tiene un precio definido en cada moneda, mensual y anual, sin conversión. Los valores vienen enamount_minor, entero en la unidad mínima de la moneda (4990 es R$ 49,90; el peso chileno no tiene decimales), conamountyformatted(como lo muestra la pantalla) al lado. GET /billing(tracker:read):currency,currency_locked(con el cobro activado, solo el equipo de Aquarela cambia la moneda),currencies,plan(key,name,description,ai_credits_per_cycle,nullpara el de por defecto del servidor,storage_gb, el espacio de archivos en GB,nullpara el de por defecto,features, lo que incluye el plan, ypricesen la moneda de la empresa),plan_source(subscription, odefaultcuando vale el plan por defecto),price(el actual),subscription(status:trialing,active,past_dueocanceled;interval:monthoyear;current_period_start,current_period_end,trial_ends_atybilling_provider,nullmientras no hay cobro),plans(los que la empresa puede tener, con el precio en su moneda),billing_detailsyplan_request(el pedido de plan pago esperando al equipo de Aquarela:plan,interval,requested_byycreated_at;nullsin pedido).PATCH /billing(tracker:write), en JSON:{"currency": "USD"}cambia la moneda;{"billing_details": {...}}cambia los datos de facturación, solo los campos enviados (nullborra):kind(companyoindividual),legal_name,email,country(ISO de dos letras),address_line1,address_line2,city,state,postal_code,tax_id_typeytax_id. El documento sigue al país, con los tipos de Stripe:br_cnpj(empresa) ybr_cpf(persona física), con los dígitos verificados,us_ein,eu_vat,gb_vat,mx_rfc,ar_cuit,cl_tinyco_nit; sintax_id_type, vale el del país. Devuelve lo mismo que el GET; una regla rechazada vuelve 422.POST /billing/plan(tracker:write), en JSON:{"plan": "pro", "interval": "year"}(planes lakeyo elidde uno de losplans;interval,monthpor defecto). Un plan gratuito en la moneda de la empresa cambia al instante (outcome:changed); un plan pago, o sin precio en la moneda, se vuelve un pedido al equipo de Aquarela (requested), que acuerda el pago y pone la empresa en el plan; el actual devuelveunchanged. Pedir otro plan reemplaza el pedido. Devuelveoutcome,plan,intervalybilling(lo mismo que el GET).DELETE /billing/plan-request(tracker:write) cancela el pedido ({"cancelled": true};falsesin pedido). En el MCP:get_billing,update_billing,change_planycancel_plan_request.- Espacio de archivos: cada plan da un espacio para los adjuntos de la empresa (
storage_gb; el de por defecto es 10 GB), que suma los adjuntos de las tareas (con los de los comentarios y las versiones de la aprobación), de la mesa de ayuda y de los Chats, también los directos. La foto de perfil, el logo y el ícono de proyecto no cuentan. Cuando se acaba el espacio, el envío de un adjunto nuevo (pantalla, API y MCP) devuelve 422 con el mensaje del límite; los archivos que el cliente manda a la mesa de ayuda entran igual, para que ningún ticket se pierda. ElGET /billingtraestorage:used_bytes,limit_bytes,plan_storage_gb(nullen el de por defecto),state(ok,warningcon 90% o más,full) y la suma por lugar entasks,tickets,chatydirect_messages(bytesyfiles). - Archivos de la empresa (la pantalla Empresa → Archivos; solo admins y dueño, para los demás 403):
GET /files(tracker:read) traestorage(como en elGET /billing),total,has_moreyfiles, del más nuevo al más antiguo (?sort=size, los más grandes primero), cada uno conid,origin(task,ticketochat),name,type,size_bytes,created_at,uploaded_by,project(id,slug,name),issue(id,code,title,comment_id),ticket(id,number,subject) ochat_message(id,thread_id), según el origen,url(dónde está en el tracker),download_url,can_deleteylocked(proof: versión enviada para aprobación;trash: tarea o proyecto en la papelera;nullcuando se puede eliminar). Filtros:?origin=,?query=(parte del nombre),?limit=hasta 100 y?offset=. Los archivos de las conversaciones directas cuentan en el espacio, pero no aparecen: solo las dos personas de la conversación los ven.GET /files/{id}(tracker:read) descarga el archivo;DELETE /files/{id}(tracker:write) elimina el archivo de donde está y libera el espacio ({"deleted": true, "origin": ..., "name": ...}; un archivo bloqueado devuelve 422). En el MCP:list_filesydelete_file.