{"name":"Financeiro","description":"Private business finances by organization: expenses, fixed expenses that enter the payables before they are due, contract income, prospects weighted by stage, competence result, cash movement and forecasts. The header switches authorized organizations. The profile opens organization branding and member invitations. Each client domain keeps its own name, logo, contact and Google sign-in credentials. OAuth secrets are encrypted on the server and are never returned by the API. Values come from recorded entries, not bank connections.","build":"4f45c13b","base_url":"https://saldobem.com","auth":{"none":"Public product documentation.","organization":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},"endpoints":[{"method":"GET","path":"/api/auth/bootstrap","auth":"none","grupo":"Account","summary":"Prepare the browser for global sign-in.","desc":"Sets a host-only HttpOnly browser cookie. CSRF is bound to the current session. No CORS.","retorno":{"csrf":{"tipo":"string","desc":"X-CSRF-Token"},"context":{"tipo":"string","desc":"Opaque view context, also in X-MM-Context; not a credential / contexto opaco da vista, não é credencial."}},"erros":{"400":"invalid_request","403":"invalid_origin / invalid_csrf","503":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"},"returns":"{ csrf, context }","url":"https://saldobem.com/api/auth/bootstrap","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/account/profile","auth":"session","grupo":"Account","exemplo":"await fetch(\"$ORIGIN/api/account/profile\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","summary":"Read your global profile.","desc":"Reads current preferences from the account. Edit them on your account page; products never own a separate profile.","retorno":{"_texto":"{profile:{name,locale,timeZone,theme,revision}}"},"erros":{"401":"invalid_session","503":"auth_unavailable"},"returns":"{profile:{name,locale,timeZone,theme,revision}}","url":"https://saldobem.com/api/account/profile"},{"method":"GET","path":"/api/account/avatar","auth":"session","grupo":"Account","exemplo":"await fetch(\"$ORIGIN/api/account/avatar\", {credentials: \"same-origin\"}).then(r => {if (!r.ok) throw new Error(\"HTTP \" + r.status); return r.blob();});","exemploLinguagem":"js","summary":"Read your global profile photo.","desc":"Private WebP, up to 64 KiB, no cache. Change it on your account. No user ID or object URL accepted.","retorno":{"_texto":"image/webp; Cache-Control: no-store"},"erros":{"401":"invalid_session","404":"not_found: no photo / sem foto","503":"auth_unavailable"},"returns":"image/webp; Cache-Control: no-store","url":"https://saldobem.com/api/account/avatar"},{"method":"GET","path":"/api/me","auth":"session","grupo":"Account","exemplo":"await fetch(\"$ORIGIN/api/me\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","summary":"Read the current global account in this product.","desc":"The product SDK also returns profile and administration. administration is {href} for the platform owner signed in with a passkey, authenticator or recovery code, otherwise null. The server derives this field from the authenticated account. authTime is the sign-in time of a browser session; it is null for an API key or OAuth token.","retorno":{"_texto":"{user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}"},"erros":{"401":"invalid_session","503":"auth_unavailable"},"returns":"{user:{identityId,sessionId,productId,audience,authTime,methods,mfaState}}","url":"https://saldobem.com/api/me"},{"method":"POST","path":"/api/auth/logout","auth":"session","grupo":"Account","exemplo":"// Execute no console da página do produto / Run in the product page console.\n(async () => {\n  const origin = \"$ORIGIN\";\n  const {csrf} = await fetch(origin + \"/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(origin + \"/api/auth/logout\", {\n    method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({})\n  });\n  if (!r.ok) throw new Error(\"Auth HTTP \" + r.status);\n  return r.json();\n})();","exemploLinguagem":"js","summary":"Revoke this product session.","desc":"Bootstrap/CSRF must belong to this browser and session. Other product sessions remain active.","retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_request","403":"invalid_origin / invalid_csrf","503":"auth_unavailable: a sessão anterior é preservada / the previous session is preserved"},"returns":"{ ok }","url":"https://saldobem.com/api/auth/logout"},{"method":"POST","path":"/api/auth/pwa/install","auth":"session","grupo":"Installed app","summary":"Prepare a personal app installation.","desc":"Requires recent sign-in, exact Origin and browser CSRF. Returns a private signed PIN and a no-store manifest address. At most 10 active installations per account and product.","corpo":{"path":{"tipo":"string","obrigatorio":true,"desc":"Same-origin task path, up to 1600 characters."},"state":{"tipo":"object","obrigatorio":true,"desc":"Up to 30 allowlisted preference keys and string values."},"manifest":{"tipo":"object","obrigatorio":true,"desc":"Public app name and same-origin icons."}},"retorno":{"_texto":"{pin,path,manifest}"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const manifest = await fetch(document.querySelector('link[rel=\"manifest\"]').href).then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/auth/pwa/install\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({path: location.pathname + location.search, state: {}, manifest})});\n  return r.json();\n})();","exemploLinguagem":"js","erros":{"400":"invalid_installation_path / invalid_installation_state / invalid_installation_manifest","401":"invalid_session / reauth_required","409":"installation_not_created","503":"auth_unavailable"},"returns":"{pin,path,manifest}","url":"https://saldobem.com/api/auth/pwa/install"},{"method":"POST","path":"/api/auth/pwa/restore","auth":"none","grupo":"Installed app","summary":"Restore an installed app.","desc":"Requires the signed PIN, exact Origin and browser CSRF. Verifies host, product, account status, security version and installation revocation. Keeps the original authentication time. Sensitive actions still require recent sign-in.","corpo":{"pin":{"tipo":"string","obrigatorio":true,"desc":"Private signed installation credential."}},"retorno":{"_texto":"{ok:true,state,path,manifest}; HttpOnly session cookies"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/auth/pwa/restore\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({pin: \"…\"})});\n  return r.json();\n})();","exemploLinguagem":"js","erros":{"401":"invalid_installation","403":"invalid_origin / invalid_csrf","503":"auth_unavailable"},"returns":"{ok:true,state,path,manifest}; HttpOnly session cookies","url":"https://saldobem.com/api/auth/pwa/restore","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/auth/pwa/manifest","auth":"none","grupo":"Installed app","summary":"Read the private installation manifest.","desc":"Requires the installation cookie and its manifest key. Private, no-store. The start URL keeps the PIN in the fragment.","query":{"key":{"tipo":"string","obrigatorio":true,"desc":"Key in the manifest address that the install or restore call returned."}},"retorno":{"_texto":"application/manifest+json"},"exemplo":"await fetch(\"$ORIGIN/api/auth/pwa/manifest?key=…\", {credentials: \"same-origin\"}).then(r => r.json())","exemploLinguagem":"js","erros":{"401":"invalid_installation"},"returns":"application/manifest+json","url":"https://saldobem.com/api/auth/pwa/manifest","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/account/keys","auth":"session","grupo":"Account","summary":"List your API keys in this product.","desc":"Never returns the key itself: name, last 4 characters, organization, creation, last use (hourly) and whether it still works.","retorno":{"keys":{"tipo":"object[]","desc":"`id`, `name`, `organizationId`, `last4`, `createdAt`, `lastUsedAt`, `revokedAt`, `active` (false when revoked or stopped by a password change / ending all sessions)."}},"erros":{"401":"invalid_session","503":"auth_unavailable"},"exemplo":"await fetch(\"$ORIGIN/api/account/keys\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","returns":"{ keys }","url":"https://saldobem.com/api/account/keys"},{"method":"POST","path":"/api/account/keys/create","auth":"session","grupo":"Account","summary":"Create an API key for agents and scripts.","desc":"Needs a sign-in within the last 2 hours; an organization key also needs a second factor in the session and the owner/admin role with this product enabled. At most 10 live keys per account and product. The key (`secret`) is returned ONCE.","corpo":{"name":{"tipo":"string","obrigatorio":true,"desc":"Up to 60 characters."},"organizationId":{"tipo":"string","nulo":true,"obrigatorio":true,"desc":"`null` for an account key."}},"body":{"name":"agent","organizationId":null},"retorno":{"key":{"tipo":"object","desc":"`id`, `name`, `organizationId`, `last4`, `createdAt`."},"secret":{"tipo":"string","desc":"`mmk_…`, shown once."}},"erros":{"400":"invalid_key_name / invalid_organization","401":"invalid_session / reauth_required","403":"invalid_origin / invalid_csrf / organization_forbidden / organization_mfa_required","409":"key_limit_reached","503":"auth_unavailable"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/account/keys/create\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({name: \"agent\", organizationId: null})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ key, secret }","url":"https://saldobem.com/api/account/keys/create"},{"method":"POST","path":"/api/account/keys/revoke","auth":"session","grupo":"Account","summary":"Revoke one of your API keys.","desc":"Stops the key at once. Repeating is harmless.","corpo":{"id":{"tipo":"string","obrigatorio":true,"desc":"The key `id`."}},"body":{"id":"…"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_key_id","401":"invalid_session","403":"invalid_origin / invalid_csrf","404":"key_not_found","503":"auth_unavailable"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/account/keys/revoke\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({id: \"…\"})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ ok }","url":"https://saldobem.com/api/account/keys/revoke"},{"method":"GET","path":"/api/account/apps","auth":"session","grupo":"Account","summary":"List the apps connected to your account in this product.","desc":"The MCP clients you signed in with (OAuth), such as claude.ai or ChatGPT. Never returns a token.","retorno":{"apps":{"tipo":"object[]","desc":"Up to 50: `id`, `nome` (the app; its host when it identifies itself by a metadata document), `criadoEm`, `usadoEm` (hourly, or null)."}},"erros":{"401":"invalid_session","503":"auth_unavailable"},"exemplo":"await fetch(\"$ORIGIN/api/account/apps\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","returns":"{ apps }","url":"https://saldobem.com/api/account/apps"},{"method":"POST","path":"/api/account/apps/revoke","auth":"session","grupo":"Account","summary":"Disconnect an app from your account.","desc":"Stops the app's access at once; it asks you to sign in again. Repeating is harmless.","corpo":{"id":{"tipo":"string","obrigatorio":true,"desc":"The app `id`."}},"body":{"id":"…"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_app_id","401":"invalid_session","403":"invalid_origin / invalid_csrf","404":"app_not_found","503":"auth_unavailable"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/account/apps/revoke\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({id: \"…\"})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ ok }","url":"https://saldobem.com/api/account/apps/revoke"},{"method":"GET","path":"/api/account/callouts","auth":"session","grupo":"Account","summary":"List the notices that you closed in this product.","desc":"The keys of the notices that stay closed for your account, on every device, such as the explanation of an area.","retorno":{"callouts":{"tipo":"string[]","desc":"Up to 200 keys, in alphabetical order."}},"erros":{"401":"invalid_session","403":"product_required","503":"auth_unavailable"},"exemplo":"await fetch(\"$ORIGIN/api/account/callouts\", {credentials: \"same-origin\"}).then(r => r.json());","exemploLinguagem":"js","returns":"{ callouts }","url":"https://saldobem.com/api/account/callouts"},{"method":"POST","path":"/api/account/callouts/dismiss","auth":"session","grupo":"Account","summary":"Close a notice for good.","desc":"The notice does not open again for your account in this product. Repeating is harmless.","corpo":{"key":{"tipo":"string","obrigatorio":true,"desc":"The notice key: letters, digits and `_.:-`, up to 80."}},"body":{"key":"financeiro_expense"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_callout","401":"invalid_session","403":"invalid_origin / invalid_csrf","409":"too_many_callouts","503":"auth_unavailable"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/account/callouts/dismiss\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({key: \"financeiro_expense\"})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ ok }","url":"https://saldobem.com/api/account/callouts/dismiss"},{"method":"POST","path":"/api/account/callouts/reopen","auth":"session","grupo":"Account","summary":"Open a closed notice again.","desc":"Undoes the close: the notice shows again for your account in this product. A product also keeps an on/off choice here, as the hidden values of Finance. Repeating is harmless.","corpo":{"key":{"tipo":"string","obrigatorio":true,"desc":"The notice key: letters, digits and `_.:-`, up to 80."}},"body":{"key":"financeiro_expense"},"retorno":{"ok":{"tipo":"bool","desc":"true"}},"erros":{"400":"invalid_callout","401":"invalid_session","403":"invalid_origin / invalid_csrf","503":"auth_unavailable"},"exemplo":"(async () => {\n  const {csrf} = await fetch(\"$ORIGIN/api/auth/bootstrap\").then(r => r.json());\n  const r = await fetch(\"$ORIGIN/api/account/callouts/reopen\", {method: \"POST\", credentials: \"same-origin\",\n    headers: {\"Content-Type\": \"application/json\", \"X-CSRF-Token\": csrf},\n    body: JSON.stringify({key: \"financeiro_expense\"})});\n  return r.json();\n})();","exemploLinguagem":"js","returns":"{ ok }","url":"https://saldobem.com/api/account/callouts/reopen"},{"method":"POST","path":"/api/auth/wallet/agent/start","auth":"none","grupo":"Account","summary":"Start the wallet credential of an agent without an account.","desc":"No account: the wallet proves it is hers by signing the message (EIP-4361). Signing does not pay or transfer anything. The message names this product and lasts 5 minutes. Before you sign, compare the message with the URL that you called. The domain on the first line must be the host of that URL. URI must be its origin. If one is different, do not sign. Sign it with personal_sign and send it to /api/auth/wallet/agent/token.","corpo":{"address":{"tipo":"string","desc":"0x…, a carteira (EOA ou contrato na Base)","obrigatorio":true}},"body":{"address":"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23"},"exemplo":"curl -s -XPOST $ORIGIN/api/auth/wallet/agent/start -H 'content-type: application/json' -d '{\"address\":\"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23\"}'","retorno":{"message":{"tipo":"string","desc":"EIP-4361"},"issuedAt":{"tipo":"number","desc":"segundos / seconds"},"expiresIn":{"tipo":"number","desc":"300"}},"erros":{"400":"invalid_wallet_address","503":"auth_unavailable"},"returns":"{ message, issuedAt, expiresIn }","url":"https://saldobem.com/api/auth/wallet/agent/start","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/auth/wallet/agent/token","auth":"none","grupo":"Account","summary":"Get the wallet credential (mmw_…) of this product.","desc":"The wallet's signature of the start message, checked here (own key) or on Base (contract, EIP-1271/6492). The credential lasts 30 days: send `Authorization: Bearer mmw_…` to the routes that accept the wallet as owner (owner `x402:<address>`). Once the wallet is linked to an account, what it did here moves to the account when the person signs in.","corpo":{"address":{"tipo":"string","desc":"0x…, a mesma carteira do start / the same wallet as in start","obrigatorio":true},"issuedAt":{"tipo":"number","desc":"o issuedAt do start / start's issuedAt","obrigatorio":true},"signature":{"tipo":"string","desc":"personal_sign (0x…)","obrigatorio":true}},"body":{"address":"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23","issuedAt":1791400000,"signature":"0x…"},"exemplo":"curl -s -XPOST $ORIGIN/api/auth/wallet/agent/token -H 'content-type: application/json' -d '{\"address\":\"0x2c7536E3605D9C16a7a3D7b1898e529396a65c23\",\"issuedAt\":1791400000,\"signature\":\"0x…\"}'","retorno":{"token":{"tipo":"string","desc":"mmw_…"},"owner":{"tipo":"string","desc":"x402:0x…"},"expiresAt":{"tipo":"number","desc":"segundos / seconds"}},"erros":{"400":"invalid_body","401":"invalid_wallet","429":"wallet_limited","503":"wallet_unavailable / auth_unavailable"},"returns":"{ token, owner, expiresAt }","url":"https://saldobem.com/api/auth/wallet/agent/token","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/auth/claim/wallets","auth":"session","grupo":"Account","summary":"Move to the account what its wallets did without an account.","desc":"The sign-in window calls it after every sign-in. For each wallet linked to the account: the rights bought here by x402 (owner x402:<address>) and what this product keeps for that owner. Repeating moves nothing.","exemplo":"await MMConta.fetch(new URL(\"$ORIGIN/api/auth/claim/wallets\").pathname, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: \"{}\" })","retorno":{"carteiras":{"tipo":"number","desc":"wallets"},"direitos":{"tipo":"number","desc":"rights moved"}},"erros":{"401":"invalid_session","503":"auth_unavailable"},"returns":"{ carteiras, direitos }","url":"https://saldobem.com/api/auth/claim/wallets"},{"method":"GET","path":"/api/plans","auth":"none","summary":"The plans for sale and the authenticated account or wallet's active plan.","desc":"Each purchase lasts 30 days, with no automatic renewal. Without an account or wallet credential, `account` is `null`.","grupo":"Billing","query":{"resumo":{"tipo":"string","obrigatorio":false,"desc":"Use `1` to read the active plan without cancellation, retention and refund details.","exemplo":"1"}},"retorno":{"plans":{"tipo":"object[]","desc":"Each plan: `id`, `name`, `organizations`, `days`, `price_usd`, `automatic_renewal`, `charged_now` and the `buy` URL."},"account":{"tipo":"object","desc":"`active` (the plan that ends last, with `valid_until`) and `cancel` (what cancelling removes when the plan ends, the free-days offer, the refund, `keeps_until`, until when what you paid for stays active, `ends_now`, true when cancelling ends part of the plan now, and `renews`, true when a monthly subscription renews it). Without a refund, `ends_now` or `renews`, cancelling changes nothing.","nulo":true}},"erros":{"401":"session_ended","503":"auth_unavailable"},"exemplo":"curl -s $ORIGIN/api/plans","returns":"{ plans, account }","url":"https://saldobem.com/api/plans","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/plans/:plan","auth":"none","summary":"Buys a plan for the account or paying wallet.","desc":"Each purchase lasts 30 days, with no automatic renewal. Without payment, the answer is 402 with the price. Pay with prepaid credit (`X-Credito`) or x402 (`PAYMENT-SIGNATURE` v2 or `X-PAYMENT` v1). Without an account, the verified paying wallet owns the purchase. Use wallet agent authentication to read its plan, or claim it after account sign-in. The `compra` mark prevents repeat credit debits. An x402 nonce can settle only once; keep the receipt after a delivery error.","grupo":"Billing","params":{"plan":{"tipo":"string","obrigatorio":true,"desc":"`business` (Full multi-user organization financial workspace, API and MCP)","exemplo":"business"}},"query":{"compra":{"tipo":"string","obrigatorio":false,"desc":"Mark of one credit purchase, 8 to 64 letters, digits, `-` or `_`. Repeating it with the same credit token does not debit again.","exemplo":"purchase-2026-10-12"}},"retorno":{"plan":{"tipo":"string","desc":"The plan bought."},"organizations_added":{"tipo":"number","desc":"Units granted by this purchase."},"valid_until":{"tipo":"string","desc":"When this purchase ends (ISO 8601)."},"automatic_renewal":{"tipo":"bool","desc":"`false` for Pix, USDC and credit."},"account":{"tipo":"object","desc":"The active plan for the owner; `null` if its summary is unavailable.","nulo":true},"_links":{"tipo":"object","desc":"Plans URL and, for a wallet purchase, wallet authentication and claim URLs."}},"erros":{"401":"An explicit account, wallet or credit credential was refused.","402":"Payment required: the price and the accepted payments.","403":"Writes with the account cookie need the same Origin and `X-CSRF-Token`.","404":"Unknown plan (`unknown_plan`).","409":"Plans are not on sale now (`sales_closed`) or billing is off (`billing_off`)."},"exemplo":"curl -s -X POST \"$ORIGIN/api/plans/business?compra=purchase-2026-10-12\" -H \"X-CSRF-Token: $CSRF\" -H \"X-Credito: $CREDITO\" -b \"$COOKIE\"","returns":"{ plan, organizations_added, valid_until, automatic_renewal, account, _links }","url":"https://saldobem.com/api/plans/:plan","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/plans/cancel","auth":"session","summary":"Cancels the active plan: nothing else is charged, and what you paid for stays active until the end of its period.","desc":"Send `{ \"accept_data_removal\": true }`. The monthly card subscription stops. A purchase made less than 7 days ago and a paid period that has not started yet, such as a renewal, go back the same way they were paid (card or Pix) and end now. The rest of the paid period stays active until `keeps_until`; then what the plan added ends (`account.cancel.losses` in `GET /api/plans` says what). A purchase paid with USDC or with credit from another purchase stays active until its end; ask for its refund by e-mail, as the cancellation page says.","grupo":"Billing","corpo":{"accept_data_removal":{"tipo":"bool","obrigatorio":true,"desc":"Must be `true`: you accept losing what the plan added."}},"body":{"accept_data_removal":true},"retorno":{"canceled":{"tipo":"bool","desc":"`true` when a valid plan was canceled: it ended now, or it stays active until `keeps_until`."},"refund":{"tipo":"object","desc":"`method` (`original`), `amount_cents` and its `currency` (`brl` when Asaas refunds, `usd` when Stripe refunds; `null` when both do).","nulo":true},"keeps_until":{"tipo":"string","desc":"When the paid period that stays active ends (ISO 8601); `null` when everything ended now.","nulo":true},"account":{"tipo":"object","desc":"The account state after cancelling, as in `GET /api/plans`."}},"erros":{"400":"Missing `accept_data_removal: true` (`confirmation_required`).","401":"Sign in first (`account_required`), or the session ended (`session_ended`).","403":"Writes with the account cookie need the same Origin and `X-CSRF-Token`."},"exemplo":"curl -s -X POST $ORIGIN/api/plans/cancel -H \"Content-Type: application/json\" -H \"X-CSRF-Token: $CSRF\" -b \"$COOKIE\" -d '{\"accept_data_removal\":true}'","returns":"{ canceled, refund, keeps_until, account }","url":"https://saldobem.com/api/plans/cancel"},{"method":"POST","path":"/api/plans/:plan/grace","auth":"session","summary":"Takes the free-days offer from the cancellation: the offered plan, free for 7 days, once per account.","desc":"`account.cancel.offer` in `GET /api/plans` says which plan and for how long. Nothing renews by itself, and what you paid for stays active until its end; the free days start after it.","grupo":"Billing","params":{"plan":{"tipo":"string","obrigatorio":true,"desc":"`business` (Full multi-user organization financial workspace, API and MCP)","exemplo":"business"}},"retorno":{"plan":{"tipo":"string","desc":"The plan granted."},"valid_until":{"tipo":"string","desc":"When the free days end."},"price_usd":{"tipo":"number","desc":"Always `0`."},"account":{"tipo":"object","desc":"The account state after the offer, as in `GET /api/plans`."}},"erros":{"401":"Sign in first (`account_required`), or the session ended (`session_ended`).","403":"Writes with the account cookie need the same Origin and `X-CSRF-Token`.","404":"Unknown plan (`unknown_plan`).","409":"No offer for this account or plan (`offer_unavailable`)."},"exemplo":"curl -s -X POST $ORIGIN/api/plans/business/grace -H \"X-CSRF-Token: $CSRF\" -b \"$COOKIE\"","returns":"{ plan, valid_until, price_usd, account }","url":"https://saldobem.com/api/plans/:plan/grace"},{"method":"GET","path":"/api/credito/x402/saude","auth":"none","exemplo":"curl -s $ORIGIN/api/credito/x402/saude","grupo":"Credit","summary":"x402 verifier health: pending payments, missing hashes, failed or stalled reconciliation.","retorno":{"verificado_em":{"tipo":"string","desc":"Reading time in UTC."},"ativo":{"tipo":"boolean","desc":"Verifier configured in this process."},"tarefas":{"tipo":"object[]","desc":"Failures with id and reason, without payer data. Bounded counts show +."}},"erros":{"503":"Verifier unavailable in this process."},"returns":"{ verificado_em, ativo, tarefas }","url":"https://saldobem.com/api/credito/x402/saude","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/credito/barrados/saude","auth":"none","exemplo":"curl -s $ORIGIN/api/credito/barrados/saude","grupo":"Credit","summary":"People who paid and were blocked on this site in the last 24 hours: the site asked for payment from someone with balance or a plan, or charged and did not deliver.","retorno":{"verificado_em":{"tipo":"string","desc":"Reading time in UTC."},"ativo":{"tipo":"boolean","desc":"The reading worked."},"total":{"tipo":"int","desc":"Number of different cases."},"tarefas":{"tipo":"object[]","desc":"Up to 8 cases, with class, route, count and last time, without payer data."}},"returns":"{ verificado_em, ativo, total, tarefas }","url":"https://saldobem.com/api/credito/barrados/saude","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/credito/conta","auth":"credito","exemplo":"curl -s $ORIGIN/api/credito/conta -H 'Cookie: <sessão>'","grupo":"Credit","summary":"The balance of the session account: the sum of its purchases in this environment, in every product, without the code. With movimentos=1, the statement of the account.","query":{"movimentos":{"tipo":"string","desc":"`1`: reads only the paged statement of the account, without the balance."},"de":{"tipo":"string","desc":"Inclusive start in UTC ISO 8601 with milliseconds. Default: 1970-01-01T00:00:00.000Z."},"ate":{"tipo":"string","desc":"Exclusive end in UTC ISO 8601 with milliseconds. Default: now. Keep the value between pages."},"antes":{"tipo":"string","desc":"The `proximo` cursor of the previous page. Only with movimentos=1."},"limite":{"tipo":"int","desc":"1 to 50 entries per page; default 20. Only with movimentos=1."}},"retorno":{"saldo_micros":{"tipo":"int","desc":"The balance in millionths of a dollar."},"saldo_usd":{"tipo":"string","desc":"The balance in dollars, formatted."},"referencia_usd":{"tipo":"string","desc":"The balance right after the last top-up, added across the wallets with a balance: the base of what is left."},"cotacao_brl_por_usd":{"tipo":"number","desc":"The BRL rate the screen uses to show the balance."},"movimentos":{"tipo":"object[]","desc":"Only with movimentos=1: id, em, valor_usd, saldo_usd, motivo, produto and recurso, newest first."},"proximo":{"tipo":"string","desc":"Only with movimentos=1: the cursor of the next page or null."}},"erros":{"400":"Invalid period, limit or cursor.","401":"No session."},"returns":"{ saldo_micros, saldo_usd, referencia_usd, cotacao_brl_por_usd, movimentos, proximo }","url":"https://saldobem.com/api/credito/conta"},{"method":"POST","path":"/api/credito/conta","auth":"credito","exemplo":"curl -s -XPOST $ORIGIN/api/credito/conta -H 'Authorization: Bearer cred_…' -H 'Cookie: <sessão>'","grupo":"Credit","summary":"Links credit bought without an account to the account of the session, USDC included. Then the balance works in the products of the shared credit with `X-Credito: conta`, added to the other purchases of the account.","retorno":{"ok":{"tipo":"boolean","desc":"The link was checked."},"ligadas":{"tipo":"int","desc":"Purchases linked now. Zero when the purchase already has an account."},"da_conta":{"tipo":"boolean","desc":"The balance of this code is already in the account balance."}},"erros":{"401":"No session or no credit code."},"returns":"{ ok, ligadas, da_conta }","url":"https://saldobem.com/api/credito/conta"},{"method":"POST","path":"/api/credito","auth":"none","summary":"Top up prepaid credit: pay once with x402 and get the token that debits on any API of the house.","grupo":"Credit","preco_usd_faixa":[0.1,25],"query":{"usd":{"tipo":"number","desc":"Package: 0.1, 1, 5, 10 or 25 dollars.","obrigatorio":true,"enum":[0.1,1,5,10,25]}},"retorno":{"token":{"tipo":"string","desc":"Bearer token for the balance (`cred_…`). Shown ONCE — it cannot be recovered."},"saldo_usd":{"tipo":"string","desc":"Credited balance."},"guarde":{"tipo":"string","desc":"Warning that the token is the bearer of the credit."},"usar":{"tipo":"string","desc":"How to present the token on paid routes."},"usar_com_outra_credencial":{"tipo":"string","desc":"The `X-Credito` header, for when `Authorization` already carries another credential."},"saldo_em":{"tipo":"string","desc":"Where to check balance and statement."},"onde_gastar":{"tipo":"object","desc":"`precos`: the paid actions and prices of this product (`/api/pricing`); `produtos`: the APIs.json with our other products."}},"erros":{"400":"Package outside the list (0.1, 1, 5, 10 or 25).","402":"Unpaid — the body carries the x402 `accepts[]`."},"exemplo":"curl -s -XPOST '$ORIGIN/api/credito?usd=10'","returns":"{ token, saldo_usd, guarde, usar, usar_com_outra_credencial, saldo_em, onde_gastar }","url":"https://saldobem.com/api/credito","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/credito","auth":"credito","summary":"Balance and statement with cred_…; wallet balance and up to 20 recovery records with mmw_….","desc":"A request without a token receives 401. The Link header points to the x402 manifest. When billing is configured, accepts[] contains the same terms as the smallest POST top-up. GET cannot charge or create credit.","grupo":"Credit","retorno":{"saldo_micros":{"tipo":"int","desc":"Balance in micro-dollars (1e-6 USD)."},"saldo_usd":{"tipo":"string","desc":"Formatted balance."},"criado_em":{"tipo":"string","desc":"When the credit was opened."},"movimentos":{"tipo":"object[]","desc":"Recent credits and debits, with product and resource."},"wallet":{"tipo":"string","desc":"Only with mmw_…: authenticated wallet address."},"payments":{"tipo":"object[]","desc":"Only with mmw_…: up to 20 payments with id, produto, rede, tx_hash, micros, estado and criado_ms. creditado means recovered balance."},"onde_gastar":{"tipo":"object","desc":"`precos`: the paid actions and prices of this product; `produtos`: the APIs.json with our other products."}},"erros":{"401":"No token, or unknown token."},"exemplo":"curl -s $ORIGIN/api/credito -H 'Authorization: Bearer cred_…'","returns":"{ saldo_micros, saldo_usd, criado_em, movimentos, wallet, payments, onde_gastar }","url":"https://saldobem.com/api/credito"},{"method":"GET","path":"/api/credito/pix","auth":"none","summary":"Credit by Pix (Brazil): the key, the fixed rate, the packs in reais and what the receipt accepts.","grupo":"Credit","retorno":{"chave":{"tipo":"string","desc":"The Pix key that receives the payment."},"brl_por_usd":{"tipo":"number","desc":"Fixed rate used for the packs."},"pacotes":{"tipo":"object[]","desc":"The packs (3, 5, 10 or 25 dollars), each with `brl_centavos` and `copia_e_cola` (the Pix copy-and-paste code for the amount, the same text as the QR: the bank app comes with the amount filled in)."},"comprovante":{"tipo":"object","desc":"Accepted types (photo or PDF) and the maximum size, in bytes."},"liberacao":{"tipo":"string","desc":"`manual`: the owner checks the Pix and releases it."}},"exemplo":"curl -s $ORIGIN/api/credito/pix","returns":"{ chave, brl_por_usd, pacotes, comprovante, liberacao }","url":"https://saldobem.com/api/credito/pix","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/credito/pix","auth":"none","summary":"Request credit paid by Pix: multipart with `usd`, `comprovante` (photo or PDF up to 2 MB) and `email`; the rest is optional.","desc":"The credit code comes back in the response and works once the owner checks the Pix and releases it (by hand, usually the same day). `email` is required: it is how the owner reaches the person. Optional: `nome`, `pagina` (the page the request came from, up to 2,000 characters) and what the person was buying when the 402 came — `recurso` (up to 2,000), `descricao` (up to 300) and `preco_usd` (decimal, e.g. `0.50`); and `navegador_id` (a UUID that links the requests from the same browser). Everything that arrives is recorded with the request — the receipt included —, with the signed-in account (checked by the session cookie), the network and browser.","grupo":"Credit","retorno":{"id":{"tipo":"string","desc":"Request id, to follow it."},"estado":{"tipo":"string","desc":"`pendente` until the decision."},"credito":{"tipo":"string","desc":"The `cred_…` token, shown ONCE; it works after the release."},"estado_em":{"tipo":"string","desc":"Where to follow the request."}},"erros":{"400":"Pack outside the list (3, 5, 10 or 25), no receipt or no valid e-mail.","413":"Receipt above 2 MB.","415":"Receipt that is neither a photo (JPEG, PNG, WebP) nor a PDF.","429":"This network already sent today's requests.","502":"The e-mail to the owner did not go out: the request is recorded as `falhou`; send it again.","503":"Review queue full, or Pix not available in this app."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/pix -F usd=5 -F email=you@company.com -F comprovante=@pix.pdf","returns":"{ id, estado, credito, estado_em }","url":"https://saldobem.com/api/credito/pix","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/credito/pix/:id","auth":"none","summary":"Status of a Pix credit request: `pendente`, `liberado`, `recusado` or `falhou`.","grupo":"Credit","params":{"id":{"desc":"Request id (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"estado":{"tipo":"string","desc":"`pendente`, `liberado`, `recusado` or `falhou` (the e-mail to the owner did not go out; send again)."},"usd":{"tipo":"int","desc":"The requested pack."},"decidido_em":{"tipo":"string","desc":"When the owner decided, or `null`."}},"erros":{"404":"Unknown request."},"exemplo":"curl -s $ORIGIN/api/credito/pix/0123456789abcdef0123456789abcdef","returns":"{ estado, usd, decidido_em }","url":"https://saldobem.com/api/credito/pix/:id","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/credito/asaas/:id/cancelar","auth":"none","grupo":"Crédito","summary":"Cancels a pending charge when the payment dialog closes.","desc":"Requires the `cancelamento` capability returned at creation. An older credit charge accepts its token in `credito`. The product and environment must match. This does not refund payments or remove records. 202 means cancellation is pending; the scheduled worker retries provider failures.","params":{"id":{"desc":"Charge id (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"id":{"tipo":"string","desc":"Charge id."},"estado":{"tipo":"string","desc":"`cancelando`, `vencido`, or the confirmed final state."}},"erros":{"404":"Invalid charge or capability, or a different product or environment."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/asaas/0123456789abcdef0123456789abcdef/cancelar -H 'content-type: application/json' -d '{\"cancelamento\":\"<bilhete>\"}'","returns":"{ id, estado }","url":"https://saldobem.com/api/credito/asaas/:id/cancelar","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/credito/asaas","auth":"none","summary":"Automatic Pix: whether it is available in this app, the packs in reais and the balance the product sells.","grupo":"Crédito","retorno":{"disponivel":{"tipo":"boolean","desc":"`false` when the app has no Asaas configured (use the Pix with receipt)."},"pacotes":{"tipo":"object[]","desc":"The credit packs (3, 5, 10 or 25 dollars), with `brl_centavos`."},"exatos":{"tipo":"object[]","desc":"Prices declared by the app, with `usd` and `brl_centavos`. Amounts start at R$ 5.00 and cannot exceed R$ 10,000."},"saldo":{"tipo":"object","desc":"When the product sells a balance in reais: the range and whether the account can buy."},"precisa_documento":{"tipo":"boolean","desc":"Whether the payer's CPF or CNPJ is still required."}},"exemplo":"curl -s $ORIGIN/api/credito/asaas","returns":"{ disponivel, pacotes, exatos, saldo, precisa_documento }","url":"https://saldobem.com/api/credito/asaas","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/credito/asaas","auth":"none","summary":"Creates a dynamic Pix: JSON with `oferta` (`pacote` with `usd`, or `saldo` with `centavos`) and the payer.","desc":"The payment releases what was bought by itself: the pack becomes the `cred_…` token already in the response; the balance goes to the logged-in account's organization. The first purchase needs `documento` (CPF or CNPJ, sent to the gateway and not stored here) and `nome`; `email`, `pagina` and `navegador_id` are optional. With `forma: \"cartao_boleto\"` the charge is open: the response brings `pagamento_em`, the gateway page where you pay by card, boleto or Pix (due in three days). With `forma: \"cartao\"` and `cartao` (`titular`, `numero`, `mes`, `ano`, `cvv`, `documento`, `email`, `cep`, `numero_endereco`, `telefone`), the charge is paid by card in the same request: 200 with `estado: \"pago\"`, 202 with `conferir` while the issuer reviews it, 422 when the card is declined; the card is not stored. Set `usd` to an amount from `pacotes` or `exatos` in the GET response. The server sets the amount in cents and rejects amounts that the app has not declared.","grupo":"Crédito","retorno":{"id":{"tipo":"string","desc":"Charge id, to follow up."},"credito":{"tipo":"string","desc":"For a pack: the `cred_…` token, shown ONCE; valid when the payment arrives."},"forma":{"tipo":"string","desc":"`pix` (the default), `cartao` or `cartao_boleto`."},"pix":{"tipo":"object","desc":"`copia_e_cola`, `imagem` (PNG QR, data URI) and `expira_em`; `pix` form only."},"pagamento_em":{"tipo":"string","desc":"In the `cartao_boleto` form: the gateway payment page."},"estado":{"tipo":"string","desc":"In the `cartao` form: `pago`, or `pendente` with `conferir`."},"estado_em":{"tipo":"string","desc":"Where to follow the payment."},"cancelamento":{"tipo":"string","desc":"Capability to cancel a pending Pix or boleto charge."}},"erros":{"400":"Credit amount outside `pacotes` and `exatos`, amount out of range, invalid CPF/CNPJ, name or e-mail, invalid card data (`cartao_dados`, with the `campo`), or the gateway refused the payer (`pagador_recusado`, with the reason in `detalhe`).","422":"Card declined (`cartao_recusado`, with the `campo` when the gateway says which); try another card with `POST /api/credito/asaas/:id/cartao`.","429":"Limit of 3 attempts per minute or 10 per day, per account or network, or the card limit.","502":"The gateway did not create the Pix; try again.","503":"Automatic Pix unavailable in this app, the gateway is busy (`asaas_ocupado`, wait `retry_after_s`), or too many charges from people not signed in waiting for payment."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/asaas -H 'content-type: application/json' -d '{\"oferta\":\"pacote\",\"usd\":5,\"documento\":\"000.000.000-00\",\"nome\":\"Ana\"}'","returns":"{ id, credito, forma, pix, pagamento_em, estado, estado_em, cancelamento }","url":"https://saldobem.com/api/credito/asaas","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/credito/asaas/:id","auth":"none","summary":"State of an automatic Pix charge: `pendente`, `pago`, `vencido`, `estornado` or `falhou`.","grupo":"Crédito","params":{"id":{"desc":"Charge id (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"estado":{"tipo":"string","desc":"`pago` releases the pack token or the balance; a Pix paid after the due date counts."},"pago_em":{"tipo":"string","desc":"When the payment was confirmed, or `null`."}},"erros":{"404":"Unknown charge."},"exemplo":"curl -s $ORIGIN/api/credito/asaas/0123456789abcdef0123456789abcdef","returns":"{ estado, pago_em }","url":"https://saldobem.com/api/credito/asaas/:id","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/credito/asaas/:id/cartao","auth":"none","summary":"Pays a card charge whose card was declined with another card: the same charge, never charged twice.","desc":"JSON with the `cartao` (the same fields as `POST /api/credito/asaas`) and, without an account, the `navegador_id` that created the charge. Only a card charge waiting for payment, by whoever created it, and up to five attempts per charge.","grupo":"Crédito","params":{"id":{"desc":"Id da cobrança (32 hex).","exemplo":"0123456789abcdef0123456789abcdef"}},"retorno":{"estado":{"tipo":"string","desc":"`pago`, or `pendente` with `conferir` while the issuer reviews it."},"estado_em":{"tipo":"string","desc":"Where to follow the payment."}},"erros":{"400":"Invalid card data (`cartao_dados`, with the `campo`).","404":"Unknown charge, someone else's charge, or not a card charge.","409":"The charge expired or was closed; start the payment again.","422":"Card declined (`cartao_recusado`).","429":"Used up the card attempts for this charge or for today."},"exemplo":"curl -s -XPOST $ORIGIN/api/credito/asaas/0123456789abcdef0123456789abcdef/cartao -H 'content-type: application/json' -d '{\"cartao\":{…}}'","returns":"{ estado, estado_em }","url":"https://saldobem.com/api/credito/asaas/:id/cartao","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/credito/asaas/saude","auth":"none","summary":"Health of this app's Pix and enabled subscriptions: failures and reasons for the dashboard.","grupo":"Crédito","retorno":{"ativo":{"tipo":"boolean","desc":"`false` when Asaas and subscriptions are disabled."},"tarefas":{"tipo":"object[]","desc":"Each problem has `id`, `falhando`, and `motivo`. Includes Pix and, when enabled, subscription recovery, queue, and budget. Does not call the provider."}},"exemplo":"curl -s $ORIGIN/api/credito/asaas/saude","returns":"{ ativo, tarefas }","url":"https://saldobem.com/api/credito/asaas/saude","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/partners","auth":"none","grupo":"Partnership","summary":"Fixed-price advertising: placements, duration, public numbers and checkout. Partnerships and custom campaigns use negotiation.","desc":"Four packages priced in USD per week, one-off or weekly subscription. Includes placements, sponsors and measured audience. Proposals, review, acceptance and payment at /conta/publicidade, also in the profile menu. Preview links go to the verified account email. GET modalidade=pedido requires a human session: list your proposals (after=next) or read id; relatorio_depois pages daily results. GET modalidade=pendencias requires the same session and returns acao_pendente for an approved preview that this account must accept or pay. GET modalidade=arte&id serves the private binary image, public only during a paid published campaign. Private responses never use public caching. The weekly catalogue is cached for 1 minute. Negotiation and partnerships use the contact form.","retorno":{"status":{"tipo":"string","desc":"`preco_fechado`: priced spaces can be purchased; other offers require negotiation."},"produto":{"tipo":"string","desc":"Product name."},"idioma":{"tipo":"string","desc":"Language of the texts (the product's)."},"titulo":{"tipo":"string","desc":"Title of the offer."},"descricao":{"tipo":"string","desc":"One sentence about the offer."},"publico":{"tipo":"string","desc":"Who uses the product — the audience a sponsor reaches."},"modalidades":{"tipo":"object[]","desc":"`{ id, nome }`: patrocinio, parceria, anuncio."},"placements":{"tipo":"object[]","desc":"Package channels: id, nome, onde, formato, medicao and disponivel. Legacy monthly price is null in the weekly catalogue."},"packages":{"tipo":"object[]","desc":"Four packages: id, nome, assinatura, preco_usd_semana, espacos, canais and allowed periods in exposicao[{dias,preco}]."},"house_bundle":{"tipo":"object","desc":"Unavailable in the weekly catalogue: `{disponivel:false}`."},"parcerias":{"tipo":"string[]","desc":"Partnership ideas the product is open to discuss."},"current_sponsors":{"tipo":"object[]","desc":"Sponsors in effect: `id`, `nome`, `url`, `frase`, `espacos`, `ate`."},"stats":{"tipo":"object","desc":"Excerpt of the public numbers (`hoje`, `janelas`, `agentes`, `confiabilidade`) and the `link` to `/api/vitrine`; `publicado: false` before the first publication."},"payment":{"tipo":"object","desc":"Shared payment through the purchase POST. Wallet fields remain for compatibility; do not send a manual payment before the quote."},"contact":{"tipo":"object","desc":"`email`, `form_url`, `api_url` (`POST /api/contact`, free: one message every 10 s per network), `campos` (required), `campos_proposta` (the optional proposal fields, each with its accepted values), `message_template`, `instructions`."},"politica":{"tipo":"object","desc":"Placement label, refused sectors, prepayment, deadlines."},"_links":{"tipo":"object","desc":"`self`, `stats`, `page` (`null` until the page exists), `contact`, `casa` (the same path on the ten products)."}},"exemplo":"curl -s $ORIGIN/api/partners","returns":"{ status, produto, idioma, titulo, descricao, publico, modalidades, placements, packages, house_bundle, parcerias, current_sponsors, stats, payment, contact, politica, _links }","url":"https://saldobem.com/api/partners","auth_detail":"Public product documentation."},{"method":"POST","path":"/api/partners","auth":"session","grupo":"Partnership","summary":"Submit an ad for approval, then buy the approved weekly package.","desc":"Human account session and same-origin CSRF required. Submit complete creative and terms with modalidade=proposta: one private binary is stored for the account, without charge or inventory reservation. The owner reviews in /adm; the verified account email receives a link to /conta/publicidade?pedido=ID. Read your proposal with GET modalidade=pedido&id=ID on any device. Review the final version, then POST modalidade=aceitar with only {id,versao,aceite:true}. Payment requires both approvals for that exact version. For one-off payment omit modalidade and send only {id,aprovacao:versao}: shared 402 quote and payment, no renewal. modalidade=assinatura adds the native assinatura body with explicit weekly renewal acceptance. Current BRL offers: /api/credito/assinaturas/ofertas. Cancel future charges in the account. modalidade=recibo reads your paid campaign receipt. The owner publishes after verified payment; the period begins on publication. Identical retries do not charge twice. Custom campaigns and free partnerships use POST /api/contact.","query":[{"nome":"modalidade","tipo":"string","desc":"proposta submits; aceitar accepts the exact owner-approved version; omit for approved one-off payment; assinatura uses native weekly card billing; recibo reads the account's campaign receipt."}],"corpo":{"id":{"tipo":"string","obrigatorio":true,"desc":"Fresh random order id: 32 lowercase hexadecimal characters. Reuse for retries."},"token":{"tipo":"string","obrigatorio":false,"desc":"Required only to submit a proposal: 64 random lowercase hexadecimal characters, reused for an identical retry. Account login remains mandatory for private access."},"espaco":{"tipo":"string[]","desc":"Legacy paid-order retry only. New purchases select a package.","obrigatorio":false},"pacote":{"tipo":"string","obrigatorio":false,"desc":"One of the four package ids in GET /api/partners packages."},"duracao":{"tipo":"int","obrigatorio":false,"desc":"Days from the package exposure list. Weekly subscriptions require 7."},"modalidade":{"tipo":"string","valores":["avulso","assinatura"],"desc":"Required in the proposal body: avulso or assinatura. The approved mode is bound to the creative hash.","obrigatorio":false},"aprovacao":{"tipo":"string","desc":"After owner approval and advertiser acceptance, send only id and this 64-character versao for one-off payment. No image is uploaded again.","obrigatorio":false},"versao":{"tipo":"string","desc":"modalidade=aceitar: exact current versao from the authenticated proposal.","obrigatorio":false},"aceite":{"tipo":"bool","desc":"modalidade=aceitar requires true after the advertiser reviews this exact version.","obrigatorio":false},"assinatura":{"tipo":"object","desc":"Only with modalidade=assinatura: the native subscription body with recurso=publicidade:ORDER_ID, simulado, cartao and explicit renewal aceite. The authenticated account must own the campaign.","obrigatorio":false},"pedido":{"tipo":"string","desc":"Only with modalidade=recibo: the campaign id owned by the signed-in account.","obrigatorio":false},"nome":{"tipo":"string","obrigatorio":false,"desc":"Brand or product, up to 80 characters."},"email":{"tipo":"string","obrigatorio":false,"desc":"Contact email."},"url":{"tipo":"string","obrigatorio":false,"desc":"HTTPS destination URL."},"frase":{"tipo":"string","obrigatorio":false,"desc":"Ad copy, up to 100 characters."},"arte":{"tipo":"string","obrigatorio":false,"desc":"Base64 image bytes, without a data URL prefix. PNG, JPEG or WebP, up to 2 MB."},"direitos":{"tipo":"bool","obrigatorio":false,"desc":"true confirms the right to use the image and content."}},"retorno":{"id":{"tipo":"string","desc":"Order id."},"estado":{"tipo":"string","desc":"proposta: private and unpaid; aprovado: owner-approved; aceite: advertiser-accepted; revisao: paid and awaiting publication; publicado: live in its paid period; recusado: declined."},"recibo":{"tipo":"string","desc":"Verified payment receipt."},"versao":{"tipo":"string","desc":"Current reviewed campaign fingerprint. Editing invalidates both approvals."},"arte":{"tipo":"string","desc":"Private binary URL; access requires the owning account or factor-protected owner until publication."}},"erros":{"400":"Invalid order or artwork.","401":"A human account session is required.","402":"Payment required.","403":"Invalid origin or CSRF.","409":"Approval required, space occupied or order changed.","503":"Checkout unavailable."},"exemplo":"Use /conta/publicidade and the shared account SDK; API keys cannot approve or purchase a campaign.","returns":"{ id, estado, recibo, versao, arte }","url":"https://saldobem.com/api/partners"},{"method":"GET","path":"/api/pricing","auth":"none","grupo":"Plans","summary":"Read public SaaS plans and 7-day trial terms in BRL.","retorno":{"_texto":"JSON with trial_days and available plans."},"returns":"JSON with trial_days and available plans.","url":"https://saldobem.com/api/pricing","auth_detail":"Public product documentation."},{"method":"GET","path":"/api/organizations/:id/trial","auth":"organization","grupo":"Plans","summary":"Read the 7-day free trial and active plan state of an organization.","retorno":{"_texto":"JSON `{ trial: { days, started, active, daysLeft, plan } }`."},"returns":"JSON `{ trial: { days, started, active, daysLeft, plan } }`.","url":"https://saldobem.com/api/organizations/:id/trial","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/organizations/:id/trial","auth":"organization","grupo":"Plans","summary":"Explicitly start the 7-day free trial for an organization.","retorno":{"_texto":"JSON `{ trial }`."},"returns":"JSON `{ trial }`.","url":"https://saldobem.com/api/organizations/:id/trial","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/plans/:id/quote","auth":"organization","grupo":"Plans","summary":"Compute an organization plan switch quote preserving remaining paid days.","retorno":{"_texto":"JSON quote object."},"returns":"JSON quote object.","url":"https://saldobem.com/api/plans/:id/quote","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/organizations","auth":"session","grupo":"Organizations","summary":"List organizations available to this account and domain.","retorno":{"_texto":"{items:[{id,nome,papel,exigeMfa,logo}],domainOrganization,canManageBranding}. The operator host allows the platform owner to switch between their memberships. An organization with its own domain opens only on that domain; its API keys keep using the API."},"returns":"{items:[{id,nome,papel,exigeMfa,logo}],domainOrganization,canManageBranding}. The operator host allows the platform owner to switch between their memberships. An organization with its own domain opens only on that domain; its API keys keep using the API.","url":"https://saldobem.com/api/organizations"},{"method":"GET","path":"/api/organizations/logo","auth":"session","grupo":"Organizations","summary":"Read the logo of an organization available to this account and domain.","query":{"organization":{"tipo":"string","desc":"Organization ID.","obrigatorio":true}},"retorno":{"_texto":"PNG or WebP image. Private cache for 60 seconds. 404 when no logo is configured."},"returns":"PNG or WebP image. Private cache for 60 seconds. 404 when no logo is configured.","url":"https://saldobem.com/api/organizations/logo"},{"method":"GET","path":"/api/branding/available","auth":"session","grupo":"Organizations","summary":"List existing organizations owned by the operator, with Finance activation state.","query":{"after":{"tipo":"string","desc":"Cursor from the preceding page."}},"retorno":{"_texto":"{items:[{id,name,role,product:{id,enabled,revision}}],next}. Operator host and platform owner only. Organizations with their own domain are managed there and are not listed."},"returns":"{items:[{id,name,role,product:{id,enabled,revision}}],next}. Operator host and platform owner only. Organizations with their own domain are managed there and are not listed.","url":"https://saldobem.com/api/branding/available"},{"method":"POST","path":"/api/branding/enable","auth":"session","grupo":"Organizations","summary":"Enable Finance for an existing organization through the account service.","corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"organizationId":{"tipo":"string","desc":"Owned organization ID.","obrigatorio":true},"revision":{"tipo":"int","desc":"Current Finance product revision.","obrigatorio":true}},"retorno":{"_texto":"Account product change receipt. Requires CSRF, ownership and recent MFA when the organization is shared."},"returns":"Account product change receipt. Requires CSRF, ownership and recent MFA when the organization is shared.","url":"https://saldobem.com/api/branding/enable"},{"method":"GET","path":"/api/branding/domains","auth":"session","grupo":"Organizations","summary":"List this organization's Finance entry domains.","query":{"organization":{"tipo":"string","desc":"Organization ID.","obrigatorio":true}},"retorno":{"_texto":"{domains,version}. Operator host, platform owner, membership and CSRF are required for writes. An assigned hostname cannot be taken from another organization."},"returns":"{domains,version}. Operator host, platform owner, membership and CSRF are required for writes. An assigned hostname cannot be taken from another organization.","url":"https://saldobem.com/api/branding/domains"},{"method":"PUT","path":"/api/branding/domains","auth":"session","grupo":"Organizations","summary":"Register or remove exact Finance entry domains with version control.","query":{"organization":{"tipo":"string","desc":"Organization ID.","obrigatorio":true}},"corpo":{"version":{"tipo":"int","desc":"Current branding version.","obrigatorio":true},"domains":{"tipo":"string[]","desc":"Up to 10 exact hostnames. Omitted previous hosts are unbound. DNS, TLS and account origins require deployment configuration.","obrigatorio":true}},"retorno":{"_texto":"{domains,version}. Operator host, platform owner, membership and CSRF are required for writes. An assigned hostname cannot be taken from another organization."},"returns":"{domains,version}. Operator host, platform owner, membership and CSRF are required for writes. An assigned hostname cannot be taken from another organization.","url":"https://saldobem.com/api/branding/domains"},{"method":"GET","path":"/api/branding/google","auth":"session","grupo":"Organizations","summary":"Read Google sign-in configuration without its secret.","query":{"organization":{"tipo":"string","desc":"Organization ID.","obrigatorio":true}},"retorno":{"_texto":"{version,enabled,clientId,configured,redirectUris}. Never returns a secret or encrypted envelope. Operator host, platform owner and organization administrator required."},"returns":"{version,enabled,clientId,configured,redirectUris}. Never returns a secret or encrypted envelope. Operator host, platform owner and organization administrator required.","url":"https://saldobem.com/api/branding/google"},{"method":"PUT","path":"/api/branding/google","auth":"session","grupo":"Organizations","summary":"Save the organization's encrypted Google client credential.","query":{"organization":{"tipo":"string","desc":"Organization ID.","obrigatorio":true}},"corpo":{"version":{"tipo":"int","desc":"Current version, or zero before the first save.","obrigatorio":true},"enabled":{"tipo":"bool","desc":"Enable only after the callback is registered with Google.","obrigatorio":true},"clientId":{"tipo":"string","desc":"Google web application's client ID.","obrigatorio":true},"clientSecret":{"tipo":"string","desc":"Write-only. Omit to retain the saved secret. Required for a new client ID."},"redirectUris":{"tipo":"string[]","desc":"Exact callbacks under the organization's registered domains.","obrigatorio":true}},"retorno":{"_texto":"{version,enabled,clientId,configured,redirectUris}. Never returns a secret or encrypted envelope. Operator host, platform owner and organization administrator required."},"returns":"{version,enabled,clientId,configured,redirectUris}. Never returns a secret or encrypted envelope. Operator host, platform owner and organization administrator required.","url":"https://saldobem.com/api/branding/google"},{"method":"GET","path":"/api/branding/organizations","auth":"session","grupo":"Organizations","summary":"List organizations available for branding. Platform owner on the operator host, or only the domain's organization on its own domain.","retorno":{"_texto":"{items:[{id,nome,papel,exigeMfa}]}"},"returns":"{items:[{id,nome,papel,exigeMfa}]}","url":"https://saldobem.com/api/branding/organizations"},{"method":"GET","path":"/api/branding","auth":"session","grupo":"Organizations","summary":"Read organization branding. Platform owner and organization administrator required, on the operator host or on the organization's own domain.","query":{"organization":{"tipo":"string","desc":"Organization ID.","obrigatorio":true}},"retorno":{"_texto":"Brand profile with version, enabled, showFooter, name, logo, website, contactEmail, senderEmail, privacyUrl, termsUrl, legalName, taxId, address, domains and emailDomains."},"returns":"Brand profile with version, enabled, showFooter, name, logo, website, contactEmail, senderEmail, privacyUrl, termsUrl, legalName, taxId, address, domains and emailDomains.","url":"https://saldobem.com/api/branding"},{"method":"PUT","path":"/api/branding","auth":"session","grupo":"Organizations","summary":"Save organization branding with optimistic version control. Requires the platform owner, organization membership and CSRF.","query":{"organization":{"tipo":"string","desc":"Organization ID.","obrigatorio":true}},"corpo":{"version":{"tipo":"int","desc":"Current version; zero for the first save.","obrigatorio":true},"enabled":{"tipo":"bool","desc":"Enable client branding.","obrigatorio":true},"showFooter":{"tipo":"bool","desc":"Show only the customer's footer. Default: false."},"name":{"tipo":"string","desc":"Client display name, up to 120 characters.","obrigatorio":true},"website":{"tipo":"string","desc":"Client HTTPS website.","obrigatorio":true},"contactEmail":{"tipo":"string","desc":"Contact destination.","obrigatorio":true},"senderEmail":{"tipo":"string","desc":"Sender of the organization's account emails (codes, notices, invitations), 7-bit ASCII. Authorize the address in Amazon SES and the domain in DNS (DKIM) first. Empty or not authorized: the organization sends no email."},"privacyUrl":{"tipo":"string","desc":"Client HTTPS privacy policy.","obrigatorio":true},"termsUrl":{"tipo":"string","desc":"Client HTTPS terms.","obrigatorio":true},"logo":{"tipo":"string","desc":"PNG or WebP data URL, up to 256 KB decoded.","obrigatorio":true},"legalName":{"tipo":"string","desc":"Client legal name for the page metadata, up to 160 characters."},"taxId":{"tipo":"string","desc":"Client tax ID (CNPJ) for the page metadata, up to 32 characters."},"address":{"tipo":"string","desc":"Client address for the page metadata, up to 300 characters."},"emailDomains":{"tipo":"string[]","desc":"Up to 10 email domains that can sign in on the client's domains, by any method. Empty: any email. The platform owner can always sign in."},"domains":{"tipo":"string[]","desc":"Up to 10 exact hostnames. Remove a binding before assigning it to another organization.","obrigatorio":true}},"retorno":{"_texto":"Saved profile with incremented version. 409 for a stale version or domain conflict."},"returns":"Saved profile with incremented version. 409 for a stale version or domain conflict.","url":"https://saldobem.com/api/branding"},{"method":"POST","path":"/api/organizations","auth":"session","grupo":"Organizations","summary":"Create an organization on an unbound domain or as the platform owner on the operator host.","corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"name":{"tipo":"string","desc":"Organization name.","obrigatorio":true}},"retorno":{"_texto":"{id,nome,papel}"},"returns":"{id,nome,papel}","url":"https://saldobem.com/api/organizations"},{"method":"GET","path":"/api/finance/status","auth":"organization","grupo":"Finance","summary":"Read initialization state and current financial permissions.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/status","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/counts","auth":"organization","grupo":"Finance","summary":"Count the open expense and income installments, the active fixed expense rules (recurring) and contracts (fixed income rules), prospects and open alerts. total: every open installment. overdue: due before today. soon: due before today or from from to to; without them, in the next 60 days.","retorno":{"_texto":"{expense:{total,overdue,soon},income:{total,overdue,soon},contracts:{total},recurring:{total},prospects:{total},alerts:{total,high}}"},"query":{"from":{"tipo":"string","desc":"First due date of soon, YYYY-MM-DD. Default: today."},"to":{"tipo":"string","desc":"Last due date of soon, inclusive. Default: today+60."}},"returns":"{expense:{total,overdue,soon},income:{total,overdue,soon},contracts:{total},recurring:{total},prospects:{total},alerts:{total,high}}","url":"https://saldobem.com/api/finance/counts","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/central","auth":"organization","grupo":"Finance","summary":"Read the payment center summary: open installments due today, tomorrow, overdue, by next Saturday, by the end of this month and next month, plus payments of today. Week and month totals include overdue installments. planned: the due dates of the active fixed rules in the bucket that are not accounts yet. With from and to, the dates of a list, the summary counts only those days, and a bucket whose days from today on are not all inside does not come.","retorno":{"_texto":"{today,kind,from?,to?,open:{count,amountCents},buckets:[{id,count,amountCents,planned:{count,amountCents}}]}. Bucket ids: today, tomorrow, overdue, paidToday, week, month, nextMonth. paidToday has no planned."},"query":{"kind":{"tipo":"string","desc":"expense or income. Default: expense."},"from":{"tipo":"string","desc":"First day, YYYY-MM-DD. Without from and to, every date counts."},"to":{"tipo":"string","desc":"Last day, YYYY-MM-DD, at most 366 days after from."},"overdue":{"tipo":"string","desc":"1 also counts every open installment due before today, as the open list does."}},"erros":{"400":"invalid_date or invalid_period: from or to is not a day, or to is before from or more than 366 days after it."},"returns":"{today,kind,from?,to?,open:{count,amountCents},buckets:[{id,count,amountCents,planned:{count,amountCents}}]}. Bucket ids: today, tomorrow, overdue, paidToday, week, month, nextMonth. paidToday has no planned.","url":"https://saldobem.com/api/finance/central","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/alerts","auth":"organization","grupo":"Finance","summary":"List data problems to check: facts to confirm that a person or an agent opened (to-confirm, with detail.note), recovered accounts, invalid dates and missing supplier, category or description in imported history, and texts repaired on import. Severe ones first.","retorno":{"_texto":"{items:[{id,code,severity,accountId,installmentId,detail,status,resolvedAt,resolvedByName,resolution,title,partyName}],next_cursor}. severity high needs a correction; low is an automatic repair to check. resolution source-fixed: the source no longer has the problem."},"query":{"status":{"tipo":"string","desc":"open or resolved. Default: open."},"account":{"tipo":"string","desc":"Only the alerts of this account ID."},"limit":{"tipo":"int","desc":"Rows per page, from 1 to 200. Default: 50."},"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."}},"returns":"{items:[{id,code,severity,accountId,installmentId,detail,status,resolvedAt,resolvedByName,resolution,title,partyName}],next_cursor}. severity high needs a correction; low is an automatic repair to check. resolution source-fixed: the source no longer has the problem.","url":"https://saldobem.com/api/finance/alerts","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/alerts","auth":"organization","grupo":"Finance","summary":"Open a to-confirm alert for a fact that no source confirms, for example an amount without a receipt or a payment with no known purpose. The automatic check does not close it. A person resolves it, and the resolution note is the answer.","retorno":{"_texto":"{item:{id,code,severity,accountId,installmentId,detail:{note},status,createdAt,updatedAt}}. code is to-confirm and severity is high."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"note":{"tipo":"string","desc":"What to confirm, at most 500 characters.","obrigatorio":true},"accountId":{"tipo":"string","desc":"Optional account ID. Without it, the alert is about the organization."}},"erros":{"400":"note_required, invalid_text (a note longer than 500 characters) or invalid_id.","401":"unauthorized: no valid API key or session.","403":"finance_forbidden or finance_suspended: the financial profile cannot write.","404":"account_not_found: no account with this accountId in the organization.","409":"request_conflict: the requestId was used with another body."},"exemplo":"curl -s -X POST '$ORIGIN/api/finance/alerts' -H \"Authorization: Bearer $FINANCE_API_KEY\" -H 'Content-Type: application/json' -d '{\"requestId\":\"confirm-2026-10-card\",\"note\":\"Confirm the amount of the October card bill.\"}'","returns":"{item:{id,code,severity,accountId,installmentId,detail:{note},status,createdAt,updatedAt}}. code is to-confirm and severity is high.","url":"https://saldobem.com/api/finance/alerts","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/alerts/:id/resolve","auth":"organization","grupo":"Finance","summary":"Mark an open alert as resolved. It does not change the account.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"note":{"tipo":"string","desc":"Optional note, at most 500 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/alerts/:id/resolve","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/initialize","auth":"organization","grupo":"Finance","summary":"Initialize this organization's company and the initial catalog.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/initialize","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/overview","auth":"organization","grupo":"Finance","summary":"Read competence result, cash movement and forecasts. The forecast and the period also count the due dates of the active fixed rules that are not accounts yet; their competence is the due date. fixed: what the active rules take or bring per month and per year. prospects: the open deals.","retorno":{"_texto":"{from,to,today,competence:[{kind,realizedCents,plannedCents}],recurring:[{kind,count,amountCents}],cash:[{kind,amountCents}],forecast:[{id,from,to,rows:[{kind,count,amountCents}],planned:[{kind,count,amountCents}]}],fixed:{expense,income:{count,monthlyCents,yearlyCents,annualCents}},prospects:{count,amountCents,weightedCents,annualCents,weightedAnnualCents}}. recurring: the fixed due dates of the period from today on. planned: the fixed due dates of the forecast period."},"query":{"from":{"tipo":"string","desc":"First date, YYYY-MM-DD. Default: first day of this month."},"to":{"tipo":"string","desc":"Last date, inclusive. Maximum period: 366 days."},"company":{"tipo":"string","desc":"Company reference ID within this organization."}},"returns":"{from,to,today,competence:[{kind,realizedCents,plannedCents}],recurring:[{kind,count,amountCents}],cash:[{kind,amountCents}],forecast:[{id,from,to,rows:[{kind,count,amountCents}],planned:[{kind,count,amountCents}]}],fixed:{expense,income:{count,monthlyCents,yearlyCents,annualCents}},prospects:{count,amountCents,weightedCents,annualCents,weightedAnnualCents}}. recurring: the fixed due dates of the period from today on. planned: the fixed due dates of the forecast period.","url":"https://saldobem.com/api/finance/overview","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/installments","auth":"organization","grupo":"Finance","summary":"List installments by date and ID, 50 per page unless limit says otherwise.","retorno":{"_texto":"{items,next_cursor}. Each item has the installment, the account title, parties, invoice, receivedAt and alert (1 when the account has an open alert). originalDueDate: the due date before the first postponement. abatementCents: the amount taken off; amountCents is already less it. refundedCents and refundedAt: the money given back after settlement. loss: 1 for a cancelled receivable that was not paid."},"query":{"from":{"tipo":"string","desc":"First date, YYYY-MM-DD. Default: first day of this month."},"to":{"tipo":"string","desc":"Last date, inclusive. Maximum period: 366 days."},"company":{"tipo":"string","desc":"Company reference ID within this organization."},"kind":{"tipo":"string","desc":"expense or income. Default: expense."},"status":{"tipo":"string","desc":"open, paid, deleted or any (open and paid). Paid entries use settlement dates. any with all=1 requires nf."},"party":{"tipo":"string","desc":"Supplier or customer reference ID."},"category":{"tipo":"string","desc":"Category reference ID."},"nf":{"tipo":"string","desc":"Invoice substring."},"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."},"all":{"tipo":"string","desc":"1 ignores from and to: every date, as the payment center lists open installments."},"overdue":{"tipo":"string","desc":"1 with status=open also lists the open installments due before today. With the same from and to, it is the list that /counts counts as soon."},"order":{"tipo":"string","desc":"desc lists the latest date first. Default: oldest first."},"limit":{"tipo":"int","desc":"Rows per page, from 1 to 200. Default: 50."}},"returns":"{items,next_cursor}. Each item has the installment, the account title, parties, invoice, receivedAt and alert (1 when the account has an open alert). originalDueDate: the due date before the first postponement. abatementCents: the amount taken off; amountCents is already less it. refundedCents and refundedAt: the money given back after settlement. loss: 1 for a cancelled receivable that was not paid.","url":"https://saldobem.com/api/finance/installments","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/installments/totals","auth":"organization","grupo":"Finance","summary":"Read the totals of the list that the same filters give, whatever the page. A paid amount is less its refund. An open list of a period also gives recurring: the due dates of its active fixed rules from today to the end of the period that are not accounts yet, with the same supplier or customer, company and category. An invoice search (nf) and all=1 have no recurring.","retorno":{"_texto":"{count,amountCents,overdueCount,overdueCents,recurring?:{count,amountCents}}. overdueCount and overdueCents: the open installments due before today."},"query":{"from":{"tipo":"string","desc":"First date, YYYY-MM-DD. Default: first day of this month."},"to":{"tipo":"string","desc":"Last date, inclusive. Maximum period: 366 days."},"company":{"tipo":"string","desc":"Company reference ID within this organization."},"kind":{"tipo":"string","desc":"expense or income. Default: expense."},"status":{"tipo":"string","desc":"open, paid, deleted or any (open and paid). Paid entries use settlement dates. any with all=1 requires nf."},"party":{"tipo":"string","desc":"Supplier or customer reference ID."},"category":{"tipo":"string","desc":"Category reference ID."},"nf":{"tipo":"string","desc":"Invoice substring."},"all":{"tipo":"string","desc":"1 ignores from and to: every date, as the payment center lists open installments."},"overdue":{"tipo":"string","desc":"1 with status=open also lists the open installments due before today. With the same from and to, it is the list that /counts counts as soon."}},"returns":"{count,amountCents,overdueCount,overdueCents,recurring?:{count,amountCents}}. overdueCount and overdueCents: the open installments due before today.","url":"https://saldobem.com/api/finance/installments/totals","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/accounts","auth":"organization","grupo":"Finance","summary":"List up to 50 entries or contracts.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"query":{"kind":{"tipo":"string","desc":"income or expense."},"contract":{"tipo":"string","desc":"1 for contracts; otherwise 0."},"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/accounts","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/accounts","auth":"organization","grupo":"Finance","summary":"Create an expense, income entry or finite contract atomically.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"kind":{"tipo":"string","desc":"expense or income.","obrigatorio":true},"contract":{"tipo":"bool","desc":"True only for contract income."},"title":{"tipo":"string","desc":"Description, at most 180 characters.","obrigatorio":true},"partyId":{"tipo":"string","desc":"Active supplier or customer ID.","obrigatorio":true},"companyId":{"tipo":"string","desc":"Active company ID. Default: default."},"categoryId":{"tipo":"string","desc":"Active category ID.","obrigatorio":true},"receivedAt":{"tipo":"string","desc":"Entry date, YYYY-MM-DD.","obrigatorio":true},"invoiceNumber":{"tipo":"string","desc":"Invoice number, at most 80 characters."},"notes":{"tipo":"string","desc":"Notes, at most 1200 characters."},"amountCents":{"tipo":"int","desc":"Positive integer BRL cents. Total for an ordinary entry; amount per period for a contract."},"installmentCount":{"tipo":"int","desc":"Number of periods or installments, from 1 to 36."},"dueDate":{"tipo":"string","desc":"First due date, YYYY-MM-DD."},"competenceDate":{"tipo":"string","desc":"First competence date. Ordinary installments share this competence."},"frequency":{"tipo":"string","desc":"monthly, weekly or once. once requires one installment."},"installments":{"tipo":"object[]","desc":"Alternative explicit schedule, 1–36 objects with dueDate, competenceDate and amountCents."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/accounts","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/accounts/:id","auth":"organization","grupo":"Finance","summary":"Read an entry, all of its installments and its open alerts.","retorno":{"_texto":"{account,installments,alerts}. account.createdByName is the person who entered it; installment.paidByName is the person who settled it. Both are empty when unknown. Imported history can have empty dates and settlements without paymentMethodId."},"returns":"{account,installments,alerts}. account.createdByName is the person who entered it; installment.paidByName is the person who settled it. Both are empty when unknown. Imported history can have empty dates and settlements without paymentMethodId.","url":"https://saldobem.com/api/finance/accounts/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"PATCH","path":"/api/finance/accounts/:id","auth":"organization","grupo":"Finance","summary":"Edit entry metadata and, optionally, the open installments. Paid installments never change.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"title":{"tipo":"string","desc":"Description, at most 180 characters.","obrigatorio":true},"partyId":{"tipo":"string","desc":"Active supplier or customer ID.","obrigatorio":true},"companyId":{"tipo":"string","desc":"Active company ID. Default: default."},"categoryId":{"tipo":"string","desc":"Active category ID.","obrigatorio":true},"receivedAt":{"tipo":"string","desc":"Entry date, YYYY-MM-DD.","obrigatorio":true},"invoiceNumber":{"tipo":"string","desc":"Invoice number, at most 80 characters."},"notes":{"tipo":"string","desc":"Notes, at most 1200 characters."},"version":{"tipo":"int","desc":"Current account version.","obrigatorio":true},"installments":{"tipo":"object[]","desc":"Not for contracts. The complete list of open installments: {id?,dueDate,competenceDate?,amountCents}. An item with id changes that open installment; one without id is added; an open installment left out is cancelled and kept in the history. Active installments are numbered again by due date, at most 120."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/accounts/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/accounts/:id/cancel","auth":"organization","grupo":"Finance","summary":"Cancel open installments with a reason. An ordinary entry with any settlement cannot be cancelled. Ending a contract preserves earlier periods.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"reason":{"tipo":"string","desc":"Required reason, at most 500 characters.","obrigatorio":true},"effectiveDate":{"tipo":"string","desc":"For contracts: today or a future date, YYYY-MM-DD."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/accounts/:id/cancel","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/installments/:id/pay","auth":"organization","grupo":"Finance","summary":"Record a completed payment or receipt. No money transfer occurs.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"paidAt":{"tipo":"string","desc":"Settlement date, no later than today. Default: today."},"paymentMethodId":{"tipo":"string","desc":"Optional active payment method ID."},"discountCents":{"tipo":"int","desc":"Nonnegative discount in cents."},"feeCents":{"tipo":"int","desc":"Nonnegative fees in cents. Income fees reduce receipts; expense fees increase payment."},"notes":{"tipo":"string","desc":"At most 500 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/installments/:id/pay","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/installments/:id/reopen","auth":"organization","grupo":"Finance","summary":"Undo a recorded settlement: the paid installment opens again. A refunded installment cannot: 409 installment_refunded.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/installments/:id/reopen","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"DELETE","path":"/api/finance/installments/:id","auth":"organization","grupo":"Finance","summary":"Cancel an open installment and keep its history.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"reason":{"tipo":"string","desc":"Optional cancellation reason, at most 500 characters."},"loss":{"tipo":"bool","desc":"True for a receivable that the customer did not pay: a loss, apart from a cancellation. Income only (400 invalid_loss)."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/installments/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/installments/:id/postpone","auth":"organization","grupo":"Finance","summary":"Move the due date of an open installment. originalDueDate keeps the due date before the first postponement.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"dueDate":{"tipo":"string","desc":"New due date, YYYY-MM-DD. 400 same_due_date for the current one.","obrigatorio":true},"reason":{"tipo":"string","desc":"Optional reason, at most 500 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/installments/:id/postpone","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/installments/:id/abatement","auth":"organization","grupo":"Finance","summary":"Take an amount off an open installment before payment. amountCents becomes the amount less it, and abatementCents adds it. To take off all of it, cancel the installment.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"amountCents":{"tipo":"int","desc":"Positive BRL cents, less than the amount (400 invalid_abatement).","obrigatorio":true},"reason":{"tipo":"string","desc":"Reason, at most 500 characters.","obrigatorio":true}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/installments/:id/abatement","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/installments/:id/abatement/cancel","auth":"organization","grupo":"Finance","summary":"Give back every abatement of an open installment: the amount is the one before them. 409 no_abatement.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"reason":{"tipo":"string","desc":"Optional reason, at most 500 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/installments/:id/abatement/cancel","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/installments/:id/refund","auth":"organization","grupo":"Finance","summary":"Record money given back after settlement. The installment stays paid; refundedCents adds the amount and refundedAt keeps the date of the last refund. The cash of /overview counts the refund on that date. No money transfer occurs.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"amountCents":{"tipo":"int","desc":"Positive BRL cents, at most the settled amount not yet refunded (400 refund_too_large).","obrigatorio":true},"refundedAt":{"tipo":"string","desc":"Refund date, from the settlement date to today. Default: today."},"reason":{"tipo":"string","desc":"Reason, at most 500 characters.","obrigatorio":true}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/installments/:id/refund","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/references/:kind","auth":"organization","grupo":"Finance","summary":"List supplier, customer, company, category or payment-method references.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"query":{"q":{"tipo":"string","desc":"Name prefix."},"active":{"tipo":"string","desc":"1 for active records only."},"archived":{"tipo":"string","desc":"0 excludes archived records; 1 lists only archived records. Omit for all records."},"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/references/:kind","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/references/:kind/:id","auth":"organization","grupo":"Finance","summary":"Read a reference in this organization.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/references/:kind/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/references/:kind","auth":"organization","grupo":"Finance","summary":"Create or update a reference. Use archived status for logical removal. A record does not repeat in its kind: 409 name_in_use for the same name with no difference of case or accents; 409 document_in_use for the same tax ID digits in another record in use, or in any record of the kind when you create one.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"name":{"tipo":"string","desc":"Record name.","obrigatorio":true},"status":{"tipo":"string","desc":"active, inactive or archived."},"document":{"tipo":"string","desc":"Tax ID."},"email":{"tipo":"string","desc":"Email."},"phone":{"tipo":"string","desc":"Phone."},"address":{"tipo":"string","desc":"Address."},"code":{"tipo":"string","desc":"Catalog code."},"tag":{"tipo":"string","desc":"Tag."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/references/:kind","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"PATCH","path":"/api/finance/references/:kind/:id","auth":"organization","grupo":"Finance","summary":"Create or update a reference. Use archived status for logical removal. A record does not repeat in its kind: 409 name_in_use for the same name with no difference of case or accents; 409 document_in_use for the same tax ID digits in another record in use, or in any record of the kind when you create one.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"name":{"tipo":"string","desc":"Record name.","obrigatorio":true},"status":{"tipo":"string","desc":"active, inactive or archived."},"document":{"tipo":"string","desc":"Tax ID."},"email":{"tipo":"string","desc":"Email."},"phone":{"tipo":"string","desc":"Phone."},"address":{"tipo":"string","desc":"Address."},"code":{"tipo":"string","desc":"Catalog code."},"tag":{"tipo":"string","desc":"Tag."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/references/:kind/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/report","auth":"organization","grupo":"Finance","summary":"Read totals and up to 200 groups, one per record of the catalog: {id,name,count,amountCents}. The name comes from the record by id. truncated signals more groups. group=month gives one group per month (YYYY-MM) of the payment date when paid, of the due date otherwise, newest first. Without from and to, all=1 gives every month.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"query":{"from":{"tipo":"string","desc":"First date, YYYY-MM-DD. Default: first day of this month."},"to":{"tipo":"string","desc":"Last date, inclusive. Maximum period: 366 days."},"company":{"tipo":"string","desc":"Company reference ID within this organization."},"kind":{"tipo":"string","desc":"expense or income. Default: expense."},"status":{"tipo":"string","desc":"open, paid, deleted or any (open and paid). Paid entries use settlement dates. any with all=1 requires nf."},"party":{"tipo":"string","desc":"Supplier or customer reference ID."},"category":{"tipo":"string","desc":"Category reference ID."},"nf":{"tipo":"string","desc":"Invoice substring."},"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."},"group":{"tipo":"string","desc":"category, company, party, month, or none for the total only (list the rows with /installments)."},"months":{"tipo":"string","desc":"1 with category, company or party: each group also brings months:[{month,count,amountCents}]. It needs from and to."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/report","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/export","auth":"organization","grupo":"Finance","summary":"Export up to 500 entries per page. JSON contains csv and next_cursor. Continue until next_cursor is null.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"query":{"from":{"tipo":"string","desc":"First date, YYYY-MM-DD. Default: first day of this month."},"to":{"tipo":"string","desc":"Last date, inclusive. Maximum period: 366 days."},"company":{"tipo":"string","desc":"Company reference ID within this organization."},"kind":{"tipo":"string","desc":"expense or income. Default: expense."},"status":{"tipo":"string","desc":"open, paid, deleted or any (open and paid). Paid entries use settlement dates. any with all=1 requires nf."},"party":{"tipo":"string","desc":"Supplier or customer reference ID."},"category":{"tipo":"string","desc":"Category reference ID."},"nf":{"tipo":"string","desc":"Invoice substring."},"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/export","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/audit","auth":"organization","grupo":"Finance","summary":"Read up to 50 audit records. Administrator only.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"query":{"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."},"from":{"tipo":"date","desc":"First business day, inclusive (Brasília)."},"to":{"tipo":"date","desc":"Last business day, inclusive (Brasília). Maximum range: 366 days."},"actorId":{"tipo":"string","desc":"Filter actions performed by this member. Defaults to the current month when dates are omitted."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/audit","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/recurring","auth":"organization","grupo":"Finance","summary":"Read the fixed expenses or the contracts (fixed income), up to 200: active first by next due date. Each active rule makes one account for each due date, payable for a supplier and an open receivable, to be confirmed, for a customer, leadDays business days before it or on day 1 of its month, whichever comes first. The due dates from pauseFrom to pauseUntil make no account; effectiveDue is the next one that makes an account. A contract made from a won prospect has prospectId and prospectTitle. summary: monthlyCents (the monthly rules plus the weekly ones 52 times a year, per month) and yearlyCents, the yearly rules; annualCents, the cost or income of a year (monthly 12 times, weekly 52 times, yearly once; a one-time rule counts only in the projection); yearEndCents and next12Cents, the due dates from today to yearEnd and to horizon (12 months), the accounts already made and the ones still to come. truncated signals more rules.","retorno":{"_texto":"{items,truncated,summary:{monthlyCents,yearlyCents,annualCents,yearEnd,horizon,yearEndCents,next12Cents}}"},"query":{"kind":{"tipo":"string","desc":"expense or income. Default: expense."}},"returns":"{items,truncated,summary:{monthlyCents,yearlyCents,annualCents,yearEnd,horizon,yearEndCents,next12Cents}}","url":"https://saldobem.com/api/finance/recurring","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/recurring","auth":"organization","grupo":"Finance","summary":"Create or edit a fixed expense or a contract (fixed income). A due date whose day came enters the payables or the receivables in the same call; issued lists the new account IDs. An edit names the version. A resumed rule continues from today. The contract of a won prospect comes from POST /prospects/:id/contract.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"kind":{"tipo":"string","desc":"expense (a supplier's bill) or income (a customer's fee). Default: expense. It never changes."},"title":{"tipo":"string","desc":"Description, at most 180 characters.","obrigatorio":true},"partyId":{"tipo":"string","desc":"Active supplier ID, or customer ID for income.","obrigatorio":true},"companyId":{"tipo":"string","desc":"Active company ID. Default: default."},"categoryId":{"tipo":"string","desc":"Active category ID.","obrigatorio":true},"amountCents":{"tipo":"int","desc":"Positive integer BRL cents of each bill."},"frequency":{"tipo":"string","desc":"monthly, yearly, weekly (every 7 days) or once (one account on nextDue, then the rule ends). Default: monthly."},"nextDue":{"tipo":"string","desc":"Next due date, YYYY-MM-DD. Its day, and its month in a yearly rule, repeat.","obrigatorio":true},"leadDays":{"tipo":"int","desc":"Business days in advance, 0 to 20. Default: 5."},"endDate":{"tipo":"string","desc":"Last due date, YYYY-MM-DD, or null for no end."},"pauseFrom":{"tipo":"string","desc":"First day of a suspension, YYYY-MM-DD, or null. Needs pauseUntil (400 invalid_pause)."},"pauseUntil":{"tipo":"string","desc":"Last day of the suspension, on or after pauseFrom, or null."},"notes":{"tipo":"string","desc":"Notes copied to each bill, at most 1200 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/recurring","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"PATCH","path":"/api/finance/recurring/:id","auth":"organization","grupo":"Finance","summary":"Create or edit a fixed expense or a contract (fixed income). A due date whose day came enters the payables or the receivables in the same call; issued lists the new account IDs. An edit names the version. A resumed rule continues from today. The contract of a won prospect comes from POST /prospects/:id/contract.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"version":{"tipo":"int","desc":"Current version of the rule.","obrigatorio":true},"status":{"tipo":"string","desc":"active or paused."},"title":{"tipo":"string","desc":"Description, at most 180 characters."},"partyId":{"tipo":"string","desc":"Active supplier ID, or customer ID for income."},"companyId":{"tipo":"string","desc":"Active company ID. Default: default."},"categoryId":{"tipo":"string","desc":"Active category ID."},"amountCents":{"tipo":"int","desc":"Positive integer BRL cents of each bill."},"frequency":{"tipo":"string","desc":"monthly, yearly, weekly (every 7 days) or once (one account on nextDue, then the rule ends). Default: monthly."},"nextDue":{"tipo":"string","desc":"Next due date, YYYY-MM-DD. Its day, and its month in a yearly rule, repeat."},"leadDays":{"tipo":"int","desc":"Business days in advance, 0 to 20. Default: 5."},"endDate":{"tipo":"string","desc":"Last due date, YYYY-MM-DD, or null for no end."},"pauseFrom":{"tipo":"string","desc":"First day of a suspension, YYYY-MM-DD, or null. Needs pauseUntil (400 invalid_pause)."},"pauseUntil":{"tipo":"string","desc":"Last day of the suspension, on or after pauseFrom, or null."},"notes":{"tipo":"string","desc":"Notes copied to each bill, at most 1200 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/recurring/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"DELETE","path":"/api/finance/recurring/:id","auth":"organization","grupo":"Finance","summary":"Delete a fixed expense or a contract. The accounts it made stay, and the audit keeps the rule.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/recurring/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/prospects","auth":"organization","grupo":"Finance","summary":"Read up to 100 prospects of one status, the most advanced stage first, with the stages and the summary: count, amountCents, weightedCents (each value times the chance of its stage), annualCents and weightedAnnualCents (a monthly value 12 times, a one-time value once) by status. Each item has billing and the same per-year values; a won one has contract, {id,status,nextDue} of its contract, or null.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"query":{"status":{"tipo":"string","desc":"open, won or lost. Default: open."},"cursor":{"tipo":"string","desc":"Opaque next_cursor from the previous response."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/prospects","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/prospects/:id","auth":"organization","grupo":"Finance","summary":"Read a prospect and its notes, newest first.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/prospects/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/prospects","auth":"organization","grupo":"Finance","summary":"Create a prospect, or change the fields that the body names. Stages: appointment 20%, qualified 40%, presentation 60%, decision 80%, contract 90%. A note joins the prospect history.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"title":{"tipo":"string","desc":"Opportunity, at most 160 characters.","obrigatorio":true},"customer":{"tipo":"string","desc":"Customer name. The same name reuses the customer."},"amountCents":{"tipo":"int","desc":"Expected BRL cents. 0 or empty: value still unknown."},"billing":{"tipo":"string","desc":"once (default) or monthly: the value is paid one time or every month (400 invalid_billing)."},"stage":{"tipo":"string","desc":"appointment, qualified, presentation, decision or contract."},"expectedClose":{"tipo":"string","desc":"Expected close date, YYYY-MM-DD, or null."},"note":{"tipo":"string","desc":"Note, at most 2000 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/prospects","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"PATCH","path":"/api/finance/prospects/:id","auth":"organization","grupo":"Finance","summary":"Create a prospect, or change the fields that the body names. Stages: appointment 20%, qualified 40%, presentation 60%, decision 80%, contract 90%. A note joins the prospect history.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"title":{"tipo":"string","desc":"Opportunity, at most 160 characters."},"customer":{"tipo":"string","desc":"Customer name. The same name reuses the customer."},"amountCents":{"tipo":"int","desc":"Expected BRL cents. 0 or empty: value still unknown."},"billing":{"tipo":"string","desc":"once (default) or monthly: the value is paid one time or every month (400 invalid_billing)."},"stage":{"tipo":"string","desc":"appointment, qualified, presentation, decision or contract."},"status":{"tipo":"string","desc":"open, won or lost."},"expectedClose":{"tipo":"string","desc":"Expected close date, YYYY-MM-DD, or null."},"note":{"tipo":"string","desc":"Note, at most 2000 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/prospects/:id","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/prospects/:id/notes","auth":"organization","grupo":"Finance","summary":"Add a note to a prospect.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"note":{"tipo":"string","desc":"Note, at most 2000 characters.","obrigatorio":true}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/prospects/:id/notes","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"POST","path":"/api/finance/prospects/:id/contract","auth":"organization","grupo":"Finance","summary":"Register the contract of a won prospect: a fixed income rule with the prospect's title, customer and value, monthly for a monthly prospect and once for a one-time one, unless the body says otherwise. One contract per prospect (409 prospect_has_contract); the prospect must be won (409 prospect_not_won). The customer is the registered customer with that name, or a new one. A due date whose day came enters the receivables in the same call; issued lists the new account IDs.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"customer":{"tipo":"string","desc":"Customer name. Default: the prospect's customer; none gives 400 customer_required."},"title":{"tipo":"string","desc":"Description. Default: the prospect's title."},"companyId":{"tipo":"string","desc":"Active company ID. Default: default."},"categoryId":{"tipo":"string","desc":"Active category ID.","obrigatorio":true},"amountCents":{"tipo":"int","desc":"Positive integer BRL cents. Default: the prospect's value."},"frequency":{"tipo":"string","desc":"monthly, yearly, weekly or once. Default: from the prospect's billing."},"nextDue":{"tipo":"string","desc":"First due date, YYYY-MM-DD.","obrigatorio":true},"leadDays":{"tipo":"int","desc":"Business days in advance, 0 to 20. Default: 5."},"endDate":{"tipo":"string","desc":"Last due date, YYYY-MM-DD, or null for no end."},"pauseFrom":{"tipo":"string","desc":"First day of a suspension, YYYY-MM-DD, or null."},"pauseUntil":{"tipo":"string","desc":"Last day of the suspension, or null."},"notes":{"tipo":"string","desc":"Notes copied to each receivable, at most 1200 characters."}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/prospects/:id/contract","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"GET","path":"/api/finance/access","auth":"organization","grupo":"Finance","summary":"Read financial profile overrides. Administrator only.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/access","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."},{"method":"PUT","path":"/api/finance/access","auth":"organization","grupo":"Finance","summary":"Set a member's financial profile. Membership is always checked separately.","retorno":{"_texto":"JSON, private and uncached. Monetary amounts use integer BRL cents."},"corpo":{"requestId":{"tipo":"string","desc":"Unique request ID. Repeat the same ID and exact body after an uncertain response.","obrigatorio":true},"identityId":{"tipo":"string","desc":"Existing organization member ID.","obrigatorio":true},"profile":{"tipo":"string","desc":"read, operation, admin or none.","obrigatorio":true}},"returns":"JSON, private and uncached. Monetary amounts use integer BRL cents.","url":"https://saldobem.com/api/finance/access","auth_detail":"An organization API key (Authorization: Bearer mmk_…), or the shared account session with X-Organization-Id. A configured domain selects and restricts the organization. Cookie writes also require the exact Origin and X-CSRF-Token. The current financial profile controls every action."}],"mcp_tools":["finance_central","finance_overview","finance_installments","finance_installment_totals","finance_alerts","finance_report","finance_recurring","finance_prospects"]}