Factuarea APIDevelopers
Contract

One breaking window: axis and payload

Company and account resources move into the URL, amounts travel as decimal strings, the collection date is renamed, X-Active-Profile is rejected and the account becomes the customer. Every operation the window touches — 519 of them — listed resource by resource.

30 September 2026 — the v1 contract breaks in five places at once, and this entry announces all five together because they are one migration: the code you touch for any of them is the code you touch for the other four. No second window follows.

  • The axis travels in the URL. A company resource now lives under /v1/companies/{company}/… and an account resource under /v1/accounts/{account}/…. The effective company stops being deduced from the credential and rides in the path, where it is visible, logged and auditable.
  • Amounts travel as decimal strings. Every monetary field of a published payload is a string, no longer a JSON number.
  • The collection date changed name. paid_at and paid_on are gone from the published payload. An invoice and a purchase invoice publish paid_recorded_at and paid_date.
  • X-Active-Profile is retired. A request that still carries the header is rejected with 400 parameter_unknown, subcode retired_active_profile_header, before it reaches the controller.
  • The account becomes the customer. A tax ID changes hands with a transfer (nif-transfers), the people of an account are members with grants per tax ID, an extra tax ID is an additional tax ID (paid_until replaces seat_paid_until, and three error codes change name), and the API keys issued per company and the writes of the tax catalog are retired.

Adapt once. A client that writes the axis segment in the URL, parses amounts as strings, reads the renamed dates, stops sending the header and handles the operations and codes listed below is finished with this window. There is no compatibility mode, no parallel field and no second break.

This page lists every operation the window touches, resource by resource: 519 rows in all — 49 new, 294 moved to the axis with only their route changed, 161 moved with additional changes, 11 retired and 4 untouched. A route is its verb and its path, so the thirty-three operations of the verb table count as moved even when nothing else about them changed. The contract that comes out of it, together with the operations that joined the axis later, publishes 664 live operations across 51 resources, and every count on this page is derived from that contract, not from a summary of it.

Where the company id comes from

The company segment takes the opaque id of the company, never its tax id. GET /v1/me publishes one entry per tax ID your credential reaches, and its id is exactly what goes in the path:

{
  "data": {
    "object": "me",
    "account": {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a00",
      "name": "Asesoría Martínez",
      "environment": "live",
      "is_provider": true,
      "privileged_scopes": [
        "accounts:read",
        "accounts:write"
      ]
    },
    "api_key": {
      "id": "019e81ef-e1d4-7208-a51d-94c2c2a54a84",
      "name": "Producción",
      "prefix": "fact_live_1OSf9KdP",
      "scopes": [
        "account:read",
        "series:read",
        "series:write"
      ],
      "tier": "scale",
      "environment": "live",
      "created_at": "2026-01-15T09:30:00Z",
      "last_used_at": "2026-05-25T18:00:00Z",
      "expires_at": null
    },
    "scope": [
      {
        "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
        "tax_id": "B12345674",
        "name": "Acme Corporation"
      },
      {
        "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a02",
        "tax_id": "B87654323",
        "name": "Acme Logística S.L."
      }
    ],
    "client_accounts": [
      {
        "id": "0199a1f0-1c22-7a10-b111-5a5b5c5d5e5f",
        "name": "Construcciones Ruiz",
        "origin": "granted",
        "access_level": "view",
        "status": "active",
        "paid_by_provider": false,
        "environment": "live"
      },
      {
        "id": "0199a1f0-1c22-7a10-b111-6a6b6c6d6e6f",
        "name": "Talleres García",
        "origin": "provisioned",
        "access_level": "operate",
        "status": "provisioned",
        "paid_by_provider": true,
        "environment": "live"
      }
    ],
    "client_accounts_visible": true,
    "client_accounts_has_more": false
  }
}

GET /v1/me is itself the replacement of GET /v1/account, which no longer exists, and it needs no scope: any valid credential can introspect itself. data.account.id is what goes in the account segment; each data.scope[].id is what goes in the company segment. When your account provisions managed accounts, or other accounts granted it access, data.client_accounts[] lists the client accounts it reaches, with their origin, access_level and status and whether your account pays them. It is filled only when the key carries the privileged accounts:read scope: without it the list is empty and client_accounts_visible is false. Call it once at startup and cache the mapping — it is stable.

Company axis — /v1/companies/{company}/<resource>

44 resource families, 359 routes and 432 of the window's operations hang from the company segment:

ResourceRoutesOperations
absence-balances22
absence-calendar11
absence-policies810
absence-requests56
absence-types46
automations1518
billing11
census-verification11
connected-accounts24
contacts2327
delivery-notes1822
emails33
employee-invitations34
employees68
events22
face-submissions22
holidays33
integrations33
invoices4552
monthly-time-record-closes79
payouts22
personalization22
presence33
price-lists913
products3141
proformas1620
purchase-invoices1318
quotes1620
recurring-invoices1518
request-logs22
series1112
shopify11
stores25
stripe-autoinvoicing34
tax-reports99
taxes1111
time-balances33
time-corrections45
time-entries99
time-tracking-settings12
verifactu2425
webhook-endpoints811
woocommerce11
work-schedules911
Total359432

Account axis — /v1/accounts/{account}/<resource>

The account segment takes the id of your own account, data.account.id of GET /v1/me; on a closed list of routes it also takes the id of a managed account of yours. 16 resource families, 49 routes and 65 of the window's operations hang from it:

ResourceRoutesOperations
access-level11
api-keys56
claim-tokens11
companies1013
employee-seats55
gestoria11
invitations35
management11
members511
nif-transfers34
owner11
plan22
provisioning-usage11
request-logs22
usage11
webhooks710
Total4965

claim-tokens keeps its place in the table, but it is no longer the tax ID transfer: POST /v1/accounts/{account}/claim-tokens reissues the claim voucher of a managed account. The transfer is nif-transfers, and its scopes and codes are renamed the same way: nif_transfers:read, nif_transfers:write, nif_transfer_expired and nif_transfer_invalid. The claim-tokens transfer routes, the claim_tokens:* scopes and the claim_token_* codes of pre-release builds of this contract do not exist in the final one.

Root — no axis at all

Ten routes belong neither to a company nor to the axis of your own account, and together they carry eleven operations. Five of them are introspection and catalogs, and only one moved: GET /v1/me replaces GET /v1/account. The other five are the provisioning root, new in this window: there the resource is a managed account or a bulk import, so it hangs from no axis.

RouteWhat it is
GET /v1/meIntrospection of the authenticated credential: its account, its API key, its effective scopes and every tax ID it reaches, each with its opaque id, plus the client accounts it reaches through a relation. It needs no scope. It replaces GET /v1/account, and the per-company settings that one returned (company, plan, addon and personalization) are not part of it: they live on the company axis.
GET /v1/event-catalogCatalog of event types you can subscribe to from a company webhook endpoint.
GET /v1/payment-methodsCatalog of payment methods accepted on a document.
GET /v1/payroll-export-formatsCatalog of payroll export formats for the monthly close.
GET /v1/tax-catalogCatalog of Spanish tax rates, with no company of its own.
GET /v1/accountsLists the managed accounts your account provisioned, in the environment of the key.
POST /v1/accountsProvisions a separate account for one of your clients, with its tax ID, its plan and the access level your account keeps on it. Each account carries your external_ref; the operation is irreversible and requires an Idempotency-Key.
GET /v1/accounts/{account}Detail of one managed account: its status, environment, plan, your access level on it, its tax IDs and the status of the management.
GET /v1/accounts/imports/templateCSV template of the bulk import of managed accounts.
POST /v1/accounts/imports/previewPreviews a bulk import with no effect: every row comes back with its status and its column errors.
POST /v1/accounts/importsApplies a bulk import of managed accounts and own tax IDs. It is irreversible and requires an Idempotency-Key.

The contract itself, /v1/openapi.json, also stays where it is.

Five traps worth reading before you rewrite a URL

  1. Underscore becomes hyphen. Five resources change their separator as they move: tax_reports, purchase_invoices, recurring_invoices, delivery_notes and webhook_endpoints are now tax-reports, purchase-invoices, recurring-invoices, delivery-notes and webhook-endpoints. Four action segments follow them: dry_run, mark_paid, rotate_secret and test_event are now dry-run, mark-paid, rotate-secret and test-event. No path segment of the contract keeps an underscore.
  2. Families you would expect at the root are on the company axis. Holidays, the automations catalog and its per-trigger fields, billing, census verification, personalization, email deliveries, events, request logs and the four document status listings (invoices, quotes, proformas and delivery-notes each publish their own statuses) read like global catalogs and are not: what they answer depends on the company.
  3. {company} is not always the axis, and {account} is not always the account. In /v1/accounts/{account}/companies/{company}/… —the tax IDs of a portfolio— and in /v1/accounts/{account}/members/{member}/grants/{company} —the grant of a member on one tax ID—, {company} is the resource being addressed, so you write it even when your credential reaches a single company. And in /v1/companies/{company}/connected-accounts/{account}, {account} is a Stripe connected account. Fourteen operations carry both parameters; tell them apart by the path, never by the name of the parameter.
  4. Company webhooks, events, emails, request logs and billing are company resources, not account ones. On the account axis sit API keys, members (with their grants and module access), invitations, tax ID transfers, employee seats, the portfolio of tax IDs, its usage, its owner, the provisioning routes of a managed account and, new in this window, the webhooks and request logs of the account itself: /v1/accounts/{account}/webhooks is not /v1/companies/{company}/webhook-endpoints, and their operations differ. See the account webhooks guide.
  5. Under /v1/accounts/{account}/…, {account} is your own account. Only a closed list of routes also accepts the id of a managed account of yours —the provisioning routes and the data of its tax IDs—; any other account id, real or not, answers the same 404 account_not_found. The provisioning root is different: in /v1/accounts and GET /v1/accounts/{account} the account is the resource itself. See the managed accounts guide.

Sixteen operations the window adds

They open the account axis, which had no public surface of its own beyond API keys: the tax ID transfer, the team with its invitations, the ownership, the usage and, under the portfolio, the issuing readiness of a tax ID. They are new routes, so nothing that exists today breaks because of them.

They are not the only new operations. The window publishes 49 in all, and the other thirty-three belong to the account model — provisioning and managed accounts, bulk import, account webhooks and request logs, the grants of a member on each tax ID and the revocation of a transfer, among others. The account model release note describes them, and their rows are in the inventory at the end of this page.

OperationScopeWhat it does
GET /v1/accounts/{account}/nif-transfersnif_transfers:readLists the tax ID transfers your account has issued, with their status (active, expired, revoked or consumed). Transfers received from other accounts are never listed.
POST /v1/accounts/{account}/nif-transfersnif_transfers:writeIssues a transfer over one tax ID of the account and returns its secret exactly once. It expires after 24 hours unless you pass an expires_at (up to 7 days), and recipient_account_id closes it to a single account. Irreversible, and it requires an Idempotency-Key.
POST /v1/accounts/{account}/nif-transfers/acceptnif_transfers:writeRedeems a transfer by its secret and moves the tax ID into the account that presents it, where it counts as an additional tax ID unless the account was registered without one. Irreversible. An expired transfer answers 422 nif_transfer_expired; any other unusable secret answers 422 nif_transfer_invalid.
GET /v1/accounts/{account}/invitationsinvitations:readLists the invitations of the account, which you can filter by status (pending, accepted, revoked or expired).
POST /v1/accounts/{account}/invitationsinvitations:writeInvites a person by email with an account role (admin or member) and the list of grants a member holds on the tax IDs of the account. It requires an Idempotency-Key.
POST /v1/accounts/{account}/invitations/{invitation}/resendinvitations:writeIssues a new acceptance secret for a pending invitation and renews its expiry; the previous secret stops working. An invitation past its window answers 422 invitation_expired. It requires an Idempotency-Key.
DELETE /v1/accounts/{account}/invitations/{invitation}invitations:writeRevokes a pending invitation; it never removes an existing member. One that does not exist or belongs to another account answers 404 invitation_not_found.
GET /v1/accounts/{account}/membersmembers:readLists the people on the account team, with their account role (owner, admin or member), their external_advisor mark and the grants of each member.
POST /v1/accounts/{account}/membersmembers:writeAdds a person to the account team with an account role (admin or member) and the required grants list, without going through an invitation. Ownership is transferred, never assigned.
PATCH /v1/accounts/{account}/members/{member}members:writeChanges the account role of a member, its external_advisor mark, or both. The owner cannot change role: ownership is transferred.
DELETE /v1/accounts/{account}/members/{member}members:writeRemoves a person from the whole account team: they stop reaching every tax ID of the account and lose their grants. Irreversible. The account owner answers 422 member_is_last_owner: transfer ownership first.
GET /v1/accounts/{account}/members/{member}/module-accessmembers:readReads the module restrictions of one member on one tax ID, which you pass in the required company_id query parameter.
PATCH /v1/accounts/{account}/members/{member}/module-accessmembers:writeReplaces the full set of module restrictions of a member on one tax ID (company_id); an empty restrictions object lifts them all.
PATCH /v1/accounts/{account}/owneraccount:ownerHands ownership of the account to another member, who is named in owner_user_id; the outgoing owner becomes an admin. Irreversible, and it requires an Idempotency-Key. A caller who is not the current owner answers 403 owner_transfer_forbidden.
GET /v1/accounts/{account}/usageaccount:readConsumption of the account in the current period: total requests, total documents and the breakdown per tax ID your credential reaches.
GET /v1/accounts/{account}/companies/{company}/issuing-readinesscompanies:readSays whether a tax ID of the portfolio is ready to issue: a can_issue verdict and a closed list of blockers (census, default series, fiscal profile, VeriFactu certificate and others), resolved in one call. It never reports billing.

The codes invitation_expired, invitation_not_found, member_is_last_owner, nif_transfer_expired and nif_transfer_invalid are part of the thirty-seven new error codes listed further down.

Eleven operations the window retires

Five of them are the API keys issued per company, which disappear. A key is a credential of the account, not of one of its companies, and the surviving operations say so in the path and in the scope: api_keys:read / api_keys:write give way to account:read / account:write, which is what the account axis already used.

BeforeNow
GET /v1/companies/{company}/api-keys · api_keys:readGET /v1/accounts/{account}/api-keys · account:read
POST /v1/companies/{company}/api-keys · api_keys:writePOST /v1/accounts/{account}/api-keys · account:write
GET /v1/companies/{company}/api-keys/{api_key} · api_keys:readGET /v1/accounts/{account}/api-keys/{api_key} · account:read
POST /v1/companies/{company}/api-keys/{api_key}/rotate-secret · api_keys:writePOST /v1/accounts/{account}/api-keys/{api_key}/rotate-secret · account:write
DELETE /v1/companies/{company}/api-keys/{api_key} · api_keys:writePOST /v1/accounts/{account}/api-keys/{api_key}/revoke · account:write

scoped_company_ids is a new body field of POST /v1/accounts/{account}/api-keys: it is where a key is restricted to a subset of the portfolio, which is the job the per-company route used to do.

The tax catalog becomes read-only

The other six retired operations are the writes of the tax catalog. The catalog is shared by the whole platform, so a company credential that edited it edited it for every company; only platform administration writes it now.

OperationBeforeScope
public-api.v1.taxes.createPOST /v1/taxestaxes:write
public-api.v1.taxes.deleteDELETE /v1/taxes/{tax}taxes:delete
public-api.v1.taxes.updatePUT /v1/taxes/{tax}taxes:write
public-api.v1.taxes.set_defaultPOST /v1/taxes/{tax}/set-defaulttaxes:write
public-api.v1.taxes.set_default_for_documentPUT /v1/taxes/{tax}/set-default/{docType}taxes:write
public-api.v1.taxes.togglePOST /v1/taxes/{tax}/toggletaxes:write

They have no replacement. The reads stay: GET /v1/companies/{company}/taxes and its siblings on the company axis, and GET /v1/tax-catalog at the root. A call to a retired write answers 405 method_not_allowed where its path still serves a read, and 404 route_not_found where it does not. The scopes taxes:write and taxes:delete stay in the scope catalog, but no operation requires them any more: granting them gives access to nothing.

Clients and suppliers stay retired

/v1/clients and /v1/suppliers were removed before this window, when canonical contacts landed, and they do not come back on the axis. One tax id is one contact, and the customer and supplier roles accumulate on it:

  • Customers: GET /v1/companies/{company}/contacts?roles[]=customer
  • Suppliers: GET /v1/companies/{company}/contacts?roles[]=supplier

The clients:* and suppliers:* scope families are replaced by contacts:read, contacts:write and contacts:delete.

Thirty-three operations change verb

Thirty-two of them move from PUT to PATCH: they accepted a partial body already, so the verb was lying. The body does not change; only the method does. The recurring invoice update is one of them — every field is optional and an omitted one is kept. The thirty-third, contacts.restore, becomes POST: it is an action without a body, like archive and unarchive, not a partial update. After this window the only PUT of the contract is a new operation, PUT /v1/accounts/{account}/members/{member}/grants/{company}, which creates or replaces the grant of one member on one tax ID.

OperationBeforeNow
public-api.v1.absence-policies.updatePUT /v1/absence-policies/{absence_policy}PATCH /v1/companies/{company}/absence-policies/{absence_policy}
public-api.v1.absence-types.updatePUT /v1/absence-types/{absence_type}PATCH /v1/companies/{company}/absence-types/{absence_type}
public-api.v1.automations.rules.updatePUT /v1/automations/rules/{rule}PATCH /v1/companies/{company}/automations/rules/{rule}
public-api.v1.contacts.change_contact_role_statusPUT /v1/contacts/{contact}/roles/{role}/statusPATCH /v1/companies/{company}/contacts/{contact}/roles/{role}/status
public-api.v1.contacts.restorePUT /v1/contacts/{contact}/restorePOST /v1/companies/{company}/contacts/{contact}/restore
public-api.v1.contacts.updatePUT /v1/contacts/{contact}PATCH /v1/companies/{company}/contacts/{contact}
public-api.v1.contacts.update_bank_accountsPUT /v1/contacts/{contact}/bank-accountsPATCH /v1/companies/{company}/contacts/{contact}/bank-accounts
public-api.v1.contacts.update_customer_profilePUT /v1/contacts/{contact}/customer-profilePATCH /v1/companies/{company}/contacts/{contact}/customer-profile
public-api.v1.contacts.update_supplier_profilePUT /v1/contacts/{contact}/supplier-profilePATCH /v1/companies/{company}/contacts/{contact}/supplier-profile
public-api.v1.delivery_notes.public_link.updatePUT /v1/delivery_notes/{delivery_note}/public-linkPATCH /v1/companies/{company}/delivery-notes/{delivery_note}/public-link
public-api.v1.delivery_notes.updatePUT /v1/delivery_notes/{delivery_note}PATCH /v1/companies/{company}/delivery-notes/{delivery_note}
public-api.v1.employees.updatePUT /v1/employees/{employee}PATCH /v1/companies/{company}/employees/{employee}
public-api.v1.invoices.public_link_updatePUT /v1/invoices/{invoice}/public-linkPATCH /v1/companies/{company}/invoices/{invoice}/public-link
public-api.v1.invoices.updatePUT /v1/invoices/{invoice}PATCH /v1/companies/{company}/invoices/{invoice}
public-api.v1.price-lists.updatePUT /v1/price-lists/{priceList}PATCH /v1/companies/{company}/price-lists/{priceList}
public-api.v1.products.presentations.updatePUT /v1/products/{product}/presentations/{presentation}PATCH /v1/companies/{company}/products/{product}/presentations/{presentation}
public-api.v1.products.supplier-offers.updatePUT /v1/products/{product}/supplier-offers/{offer}PATCH /v1/companies/{company}/products/{product}/supplier-offers/{offer}
public-api.v1.products.updatePUT /v1/products/{product}PATCH /v1/companies/{company}/products/{product}
public-api.v1.products.update_stockPUT /v1/products/{product}/stockPATCH /v1/companies/{company}/products/{product}/stock
public-api.v1.products.variants.updatePUT /v1/products/{product}/variants/{variant}PATCH /v1/companies/{company}/products/{product}/variants/{variant}
public-api.v1.proformas.public_link_updatePUT /v1/proformas/{proforma}/public-linkPATCH /v1/companies/{company}/proformas/{proforma}/public-link
public-api.v1.proformas.updatePUT /v1/proformas/{proforma}PATCH /v1/companies/{company}/proformas/{proforma}
public-api.v1.purchase_invoices.updatePUT /v1/purchase_invoices/{purchase_invoice}PATCH /v1/companies/{company}/purchase-invoices/{purchase_invoice}
public-api.v1.quotes.public_link_updatePUT /v1/quotes/{quote}/public-linkPATCH /v1/companies/{company}/quotes/{quote}/public-link
public-api.v1.quotes.updatePUT /v1/quotes/{quote}PATCH /v1/companies/{company}/quotes/{quote}
public-api.v1.recurring_invoices.updatePUT /v1/recurring_invoices/{recurring_invoice}PATCH /v1/companies/{company}/recurring-invoices/{recurring_invoice}
public-api.v1.stores.updatePUT /v1/stores/{store}PATCH /v1/companies/{company}/stores/{store}
public-api.v1.stripe_autoinvoicing.accounts.updatePUT /v1/connected-accounts/{account}PATCH /v1/companies/{company}/connected-accounts/{account}
public-api.v1.stripe_autoinvoicing.config.updatePUT /v1/stripe-autoinvoicing/configPATCH /v1/companies/{company}/stripe-autoinvoicing/config
public-api.v1.time_tracking_settings.updatePUT /v1/time-tracking-settingsPATCH /v1/companies/{company}/time-tracking-settings
public-api.v1.verifactu.settings.updatePUT /v1/verifactu/settingsPATCH /v1/companies/{company}/verifactu/settings
public-api.v1.webhook_endpoints.updatePUT /v1/webhook_endpoints/{webhook_endpoint}PATCH /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}
public-api.v1.work_schedules.updatePUT /v1/work-schedules/{schedule}PATCH /v1/companies/{company}/work-schedules/{schedule}

Thirty-seven new error codes

The catalog grows from 376 to 410 codes: thirty-seven arrive and three are retired (next section). Thirty of the new ones belong to the account surface, four to the additional tax ID gate, two to the access that the person who issued a key holds on a tax ID, and one to account webhooks.

CodeStatusTypeMeaning
access_level_raise_forbidden422invalid_request_errorSomeone tried to raise the access level on a managed account whose holder has already claimed it. Since the claim only the holder can raise that level; the provider can only lower it.
account_webhook_endpoint_limit_reached422invalid_request_errorThe account reached the number of account webhook endpoints its tier allows in that environment. The cap is counted per account and per environment (live or test) and includes disabled endpoints: only deleting an endpoint frees a slot.
additional_nif_charge_failed402payment_required_errorThe immediate charge for the additional tax ID was declined: the card was refused, it needs authentication, or the payment provider was unreachable. When the charge fails, the tax ID is not added or activated and no charge remains.
additional_nif_not_in_plan403authorization_errorThe account holds a live plan, but that plan does not include additional tax IDs: only Empresario and Enterprise (trials included) allow them. Nothing was charged and no change was written.
additional_nif_plan_required402payment_required_errorThe account has no live plan, so there is no subscription on which to charge the additional tax ID. Nothing was charged and no change was written.
billing_managed_by_provider403authorization_errorThis account's billing is paid by another account, so it cannot contract an additional tax ID on its own. Nothing was charged and no change was written.
company_read_only403authorization_errorThe person who issued the credential has read-only access (level view) to the effective company: their role in the account lets them see that tax ID, not write to it. The effective level is the lower of the one stored on the credential and the one the person holds today.
emitter_capability_restricted403authorization_errorThe person who issued the credential has the section or action required by the operation withdrawn in the effective company. It is the same per-module restriction the company administrator set for them in the web app, and it applies even if their access level to the tax ID is operate.
enterprise_contract_transition_required422invalid_request_errorThe managed account has an enterprise contract and, on ending the management, its payment would move to the holder before Factuarea has set the plan it continues on. A subscription is never created without a price, so nothing was changed.
external_advisor_already_assigned422invalid_request_errorThe account already has an external advisor marked: there can only be one per account.
grant_company_not_in_account422invalid_request_errorThe grant's tax ID is not a real tax ID of the account, or it is outside the credential's tax ID scope. Both cases get the same answer, without telling which.
grants_only_for_member422invalid_request_errorOnly a member with the member role can hold per tax ID permissions (grants). The owner (owner) and the administrators (admin) reach every tax ID of the account, so a grant on them would mean nothing.
import_file_invalid422invalid_request_errorOne of the import files cannot be read with the template format: it is not a readable CSV, its header does not appear within its first 20 lines, it lacks a required column or it has a broken line. param says which file fails (accounts_file or customers_file) and the message names the column or the line. Nothing was written.
import_file_too_large413invalid_request_errorOne of the import files exceeds 5 MB. The size is checked before reading any row, so nothing was processed or written. param says which file fails (accounts_file or customers_file).
import_in_progress409conflict_errorA bulk import of this provider account is already in progress. Imports of the same account are applied one at a time so that no account, charge or tax ID is created twice, so this one was not applied and nothing was written.
import_row_limit_exceeded422invalid_request_errorOne of the import files carries more rows than a single import accepts: 100 in the accounts file (accounts_file) and 1,000 in the customers file (customers_file). Rows are counted before being read, so nothing was processed or written. param says which file fails.
invitation_expired422invalid_request_errorThe invitation exists and belongs to this company, but its acceptance window already closed, so the person who received it can no longer redeem it.
invitation_not_found404not_found_errorThe identifier matches no pending invitation of the authenticated company: it may have been cancelled, already accepted, or issued by a different company.
live_credential_required403authorization_errorA test key tried to change a live account. It only happens on the operations that change the account —members, invitations, ownership, tax ID transfers, NIF portfolio, keys and seats—: a test key cannot alter real data.
managed_account_external_ref_in_other_environment409conflict_errorThe external reference is already used by a managed account of the other environment (live or test). The reference is unique across both environments, and the answer does not name that account because this environment does not list it. Nothing was written.
managed_account_not_claimable422invalid_request_errorThe managed account is a test one, and a test account is never claimed: it has no claim voucher to issue or reissue.
managed_account_plan_not_self_serve422invalid_request_errorThe enterprise plan was requested for a managed account. A managed account is created or changed on emprendedor or empresario; enterprise is only assigned by Factuarea under contract.
managed_account_provider_in_trial422invalid_request_errorThe provider account is on its trial period and requested a live managed account, which is charged. During the trial only test managed accounts can be created.
managed_accounts_limit_reached422invalid_request_errorThe provider account already has as many live managed accounts under active management as its cap allows. Test managed accounts do not count towards that cap.
member_is_last_owner422invalid_request_errorThe operation would leave the NIF with nobody able to administer it: the member being removed, or demoted to a role without administration, is the last one holding the owner or admin role in that NIF.
member_not_found404not_found_errorThe identifier matches nobody on the account team: either that person was never a member of the authenticated company, or they belong to a different one. The account surface answers both cases alike.
nif_transfer_expired422invalid_request_errorThe tax ID transfer was genuinely issued, but its validity period ran out. Unlike an unrecognised transfer, this answer only reaches whoever already held a real one, so it reveals nothing new.
nif_transfer_invalid422invalid_request_errorThe tax ID transfer presented authorizes nothing: its secret is mistyped, truncated, already consumed, or was never issued. All of those answer alike on purpose, so the operation cannot be used to probe which transfers exist.
owner_transfer_forbidden403authorization_errorThe caller is not allowed to transfer ownership of the account: either they are not the current owner, or the proposed recipient cannot hold it. This is a matter of permission, not of a malformed payload.
privileged_scope_required403authorization_errorThe operation requires the account provider privilege (accounts:read or accounts:write) and it is not met: either the key's account has not been granted it, or the person who issued the key is no longer an owner or administrator of the account. Both causes answer alike.
provisioning_account_claimed409conflict_errorThe holder has already claimed this managed account and runs it on their own: it can no longer be claimed again, have its claim voucher reissued or be provisioned again with the same external reference.
relation_already_exists422invalid_request_errorThere is already a pending or active access between these two accounts, and only one can be open for each pair of accounts.
relation_company_not_in_grantor422invalid_request_errorThe list of tax IDs of the access is not valid: either it names a tax ID that does not belong to the account granting the access, or it is empty. The error points at the company_ids field and does not tell which tax ID fails.
relation_invitation_expired422invalid_request_errorThe access invitation exists and is still pending, but its acceptance window ran out, so it can no longer be accepted.
relation_invitation_invalid422invalid_request_errorThe access invitation presented is no good: its secret does not exist, was already used, was revoked or is addressed to another account. All of those answer alike on purpose, so the operation cannot be used to probe other accounts' invitations.
relation_self_grant_not_allowed422invalid_request_errorThe account given cannot receive the access: either it is the same account granting it, or the identifier does not match a valid account. Both cases answer alike.
relation_transition_not_allowed422invalid_request_errorThe access between accounts is in a state that does not admit the requested change: for example, accepting one that is already active or resending the invitation of one that has ended.

nif_transfer_expired and nif_transfer_invalid take the place of claim_token_expired and claim_token_invalid, the codes of the claim-tokens transfer of pre-release builds, which no longer exist.

Separately, 190 of the operations that already existed now document a 404 they did not document before: an axis segment that names a company or an account your credential cannot reach answers 404, not 403, so the API never confirms that a company you cannot see exists. Every company-axis operation documents 404 profile_not_found for it; an account you cannot reach answers 404 account_not_found.

Three error codes the window retires

The additional tax ID replaces the per-company seat charge and its plan and module gates, so three codes leave the catalog. Branch on the replacement: the status and the error.type are the same in each pair.

Retired codeStatusReplaced by
gestoria_module_required403additional_nif_not_in_plan (403)
gestoria_plan_required402additional_nif_plan_required (402)
seat_charge_failed402additional_nif_charge_failed (402)

Payload: amounts, dates and coverage

Every amount is a decimal string

123 monetary properties across 40 published schemas changed from JSON number to string: totals, line subtotals, taxes, retentions, surcharges, unit prices and costs, paid and pending amounts, statistics, payout figures, charge previews and the thresholds of the simplified invoice. The string carries two decimals, a point as separator, no thousands separator and no currency symbol; the currency keeps its own currency field. The one exception is the unit_price of a document line, which keeps the four-decimal scale it is stored with ("100.0000"), so that reading a line and sending it back never changes its price; the derived amounts of the line (subtotal, taxes and total) keep two.

{
  "object": "invoice",
  "subtotal": "1000.00",
  "total_vat": "210.00",
  "total": "1210.00",
  "paid_amount": "1210.00",
  "pending_amount": "0.00",
  "currency": "EUR"
}

A JSON number carries no declared scale: 1210 comes back as 1210, 1210.0 or 1209.9999999999998 depending on who parses it. Read every money field into a fixed-decimal type — Decimal in Python, a big decimal or minor units in JavaScript — and never into a binary float. The schemas affected are BusinessContactActivity, CompanySeatChargePreview, DeliveryNote, DeliveryNoteLine, DeliveryNoteStats, EmployeeSeatBillingStatus, EmployeeSeatChargePreview, EventDataInvoicePaid, Invoice, InvoiceCorrective, InvoiceLine, InvoicePaymentDetail, InvoiceReminderPreview, InvoiceStats, ProductSalesAnalytics, ProductVariant, Proforma, ProformaLine, ProformaStats, PurchaseInvoice, PurchaseInvoiceLine, PurchaseInvoicePayment, PurchaseInvoiceStats, Quote, QuoteLine, QuoteStats, RecurringInvoice, RecurringInvoiceLine, RecurringInvoicePreviewDate, RecurringInvoiceStats, SimplifiedInvoiceEligibility, Store, StripeAutoinvoicedCorrective, StripeAutoinvoicedPayment, StripePayout, SupplierProductOffer, TaxCalculation, TaxTotals, TaxTotalsLine and VeriFactuRecord.

The collection date changed name

paid_at and paid_on are gone from the published payload. They are not emitted in parallel and they are not kept as aliases: the _at suffix marks an instant, and each canonical name now says which date it is.

You used to readYou read now
paid_at on an invoicepaid_recorded_at (date-time), the instant the collection was recorded
paid_on on an invoicepaid_date (date), the declared collection date
paid_at on a purchase invoicepaid_date (date), the declared payment date, and paid_recorded_at (date-time), the instant the payment was recorded
paid_on on a purchase invoice paymentpaid_date (date)

The request body does not change: mark-paid and the payment registration still take paid_on, a YYYY-MM-DD date, and the invoice list filters by paid_on[gte], paid_on[lte], paid_on[gt] and paid_on[lt]. You send paid_on and you read paid_date and paid_recorded_at.

The paid coverage of a tax ID changed name

The Company resource drops seat_paid_until and publishes paid_until: the date up to which the tax ID is covered as an additional tax ID of the account (ISO 8601). It is null when the tax ID was never charged or its coverage expired, and reactivating it before that date is free. The resource also gains readiness, the same verdict and blockers as issuing-readiness, and suspension_reason: payer_blocked when the account that pays for a managed account has its billing blocked, management_ended when the management ended before anyone took over the payment, and null otherwise.

Creation responses declare Location

Forty-one operations answer 201 Created with a Location header: the canonical URL, relative to the server, of the resource the request created, with the axis segment in it — for an invoice, /v1/companies/{company}/invoices/{invoice} with both ids filled in. The header is not new on the wire: twenty-two of those operations already sent it without declaring it, and the contract now says so. Four of the forty-one are new operations. Follow Location instead of rebuilding the URL from the response.

The header that no longer exists

X-Active-Profile is rejected on presence, never on its value: a well-formed id, an id of a company you cannot reach, a malformed value and an empty string all get the same error.

FieldValue
Status400
error.codeparameter_unknown
error.typeinvalid_request_error
error.paramX-Active-Profile
error.subcoderetired_active_profile_header

Ignoring the header would have been the dangerous "compatible" option: the call would succeed and issue the document under the tax id of the credential holder instead of the one you meant, with no signal at all.

# Before
curl https://api.factuarea.com/v1/invoices \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  -H "X-Active-Profile: $COMPANY_ID"

# Now
curl https://api.factuarea.com/v1/companies/$COMPANY_ID/invoices \
  -H "Authorization: Bearer $FACTUAREA_API_KEY"

Every public identifier is a UUID v7

Every id the API returns, and every identifier in a path, is a UUID v7: time-ordered, so sorting by id follows creation order. There is a single format, whatever the resource.

  • New records always get a UUID v7, including invoices issued automatically from Stripe payments.
  • Identifiers you create yourself — the id of a new configuration, option group or option value in products.create and products.update — must be a UUID v7. Any other version is rejected with 422; an existing item keeps its identifier.
  • A few older records — some documents, product configurations and VeriFactu certificates created before UUID v7 was the rule — receive a new UUID v7 in this window. The old id no longer answers in the API, so read those records again from their list endpoints if you stored their ids. Public document links you already sent keep working and open the document under its new identifier.

Idempotency after the move

Replay is unchanged in mechanics and grows with the surface. All 287 writes publish Idempotent-Replayed and replay a repeated key, and 130 of them declare Idempotency-Key as required — thirteen more than before the window, because the account axis and the provisioning surface add irreversible writes (issuing, accepting and revoking a tax ID transfer, removing a member, transferring ownership, creating a managed account, ending its management, changing its plan, reissuing its voucher, applying an import, rotating the secret of an account webhook and deleting one) and a few more that are not irreversible but deserve the same guard (sending and resending an invitation, retrying an account webhook delivery and testing an endpoint). 69 of them are flagged irreversible, nine more than before.

CodeStatusMeaning
idempotency_key_reused422The key was already used with a different payload. A key identifies one specific operation, so reusing it for another would make replay meaningless.
idempotency_key_required422The operation delivers an effect that cannot be taken back and the header was missing. Rejected before any business logic runs.
idempotency_key_in_use409Another request with the same key is still in flight and its result is not known yet.
idempotency_key_invalid400The key is not 1 to 255 printable ASCII characters.

idempotency_key_reused is the one that moved: before this window it answered 409, and it answers 422 now. The fingerprint a key is bound to includes the path, so the same key sent to /v1/invoices and to /v1/companies/{company}/invoices is not a replay. While you migrate, mint a fresh key per call rather than reusing the ones your queue already holds. Read the idempotency guide.

CLI, PHP SDK and Node SDK

All three are generated from this contract and are regenerated against it: the CLI resource paths, the PHP SDK operation methods and the Node SDK operation methods all take the axis segment as their first argument, amounts come back as strings, and the retired header has no option left in any of them. Their release notes point at this page instead of describing a break of their own.

Migration checklist

  1. Call GET /v1/me and keep data.account.id and every data.scope[].id. If you work for client accounts, read data.client_accounts[] too: it lists the accounts that granted your account access and the managed accounts you provisioned, with the level you hold on each.
  2. Rewrite your base paths: company resources under /v1/companies/{company}/…, account resources under /v1/accounts/{account}/…, the provisioning root and the five catalog and introspection routes at the root. Watch the five underscore-to-hyphen renames and the four action segments that lose their underscore.
  3. Swap PUT for PATCH on the thirty-two operations of the verb table, and call contacts.restore with POST.
  4. Remove X-Active-Profile from your client. If you used it to act on several companies, the company segment now does it per request, without a header.
  5. Parse every money field as a string into a fixed-decimal type, with the four-decimal unit_price of a line; read paid_recorded_at and paid_date where you read paid_at and paid_on, and keep sending paid_on; read paid_until where you read seat_paid_until.
  6. Move any call to the API keys of one company to /v1/accounts/{account}/api-keys, restrict the key with scoped_company_ids, and swap api_keys:* for account:read / account:write on your keys.
  7. Change claim-tokens for nif-transfers if you integrated the tax ID transfer against a pre-release build: scopes nif_transfers:read and nif_transfers:write, codes nif_transfer_expired and nif_transfer_invalid.
  8. Treat the codes of the additional tax ID gate: additional_nif_charge_failed where you handled seat_charge_failed, additional_nif_plan_required where you handled gestoria_plan_required, additional_nif_not_in_plan where you handled gestoria_module_required, and billing_managed_by_provider for an account whose billing another account pays.
  9. Treat the 403 codes of the account model: privileged_scope_required, live_credential_required, company_read_only, emitter_capability_restricted, owner_transfer_forbidden, additional_nif_not_in_plan and billing_managed_by_provider. Branch on code, not on message.
  10. Stop calling the writes of the tax catalog: read it with GET /v1/companies/{company}/taxes or GET /v1/tax-catalog.
  11. Add the thirty-seven new codes and parameter_unknown to your error handling, read idempotency_key_reused as a 422, and treat a 404 on an axis segment as "out of reach", not as a transient failure.
  12. Replay your integration with a fact_test_ key before you move live traffic.
  13. If you stored ids of records created before the window, re-read them from the list endpoints: the few that still had an older UUID version now have a UUID v7.

Read Amounts and dates, Reach a tax ID through the company segment, Accounts and tax IDs, Additional tax IDs and Errors.

Every operation, resource by resource

Operations: 519 — 49 new, 294 moved to the axis, 161 moved with other changes, 11 removed, 4 unchanged.

Changes that hit 50 or more operations at once are not repeated in the rows below: they are documented here once, with the number of operations each one touches. Everything else that changed in an operation is in its row.

ChangeOperations
error code 400 parameter_unknown/retired_active_profile_header documented459
error code 400 unsupported_api_version documented459
error code 403 company_inactive documented432
error code 404 profile_not_found documented432
error code 400 parameter_invalid_format documented430
response 400 added426
error code 422 idempotency_key_reused documented260
error code 409 idempotency_key_reused no longer documented210
response 404 added190
error code 404 resource_not_found documented187
response 409 removed181
error code 422 invalid_param_format documented160
error code 422 idempotency_key_required documented114
error code 409 resource_conflict no longer documented59
error code 409 resource_conflict documented54
parameter X-Active-Profile removed459
path parameter {company} added432
path parameter {account} added22
amounts and unit_price become decimal strings147

Absence balances

Operations: 2 — 0 new, 2 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.absence-balances.list — Path movedGET /v1/absence-balancesGET /v1/companies/{company}/absence-balances—
public-api.v1.absence-balances.show — Path movedGET /v1/absence-balances/{absence_balance}GET /v1/companies/{company}/absence-balances/{absence_balance}—

Absence calendar

Operations: 1 — 0 new, 1 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.absence-calendar.show — Path movedGET /v1/absence-calendarGET /v1/companies/{company}/absence-calendar—

Absence policies

Operations: 10 — 0 new, 7 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.absence-policies.archive — ChangedPOST /v1/absence-policies/{absence_policy}/archivePOST /v1/companies/{company}/absence-policies/{absence_policy}/archiveresponses added: 422
public-api.v1.absence-policies.assign — Path movedPOST /v1/absence-policies/{absence_policy}/assignPOST /v1/companies/{company}/absence-policies/{absence_policy}/assign—
public-api.v1.absence-policies.assignments — Path movedGET /v1/absence-policies/{absence_policy}/assignmentsGET /v1/companies/{company}/absence-policies/{absence_policy}/assignments—
public-api.v1.absence-policies.carryover — Path movedPOST /v1/absence-policies/{absence_policy}/carryoverPOST /v1/companies/{company}/absence-policies/{absence_policy}/carryover—
public-api.v1.absence-policies.create — ChangedPOST /v1/absence-policiesPOST /v1/companies/{company}/absence-policiesLocation header declared on 201
public-api.v1.absence-policies.list — Path movedGET /v1/absence-policiesGET /v1/companies/{company}/absence-policies—
public-api.v1.absence-policies.show — Path movedGET /v1/absence-policies/{absence_policy}GET /v1/companies/{company}/absence-policies/{absence_policy}—
public-api.v1.absence-policies.unarchive — ChangedPOST /v1/absence-policies/{absence_policy}/unarchivePOST /v1/companies/{company}/absence-policies/{absence_policy}/unarchiveresponses added: 422
public-api.v1.absence-policies.unassign — Path movedPOST /v1/absence-policies/{absence_policy}/unassignPOST /v1/companies/{company}/absence-policies/{absence_policy}/unassign—
public-api.v1.absence-policies.update — Path movedPUT /v1/absence-policies/{absence_policy}PATCH /v1/companies/{company}/absence-policies/{absence_policy}verb PUT → PATCH

Absence requests

Operations: 6 — 0 new, 4 moved to the axis, 2 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.absence-requests.approve — Path movedPOST /v1/absence-requests/{absence_request}/approvePOST /v1/companies/{company}/absence-requests/{absence_request}/approve—
public-api.v1.absence-requests.cancel — ChangedPOST /v1/absence-requests/{absence_request}/cancelPOST /v1/companies/{company}/absence-requests/{absence_request}/cancelresponses added: 422
public-api.v1.absence-requests.create — ChangedPOST /v1/absence-requestsPOST /v1/companies/{company}/absence-requestsLocation header declared on 201
public-api.v1.absence-requests.list — Path movedGET /v1/absence-requestsGET /v1/companies/{company}/absence-requests—
public-api.v1.absence-requests.reject — Path movedPOST /v1/absence-requests/{absence_request}/rejectPOST /v1/companies/{company}/absence-requests/{absence_request}/reject—
public-api.v1.absence-requests.show — Path movedGET /v1/absence-requests/{absence_request}GET /v1/companies/{company}/absence-requests/{absence_request}—

Absence types

Operations: 6 — 0 new, 3 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.absence-types.archive — ChangedPOST /v1/absence-types/{absence_type}/archivePOST /v1/companies/{company}/absence-types/{absence_type}/archiveresponses added: 422
public-api.v1.absence-types.create — ChangedPOST /v1/absence-typesPOST /v1/companies/{company}/absence-typesLocation header declared on 201
public-api.v1.absence-types.list — Path movedGET /v1/absence-typesGET /v1/companies/{company}/absence-types—
public-api.v1.absence-types.show — Path movedGET /v1/absence-types/{absence_type}GET /v1/companies/{company}/absence-types/{absence_type}—
public-api.v1.absence-types.unarchive — ChangedPOST /v1/absence-types/{absence_type}/unarchivePOST /v1/companies/{company}/absence-types/{absence_type}/unarchiveresponses added: 422
public-api.v1.absence-types.update — Path movedPUT /v1/absence-types/{absence_type}PATCH /v1/companies/{company}/absence-types/{absence_type}verb PUT → PATCH

Account

Operations: 57 — 47 new, 4 moved to the axis, 6 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.account.api_keys.create — ChangedPOST /v1/account/api-keysPOST /v1/accounts/{account}/api-keysnew body fields: scoped_company_ids; Location header declared on 201; data.secret can now be null; error codes documented: 404 account_not_found
public-api.v1.account.api_keys.list — ChangedGET /v1/account/api-keysGET /v1/accounts/{account}/api-keyserror codes documented: 404 account_not_found
public-api.v1.account.api_keys.revoke — ChangedPOST /v1/account/api-keys/{api_key}/revokePOST /v1/accounts/{account}/api-keys/{api_key}/revokeerror codes documented: 404 account_not_found
public-api.v1.account.api_keys.rotate_secret — ChangedPOST /v1/account/api-keys/{api_key}/rotate_secretPOST /v1/accounts/{account}/api-keys/{api_key}/rotate-secretdata.secret can now be null; error codes documented: 404 account_not_found
public-api.v1.account.api_keys.show — ChangedGET /v1/account/api-keys/{api_key}GET /v1/accounts/{account}/api-keys/{api_key}error codes documented: 404 account_not_found
public-api.v1.account.api_keys.update_nif_scope — New—PATCH /v1/accounts/{account}/api-keys/{api_key}/nif-scopeNew
public-api.v1.account.billing — Path movedGET /v1/account/billingGET /v1/companies/{company}/billing—
public-api.v1.account.invitations.cancel — New—DELETE /v1/accounts/{account}/invitations/{invitation}New
public-api.v1.account.invitations.create — New—POST /v1/accounts/{account}/invitationsNew
public-api.v1.account.invitations.list — New—GET /v1/accounts/{account}/invitationsNew
public-api.v1.account.invitations.resend — New—POST /v1/accounts/{account}/invitations/{invitation}/resendNew
public-api.v1.account.invitations.show — New—GET /v1/accounts/{account}/invitations/{invitation}New
public-api.v1.account.members.create — New—POST /v1/accounts/{account}/membersNew
public-api.v1.account.members.delete — New—DELETE /v1/accounts/{account}/members/{member}New
public-api.v1.account.members.grants.delete — New—DELETE /v1/accounts/{account}/members/{member}/grants/{company}New
public-api.v1.account.members.grants.list — New—GET /v1/accounts/{account}/members/{member}/grantsNew
public-api.v1.account.members.grants.show — New—GET /v1/accounts/{account}/members/{member}/grants/{company}New
public-api.v1.account.members.grants.update — New—PUT /v1/accounts/{account}/members/{member}/grants/{company}New
public-api.v1.account.members.list — New—GET /v1/accounts/{account}/membersNew
public-api.v1.account.members.module_access.show — New—GET /v1/accounts/{account}/members/{member}/module-accessNew
public-api.v1.account.members.module_access.update — New—PATCH /v1/accounts/{account}/members/{member}/module-accessNew
public-api.v1.account.members.show — New—GET /v1/accounts/{account}/members/{member}New
public-api.v1.account.members.update — New—PATCH /v1/accounts/{account}/members/{member}New
public-api.v1.account.nif_transfers.accept — New—POST /v1/accounts/{account}/nif-transfers/acceptNew
public-api.v1.account.nif_transfers.create — New—POST /v1/accounts/{account}/nif-transfersNew
public-api.v1.account.nif_transfers.list — New—GET /v1/accounts/{account}/nif-transfersNew
public-api.v1.account.nif_transfers.revoke — New—POST /v1/accounts/{account}/nif-transfers/{nif_transfer}/revokeNew
public-api.v1.account.owner.transfer — New—PATCH /v1/accounts/{account}/ownerNew
public-api.v1.account.personalization.templates — Path movedGET /v1/account/personalization/templatesGET /v1/companies/{company}/personalization/templates—
public-api.v1.account.personalization.update — Path movedPATCH /v1/account/personalizationPATCH /v1/companies/{company}/personalization—
public-api.v1.account.provisioning_usage — New—GET /v1/accounts/{account}/provisioning-usageNew
public-api.v1.account.request_logs.list — New—GET /v1/accounts/{account}/request-logsNew
public-api.v1.account.request_logs.show — New—GET /v1/accounts/{account}/request-logs/{request_id}New
public-api.v1.account.show — ChangedGET /v1/accountGET /v1/mescope account:read → none; response fields added: data.account, data.client_accounts, data.client_accounts_has_more, data.client_accounts_visible, data.scope; response fields removed: data.addon, data.company, data.personalization, data.plan
public-api.v1.account.usage — New—GET /v1/accounts/{account}/usageNew
public-api.v1.account.verify_census — Path movedPOST /v1/account/census-verificationPOST /v1/companies/{company}/census-verification—
public-api.v1.account.webhooks.create — New—POST /v1/accounts/{account}/webhooksNew
public-api.v1.account.webhooks.delete — New—DELETE /v1/accounts/{account}/webhooks/{webhook}New
public-api.v1.account.webhooks.deliveries.list — New—GET /v1/accounts/{account}/webhooks/{webhook}/deliveriesNew
public-api.v1.account.webhooks.deliveries.retry — New—POST /v1/accounts/{account}/webhooks/{webhook}/deliveries/{delivery}/retryNew
public-api.v1.account.webhooks.deliveries.show — New—GET /v1/accounts/{account}/webhooks/{webhook}/deliveries/{delivery}New
public-api.v1.account.webhooks.list — New—GET /v1/accounts/{account}/webhooksNew
public-api.v1.account.webhooks.rotate_secret — New—POST /v1/accounts/{account}/webhooks/{webhook}/secretNew
public-api.v1.account.webhooks.show — New—GET /v1/accounts/{account}/webhooks/{webhook}New
public-api.v1.account.webhooks.test — New—POST /v1/accounts/{account}/webhooks/{webhook}/testNew
public-api.v1.account.webhooks.update — New—PATCH /v1/accounts/{account}/webhooks/{webhook}New
public-api.v1.managed_accounts.access_level.update — New—PATCH /v1/accounts/{account}/access-levelNew
public-api.v1.managed_accounts.claim_tokens.create — New—POST /v1/accounts/{account}/claim-tokensNew
public-api.v1.managed_accounts.create — New—POST /v1/accountsNew
public-api.v1.managed_accounts.imports.create — New—POST /v1/accounts/importsNew
public-api.v1.managed_accounts.imports.preview — New—POST /v1/accounts/imports/previewNew
public-api.v1.managed_accounts.imports.template — New—GET /v1/accounts/imports/templateNew
public-api.v1.managed_accounts.list — New—GET /v1/accountsNew
public-api.v1.managed_accounts.management.end — New—DELETE /v1/accounts/{account}/managementNew
public-api.v1.managed_accounts.plan.preview — New—GET /v1/accounts/{account}/plan/previewNew
public-api.v1.managed_accounts.plan.update — New—PATCH /v1/accounts/{account}/planNew
public-api.v1.managed_accounts.show — New—GET /v1/accounts/{account}New

Automations

Operations: 18 — 0 new, 0 moved to the axis, 18 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.automations.catalog.show — ChangedGET /v1/automations/catalogGET /v1/companies/{company}/automations/catalogerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded
public-api.v1.automations.catalog.trigger_fields — ChangedGET /v1/automations/catalog/triggers/{trigger}/fieldsGET /v1/companies/{company}/automations/catalog/triggers/{trigger}/fieldserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found
public-api.v1.automations.rules.activate — ChangedPOST /v1/automations/rules/{rule}/activatePOST /v1/companies/{company}/automations/rules/{rule}/activateerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.rules.create — ChangedPOST /v1/automations/rulesPOST /v1/companies/{company}/automations/ruleserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.rules.delete — ChangedDELETE /v1/automations/rules/{rule}DELETE /v1/companies/{company}/automations/rules/{rule}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.rules.dry_run — ChangedPOST /v1/automations/rules/{rule}/dry_runPOST /v1/companies/{company}/automations/rules/{rule}/dry-runerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.rules.list — ChangedGET /v1/automations/rulesGET /v1/companies/{company}/automations/ruleserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 422 invalid_param_format
public-api.v1.automations.rules.pause — ChangedPOST /v1/automations/rules/{rule}/pausePOST /v1/companies/{company}/automations/rules/{rule}/pauseerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.rules.show — ChangedGET /v1/automations/rules/{rule}GET /v1/companies/{company}/automations/rules/{rule}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found
public-api.v1.automations.rules.update — ChangedPUT /v1/automations/rules/{rule}PATCH /v1/companies/{company}/automations/rules/{rule}verb PUT → PATCH; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.rules.versions.list — ChangedGET /v1/automations/rules/{rule}/versionsGET /v1/companies/{company}/automations/rules/{rule}/versionserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 422 invalid_param_format
public-api.v1.automations.rules.versions.show — ChangedGET /v1/automations/rules/{rule}/versions/{version}GET /v1/companies/{company}/automations/rules/{rule}/versions/{version}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found
public-api.v1.automations.runs.list — ChangedGET /v1/automations/runsGET /v1/companies/{company}/automations/runserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 422 invalid_param_format
public-api.v1.automations.runs.replay — ChangedPOST /v1/automations/runs/{run}/replayPOST /v1/companies/{company}/automations/runs/{run}/replayerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.runs.show — ChangedGET /v1/automations/runs/{run}GET /v1/companies/{company}/automations/runs/{run}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found
public-api.v1.automations.runs.steps.list — ChangedGET /v1/automations/runs/{run}/stepsGET /v1/companies/{company}/automations/runs/{run}/stepserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 422 invalid_param_format
public-api.v1.automations.runs.steps.replay — ChangedPOST /v1/automations/runs/{run}/steps/{step_index}/replayPOST /v1/companies/{company}/automations/runs/{run}/steps/{step_index}/replayerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.automations.usage.show — ChangedGET /v1/automations/usageGET /v1/companies/{company}/automations/usageerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded

Companies

Operations: 19 — 2 new, 0 moved to the axis, 12 moved with other changes, 5 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.companies.activate — ChangedPOST /v1/companies/{company}/activatePOST /v1/accounts/{account}/companies/{company}/activateresponse fields added: data.paid_until, data.readiness, data.suspension_reason; response fields removed: data.seat_paid_until; error codes documented: 402 additional_nif_charge_failed/additional_nif_charge_failed, 402 additional_nif_plan_required, 403 additional_nif_not_in_plan, 403 billing_managed_by_provider, 403 company_read_only, 404 account_not_found, 422 business_rule_violation/additional_nif_limit_reached
public-api.v1.companies.activate_batch — ChangedPOST /v1/companies/activatePOST /v1/accounts/{account}/companies/activateresponse fields added: data[].address, data[].business_name, data[].city, data[].country_aeat_zone, data[].created_at, data[].email, data[].id, data[].logo_url (+11 more); response fields removed: data.address, data.business_name, data.city, data.country_aeat_zone, data.created_at, data.email, data.id, data.logo_url (+9 more); data changes type (object → array); error codes documented: 402 additional_nif_charge_failed/additional_nif_charge_failed, 402 additional_nif_plan_required, 403 additional_nif_not_in_plan, 403 billing_managed_by_provider, 403 company_read_only, 404 account_not_found, 422 business_rule_violation/additional_nif_limit_reached
public-api.v1.companies.api_keys.create — RemovedPOST /v1/companies/{company}/api-keys—Removed
public-api.v1.companies.api_keys.list — RemovedGET /v1/companies/{company}/api-keys—Removed
public-api.v1.companies.api_keys.revoke — RemovedDELETE /v1/companies/{company}/api-keys/{api_key}—Removed
public-api.v1.companies.api_keys.rotate_secret — RemovedPOST /v1/companies/{company}/api-keys/{api_key}/rotate-secret—Removed
public-api.v1.companies.api_keys.show — RemovedGET /v1/companies/{company}/api-keys/{api_key}—Removed
public-api.v1.companies.create — ChangedPOST /v1/companiesPOST /v1/accounts/{account}/companiesresponse fields added: data.paid_until, data.readiness, data.suspension_reason; response fields removed: data.seat_paid_until; Location header declared on 201; error codes documented: 402 additional_nif_charge_failed/additional_nif_charge_failed, 402 additional_nif_plan_required, 403 additional_nif_not_in_plan, 403 billing_managed_by_provider, 404 account_not_found, 409 resource_already_exists/managed_company_tax_id_already_exists, 422 business_rule_violation/additional_nif_limit_reached
public-api.v1.companies.creation_status — ChangedGET /v1/companies/{company}/creation-statusGET /v1/accounts/{account}/companies/{company}/creation-statuserror codes documented: 404 account_not_found
public-api.v1.companies.deactivate — ChangedPOST /v1/companies/{company}/deactivatePOST /v1/accounts/{account}/companies/{company}/deactivateresponses added: 422; response fields added: data.paid_until, data.readiness, data.suspension_reason; response fields removed: data.seat_paid_until; error codes documented: 403 company_read_only, 404 account_not_found
public-api.v1.companies.delete — ChangedDELETE /v1/companies/{company}DELETE /v1/accounts/{account}/companies/{company}responses added: 422; error codes documented: 403 company_read_only, 404 account_not_found
public-api.v1.companies.issuing_readiness — New—GET /v1/accounts/{account}/companies/{company}/issuing-readinessNew
public-api.v1.companies.list — ChangedGET /v1/companiesGET /v1/accounts/{account}/companiesnew params: cursor, include, limit, tax_id; response fields added: data[].paid_until, data[].readiness, data[].suspension_reason; response fields removed: data[].seat_paid_until; error codes documented: 404 account_not_found
public-api.v1.companies.seat_charge_preview — ChangedGET /v1/companies/seat-charge-previewGET /v1/accounts/{account}/companies/seat-charge-previewcompany_ids[] is now optional; error codes documented: 404 account_not_found
public-api.v1.companies.show — ChangedGET /v1/companies/{company}GET /v1/accounts/{account}/companies/{company}response fields added: data.paid_until, data.readiness, data.suspension_reason; response fields removed: data.seat_paid_until; error codes documented: 404 account_not_found
public-api.v1.companies.stats — New—GET /v1/accounts/{account}/companies/statsNew
public-api.v1.companies.update — ChangedPATCH /v1/companies/{company}PATCH /v1/accounts/{account}/companies/{company}response fields added: data.paid_until, data.readiness, data.suspension_reason; response fields removed: data.seat_paid_until; error codes documented: 403 company_read_only, 404 account_not_found
public-api.v1.companies.verify_creation — ChangedPOST /v1/companies/{company}/verify-creationPOST /v1/accounts/{account}/companies/{company}/verify-creationresponses added: 422; error codes documented: 403 company_read_only, 404 account_not_found
public-api.v1.gestoria.workforce_summary — ChangedGET /v1/gestoria/workforce-summaryGET /v1/accounts/{account}/gestoria/workforce-summaryerror codes documented: 404 account_not_found

Contacts

Operations: 27 — 0 new, 2 moved to the axis, 25 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.contacts.activities — ChangedGET /v1/contacts/{contact}/activitiesGET /v1/companies/{company}/contacts/{contact}/activitieserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 422 invalid_param_format
public-api.v1.contacts.archive — ChangedPOST /v1/contacts/{contact}/archivePOST /v1/companies/{company}/contacts/{contact}/archiveresponses added: 422; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.assign_contact_role — ChangedPOST /v1/contacts/{contact}/roles/{role}POST /v1/companies/{company}/contacts/{contact}/roles/{role}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.bulk_archive — ChangedPOST /v1/contacts/bulk/archivePOST /v1/companies/{company}/contacts/bulk/archiveerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.bulk_change_contact_role_status — ChangedPOST /v1/contacts/bulk/statusPOST /v1/companies/{company}/contacts/bulk/statuserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.bulk_create — Path movedPOST /v1/contacts/bulk-createPOST /v1/companies/{company}/contacts/bulk-create—
public-api.v1.contacts.bulk_delete — ChangedPOST /v1/contacts/bulk-deletePOST /v1/companies/{company}/contacts/bulk-deleteerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.change_contact_role_status — ChangedPUT /v1/contacts/{contact}/roles/{role}/statusPATCH /v1/companies/{company}/contacts/{contact}/roles/{role}/statusverb PUT → PATCH; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.create — ChangedPOST /v1/contactsPOST /v1/companies/{company}/contactsresponses added: 201; response fields added: data; Location header declared on 200; Location header declared on 201; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded
public-api.v1.contacts.delete — ChangedDELETE /v1/contacts/{contact}DELETE /v1/companies/{company}/contacts/{contact}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.find_by_external_id — ChangedPOST /v1/contacts/find-by-external-idPOST /v1/companies/{company}/contacts/find-by-external-iderror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 404 contact_not_found, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded (+1 more); error codes no longer documented: 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.find_by_tax_id — ChangedPOST /v1/contacts/find-by-tax-idPOST /v1/companies/{company}/contacts/find-by-tax-iderror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 404 contact_not_found, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded (+1 more)
public-api.v1.contacts.import — ChangedPOST /v1/contacts/importPOST /v1/companies/{company}/contacts/importerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 409 resource_already_exists/external_id_already_exists, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded (+1 more)
public-api.v1.contacts.import_template — ChangedGET /v1/contacts/import/templateGET /v1/companies/{company}/contacts/import/templateerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded
public-api.v1.contacts.list — ChangedGET /v1/contactsGET /v1/companies/{company}/contactserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 422 invalid_param_format
public-api.v1.contacts.options — ChangedGET /v1/contacts/optionsGET /v1/companies/{company}/contacts/optionserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 422 invalid_param_format
public-api.v1.contacts.preview_import — ChangedPOST /v1/contacts/import/previewPOST /v1/companies/{company}/contacts/import/previewerror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.remove_contact_role — ChangedDELETE /v1/contacts/{contact}/roles/{role}DELETE /v1/companies/{company}/contacts/{contact}/roles/{role}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.restore — ChangedPUT /v1/contacts/{contact}/restorePOST /v1/companies/{company}/contacts/{contact}/restoreverb PUT → POST; responses added: 422; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.search — ChangedGET /v1/contacts/searchGET /v1/companies/{company}/contacts/searcherror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 422 invalid_param_format
public-api.v1.contacts.show — ChangedGET /v1/contacts/{contact}GET /v1/companies/{company}/contacts/{contact}error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found
public-api.v1.contacts.stats — ChangedGET /v1/contacts/statsGET /v1/companies/{company}/contacts/statserror codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded
public-api.v1.contacts.update — ChangedPUT /v1/contacts/{contact}PATCH /v1/companies/{company}/contacts/{contact}verb PUT → PATCH; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 409 resource_already_exists/external_id_already_exists, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded (+1 more); error codes no longer documented: 404 tax_report_not_found
public-api.v1.contacts.update_bank_accounts — ChangedPUT /v1/contacts/{contact}/bank-accountsPATCH /v1/companies/{company}/contacts/{contact}/bank-accountsverb PUT → PATCH; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.update_customer_profile — ChangedPUT /v1/contacts/{contact}/customer-profilePATCH /v1/companies/{company}/contacts/{contact}/customer-profileverb PUT → PATCH; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.update_supplier_profile — ChangedPUT /v1/contacts/{contact}/supplier-profilePATCH /v1/companies/{company}/contacts/{contact}/supplier-profileverb PUT → PATCH; error codes documented: 401 api_key_expired, 401 ip_not_allowed, 403 forbidden_action, 403 module_not_available_in_sandbox, 403 privileged_scope_required, 429 monthly_quota_exceeded, 429 portfolio_monthly_quota_exceeded, 429 portfolio_rate_limit_exceeded; error codes no longer documented: 404 tax_report_not_found, 409 resource_already_exists/tax_id_already_exists
public-api.v1.contacts.verify_census — Path movedPOST /v1/contacts/census-verificationPOST /v1/companies/{company}/contacts/census-verification—

Delivery notes

Operations: 22 — 0 new, 19 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.delivery_notes.bulk_delete — Path movedPOST /v1/delivery_notes/bulk-deletePOST /v1/companies/{company}/delivery-notes/bulk-delete—
public-api.v1.delivery_notes.bulk_pdf — Path movedPOST /v1/delivery_notes/bulk-pdfPOST /v1/companies/{company}/delivery-notes/bulk-pdf—
public-api.v1.delivery_notes.bulk_send — Path movedPOST /v1/delivery_notes/bulk-sendPOST /v1/companies/{company}/delivery-notes/bulk-send—
public-api.v1.delivery_notes.bulk_status — Path movedPOST /v1/delivery_notes/bulk-statusPOST /v1/companies/{company}/delivery-notes/bulk-status—
public-api.v1.delivery_notes.cancel — Path movedPOST /v1/delivery_notes/{delivery_note}/cancelPOST /v1/companies/{company}/delivery-notes/{delivery_note}/cancel—
public-api.v1.delivery_notes.convert — ChangedPOST /v1/delivery_notes/{delivery_note}/convertPOST /v1/companies/{company}/delivery-notes/{delivery_note}/convertresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.delivery_notes.create — Path movedPOST /v1/delivery_notesPOST /v1/companies/{company}/delivery-notes—
public-api.v1.delivery_notes.delete — Path movedDELETE /v1/delivery_notes/{delivery_note}DELETE /v1/companies/{company}/delivery-notes/{delivery_note}—
public-api.v1.delivery_notes.duplicate — ChangedPOST /v1/delivery_notes/{delivery_note}/duplicatePOST /v1/companies/{company}/delivery-notes/{delivery_note}/duplicateresponses added: 422
public-api.v1.delivery_notes.find_by_external_id — Path movedPOST /v1/delivery_notes/find-by-external-idPOST /v1/companies/{company}/delivery-notes/find-by-external-id—
public-api.v1.delivery_notes.list — Path movedGET /v1/delivery_notesGET /v1/companies/{company}/delivery-notes—
public-api.v1.delivery_notes.mark_delivered — Path movedPOST /v1/delivery_notes/{delivery_note}/mark-deliveredPOST /v1/companies/{company}/delivery-notes/{delivery_note}/mark-delivered—
public-api.v1.delivery_notes.pdf — Path movedGET /v1/delivery_notes/{delivery_note}/pdfGET /v1/companies/{company}/delivery-notes/{delivery_note}/pdf—
public-api.v1.delivery_notes.public_link.get — Path movedGET /v1/delivery_notes/{delivery_note}/public-linkGET /v1/companies/{company}/delivery-notes/{delivery_note}/public-link—
public-api.v1.delivery_notes.public_link.update — Path movedPUT /v1/delivery_notes/{delivery_note}/public-linkPATCH /v1/companies/{company}/delivery-notes/{delivery_note}/public-linkverb PUT → PATCH
public-api.v1.delivery_notes.send — Path movedPOST /v1/delivery_notes/{delivery_note}/sendPOST /v1/companies/{company}/delivery-notes/{delivery_note}/send—
public-api.v1.delivery_notes.show — Path movedGET /v1/delivery_notes/{delivery_note}GET /v1/companies/{company}/delivery-notes/{delivery_note}—
public-api.v1.delivery_notes.sign — Path movedPOST /v1/delivery_notes/{delivery_note}/signPOST /v1/companies/{company}/delivery-notes/{delivery_note}/sign—
public-api.v1.delivery_notes.signature_audits.forget — Path movedPOST /v1/delivery_notes/signature-audits/{auditId}/forgetPOST /v1/companies/{company}/delivery-notes/signature-audits/{auditId}/forget—
public-api.v1.delivery_notes.stats — Path movedGET /v1/delivery_notes/statsGET /v1/companies/{company}/delivery-notes/stats—
public-api.v1.delivery_notes.statuses — Path movedGET /v1/delivery_notes/statusesGET /v1/companies/{company}/delivery-notes/statuses—
public-api.v1.delivery_notes.update — ChangedPUT /v1/delivery_notes/{delivery_note}PATCH /v1/companies/{company}/delivery-notes/{delivery_note}verb PUT → PATCH; error codes documented: 409 resource_already_exists/external_id_already_exists

Request logs

Operations: 2 — 0 new, 2 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.developers.request_logs.list — Path movedGET /v1/developers/request-logsGET /v1/companies/{company}/request-logs—
public-api.v1.developers.request_logs.show — Path movedGET /v1/developers/request-logs/{request_id}GET /v1/companies/{company}/request-logs/{request_id}—

Email deliveries

Operations: 3 — 0 new, 3 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.emails.indicators — Path movedGET /v1/emails/indicatorsGET /v1/companies/{company}/emails/indicators—
public-api.v1.emails.list — Path movedGET /v1/emailsGET /v1/companies/{company}/emails—
public-api.v1.emails.show — Path movedGET /v1/emails/{email}GET /v1/companies/{company}/emails/{email}—

Employees

Operations: 17 — 0 new, 8 moved to the axis, 9 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.employee-invitations.cancel — ChangedDELETE /v1/employee-invitations/{invitation}DELETE /v1/companies/{company}/employee-invitations/{invitation}responses added: 422
public-api.v1.employee-invitations.list — Path movedGET /v1/employee-invitationsGET /v1/companies/{company}/employee-invitations—
public-api.v1.employee-invitations.resend — Path movedPOST /v1/employee-invitations/{invitation}/resendPOST /v1/companies/{company}/employee-invitations/{invitation}/resend—
public-api.v1.employee-invitations.send — ChangedPOST /v1/employee-invitationsPOST /v1/companies/{company}/employee-invitationsLocation header declared on 201
public-api.v1.employee-seats.cancel — ChangedPOST /v1/employee-seats/cancelPOST /v1/accounts/{account}/employee-seats/cancelerror codes documented: 404 account_not_found
public-api.v1.employee-seats.change-quantity — ChangedPOST /v1/employee-seats/change-quantityPOST /v1/accounts/{account}/employee-seats/change-quantityerror codes documented: 404 account_not_found
public-api.v1.employee-seats.preview — ChangedGET /v1/employee-seats/previewGET /v1/accounts/{account}/employee-seats/previewerror codes documented: 404 account_not_found
public-api.v1.employee-seats.status — ChangedGET /v1/employee-seatsGET /v1/accounts/{account}/employee-seatserror codes documented: 404 account_not_found
public-api.v1.employee-seats.subscribe — ChangedPOST /v1/employee-seats/subscribePOST /v1/accounts/{account}/employee-seats/subscribeerror codes documented: 404 account_not_found
public-api.v1.employees.create — ChangedPOST /v1/employeesPOST /v1/companies/{company}/employeesLocation header declared on 201; error codes documented: 409 resource_already_exists/external_id_already_exists
public-api.v1.employees.deactivate — Path movedPOST /v1/employees/{employee}/deactivatePOST /v1/companies/{company}/employees/{employee}/deactivate—
public-api.v1.employees.find_by_external_id — Path movedPOST /v1/employees/find-by-external-idPOST /v1/companies/{company}/employees/find-by-external-id—
public-api.v1.employees.list — Path movedGET /v1/employeesGET /v1/companies/{company}/employees—
public-api.v1.employees.reactivate — Path movedPOST /v1/employees/{employee}/reactivatePOST /v1/companies/{company}/employees/{employee}/reactivate—
public-api.v1.employees.show — Path movedGET /v1/employees/{employee}GET /v1/companies/{company}/employees/{employee}—
public-api.v1.employees.stats — Path movedGET /v1/employees/statsGET /v1/companies/{company}/employees/stats—
public-api.v1.employees.update — ChangedPUT /v1/employees/{employee}PATCH /v1/companies/{company}/employees/{employee}verb PUT → PATCH; error codes documented: 409 resource_already_exists/external_id_already_exists

Events

Operations: 3 — 0 new, 0 moved to the axis, 2 moved with other changes, 0 removed, 1 unchanged.

OperationBeforeNowWhat changed
public-api.v1.event_catalog.list — UnchangedGET /v1/event-catalogGET /v1/event-catalogUnchanged
public-api.v1.events.list — ChangedGET /v1/eventsGET /v1/companies/{company}/eventsresponse fields added: data[].data.object.paid_date, data[].data.object.paid_recorded_at; response fields removed: data[].data.object.paid_at, data[].data.object.paid_on
public-api.v1.events.show — ChangedGET /v1/events/{event}GET /v1/companies/{company}/events/{event}response fields added: data.data.object.paid_date, data.data.object.paid_recorded_at; response fields removed: data.data.object.paid_at, data.data.object.paid_on

FacturaE / FACe

Operations: 5 — 0 new, 4 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.face_submissions.cancel — Path movedPOST /v1/face-submissions/{faceSubmission}/cancelPOST /v1/companies/{company}/face-submissions/{faceSubmission}/cancel—
public-api.v1.face_submissions.show — Path movedGET /v1/face-submissions/{faceSubmission}GET /v1/companies/{company}/face-submissions/{faceSubmission}—
public-api.v1.invoices.face_submissions.list — Path movedGET /v1/invoices/{invoice}/face-submissionsGET /v1/companies/{company}/invoices/{invoice}/face-submissions—
public-api.v1.invoices.face_submissions.submit — ChangedPOST /v1/invoices/{invoice}/face-submissionsPOST /v1/companies/{company}/invoices/{invoice}/face-submissionserror codes documented: 409 resource_already_exists/face_submission_already_exists
public-api.v1.invoices.facturae — Path movedGET /v1/invoices/{invoice}/facturaeGET /v1/companies/{company}/invoices/{invoice}/facturae—

Holidays

Operations: 3 — 0 new, 3 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.holidays.list — Path movedGET /v1/holidaysGET /v1/companies/{company}/holidays—
public-api.v1.holidays.resolve — Path movedGET /v1/holidays/resolveGET /v1/companies/{company}/holidays/resolve—
public-api.v1.holidays.show — Path movedGET /v1/holidays/{holiday}GET /v1/companies/{company}/holidays/{holiday}—

Integration events

Operations: 3 — 0 new, 3 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.integrations.events.list — Path movedGET /v1/integrations/eventsGET /v1/companies/{company}/integrations/events—
public-api.v1.integrations.events.replay — Path movedPOST /v1/integrations/events/{event}/replayPOST /v1/companies/{company}/integrations/events/{event}/replay—
public-api.v1.integrations.events.show — Path movedGET /v1/integrations/events/{event}GET /v1/companies/{company}/integrations/events/{event}—

Invoices

Operations: 48 — 0 new, 25 moved to the axis, 22 moved with other changes, 0 removed, 1 unchanged.

OperationBeforeNowWhat changed
public-api.v1.invoices.activities — Path movedGET /v1/invoices/{invoice}/activitiesGET /v1/companies/{company}/invoices/{invoice}/activities—
public-api.v1.invoices.annul — ChangedPOST /v1/invoices/{invoice}/annulPOST /v1/companies/{company}/invoices/{invoice}/annulresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.assign_real_number — ChangedPOST /v1/invoices/{invoice}/assign-real-numberPOST /v1/companies/{company}/invoices/{invoice}/assign-real-numberresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.bulk_create — ChangedPOST /v1/invoices/bulk-createPOST /v1/companies/{company}/invoices/bulk-createnew body fields: invoices[].client_id, invoices[].custom_fields, invoices[].due_on, invoices[].external_id, invoices[].issued_on, invoices[].lines, invoices[].metadata, invoices[].metadata{} (+6 more); body fields removed: invoices[][]
public-api.v1.invoices.bulk_delete — Path movedPOST /v1/invoices/bulk-deletePOST /v1/companies/{company}/invoices/bulk-delete—
public-api.v1.invoices.bulk_pdf — Path movedPOST /v1/invoices/bulk-pdfPOST /v1/companies/{company}/invoices/bulk-pdf—
public-api.v1.invoices.bulk_send — Path movedPOST /v1/invoices/bulk-sendPOST /v1/companies/{company}/invoices/bulk-send—
public-api.v1.invoices.bulk_status — Path movedPOST /v1/invoices/bulk-statusPOST /v1/companies/{company}/invoices/bulk-status—
public-api.v1.invoices.can_annul — Path movedGET /v1/invoices/{invoice}/can-annulGET /v1/companies/{company}/invoices/{invoice}/can-annul—
public-api.v1.invoices.corrective — ChangedPOST /v1/invoices/{invoice}/correctivePOST /v1/companies/{company}/invoices/{invoice}/correctiveresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.correctives — ChangedGET /v1/invoices/{invoice}/correctivesGET /v1/companies/{company}/invoices/{invoice}/correctivesresponse fields added: data[].paid_date, data[].paid_recorded_at; response fields removed: data[].paid_at, data[].paid_on
public-api.v1.invoices.create — ChangedPOST /v1/invoicesPOST /v1/companies/{company}/invoicesresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.create_recurring — ChangedPOST /v1/invoices/{invoice}/create-recurringPOST /v1/companies/{company}/invoices/{invoice}/create-recurringLocation header declared on 201
public-api.v1.invoices.delete — Path movedDELETE /v1/invoices/{invoice}DELETE /v1/companies/{company}/invoices/{invoice}—
public-api.v1.invoices.duplicate — ChangedPOST /v1/invoices/{invoice}/duplicatePOST /v1/companies/{company}/invoices/{invoice}/duplicateresponses added: 422; response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.export_excel — Path movedPOST /v1/invoices/export/excelPOST /v1/companies/{company}/invoices/export/excel—
public-api.v1.invoices.find_by_external_id — ChangedPOST /v1/invoices/find-by-external-idPOST /v1/companies/{company}/invoices/find-by-external-idresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.find_by_number — ChangedPOST /v1/invoices/find-by-numberPOST /v1/companies/{company}/invoices/find-by-numberresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.list — ChangedGET /v1/invoicesGET /v1/companies/{company}/invoicesnew params: paid_on[gt], paid_on[gte], paid_on[lt], paid_on[lte]; response fields added: data[].paid_date, data[].paid_recorded_at; response fields removed: data[].paid_at, data[].paid_on
public-api.v1.invoices.mark_paid — ChangedPOST /v1/invoices/{invoice}/mark-paidPOST /v1/companies/{company}/invoices/{invoice}/mark-paidresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.mark_sent — ChangedPOST /v1/invoices/{invoice}/mark-sentPOST /v1/companies/{company}/invoices/{invoice}/mark-sentresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.payment_receipt — Path movedGET /v1/invoices/{invoice}/payment-receiptGET /v1/companies/{company}/invoices/{invoice}/payment-receipt—
public-api.v1.invoices.payments_create — Path movedPOST /v1/invoices/{invoice}/paymentsPOST /v1/companies/{company}/invoices/{invoice}/payments—
public-api.v1.invoices.payments_list — Path movedGET /v1/invoices/{invoice}/paymentsGET /v1/companies/{company}/invoices/{invoice}/payments—
public-api.v1.invoices.payments_revert — Path movedPOST /v1/invoices/{invoice}/payments/{payment}/reversalPOST /v1/companies/{company}/invoices/{invoice}/payments/{payment}/reversal—
public-api.v1.invoices.pdf — Path movedGET /v1/invoices/{invoice}/pdfGET /v1/companies/{company}/invoices/{invoice}/pdf—
public-api.v1.invoices.pdf_link — Path movedGET /v1/invoices/{invoice}/pdf-linkGET /v1/companies/{company}/invoices/{invoice}/pdf-link—
public-api.v1.invoices.pdf_preview — Path movedGET /v1/invoices/{invoice}/pdf/previewGET /v1/companies/{company}/invoices/{invoice}/pdf/preview—
public-api.v1.invoices.public_link_get — Path movedGET /v1/invoices/{invoice}/public-linkGET /v1/companies/{company}/invoices/{invoice}/public-link—
public-api.v1.invoices.public_link_update — Path movedPUT /v1/invoices/{invoice}/public-linkPATCH /v1/companies/{company}/invoices/{invoice}/public-linkverb PUT → PATCH
public-api.v1.invoices.quarterly.available — Path movedGET /v1/invoices/quarterly/available-quartersGET /v1/companies/{company}/invoices/quarterly/available-quarters—
public-api.v1.invoices.quarterly.download_zip — Path movedPOST /v1/invoices/quarterly/download-zipPOST /v1/companies/{company}/invoices/quarterly/download-zip—
public-api.v1.invoices.quarterly.send_email — Path movedPOST /v1/invoices/quarterly/send-emailPOST /v1/companies/{company}/invoices/quarterly/send-email—
public-api.v1.invoices.reminder_preview — Path movedPOST /v1/invoices/{invoice}/reminder-previewPOST /v1/companies/{company}/invoices/{invoice}/reminder-preview—
public-api.v1.invoices.reschedule — ChangedPATCH /v1/invoices/{invoice}/reschedulePATCH /v1/companies/{company}/invoices/{invoice}/rescheduleresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.schedule — ChangedPOST /v1/invoices/{invoice}/schedulePOST /v1/companies/{company}/invoices/{invoice}/scheduleresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.send — ChangedPOST /v1/invoices/{invoice}/sendPOST /v1/companies/{company}/invoices/{invoice}/sendresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.send_reminder — Path movedPOST /v1/invoices/{invoice}/send-reminderPOST /v1/companies/{company}/invoices/{invoice}/send-reminder—
public-api.v1.invoices.show — ChangedGET /v1/invoices/{invoice}GET /v1/companies/{company}/invoices/{invoice}response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.simplified_eligibility — Path movedPOST /v1/invoices/simplified-eligibilityPOST /v1/companies/{company}/invoices/simplified-eligibility—
public-api.v1.invoices.stats — Path movedGET /v1/invoices/statsGET /v1/companies/{company}/invoices/stats—
public-api.v1.invoices.statuses — Path movedGET /v1/invoices/statusesGET /v1/companies/{company}/invoices/statuses—
public-api.v1.invoices.substitute_simplified — ChangedPOST /v1/invoices/substitute-simplifiedPOST /v1/companies/{company}/invoices/substitute-simplifiedresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.unschedule — ChangedPOST /v1/invoices/{invoice}/unschedulePOST /v1/companies/{company}/invoices/{invoice}/unscheduleresponses added: 422; response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.unsend — ChangedPOST /v1/invoices/{invoice}/unsendPOST /v1/companies/{company}/invoices/{invoice}/unsendresponses added: 422; response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.invoices.update — ChangedPUT /v1/invoices/{invoice}PATCH /v1/companies/{company}/invoices/{invoice}verb PUT → PATCH; response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on; error codes documented: 409 resource_already_exists/external_id_already_exists
public-api.v1.invoices.void — ChangedPOST /v1/invoices/{invoice}/voidPOST /v1/companies/{company}/invoices/{invoice}/voidresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.payment_methods.list — UnchangedGET /v1/payment-methodsGET /v1/payment-methodsUnchanged

VeriFactu

Operations: 27 — 0 new, 24 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.invoices.verifactu_create — Path movedPOST /v1/invoices/{invoice}/verifactuPOST /v1/companies/{company}/invoices/{invoice}/verifactu—
public-api.v1.invoices.verifactu_get — Path movedGET /v1/invoices/{invoice}/verifactuGET /v1/companies/{company}/invoices/{invoice}/verifactu—
public-api.v1.verifactu.aeat_access.list — Path movedGET /v1/verifactu/aeat-access/recordsGET /v1/companies/{company}/verifactu/aeat-access/records—
public-api.v1.verifactu.aeat_access.show — Path movedGET /v1/verifactu/aeat-access/records/{record}GET /v1/companies/{company}/verifactu/aeat-access/records/{record}—
public-api.v1.verifactu.certificates.activate — Path movedPOST /v1/verifactu/certificates/{certificate}/activatePOST /v1/companies/{company}/verifactu/certificates/{certificate}/activate—
public-api.v1.verifactu.certificates.active — Path movedGET /v1/verifactu/certificates/activeGET /v1/companies/{company}/verifactu/certificates/active—
public-api.v1.verifactu.certificates.list — Path movedGET /v1/verifactu/certificatesGET /v1/companies/{company}/verifactu/certificates—
public-api.v1.verifactu.certificates.revoke — Path movedDELETE /v1/verifactu/certificates/{certificate}DELETE /v1/companies/{company}/verifactu/certificates/{certificate}—
public-api.v1.verifactu.certificates.upload — ChangedPOST /v1/verifactu/certificatesPOST /v1/companies/{company}/verifactu/certificateserror codes documented: 422 business_rule_violation/certificate_too_large, 422 business_rule_violation/invalid_certificate_format, 422 business_rule_violation/invalid_certificate_password, 422 verifactu_not_eligible/certificate_expired, 422 verifactu_not_eligible/certificate_nif_mismatch
public-api.v1.verifactu.chain.validate — Path movedGET /v1/verifactu/chain/validateGET /v1/companies/{company}/verifactu/chain/validate—
public-api.v1.verifactu.config — Path movedGET /v1/verifactu/configGET /v1/companies/{company}/verifactu/config—
public-api.v1.verifactu.declaracion.current — Path movedGET /v1/verifactu/declaracion-responsableGET /v1/companies/{company}/verifactu/declaracion-responsable—
public-api.v1.verifactu.declaracion.history — Path movedGET /v1/verifactu/declaracion-responsable/historyGET /v1/companies/{company}/verifactu/declaracion-responsable/history—
public-api.v1.verifactu.events.list — Path movedGET /v1/verifactu/eventsGET /v1/companies/{company}/verifactu/events—
public-api.v1.verifactu.events.retry — Path movedPOST /v1/verifactu/events/{event}/retryPOST /v1/companies/{company}/verifactu/events/{event}/retry—
public-api.v1.verifactu.events.show — Path movedGET /v1/verifactu/events/{event}GET /v1/companies/{company}/verifactu/events/{event}—
public-api.v1.verifactu.events.summary — Path movedGET /v1/verifactu/events/summaryGET /v1/companies/{company}/verifactu/events/summary—
public-api.v1.verifactu.records.activities — Path movedGET /v1/verifactu/records/{record}/activitiesGET /v1/companies/{company}/verifactu/records/{record}/activities—
public-api.v1.verifactu.records.find_by_csv — ChangedPOST /v1/verifactu/records/find-by-csvPOST /v1/companies/{company}/verifactu/records/find-by-csvresponses added: 422
public-api.v1.verifactu.records.find_by_huella — Path movedPOST /v1/verifactu/records/find-by-huellaPOST /v1/companies/{company}/verifactu/records/find-by-huella—
public-api.v1.verifactu.records.find_by_invoice_number — ChangedPOST /v1/verifactu/records/find-by-invoice-numberPOST /v1/companies/{company}/verifactu/records/find-by-invoice-numberresponses added: 422
public-api.v1.verifactu.records.list — Path movedGET /v1/verifactu/recordsGET /v1/companies/{company}/verifactu/records—
public-api.v1.verifactu.records.retry — Path movedPOST /v1/verifactu/records/{record}/retryPOST /v1/companies/{company}/verifactu/records/{record}/retry—
public-api.v1.verifactu.records.show — Path movedGET /v1/verifactu/records/{record}GET /v1/companies/{company}/verifactu/records/{record}—
public-api.v1.verifactu.records.subsanar — Path movedPOST /v1/verifactu/records/{record}/subsanarPOST /v1/companies/{company}/verifactu/records/{record}/subsanar—
public-api.v1.verifactu.settings.update — Path movedPUT /v1/verifactu/settingsPATCH /v1/companies/{company}/verifactu/settingsverb PUT → PATCH
public-api.v1.verifactu.stats — Path movedGET /v1/verifactu/statsGET /v1/companies/{company}/verifactu/stats—

Monthly closes

Operations: 8 — 0 new, 5 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.monthly_time_record_closes.create — ChangedPOST /v1/monthly-time-record-closesPOST /v1/companies/{company}/monthly-time-record-closesLocation header declared on 201; error codes documented: 409 resource_already_exists/monthly_register_already_closed
public-api.v1.monthly_time_record_closes.export — Path movedGET /v1/monthly-time-record-closes/{monthly_time_record_close}/exportGET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/export—
public-api.v1.monthly_time_record_closes.list — Path movedGET /v1/monthly-time-record-closesGET /v1/companies/{company}/monthly-time-record-closes—
public-api.v1.monthly_time_record_closes.reopen — ChangedPOST /v1/monthly-time-record-closes/{monthly_time_record_close}/reopenPOST /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/reopenresponses added: 422
public-api.v1.monthly_time_record_closes.report — Path movedGET /v1/monthly-time-record-closes/{monthly_time_record_close}/reportGET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/report—
public-api.v1.monthly_time_record_closes.seal — ChangedPOST /v1/monthly-time-record-closes/{monthly_time_record_close}/sealPOST /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/sealLocation header declared on 201; error codes documented: 409 resource_already_exists/monthly_register_already_sealed
public-api.v1.monthly_time_record_closes.seal_show — Path movedGET /v1/monthly-time-record-closes/{monthly_time_record_close}/sealGET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/seal—
public-api.v1.monthly_time_record_closes.show — Path movedGET /v1/monthly-time-record-closes/{monthly_time_record_close}GET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}—

Payroll exports

Operations: 2 — 0 new, 1 moved to the axis, 0 moved with other changes, 0 removed, 1 unchanged.

OperationBeforeNowWhat changed
public-api.v1.monthly_time_record_closes.payroll_export — Path movedGET /v1/monthly-time-record-closes/{monthly_time_record_close}/payroll-exportGET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/payroll-export—
public-api.v1.payroll_export_formats.list — UnchangedGET /v1/payroll-export-formatsGET /v1/payroll-export-formatsUnchanged

Stripe

Operations: 10 — 0 new, 9 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.payouts.list — Path movedGET /v1/payoutsGET /v1/companies/{company}/payouts—
public-api.v1.payouts.show — Path movedGET /v1/payouts/{payout}GET /v1/companies/{company}/payouts/{payout}—
public-api.v1.stripe_autoinvoicing.accounts.disconnect — Path movedDELETE /v1/connected-accounts/{account}DELETE /v1/companies/{company}/connected-accounts/{account}—
public-api.v1.stripe_autoinvoicing.accounts.list — Path movedGET /v1/connected-accountsGET /v1/companies/{company}/connected-accounts—
public-api.v1.stripe_autoinvoicing.accounts.show — Path movedGET /v1/connected-accounts/{account}GET /v1/companies/{company}/connected-accounts/{account}—
public-api.v1.stripe_autoinvoicing.accounts.update — Path movedPUT /v1/connected-accounts/{account}PATCH /v1/companies/{company}/connected-accounts/{account}verb PUT → PATCH
public-api.v1.stripe_autoinvoicing.config.show — Path movedGET /v1/stripe-autoinvoicing/configGET /v1/companies/{company}/stripe-autoinvoicing/config—
public-api.v1.stripe_autoinvoicing.config.update — ChangedPUT /v1/stripe-autoinvoicing/configPATCH /v1/companies/{company}/stripe-autoinvoicing/configverb PUT → PATCH; the request body is now optional; enabled is now optional
public-api.v1.stripe_autoinvoicing.correctives.list — Path movedGET /v1/stripe-autoinvoicing/correctivesGET /v1/companies/{company}/stripe-autoinvoicing/correctives—
public-api.v1.stripe_autoinvoicing.payments.list — Path movedGET /v1/stripe-autoinvoicing/paymentsGET /v1/companies/{company}/stripe-autoinvoicing/payments—

Presence

Operations: 3 — 0 new, 3 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.presence.daily — Path movedGET /v1/presence/dailyGET /v1/companies/{company}/presence/daily—
public-api.v1.presence.live — Path movedGET /v1/presenceGET /v1/companies/{company}/presence—
public-api.v1.presence.show — Path movedGET /v1/presence/{employee}GET /v1/companies/{company}/presence/{employee}—

Price lists

Operations: 13 — 0 new, 12 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.price-lists.create — ChangedPOST /v1/price-listsPOST /v1/companies/{company}/price-listsLocation header declared on 201
public-api.v1.price-lists.delete — Path movedDELETE /v1/price-lists/{priceList}DELETE /v1/companies/{company}/price-lists/{priceList}—
public-api.v1.price-lists.items.delete — Path movedDELETE /v1/price-lists/{priceList}/items/{item}DELETE /v1/companies/{company}/price-lists/{priceList}/items/{item}—
public-api.v1.price-lists.items.list — Path movedGET /v1/price-lists/{priceList}/itemsGET /v1/companies/{company}/price-lists/{priceList}/items—
public-api.v1.price-lists.items.purge_retired — Path movedPOST /v1/price-lists/{priceList}/items/{item}/purgePOST /v1/companies/{company}/price-lists/{priceList}/items/{item}/purge—
public-api.v1.price-lists.items.reassign_retired — Path movedPOST /v1/price-lists/{priceList}/items/{item}/reassignPOST /v1/companies/{company}/price-lists/{priceList}/items/{item}/reassign—
public-api.v1.price-lists.items.upsert — Path movedPOST /v1/price-lists/{priceList}/itemsPOST /v1/companies/{company}/price-lists/{priceList}/items—
public-api.v1.price-lists.list — Path movedGET /v1/price-listsGET /v1/companies/{company}/price-lists—
public-api.v1.price-lists.options — Path movedGET /v1/price-lists/optionsGET /v1/companies/{company}/price-lists/options—
public-api.v1.price-lists.resolve — Path movedPOST /v1/price-lists/resolvePOST /v1/companies/{company}/price-lists/resolve—
public-api.v1.price-lists.resolve_many — Path movedPOST /v1/price-lists/resolve-manyPOST /v1/companies/{company}/price-lists/resolve-many—
public-api.v1.price-lists.show — Path movedGET /v1/price-lists/{priceList}GET /v1/companies/{company}/price-lists/{priceList}—
public-api.v1.price-lists.update — Path movedPUT /v1/price-lists/{priceList}PATCH /v1/companies/{company}/price-lists/{priceList}verb PUT → PATCH

Products

Operations: 41 — 0 new, 37 moved to the axis, 4 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.products.activities — Path movedGET /v1/products/{product}/activitiesGET /v1/companies/{company}/products/{product}/activities—
public-api.v1.products.bulk_delete — Path movedPOST /v1/products/bulk-deletePOST /v1/companies/{company}/products/bulk-delete—
public-api.v1.products.bulk_status — Path movedPOST /v1/products/bulk-statusPOST /v1/companies/{company}/products/bulk-status—
public-api.v1.products.bulk_update_stock — Path movedPOST /v1/products/bulk-update-stockPOST /v1/companies/{company}/products/bulk-update-stock—
public-api.v1.products.configurations.impact_preview — Path movedPOST /v1/products/{product}/configurations/impact-previewPOST /v1/companies/{company}/products/{product}/configurations/impact-preview—
public-api.v1.products.configurations.list — Path movedGET /v1/products/{product}/configurationsGET /v1/companies/{company}/products/{product}/configurations—
public-api.v1.products.create — ChangedPOST /v1/productsPOST /v1/companies/{company}/productserror codes documented: 409 resource_already_exists/external_id_already_exists, 409 resource_already_exists/sku_already_exists
public-api.v1.products.delete — Path movedDELETE /v1/products/{product}DELETE /v1/companies/{company}/products/{product}—
public-api.v1.products.find_by_external_id — Path movedPOST /v1/products/find-by-external-idPOST /v1/companies/{company}/products/find-by-external-id—
public-api.v1.products.find_by_sku — Path movedPOST /v1/products/find-by-skuPOST /v1/companies/{company}/products/find-by-sku—
public-api.v1.products.gallery.delete — Path movedDELETE /v1/products/{product}/gallery/{index}DELETE /v1/companies/{company}/products/{product}/gallery/{index}—
public-api.v1.products.gallery.download — Path movedGET /v1/products/{product}/gallery/{index}/downloadGET /v1/companies/{company}/products/{product}/gallery/{index}/download—
public-api.v1.products.gallery.upload — Path movedPOST /v1/products/{product}/galleryPOST /v1/companies/{company}/products/{product}/gallery—
public-api.v1.products.list — Path movedGET /v1/productsGET /v1/companies/{company}/products—
public-api.v1.products.low_stock_report — Path movedGET /v1/products/low-stock-reportGET /v1/companies/{company}/products/low-stock-report—
public-api.v1.products.options.list — Path movedGET /v1/products/{product}/optionsGET /v1/companies/{company}/products/{product}/options—
public-api.v1.products.presentations.create — Path movedPOST /v1/products/{product}/presentationsPOST /v1/companies/{company}/products/{product}/presentations—
public-api.v1.products.presentations.delete — Path movedDELETE /v1/products/{product}/presentations/{presentation}DELETE /v1/companies/{company}/products/{product}/presentations/{presentation}—
public-api.v1.products.presentations.list — Path movedGET /v1/products/{product}/presentationsGET /v1/companies/{company}/products/{product}/presentations—
public-api.v1.products.presentations.update — Path movedPUT /v1/products/{product}/presentations/{presentation}PATCH /v1/companies/{company}/products/{product}/presentations/{presentation}verb PUT → PATCH
public-api.v1.products.resolve_selection — Path movedPOST /v1/products/{product}/resolve-selectionPOST /v1/companies/{company}/products/{product}/resolve-selection—
public-api.v1.products.sales_analytics — Path movedGET /v1/products/{product}/sales-analyticsGET /v1/companies/{company}/products/{product}/sales-analytics—
public-api.v1.products.search — Path movedGET /v1/products/searchGET /v1/companies/{company}/products/search—
public-api.v1.products.show — Path movedGET /v1/products/{product}GET /v1/companies/{company}/products/{product}—
public-api.v1.products.stats — Path movedGET /v1/products/statsGET /v1/companies/{company}/products/stats—
public-api.v1.products.stock_movements.list — Path movedGET /v1/products/{product}/stock-movementsGET /v1/companies/{company}/products/{product}/stock-movements—
public-api.v1.products.supplier-offers.create — Path movedPOST /v1/products/{product}/supplier-offersPOST /v1/companies/{company}/products/{product}/supplier-offers—
public-api.v1.products.supplier-offers.delete — Path movedDELETE /v1/products/{product}/supplier-offers/{offer}DELETE /v1/companies/{company}/products/{product}/supplier-offers/{offer}—
public-api.v1.products.supplier-offers.list — Path movedGET /v1/products/{product}/supplier-offersGET /v1/companies/{company}/products/{product}/supplier-offers—
public-api.v1.products.supplier-offers.preferred — Path movedPOST /v1/products/{product}/supplier-offers/{offer}/preferredPOST /v1/companies/{company}/products/{product}/supplier-offers/{offer}/preferred—
public-api.v1.products.supplier-offers.update — Path movedPUT /v1/products/{product}/supplier-offers/{offer}PATCH /v1/companies/{company}/products/{product}/supplier-offers/{offer}verb PUT → PATCH
public-api.v1.products.toggle_active — ChangedPOST /v1/products/{product}/toggle-activePOST /v1/companies/{company}/products/{product}/toggle-activeresponses added: 422
public-api.v1.products.update — ChangedPUT /v1/products/{product}PATCH /v1/companies/{company}/products/{product}verb PUT → PATCH; error codes documented: 409 resource_already_exists/external_id_already_exists, 409 resource_already_exists/sku_already_exists
public-api.v1.products.update_stock — Path movedPUT /v1/products/{product}/stockPATCH /v1/companies/{company}/products/{product}/stockverb PUT → PATCH
public-api.v1.products.variants.create — Path movedPOST /v1/products/{product}/variantsPOST /v1/companies/{company}/products/{product}/variants—
public-api.v1.products.variants.delete — Path movedDELETE /v1/products/{product}/variants/{variant}DELETE /v1/companies/{company}/products/{product}/variants/{variant}—
public-api.v1.products.variants.list — Path movedGET /v1/products/{product}/variantsGET /v1/companies/{company}/products/{product}/variants—
public-api.v1.products.variants.update — Path movedPUT /v1/products/{product}/variants/{variant}PATCH /v1/companies/{company}/products/{product}/variants/{variant}verb PUT → PATCH
public-api.v1.products.video.delete — ChangedDELETE /v1/products/{product}/videoDELETE /v1/companies/{company}/products/{product}/videoresponses added: 422
public-api.v1.products.video.download — Path movedGET /v1/products/{product}/video/downloadGET /v1/companies/{company}/products/{product}/video/download—
public-api.v1.products.video.upload — Path movedPOST /v1/products/{product}/videoPOST /v1/companies/{company}/products/{product}/video—

Proformas

Operations: 20 — 0 new, 17 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.proformas.accept — Path movedPOST /v1/proformas/{proforma}/acceptPOST /v1/companies/{company}/proformas/{proforma}/accept—
public-api.v1.proformas.bulk_delete — Path movedPOST /v1/proformas/bulk-deletePOST /v1/companies/{company}/proformas/bulk-delete—
public-api.v1.proformas.bulk_pdf — Path movedPOST /v1/proformas/bulk-pdfPOST /v1/companies/{company}/proformas/bulk-pdf—
public-api.v1.proformas.bulk_send — Path movedPOST /v1/proformas/bulk-sendPOST /v1/companies/{company}/proformas/bulk-send—
public-api.v1.proformas.bulk_status — Path movedPOST /v1/proformas/bulk-statusPOST /v1/companies/{company}/proformas/bulk-status—
public-api.v1.proformas.convert — ChangedPOST /v1/proformas/{proforma}/convertPOST /v1/companies/{company}/proformas/{proforma}/convertresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.proformas.create — Path movedPOST /v1/proformasPOST /v1/companies/{company}/proformas—
public-api.v1.proformas.delete — Path movedDELETE /v1/proformas/{proforma}DELETE /v1/companies/{company}/proformas/{proforma}—
public-api.v1.proformas.duplicate — ChangedPOST /v1/proformas/{proforma}/duplicatePOST /v1/companies/{company}/proformas/{proforma}/duplicateresponses added: 422
public-api.v1.proformas.find_by_external_id — Path movedPOST /v1/proformas/find-by-external-idPOST /v1/companies/{company}/proformas/find-by-external-id—
public-api.v1.proformas.list — Path movedGET /v1/proformasGET /v1/companies/{company}/proformas—
public-api.v1.proformas.pdf — Path movedGET /v1/proformas/{proforma}/pdfGET /v1/companies/{company}/proformas/{proforma}/pdf—
public-api.v1.proformas.public_link_get — Path movedGET /v1/proformas/{proforma}/public-linkGET /v1/companies/{company}/proformas/{proforma}/public-link—
public-api.v1.proformas.public_link_update — Path movedPUT /v1/proformas/{proforma}/public-linkPATCH /v1/companies/{company}/proformas/{proforma}/public-linkverb PUT → PATCH
public-api.v1.proformas.reject — Path movedPOST /v1/proformas/{proforma}/rejectPOST /v1/companies/{company}/proformas/{proforma}/reject—
public-api.v1.proformas.send — Path movedPOST /v1/proformas/{proforma}/sendPOST /v1/companies/{company}/proformas/{proforma}/send—
public-api.v1.proformas.show — Path movedGET /v1/proformas/{proforma}GET /v1/companies/{company}/proformas/{proforma}—
public-api.v1.proformas.stats — Path movedGET /v1/proformas/statsGET /v1/companies/{company}/proformas/stats—
public-api.v1.proformas.statuses — Path movedGET /v1/proformas/statusesGET /v1/companies/{company}/proformas/statuses—
public-api.v1.proformas.update — ChangedPUT /v1/proformas/{proforma}PATCH /v1/companies/{company}/proformas/{proforma}verb PUT → PATCH; error codes documented: 409 resource_already_exists/external_id_already_exists

Purchase invoices

Operations: 18 — 0 new, 6 moved to the axis, 12 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.purchase_invoices.attach_file — ChangedPOST /v1/purchase_invoices/{purchase_invoice}/attach-filePOST /v1/companies/{company}/purchase-invoices/{purchase_invoice}/attach-fileresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at; data.lines[].unit_price changes type (number|string → string)
public-api.v1.purchase_invoices.bulk_delete — Path movedPOST /v1/purchase_invoices/bulk-deletePOST /v1/companies/{company}/purchase-invoices/bulk-delete—
public-api.v1.purchase_invoices.bulk_status — Path movedPOST /v1/purchase_invoices/bulk-statusPOST /v1/companies/{company}/purchase-invoices/bulk-status—
public-api.v1.purchase_invoices.create — ChangedPOST /v1/purchase_invoicesPOST /v1/companies/{company}/purchase-invoicesresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at; data.lines[].unit_price changes type (number|string → string); error codes documented: 409 resource_already_exists/purchase_invoice_already_exists
public-api.v1.purchase_invoices.delete — Path movedDELETE /v1/purchase_invoices/{purchase_invoice}DELETE /v1/companies/{company}/purchase-invoices/{purchase_invoice}—
public-api.v1.purchase_invoices.delete_file — ChangedDELETE /v1/purchase_invoices/{purchase_invoice}/fileDELETE /v1/companies/{company}/purchase-invoices/{purchase_invoice}/fileresponses added: 422
public-api.v1.purchase_invoices.file — Path movedGET /v1/purchase_invoices/{purchase_invoice}/fileGET /v1/companies/{company}/purchase-invoices/{purchase_invoice}/file—
public-api.v1.purchase_invoices.find_by_external_id — ChangedPOST /v1/purchase_invoices/find-by-external-idPOST /v1/companies/{company}/purchase-invoices/find-by-external-idresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at; data.lines[].unit_price changes type (number|string → string)
public-api.v1.purchase_invoices.list — ChangedGET /v1/purchase_invoicesGET /v1/companies/{company}/purchase-invoicesresponse fields added: data[].paid_date, data[].paid_recorded_at; response fields removed: data[].paid_at; data[].lines[].unit_price changes type (number|string → string)
public-api.v1.purchase_invoices.list_payments — ChangedGET /v1/purchase_invoices/{purchase_invoice}/paymentsGET /v1/companies/{company}/purchase-invoices/{purchase_invoice}/paymentsresponse fields added: data[].paid_date; response fields removed: data[].paid_on
public-api.v1.purchase_invoices.mark_paid — ChangedPOST /v1/purchase_invoices/{purchase_invoice}/mark_paidPOST /v1/companies/{company}/purchase-invoices/{purchase_invoice}/mark-paidresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at; data.lines[].unit_price changes type (number|string → string)
public-api.v1.purchase_invoices.overdue — ChangedGET /v1/purchase_invoices/overdueGET /v1/companies/{company}/purchase-invoices/overdueresponse fields added: data[].paid_date, data[].paid_recorded_at; response fields removed: data[].paid_at; data[].lines[].unit_price changes type (number|string → string)
public-api.v1.purchase_invoices.payment_receipt — Path movedGET /v1/purchase_invoices/{purchase_invoice}/payment-receiptGET /v1/companies/{company}/purchase-invoices/{purchase_invoice}/payment-receipt—
public-api.v1.purchase_invoices.pending — ChangedGET /v1/purchase_invoices/pendingGET /v1/companies/{company}/purchase-invoices/pendingresponse fields added: data[].paid_date, data[].paid_recorded_at; response fields removed: data[].paid_at; data[].lines[].unit_price changes type (number|string → string)
public-api.v1.purchase_invoices.register_payment — ChangedPOST /v1/purchase_invoices/{purchase_invoice}/paymentsPOST /v1/companies/{company}/purchase-invoices/{purchase_invoice}/paymentsresponse fields added: data.paid_date; response fields removed: data.paid_on; Location header declared on 201
public-api.v1.purchase_invoices.show — ChangedGET /v1/purchase_invoices/{purchase_invoice}GET /v1/companies/{company}/purchase-invoices/{purchase_invoice}response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at; data.lines[].unit_price changes type (number|string → string)
public-api.v1.purchase_invoices.stats — Path movedGET /v1/purchase_invoices/statsGET /v1/companies/{company}/purchase-invoices/stats—
public-api.v1.purchase_invoices.update — ChangedPUT /v1/purchase_invoices/{purchase_invoice}PATCH /v1/companies/{company}/purchase-invoices/{purchase_invoice}verb PUT → PATCH; response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at; data.lines[].unit_price changes type (number|string → string); error codes documented: 409 resource_already_exists/external_id_already_exists

Quotes

Operations: 20 — 0 new, 17 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.quotes.accept — Path movedPOST /v1/quotes/{quote}/acceptPOST /v1/companies/{company}/quotes/{quote}/accept—
public-api.v1.quotes.bulk_delete — Path movedPOST /v1/quotes/bulk-deletePOST /v1/companies/{company}/quotes/bulk-delete—
public-api.v1.quotes.bulk_pdf — Path movedPOST /v1/quotes/bulk-pdfPOST /v1/companies/{company}/quotes/bulk-pdf—
public-api.v1.quotes.bulk_send — Path movedPOST /v1/quotes/bulk-sendPOST /v1/companies/{company}/quotes/bulk-send—
public-api.v1.quotes.bulk_status — Path movedPOST /v1/quotes/bulk-statusPOST /v1/companies/{company}/quotes/bulk-status—
public-api.v1.quotes.convert — ChangedPOST /v1/quotes/{quote}/convertPOST /v1/companies/{company}/quotes/{quote}/convertresponse fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on
public-api.v1.quotes.create — Path movedPOST /v1/quotesPOST /v1/companies/{company}/quotes—
public-api.v1.quotes.delete — Path movedDELETE /v1/quotes/{quote}DELETE /v1/companies/{company}/quotes/{quote}—
public-api.v1.quotes.duplicate — ChangedPOST /v1/quotes/{quote}/duplicatePOST /v1/companies/{company}/quotes/{quote}/duplicateresponses added: 422
public-api.v1.quotes.find_by_external_id — Path movedPOST /v1/quotes/find-by-external-idPOST /v1/companies/{company}/quotes/find-by-external-id—
public-api.v1.quotes.list — Path movedGET /v1/quotesGET /v1/companies/{company}/quotes—
public-api.v1.quotes.pdf — Path movedGET /v1/quotes/{quote}/pdfGET /v1/companies/{company}/quotes/{quote}/pdf—
public-api.v1.quotes.public_link_get — Path movedGET /v1/quotes/{quote}/public-linkGET /v1/companies/{company}/quotes/{quote}/public-link—
public-api.v1.quotes.public_link_update — Path movedPUT /v1/quotes/{quote}/public-linkPATCH /v1/companies/{company}/quotes/{quote}/public-linkverb PUT → PATCH
public-api.v1.quotes.reject — Path movedPOST /v1/quotes/{quote}/rejectPOST /v1/companies/{company}/quotes/{quote}/reject—
public-api.v1.quotes.send — Path movedPOST /v1/quotes/{quote}/sendPOST /v1/companies/{company}/quotes/{quote}/send—
public-api.v1.quotes.show — Path movedGET /v1/quotes/{quote}GET /v1/companies/{company}/quotes/{quote}—
public-api.v1.quotes.stats — Path movedGET /v1/quotes/statsGET /v1/companies/{company}/quotes/stats—
public-api.v1.quotes.statuses — Path movedGET /v1/quotes/statusesGET /v1/companies/{company}/quotes/statuses—
public-api.v1.quotes.update — ChangedPUT /v1/quotes/{quote}PATCH /v1/companies/{company}/quotes/{quote}verb PUT → PATCH; error codes documented: 409 resource_already_exists/external_id_already_exists

Recurring invoices

Operations: 18 — 0 new, 15 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.recurring_invoices.activate — Path movedPOST /v1/recurring_invoices/{recurring_invoice}/activatePOST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/activate—
public-api.v1.recurring_invoices.activities — Path movedGET /v1/recurring_invoices/{recurring_invoice}/activitiesGET /v1/companies/{company}/recurring-invoices/{recurring_invoice}/activities—
public-api.v1.recurring_invoices.bulk-delete — Path movedPOST /v1/recurring_invoices/bulk-deletePOST /v1/companies/{company}/recurring-invoices/bulk-delete—
public-api.v1.recurring_invoices.bulk_status — Path movedPOST /v1/recurring_invoices/bulk-statusPOST /v1/companies/{company}/recurring-invoices/bulk-status—
public-api.v1.recurring_invoices.cancel — Path movedPOST /v1/recurring_invoices/{recurring_invoice}/cancelPOST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/cancel—
public-api.v1.recurring_invoices.create — Path movedPOST /v1/recurring_invoicesPOST /v1/companies/{company}/recurring-invoices—
public-api.v1.recurring_invoices.delete — Path movedDELETE /v1/recurring_invoices/{recurring_invoice}DELETE /v1/companies/{company}/recurring-invoices/{recurring_invoice}—
public-api.v1.recurring_invoices.find_by_external_id — Path movedPOST /v1/recurring_invoices/find-by-external-idPOST /v1/companies/{company}/recurring-invoices/find-by-external-id—
public-api.v1.recurring_invoices.generate — Path movedPOST /v1/recurring_invoices/{recurring_invoice}/generatePOST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/generate—
public-api.v1.recurring_invoices.list — Path movedGET /v1/recurring_invoicesGET /v1/companies/{company}/recurring-invoices—
public-api.v1.recurring_invoices.logs — Path movedGET /v1/recurring_invoices/{recurring_invoice}/logsGET /v1/companies/{company}/recurring-invoices/{recurring_invoice}/logs—
public-api.v1.recurring_invoices.pause — ChangedPOST /v1/recurring_invoices/{recurring_invoice}/pausePOST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/pauseresponses added: 422
public-api.v1.recurring_invoices.preview — Path movedGET /v1/recurring_invoices/{recurring_invoice}/previewGET /v1/companies/{company}/recurring-invoices/{recurring_invoice}/preview—
public-api.v1.recurring_invoices.resume — Path movedPOST /v1/recurring_invoices/{recurring_invoice}/resumePOST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/resume—
public-api.v1.recurring_invoices.show — Path movedGET /v1/recurring_invoices/{recurring_invoice}GET /v1/companies/{company}/recurring-invoices/{recurring_invoice}—
public-api.v1.recurring_invoices.skip — ChangedPOST /v1/recurring_invoices/{recurring_invoice}/skipPOST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/skipresponses added: 422
public-api.v1.recurring_invoices.stats — Path movedGET /v1/recurring_invoices/statsGET /v1/companies/{company}/recurring-invoices/stats—
public-api.v1.recurring_invoices.update — ChangedPUT /v1/recurring_invoices/{recurring_invoice}PATCH /v1/companies/{company}/recurring-invoices/{recurring_invoice}verb PUT → PATCH; error codes documented: 409 resource_already_exists/external_id_already_exists

Series

Operations: 12 — 0 new, 8 moved to the axis, 4 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.series.active — Path movedGET /v1/series/activeGET /v1/companies/{company}/series/active—
public-api.v1.series.activities — Path movedGET /v1/series/{series}/activitiesGET /v1/companies/{company}/series/{series}/activities—
public-api.v1.series.archive — ChangedPOST /v1/series/{series}/archivePOST /v1/companies/{company}/series/{series}/archiveresponses added: 422
public-api.v1.series.bootstrap — ChangedPOST /v1/series/bootstrapPOST /v1/companies/{company}/series/bootstrapresponses added: 422
public-api.v1.series.create — Path movedPOST /v1/seriesPOST /v1/companies/{company}/series—
public-api.v1.series.default — Path movedGET /v1/series/defaultGET /v1/companies/{company}/series/default—
public-api.v1.series.find_by_code — Path movedPOST /v1/series/find-by-codePOST /v1/companies/{company}/series/find-by-code—
public-api.v1.series.list — Path movedGET /v1/seriesGET /v1/companies/{company}/series—
public-api.v1.series.set_default — ChangedPOST /v1/series/{series}/defaultPOST /v1/companies/{company}/series/{series}/defaultresponses added: 422
public-api.v1.series.show — Path movedGET /v1/series/{series}GET /v1/companies/{company}/series/{series}—
public-api.v1.series.stats — Path movedGET /v1/series/statsGET /v1/companies/{company}/series/stats—
public-api.v1.series.unarchive — ChangedPOST /v1/series/{series}/unarchivePOST /v1/companies/{company}/series/{series}/unarchiveresponses added: 422

Shopify

Operations: 1 — 0 new, 1 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.shopify.stores.connection_test — Path movedPOST /v1/shopify/stores/{store}/connection-testPOST /v1/companies/{company}/shopify/stores/{store}/connection-test—

Stores

Operations: 5 — 0 new, 4 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.stores.create — ChangedPOST /v1/storesPOST /v1/companies/{company}/storesLocation header declared on 201
public-api.v1.stores.disconnect — Path movedDELETE /v1/stores/{store}DELETE /v1/companies/{company}/stores/{store}—
public-api.v1.stores.index — Path movedGET /v1/storesGET /v1/companies/{company}/stores—
public-api.v1.stores.show — Path movedGET /v1/stores/{store}GET /v1/companies/{company}/stores/{store}—
public-api.v1.stores.update — Path movedPUT /v1/stores/{store}PATCH /v1/companies/{company}/stores/{store}verb PUT → PATCH

Taxes

Operations: 18 — 0 new, 11 moved to the axis, 0 moved with other changes, 6 removed, 1 unchanged.

OperationBeforeNowWhat changed
public-api.v1.tax-catalog.show — UnchangedGET /v1/tax-catalogGET /v1/tax-catalogUnchanged
public-api.v1.taxes.active — Path movedGET /v1/taxes/activeGET /v1/companies/{company}/taxes/active—
public-api.v1.taxes.by_type — Path movedGET /v1/taxes/by-typeGET /v1/companies/{company}/taxes/by-type—
public-api.v1.taxes.calculate — Path movedPOST /v1/taxes/calculatePOST /v1/companies/{company}/taxes/calculate—
public-api.v1.taxes.calculate_totals — Path movedPOST /v1/taxes/calculate-totalsPOST /v1/companies/{company}/taxes/calculate-totals—
public-api.v1.taxes.create — RemovedPOST /v1/taxes—Removed
public-api.v1.taxes.defaults — Path movedGET /v1/taxes/defaults/{docType}GET /v1/companies/{company}/taxes/defaults/{docType}—
public-api.v1.taxes.delete — RemovedDELETE /v1/taxes/{tax}—Removed
public-api.v1.taxes.for_purchases — Path movedGET /v1/taxes/for-purchasesGET /v1/companies/{company}/taxes/for-purchases—
public-api.v1.taxes.for_sales — Path movedGET /v1/taxes/for-salesGET /v1/companies/{company}/taxes/for-sales—
public-api.v1.taxes.is_in_use — Path movedGET /v1/taxes/{tax}/is-in-useGET /v1/companies/{company}/taxes/{tax}/is-in-use—
public-api.v1.taxes.list — Path movedGET /v1/taxesGET /v1/companies/{company}/taxes—
public-api.v1.taxes.set_default — RemovedPOST /v1/taxes/{tax}/set-default—Removed
public-api.v1.taxes.set_default_for_document — RemovedPUT /v1/taxes/{tax}/set-default/{docType}—Removed
public-api.v1.taxes.show — Path movedGET /v1/taxes/{tax}GET /v1/companies/{company}/taxes/{tax}—
public-api.v1.taxes.stats — Path movedGET /v1/taxes/statsGET /v1/companies/{company}/taxes/stats—
public-api.v1.taxes.toggle — RemovedPOST /v1/taxes/{tax}/toggle—Removed
public-api.v1.taxes.update — RemovedPUT /v1/taxes/{tax}—Removed

Tax reports

Operations: 9 — 0 new, 8 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.tax_reports.activities — Path movedGET /v1/tax_reports/{tax_report}/activitiesGET /v1/companies/{company}/tax-reports/{tax_report}/activities—
public-api.v1.tax_reports.download — Path movedGET /v1/tax_reports/{tax_report}/downloadGET /v1/companies/{company}/tax-reports/{tax_report}/download—
public-api.v1.tax_reports.find_by_period — Path movedPOST /v1/tax_reports/find-by-periodPOST /v1/companies/{company}/tax-reports/find-by-period—
public-api.v1.tax_reports.generate_130 — ChangedPOST /v1/tax_reports/130POST /v1/companies/{company}/tax-reports/130Location header declared on 201
public-api.v1.tax_reports.generate_303 — Path movedPOST /v1/tax_reports/303POST /v1/companies/{company}/tax-reports/303—
public-api.v1.tax_reports.generate_347 — Path movedPOST /v1/tax_reports/347POST /v1/companies/{company}/tax-reports/347—
public-api.v1.tax_reports.history — Path movedGET /v1/tax_reports/historyGET /v1/companies/{company}/tax-reports/history—
public-api.v1.tax_reports.preview — Path movedPOST /v1/tax_reports/previewPOST /v1/companies/{company}/tax-reports/preview—
public-api.v1.tax_reports.stats — Path movedGET /v1/tax_reports/statsGET /v1/companies/{company}/tax-reports/stats—

Time balances

Operations: 3 — 0 new, 3 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.time_balances.employee — Path movedGET /v1/time-balances/employee/{employee}GET /v1/companies/{company}/time-balances/employee/{employee}—
public-api.v1.time_balances.monthly_sheet — Path movedGET /v1/time-balances/monthly-sheetGET /v1/companies/{company}/time-balances/monthly-sheet—
public-api.v1.time_balances.team_summary — Path movedGET /v1/time-balances/team-summaryGET /v1/companies/{company}/time-balances/team-summary—

Time corrections

Operations: 5 — 0 new, 4 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.time_corrections.approve — Path movedPOST /v1/time-corrections/{time_correction}/approvePOST /v1/companies/{company}/time-corrections/{time_correction}/approve—
public-api.v1.time_corrections.create — ChangedPOST /v1/time-correctionsPOST /v1/companies/{company}/time-correctionsLocation header declared on 201
public-api.v1.time_corrections.list — Path movedGET /v1/time-correctionsGET /v1/companies/{company}/time-corrections—
public-api.v1.time_corrections.reject — Path movedPOST /v1/time-corrections/{time_correction}/rejectPOST /v1/companies/{company}/time-corrections/{time_correction}/reject—
public-api.v1.time_corrections.show — Path movedGET /v1/time-corrections/{time_correction}GET /v1/companies/{company}/time-corrections/{time_correction}—

Time entries

Operations: 9 — 0 new, 4 moved to the axis, 5 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.time_entries.chain.validate — Path movedGET /v1/time-entries/chain/validateGET /v1/companies/{company}/time-entries/chain/validate—
public-api.v1.time_entries.clock_in — ChangedPOST /v1/time-entries/clock-inPOST /v1/companies/{company}/time-entries/clock-inLocation header declared on 201
public-api.v1.time_entries.clock_out — ChangedPOST /v1/time-entries/clock-outPOST /v1/companies/{company}/time-entries/clock-outLocation header declared on 201
public-api.v1.time_entries.current — Path movedGET /v1/time-entries/currentGET /v1/companies/{company}/time-entries/current—
public-api.v1.time_entries.list — Path movedGET /v1/time-entriesGET /v1/companies/{company}/time-entries—
public-api.v1.time_entries.manual — ChangedPOST /v1/time-entries/manualPOST /v1/companies/{company}/time-entries/manualLocation header declared on 201
public-api.v1.time_entries.pause — ChangedPOST /v1/time-entries/pausePOST /v1/companies/{company}/time-entries/pauseLocation header declared on 201
public-api.v1.time_entries.resume — ChangedPOST /v1/time-entries/resumePOST /v1/companies/{company}/time-entries/resumeLocation header declared on 201
public-api.v1.time_entries.show — Path movedGET /v1/time-entries/{time_entry}GET /v1/companies/{company}/time-entries/{time_entry}—

Time tracking settings

Operations: 2 — 0 new, 1 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.time_tracking_settings.show — Path movedGET /v1/time-tracking-settingsGET /v1/companies/{company}/time-tracking-settings—
public-api.v1.time_tracking_settings.update — ChangedPUT /v1/time-tracking-settingsPATCH /v1/companies/{company}/time-tracking-settingsverb PUT → PATCH; the request body is now optional; clock_in_reminder_enabled is now optional; clock_in_reminder_grace_minutes is now optional; overtime_basis is now optional; overtime_tolerance_minutes is now optional

Webhooks

Operations: 11 — 0 new, 6 moved to the axis, 5 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.webhook_endpoints.create — ChangedPOST /v1/webhook_endpointsPOST /v1/companies/{company}/webhook-endpointsdata.secret can now be null
public-api.v1.webhook_endpoints.delete — Path movedDELETE /v1/webhook_endpoints/{webhook_endpoint}DELETE /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}—
public-api.v1.webhook_endpoints.deliveries.list — ChangedGET /v1/webhook_endpoints/{webhook_endpoint}/deliveriesGET /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveriesresponse fields added: data[].payload.data.object.paid_date, data[].payload.data.object.paid_recorded_at; response fields removed: data[].payload.data.object.paid_at, data[].payload.data.object.paid_on
public-api.v1.webhook_endpoints.deliveries.replay — Path movedPOST /v1/webhook_endpoints/{webhook_endpoint}/deliveries/{delivery}/replayPOST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveries/{delivery}/replay—
public-api.v1.webhook_endpoints.deliveries.show — ChangedGET /v1/webhook_endpoints/{webhook_endpoint}/deliveries/{delivery}GET /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveries/{delivery}response fields added: data.payload.data.object.paid_date, data.payload.data.object.paid_recorded_at; response fields removed: data.payload.data.object.paid_at, data.payload.data.object.paid_on
public-api.v1.webhook_endpoints.list — Path movedGET /v1/webhook_endpointsGET /v1/companies/{company}/webhook-endpoints—
public-api.v1.webhook_endpoints.ping — Path movedPOST /v1/webhook_endpoints/{webhook_endpoint}/pingPOST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/ping—
public-api.v1.webhook_endpoints.rotate_secret — ChangedPOST /v1/webhook_endpoints/{webhook_endpoint}/rotate_secretPOST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/rotate-secretdata.secret can now be null; error codes documented: 422 business_rule_violation/webhook_secret_recently_rotated
public-api.v1.webhook_endpoints.show — Path movedGET /v1/webhook_endpoints/{webhook_endpoint}GET /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}—
public-api.v1.webhook_endpoints.test_event — Path movedPOST /v1/webhook_endpoints/{webhook_endpoint}/test_eventPOST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/test-event—
public-api.v1.webhook_endpoints.update — ChangedPUT /v1/webhook_endpoints/{webhook_endpoint}PATCH /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}verb PUT → PATCH; new body fields: status

WooCommerce

Operations: 1 — 0 new, 1 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.woocommerce.stores.connection_test — Path movedPOST /v1/woocommerce/stores/{store}/connection-testPOST /v1/companies/{company}/woocommerce/stores/{store}/connection-test—

Work schedules

Operations: 11 — 0 new, 7 moved to the axis, 4 moved with other changes, 0 removed, 0 unchanged.

OperationBeforeNowWhat changed
public-api.v1.work_schedules.archive — ChangedPOST /v1/work-schedules/{schedule}/archivePOST /v1/companies/{company}/work-schedules/{schedule}/archiveresponses added: 422
public-api.v1.work_schedules.assign — Path movedPOST /v1/work-schedules/{schedule}/assignPOST /v1/companies/{company}/work-schedules/{schedule}/assign—
public-api.v1.work_schedules.assignments — Path movedGET /v1/work-schedules/{schedule}/assignmentsGET /v1/companies/{company}/work-schedules/{schedule}/assignments—
public-api.v1.work_schedules.create — ChangedPOST /v1/work-schedulesPOST /v1/companies/{company}/work-schedulesLocation header declared on 201
public-api.v1.work_schedules.employee_schedule — Path movedGET /v1/work-schedules/employee/{employee}GET /v1/companies/{company}/work-schedules/employee/{employee}—
public-api.v1.work_schedules.list — Path movedGET /v1/work-schedulesGET /v1/companies/{company}/work-schedules—
public-api.v1.work_schedules.show — Path movedGET /v1/work-schedules/{schedule}GET /v1/companies/{company}/work-schedules/{schedule}—
public-api.v1.work_schedules.stats — Path movedGET /v1/work-schedules/statsGET /v1/companies/{company}/work-schedules/stats—
public-api.v1.work_schedules.unarchive — ChangedPOST /v1/work-schedules/{schedule}/unarchivePOST /v1/companies/{company}/work-schedules/{schedule}/unarchiveresponses added: 422
public-api.v1.work_schedules.unassign — Path movedPOST /v1/work-schedules/{schedule}/unassignPOST /v1/companies/{company}/work-schedules/{schedule}/unassign—
public-api.v1.work_schedules.update — ChangedPUT /v1/work-schedules/{schedule}PATCH /v1/companies/{company}/work-schedules/{schedule}verb PUT → PATCH; the request body is now optional; mode is now optional; name is now optional; week_pattern is now optional

New endpoints16

EndpointDescription
DEL/v1/accounts/{account}/invitations/{invitation}Revoke an account invitation
POST/v1/accounts/{account}/invitationsSend an account invitation
GET/v1/accounts/{account}/invitationsList account invitations
POST/v1/accounts/{account}/invitations/{invitation}/resendResend an account invitation
POST/v1/accounts/{account}/membersAdd a member to the account
DEL/v1/accounts/{account}/members/{member}Remove a member from the account
GET/v1/accounts/{account}/membersList account members
GET/v1/accounts/{account}/members/{member}/module-accessRetrieve a member module access level
PATCH/v1/accounts/{account}/members/{member}/module-accessSet a member module access level
PATCH/v1/accounts/{account}/members/{member}Change an account member role
POST/v1/accounts/{account}/nif-transfers/acceptAccept a tax ID transfer
POST/v1/accounts/{account}/nif-transfersIssue a tax ID transfer
GET/v1/accounts/{account}/nif-transfersList issued tax ID transfers
PATCH/v1/accounts/{account}/ownerTransfer account ownership
GET/v1/accounts/{account}/usageRetrieve account usage for the current period
GET/v1/accounts/{account}/companies/{company}/issuing-readinessCheck whether a portfolio NIF can issue

Updated endpoints455

EndpointDescription
GET/v1/companies/{company}/absence-balancesList all absence balances
GET/v1/companies/{company}/absence-balances/{absence_balance}Retrieve an absence balance
GET/v1/companies/{company}/absence-calendarGet the team absence calendar
POST/v1/companies/{company}/absence-policies/{absence_policy}/archiveArchive an absence policy
POST/v1/companies/{company}/absence-policies/{absence_policy}/assignAssign a policy to employees
GET/v1/companies/{company}/absence-policies/{absence_policy}/assignmentsList a policy’s assigned employees
POST/v1/companies/{company}/absence-policies/{absence_policy}/carryoverConfigure a policy’s year-end carryover
POST/v1/companies/{company}/absence-policiesCreate an absence policy
GET/v1/companies/{company}/absence-policiesList all absence policies
GET/v1/companies/{company}/absence-policies/{absence_policy}Retrieve an absence policy
POST/v1/companies/{company}/absence-policies/{absence_policy}/unarchiveUnarchive an absence policy
POST/v1/companies/{company}/absence-policies/{absence_policy}/unassignUnassign a policy from employees
PATCH/v1/companies/{company}/absence-policies/{absence_policy}Update an absence policy
POST/v1/companies/{company}/absence-requests/{absence_request}/approveApprove an absence request
POST/v1/companies/{company}/absence-requests/{absence_request}/cancelCancel an absence request
POST/v1/companies/{company}/absence-requestsCreate an absence request
GET/v1/companies/{company}/absence-requestsList all absence requests
POST/v1/companies/{company}/absence-requests/{absence_request}/rejectReject an absence request
GET/v1/companies/{company}/absence-requests/{absence_request}Retrieve an absence request
POST/v1/companies/{company}/absence-types/{absence_type}/archiveArchive an absence type
POST/v1/companies/{company}/absence-typesCreate an absence type
GET/v1/companies/{company}/absence-typesList all absence types
GET/v1/companies/{company}/absence-types/{absence_type}Retrieve an absence type
POST/v1/companies/{company}/absence-types/{absence_type}/unarchiveUnarchive an absence type
PATCH/v1/companies/{company}/absence-types/{absence_type}Update an absence type
POST/v1/accounts/{account}/api-keysCreate an API key
GET/v1/accounts/{account}/api-keysList your API keys
POST/v1/accounts/{account}/api-keys/{api_key}/revokeRevoke an API key
POST/v1/accounts/{account}/api-keys/{api_key}/rotate-secretRotate an API key secret
GET/v1/accounts/{account}/api-keys/{api_key}Retrieve an API key
GET/v1/companies/{company}/billingRetrieve account billing details
GET/v1/companies/{company}/personalization/templatesList available personalization templates
PATCH/v1/companies/{company}/personalizationUpdate account personalization
GET/v1/meRetrieve the calling credential
POST/v1/companies/{company}/census-verificationVerify account against the AEAT census
GET/v1/companies/{company}/automations/catalogRetrieve the automation catalog
GET/v1/companies/{company}/automations/catalog/triggers/{trigger}/fieldsRetrieve the evaluable fields of a trigger
POST/v1/companies/{company}/automations/rules/{rule}/activateActivate an automation rule
POST/v1/companies/{company}/automations/rulesCreate an automation rule
DEL/v1/companies/{company}/automations/rules/{rule}Delete an automation rule
POST/v1/companies/{company}/automations/rules/{rule}/dry-runDry-run an automation rule
GET/v1/companies/{company}/automations/rulesList your automation rules
POST/v1/companies/{company}/automations/rules/{rule}/pausePause an automation rule
GET/v1/companies/{company}/automations/rules/{rule}Retrieve an automation rule
PATCH/v1/companies/{company}/automations/rules/{rule}Update an automation rule
GET/v1/companies/{company}/automations/rules/{rule}/versionsList the versions of an automation rule
GET/v1/companies/{company}/automations/rules/{rule}/versions/{version}Retrieve a version of an automation rule
GET/v1/companies/{company}/automations/runsList automation runs
POST/v1/companies/{company}/automations/runs/{run}/replayReplay the parked steps of an automation run
GET/v1/companies/{company}/automations/runs/{run}Retrieve an automation run
GET/v1/companies/{company}/automations/runs/{run}/stepsList the steps of an automation run
POST/v1/companies/{company}/automations/runs/{run}/steps/{step_index}/replayReplay one step of an automation run
GET/v1/companies/{company}/automations/usageRetrieve automation usage
POST/v1/accounts/{account}/companies/{company}/activateActivate a tax ID of the account
POST/v1/accounts/{account}/companies/activateActivate several tax IDs of the account
POST/v1/accounts/{account}/companiesRegister a tax ID in the account
GET/v1/accounts/{account}/companies/{company}/creation-statusRetrieve the creation status of a tax ID
POST/v1/accounts/{account}/companies/{company}/deactivateDeactivate a tax ID of the account
DEL/v1/accounts/{account}/companies/{company}Archive a tax ID of the account
GET/v1/accounts/{account}/companiesList the tax IDs of your account
GET/v1/accounts/{account}/companies/seat-charge-previewPreview the seat charge of adding a company
GET/v1/accounts/{account}/companies/{company}Retrieve a tax ID of the account
PATCH/v1/accounts/{account}/companies/{company}Update a tax ID of the account
POST/v1/accounts/{account}/companies/{company}/verify-creationVerify the creation of a tax ID
GET/v1/companies/{company}/contacts/{contact}/activitiesList contact activity
POST/v1/companies/{company}/contacts/{contact}/archiveArchive a contact
POST/v1/companies/{company}/contacts/{contact}/roles/{role}Assign a contact role
POST/v1/companies/{company}/contacts/bulk/archiveArchive contacts in bulk
POST/v1/companies/{company}/contacts/bulk/statusChange contact role status in bulk
POST/v1/companies/{company}/contacts/bulk-createCreate contacts in bulk
POST/v1/companies/{company}/contacts/bulk-deleteDelete contacts in bulk
PATCH/v1/companies/{company}/contacts/{contact}/roles/{role}/statusChange a contact role status
POST/v1/companies/{company}/contactsCreate a contact
DEL/v1/companies/{company}/contacts/{contact}Delete a contact
POST/v1/companies/{company}/contacts/find-by-external-idFind a contact by external ID
POST/v1/companies/{company}/contacts/find-by-tax-idFind a contact by tax ID
POST/v1/companies/{company}/contacts/importImport contacts
GET/v1/companies/{company}/contacts/import/templateDownload the contact import template
GET/v1/companies/{company}/contactsList contacts
GET/v1/companies/{company}/contacts/optionsList contact filter options
POST/v1/companies/{company}/contacts/import/previewPreview a contact import
DEL/v1/companies/{company}/contacts/{contact}/roles/{role}Remove a contact role
POST/v1/companies/{company}/contacts/{contact}/restoreRestore an archived contact
GET/v1/companies/{company}/contacts/searchSearch contacts
GET/v1/companies/{company}/contacts/{contact}Retrieve a contact
GET/v1/companies/{company}/contacts/statsGet contact statistics
PATCH/v1/companies/{company}/contacts/{contact}Update a contact
PATCH/v1/companies/{company}/contacts/{contact}/bank-accountsReplace the bank accounts of a contact
PATCH/v1/companies/{company}/contacts/{contact}/customer-profileUpdate a customer profile
PATCH/v1/companies/{company}/contacts/{contact}/supplier-profileUpdate a supplier profile
POST/v1/companies/{company}/contacts/census-verificationVerify a contact against the AEAT census
POST/v1/companies/{company}/delivery-notes/bulk-deleteBulk delete delivery notes
POST/v1/companies/{company}/delivery-notes/bulk-pdfBulk download delivery note PDFs
POST/v1/companies/{company}/delivery-notes/bulk-sendBulk send delivery notes
POST/v1/companies/{company}/delivery-notes/bulk-statusBulk change delivery note status
POST/v1/companies/{company}/delivery-notes/{delivery_note}/cancelCancel a delivery note
POST/v1/companies/{company}/delivery-notes/{delivery_note}/convertConvert delivery note to invoice
POST/v1/companies/{company}/delivery-notesCreate a delivery note
DEL/v1/companies/{company}/delivery-notes/{delivery_note}Delete a delivery note
POST/v1/companies/{company}/delivery-notes/{delivery_note}/duplicateDuplicate a delivery note
POST/v1/companies/{company}/delivery-notes/find-by-external-idFind a delivery note by external ID
GET/v1/companies/{company}/delivery-notesList all delivery notes
POST/v1/companies/{company}/delivery-notes/{delivery_note}/mark-deliveredMark delivery note as delivered
GET/v1/companies/{company}/delivery-notes/{delivery_note}/pdfDownload delivery note PDF
GET/v1/companies/{company}/delivery-notes/{delivery_note}/public-linkRetrieve a delivery note public link
PATCH/v1/companies/{company}/delivery-notes/{delivery_note}/public-linkUpdate a delivery note public link
POST/v1/companies/{company}/delivery-notes/{delivery_note}/sendSend a delivery note
GET/v1/companies/{company}/delivery-notes/{delivery_note}Retrieve a delivery note
POST/v1/companies/{company}/delivery-notes/{delivery_note}/signSign a delivery note
POST/v1/companies/{company}/delivery-notes/signature-audits/{auditId}/forgetForget delivery note signature PII
GET/v1/companies/{company}/delivery-notes/statsRetrieve delivery note stats
GET/v1/companies/{company}/delivery-notes/statusesList delivery note statuses
PATCH/v1/companies/{company}/delivery-notes/{delivery_note}Update a delivery note
GET/v1/companies/{company}/request-logsList your API request logs
GET/v1/companies/{company}/request-logs/{request_id}Retrieve an API request log
GET/v1/companies/{company}/emails/indicatorsSummarize email delivery per document
GET/v1/companies/{company}/emailsList sent emails
GET/v1/companies/{company}/emails/{email}Retrieve a sent email
DEL/v1/companies/{company}/employee-invitations/{invitation}Cancel an employee invitation
GET/v1/companies/{company}/employee-invitationsList employee invitations
POST/v1/companies/{company}/employee-invitations/{invitation}/resendResend an employee invitation
POST/v1/companies/{company}/employee-invitationsSend an employee invitation
POST/v1/accounts/{account}/employee-seats/cancelCancel the employee seat add-on
POST/v1/accounts/{account}/employee-seats/change-quantitySync the employee seat quantity
GET/v1/accounts/{account}/employee-seats/previewPreview the employee seat charge
GET/v1/accounts/{account}/employee-seatsRetrieve employee seat billing status
POST/v1/accounts/{account}/employee-seats/subscribeSubscribe to the employee seat add-on
POST/v1/companies/{company}/employeesCreate an employee
POST/v1/companies/{company}/employees/{employee}/deactivateDeactivate an employee
POST/v1/companies/{company}/employees/find-by-external-idFind an employee by external ID
GET/v1/companies/{company}/employeesList all employees
POST/v1/companies/{company}/employees/{employee}/reactivateReactivate an employee
GET/v1/companies/{company}/employees/{employee}Retrieve an employee
GET/v1/companies/{company}/employees/statsGet employee stats
PATCH/v1/companies/{company}/employees/{employee}Update an employee
GET/v1/companies/{company}/eventsList all events
GET/v1/companies/{company}/events/{event}Retrieve an event
POST/v1/companies/{company}/face-submissions/{faceSubmission}/cancelRequest FACe submission cancellation
GET/v1/companies/{company}/face-submissions/{faceSubmission}Retrieve a FACe submission
GET/v1/accounts/{account}/gestoria/workforce-summaryRetrieve the consolidated workforce compliance overview
GET/v1/companies/{company}/holidaysList all holidays
GET/v1/companies/{company}/holidays/resolveResolve applicable holidays
GET/v1/companies/{company}/holidays/{holiday}Retrieve a holiday
GET/v1/companies/{company}/integrations/eventsList integration events
POST/v1/companies/{company}/integrations/events/{event}/replayReplay a parked integration event
GET/v1/companies/{company}/integrations/events/{event}Retrieve an integration event
GET/v1/companies/{company}/invoices/{invoice}/activitiesList invoice activity
POST/v1/companies/{company}/invoices/{invoice}/annulAnnul an invoice
POST/v1/companies/{company}/invoices/{invoice}/assign-real-numberAssign a real invoice number
POST/v1/companies/{company}/invoices/bulk-createBulk create invoices
POST/v1/companies/{company}/invoices/bulk-deleteBulk delete invoices
POST/v1/companies/{company}/invoices/bulk-pdfBulk download invoice PDFs
POST/v1/companies/{company}/invoices/bulk-sendBulk send invoices
POST/v1/companies/{company}/invoices/bulk-statusBulk change invoice status
GET/v1/companies/{company}/invoices/{invoice}/can-annulCheck annulment eligibility
POST/v1/companies/{company}/invoices/{invoice}/correctiveGenerate corrective invoice
GET/v1/companies/{company}/invoices/{invoice}/correctivesList corrective invoices
POST/v1/companies/{company}/invoicesCreate an invoice
POST/v1/companies/{company}/invoices/{invoice}/create-recurringCreate a recurring invoice from an invoice
DEL/v1/companies/{company}/invoices/{invoice}Delete an invoice
POST/v1/companies/{company}/invoices/{invoice}/duplicateDuplicate an invoice
POST/v1/companies/{company}/invoices/export/excelExport invoices to a spreadsheet
GET/v1/companies/{company}/invoices/{invoice}/face-submissionsList invoice FACe submissions
POST/v1/companies/{company}/invoices/{invoice}/face-submissionsSubmit invoice to FACe
GET/v1/companies/{company}/invoices/{invoice}/facturaeDownload FacturaE XML
POST/v1/companies/{company}/invoices/find-by-external-idFind an invoice by external ID
POST/v1/companies/{company}/invoices/find-by-numberFind an invoice by number
GET/v1/companies/{company}/invoicesList all invoices
POST/v1/companies/{company}/invoices/{invoice}/mark-paidMark invoice as paid
POST/v1/companies/{company}/invoices/{invoice}/mark-sentMark an invoice as sent
GET/v1/companies/{company}/invoices/{invoice}/payment-receiptDownload the receipt PDF of a payment
POST/v1/companies/{company}/invoices/{invoice}/paymentsRegister a payment
GET/v1/companies/{company}/invoices/{invoice}/paymentsList invoice payments
POST/v1/companies/{company}/invoices/{invoice}/payments/{payment}/reversalRevert an invoice payment
GET/v1/companies/{company}/invoices/{invoice}/pdfDownload invoice PDF
GET/v1/companies/{company}/invoices/{invoice}/pdf-linkGenerate temporary PDF link
GET/v1/companies/{company}/invoices/{invoice}/pdf/previewPreview an invoice draft PDF
GET/v1/companies/{company}/invoices/{invoice}/public-linkRetrieve invoice public link
PATCH/v1/companies/{company}/invoices/{invoice}/public-linkUpdate invoice public link
GET/v1/companies/{company}/invoices/quarterly/available-quartersList quarters to export
POST/v1/companies/{company}/invoices/quarterly/download-zipGenerate quarterly ZIP archive
POST/v1/companies/{company}/invoices/quarterly/send-emailEmail quarterly ZIP to accountant
POST/v1/companies/{company}/invoices/{invoice}/reminder-previewPreview a payment reminder email
PATCH/v1/companies/{company}/invoices/{invoice}/rescheduleReschedule an invoice
POST/v1/companies/{company}/invoices/{invoice}/scheduleSchedule an invoice
POST/v1/companies/{company}/invoices/{invoice}/sendSend invoice by email
POST/v1/companies/{company}/invoices/{invoice}/send-reminderSend a payment reminder
GET/v1/companies/{company}/invoices/{invoice}Retrieve an invoice
POST/v1/companies/{company}/invoices/simplified-eligibilityCheck simplified invoice eligibility
GET/v1/companies/{company}/invoices/statsGet invoice statistics
GET/v1/companies/{company}/invoices/statusesList invoice statuses
POST/v1/companies/{company}/invoices/substitute-simplifiedSubstitute simplified invoices with full invoice
POST/v1/companies/{company}/invoices/{invoice}/unscheduleUnschedule an invoice
POST/v1/companies/{company}/invoices/{invoice}/unsendUnsend an invoice
PATCH/v1/companies/{company}/invoices/{invoice}Update an invoice
POST/v1/companies/{company}/invoices/{invoice}/verifactuForce-create VeriFactu record for invoice
GET/v1/companies/{company}/invoices/{invoice}/verifactuRetrieve invoice VeriFactu record
POST/v1/companies/{company}/invoices/{invoice}/voidVoid an invoice
POST/v1/companies/{company}/monthly-time-record-closesClose a monthly time record
GET/v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/exportDownload the closed register (RD-ley 8/2019)
GET/v1/companies/{company}/monthly-time-record-closesList all monthly time record closes
GET/v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/payroll-exportDownload the payroll export of a closed month
POST/v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/reopenReopen a monthly time record close
GET/v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/reportRetrieve the report of a closed period
POST/v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/sealSeal a monthly time record register
GET/v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/sealRetrieve the seal of a monthly register
GET/v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}Retrieve a monthly time record close
GET/v1/companies/{company}/payoutsList Stripe payouts
GET/v1/companies/{company}/payouts/{payout}Retrieve a Stripe payout
GET/v1/companies/{company}/presence/dailyList office/remote presence declarations
GET/v1/companies/{company}/presenceGet the live team presence
GET/v1/companies/{company}/presence/{employee}Retrieve an employee’s live presence
POST/v1/companies/{company}/price-listsCreate a price list
DEL/v1/companies/{company}/price-lists/{priceList}Delete a price list
DEL/v1/companies/{company}/price-lists/{priceList}/items/{item}Delete a price list item
GET/v1/companies/{company}/price-lists/{priceList}/itemsList price list items
POST/v1/companies/{company}/price-lists/{priceList}/items/{item}/purgePermanently delete a retired price list item
POST/v1/companies/{company}/price-lists/{priceList}/items/{item}/reassignReassign a retired price list item
POST/v1/companies/{company}/price-lists/{priceList}/itemsUpsert a price list item
GET/v1/companies/{company}/price-listsList price lists
GET/v1/companies/{company}/price-lists/optionsList active price list options
POST/v1/companies/{company}/price-lists/resolveResolve a catalog price
POST/v1/companies/{company}/price-lists/resolve-manyResolve many catalog prices
GET/v1/companies/{company}/price-lists/{priceList}Retrieve a price list
PATCH/v1/companies/{company}/price-lists/{priceList}Update a price list
GET/v1/companies/{company}/products/{product}/activitiesList product activity timeline
POST/v1/companies/{company}/products/bulk-deleteDelete multiple products in bulk
POST/v1/companies/{company}/products/bulk-statusBulk change product active state
POST/v1/companies/{company}/products/bulk-update-stockUpdate stock for many products
POST/v1/companies/{company}/products/{product}/configurations/impact-previewPreview the impact of restricting a catalog
GET/v1/companies/{company}/products/{product}/configurationsList product commercial combinations
POST/v1/companies/{company}/productsCreate a product
DEL/v1/companies/{company}/products/{product}Delete a product
POST/v1/companies/{company}/products/find-by-external-idFind a product by external ID
POST/v1/companies/{company}/products/find-by-skuFind a product by SKU
DEL/v1/companies/{company}/products/{product}/gallery/{index}Remove a gallery image from a product
GET/v1/companies/{company}/products/{product}/gallery/{index}/downloadDownload a product gallery image binary
POST/v1/companies/{company}/products/{product}/galleryUpload a gallery image to a product
GET/v1/companies/{company}/productsList all products
GET/v1/companies/{company}/products/low-stock-reportList products below the stock threshold
GET/v1/companies/{company}/products/{product}/optionsList product option groups
POST/v1/companies/{company}/products/{product}/presentationsCreate a product presentation
DEL/v1/companies/{company}/products/{product}/presentations/{presentation}Delete a product presentation
GET/v1/companies/{company}/products/{product}/presentationsList product presentations
PATCH/v1/companies/{company}/products/{product}/presentations/{presentation}Update a product presentation
POST/v1/companies/{company}/products/{product}/resolve-selectionResolve a catalog selection
GET/v1/companies/{company}/products/{product}/sales-analyticsGet product sales analytics
GET/v1/companies/{company}/products/searchSearch products
GET/v1/companies/{company}/products/{product}Retrieve a product
GET/v1/companies/{company}/products/statsGet product stats
GET/v1/companies/{company}/products/{product}/stock-movementsList stock movements of a product
POST/v1/companies/{company}/products/{product}/supplier-offersCreate a supplier offer
DEL/v1/companies/{company}/products/{product}/supplier-offers/{offer}Delete a supplier offer
GET/v1/companies/{company}/products/{product}/supplier-offersList supplier offers
POST/v1/companies/{company}/products/{product}/supplier-offers/{offer}/preferredSet the preferred supplier offer
PATCH/v1/companies/{company}/products/{product}/supplier-offers/{offer}Update a supplier offer
POST/v1/companies/{company}/products/{product}/toggle-activeToggle product active state
PATCH/v1/companies/{company}/products/{product}Update a product
PATCH/v1/companies/{company}/products/{product}/stockUpdate product stock
POST/v1/companies/{company}/products/{product}/variantsCreate a product variant
DEL/v1/companies/{company}/products/{product}/variants/{variant}Delete a product variant
GET/v1/companies/{company}/products/{product}/variantsList product variants
PATCH/v1/companies/{company}/products/{product}/variants/{variant}Update a product variant
DEL/v1/companies/{company}/products/{product}/videoRemove the product video
GET/v1/companies/{company}/products/{product}/video/downloadDownload the product video binary
POST/v1/companies/{company}/products/{product}/videoUpload a video to a product
POST/v1/companies/{company}/proformas/{proforma}/acceptAccept a proforma
POST/v1/companies/{company}/proformas/bulk-deleteBulk delete proformas
POST/v1/companies/{company}/proformas/bulk-pdfBulk download proforma PDFs
POST/v1/companies/{company}/proformas/bulk-sendBulk send proformas
POST/v1/companies/{company}/proformas/bulk-statusBulk change proforma status
POST/v1/companies/{company}/proformas/{proforma}/convertConvert proforma to invoice
POST/v1/companies/{company}/proformasCreate a proforma
DEL/v1/companies/{company}/proformas/{proforma}Delete a proforma
POST/v1/companies/{company}/proformas/{proforma}/duplicateDuplicate a proforma
POST/v1/companies/{company}/proformas/find-by-external-idFind a proforma by external ID
GET/v1/companies/{company}/proformasList all proformas
GET/v1/companies/{company}/proformas/{proforma}/pdfDownload proforma PDF
GET/v1/companies/{company}/proformas/{proforma}/public-linkRetrieve proforma public link
PATCH/v1/companies/{company}/proformas/{proforma}/public-linkUpdate proforma public link
POST/v1/companies/{company}/proformas/{proforma}/rejectReject a proforma
POST/v1/companies/{company}/proformas/{proforma}/sendSend proforma by email
GET/v1/companies/{company}/proformas/{proforma}Retrieve a proforma
GET/v1/companies/{company}/proformas/statsGet proforma stats
GET/v1/companies/{company}/proformas/statusesList proforma statuses
PATCH/v1/companies/{company}/proformas/{proforma}Update a proforma
POST/v1/companies/{company}/purchase-invoices/{purchase_invoice}/attach-fileAttach a file to an expense
POST/v1/companies/{company}/purchase-invoices/bulk-deleteBulk delete expenses
POST/v1/companies/{company}/purchase-invoices/bulk-statusBulk change expense status
POST/v1/companies/{company}/purchase-invoicesCreate an expense
DEL/v1/companies/{company}/purchase-invoices/{purchase_invoice}Delete an expense
DEL/v1/companies/{company}/purchase-invoices/{purchase_invoice}/fileRemove an expense file
GET/v1/companies/{company}/purchase-invoices/{purchase_invoice}/fileDownload the original expense file
POST/v1/companies/{company}/purchase-invoices/find-by-external-idFind an expense by external ID
GET/v1/companies/{company}/purchase-invoicesList all expenses
GET/v1/companies/{company}/purchase-invoices/{purchase_invoice}/paymentsList expense payments
POST/v1/companies/{company}/purchase-invoices/{purchase_invoice}/mark-paidMark expense as paid
GET/v1/companies/{company}/purchase-invoices/overdueList overdue expenses
GET/v1/companies/{company}/purchase-invoices/{purchase_invoice}/payment-receiptDownload the receipt PDF of an expense payment
GET/v1/companies/{company}/purchase-invoices/pendingList pending expenses
POST/v1/companies/{company}/purchase-invoices/{purchase_invoice}/paymentsRegister an expense payment
GET/v1/companies/{company}/purchase-invoices/{purchase_invoice}Retrieve an expense
GET/v1/companies/{company}/purchase-invoices/statsGet expense stats
PATCH/v1/companies/{company}/purchase-invoices/{purchase_invoice}Update an expense
POST/v1/companies/{company}/quotes/{quote}/acceptAccept a quote
POST/v1/companies/{company}/quotes/bulk-deleteBulk delete quotes
POST/v1/companies/{company}/quotes/bulk-pdfBulk download quote PDFs
POST/v1/companies/{company}/quotes/bulk-sendBulk send quotes
POST/v1/companies/{company}/quotes/bulk-statusBulk change quote status
POST/v1/companies/{company}/quotes/{quote}/convertConvert quote to invoice
POST/v1/companies/{company}/quotesCreate a quote
DEL/v1/companies/{company}/quotes/{quote}Delete a quote
POST/v1/companies/{company}/quotes/{quote}/duplicateDuplicate a quote
POST/v1/companies/{company}/quotes/find-by-external-idFind a quote by external ID
GET/v1/companies/{company}/quotesList all quotes
GET/v1/companies/{company}/quotes/{quote}/pdfDownload quote PDF
GET/v1/companies/{company}/quotes/{quote}/public-linkRetrieve quote public link
PATCH/v1/companies/{company}/quotes/{quote}/public-linkUpdate quote public link
POST/v1/companies/{company}/quotes/{quote}/rejectReject a quote
POST/v1/companies/{company}/quotes/{quote}/sendSend quote by email
GET/v1/companies/{company}/quotes/{quote}Retrieve a quote
GET/v1/companies/{company}/quotes/statsGet quote stats
GET/v1/companies/{company}/quotes/statusesList quote statuses
PATCH/v1/companies/{company}/quotes/{quote}Update a quote
POST/v1/companies/{company}/recurring-invoices/{recurring_invoice}/activateActivate recurring invoice
GET/v1/companies/{company}/recurring-invoices/{recurring_invoice}/activitiesList recurring invoice activity
POST/v1/companies/{company}/recurring-invoices/bulk-deleteBulk delete recurring invoices
POST/v1/companies/{company}/recurring-invoices/bulk-statusBulk change recurring invoice status
POST/v1/companies/{company}/recurring-invoices/{recurring_invoice}/cancelCancel recurring invoice
POST/v1/companies/{company}/recurring-invoicesCreate a recurring invoice
DEL/v1/companies/{company}/recurring-invoices/{recurring_invoice}Delete a recurring invoice
POST/v1/companies/{company}/recurring-invoices/find-by-external-idFind a recurring invoice by external ID
POST/v1/companies/{company}/recurring-invoices/{recurring_invoice}/generateGenerate an invoice from a recurring template
GET/v1/companies/{company}/recurring-invoicesList all recurring invoices
GET/v1/companies/{company}/recurring-invoices/{recurring_invoice}/logsList recurring invoice execution logs
POST/v1/companies/{company}/recurring-invoices/{recurring_invoice}/pausePause recurring invoice
GET/v1/companies/{company}/recurring-invoices/{recurring_invoice}/previewPreview upcoming recurring invoice dates
POST/v1/companies/{company}/recurring-invoices/{recurring_invoice}/resumeResume recurring invoice
GET/v1/companies/{company}/recurring-invoices/{recurring_invoice}Retrieve a recurring invoice
POST/v1/companies/{company}/recurring-invoices/{recurring_invoice}/skipSkip the next recurring invoice generation
GET/v1/companies/{company}/recurring-invoices/statsRetrieve recurring invoice stats
PATCH/v1/companies/{company}/recurring-invoices/{recurring_invoice}Update a recurring invoice
GET/v1/companies/{company}/series/activeList active series by document type
GET/v1/companies/{company}/series/{series}/activitiesList series activity timeline
POST/v1/companies/{company}/series/{series}/archiveArchive a series
POST/v1/companies/{company}/series/bootstrapBootstrap the default series of a company
POST/v1/companies/{company}/seriesCreate a series
GET/v1/companies/{company}/series/defaultGet the default series for a document type
POST/v1/companies/{company}/series/find-by-codeFind a series by code
GET/v1/companies/{company}/seriesList all series
POST/v1/companies/{company}/series/{series}/defaultMark a series as default for its type
GET/v1/companies/{company}/series/{series}Retrieve a series
GET/v1/companies/{company}/series/statsGet series stats
POST/v1/companies/{company}/series/{series}/unarchiveUnarchive a series
POST/v1/companies/{company}/shopify/stores/{store}/connection-testTest a Shopify store connection
POST/v1/companies/{company}/storesConnect a store
DEL/v1/companies/{company}/stores/{store}Disconnect a store
GET/v1/companies/{company}/storesList connected stores
GET/v1/companies/{company}/stores/{store}Retrieve a connected store
PATCH/v1/companies/{company}/stores/{store}Update store settings
DEL/v1/companies/{company}/connected-accounts/{account}Disconnect a connected Stripe account
GET/v1/companies/{company}/connected-accountsList connected Stripe accounts
GET/v1/companies/{company}/connected-accounts/{account}Retrieve a connected Stripe account
PATCH/v1/companies/{company}/connected-accounts/{account}Update a connected Stripe account
GET/v1/companies/{company}/stripe-autoinvoicing/configRetrieve Stripe autoinvoicing config
PATCH/v1/companies/{company}/stripe-autoinvoicing/configUpdate Stripe autoinvoicing config
GET/v1/companies/{company}/stripe-autoinvoicing/correctivesList Stripe autoinvoiced correctives
GET/v1/companies/{company}/stripe-autoinvoicing/paymentsList Stripe autoinvoiced charges
GET/v1/companies/{company}/tax-reports/{tax_report}/activitiesList tax report activities
GET/v1/companies/{company}/tax-reports/{tax_report}/downloadDownload tax report file
POST/v1/companies/{company}/tax-reports/find-by-periodFind a tax report by period
POST/v1/companies/{company}/tax-reports/130Generate Modelo 130
POST/v1/companies/{company}/tax-reports/303Generate Modelo 303
POST/v1/companies/{company}/tax-reports/347Generate Modelo 347
GET/v1/companies/{company}/tax-reports/historyList tax report history
POST/v1/companies/{company}/tax-reports/previewPreview a tax report
GET/v1/companies/{company}/tax-reports/statsRetrieve tax report stats
GET/v1/companies/{company}/taxes/activeList active taxes
GET/v1/companies/{company}/taxes/by-typeList taxes filtered by type
POST/v1/companies/{company}/taxes/calculateCalculate a tax over a base amount
POST/v1/companies/{company}/taxes/calculate-totalsCalculate totals for a set of lines
GET/v1/companies/{company}/taxes/defaults/{docType}Get default taxes for a document type
GET/v1/companies/{company}/taxes/for-purchasesList taxes applicable to purchases
GET/v1/companies/{company}/taxes/for-salesList taxes applicable to sales
GET/v1/companies/{company}/taxes/{tax}/is-in-useCheck whether a tax is in use
GET/v1/companies/{company}/taxesList all taxes
GET/v1/companies/{company}/taxes/{tax}Retrieve a tax
GET/v1/companies/{company}/taxes/statsGet tax stats
GET/v1/companies/{company}/time-balances/employee/{employee}Retrieve an employee’s time balance for a period
GET/v1/companies/{company}/time-balances/monthly-sheetRetrieve an employee’s monthly time sheet
GET/v1/companies/{company}/time-balances/team-summaryRetrieve the team time balance summary
POST/v1/companies/{company}/time-corrections/{time_correction}/approveApprove a time entry correction
POST/v1/companies/{company}/time-correctionsRequest a time entry correction
GET/v1/companies/{company}/time-correctionsList all time entry corrections
POST/v1/companies/{company}/time-corrections/{time_correction}/rejectReject a time entry correction
GET/v1/companies/{company}/time-corrections/{time_correction}Retrieve a time entry correction
GET/v1/companies/{company}/time-entries/chain/validateValidate the time record hash chain
POST/v1/companies/{company}/time-entries/clock-inClock in an employee
POST/v1/companies/{company}/time-entries/clock-outClock out an employee
GET/v1/companies/{company}/time-entries/currentRetrieve an employee’s current workday state
GET/v1/companies/{company}/time-entriesList all time entries
POST/v1/companies/{company}/time-entries/manualRecord a manual retroactive entry
POST/v1/companies/{company}/time-entries/pauseStart a pause
POST/v1/companies/{company}/time-entries/resumeResume from a pause
GET/v1/companies/{company}/time-entries/{time_entry}Retrieve a time entry
GET/v1/companies/{company}/time-tracking-settingsRetrieve the time tracking settings
PATCH/v1/companies/{company}/time-tracking-settingsUpdate the time tracking settings
GET/v1/companies/{company}/verifactu/aeat-access/recordsList AEAT access records
GET/v1/companies/{company}/verifactu/aeat-access/records/{record}Retrieve an AEAT access record
POST/v1/companies/{company}/verifactu/certificates/{certificate}/activateActivate a company certificate
GET/v1/companies/{company}/verifactu/certificates/activeRetrieve the active certificate
GET/v1/companies/{company}/verifactu/certificatesList company certificates
DEL/v1/companies/{company}/verifactu/certificates/{certificate}Revoke a company certificate
POST/v1/companies/{company}/verifactu/certificatesUpload a company certificate
GET/v1/companies/{company}/verifactu/chain/validateValidate the VeriFactu hash chain
GET/v1/companies/{company}/verifactu/configRetrieve VeriFactu config
GET/v1/companies/{company}/verifactu/declaracion-responsableRetrieve the current declaración responsable
GET/v1/companies/{company}/verifactu/declaracion-responsable/historyList declaración responsable history
GET/v1/companies/{company}/verifactu/eventsList VeriFactu events
POST/v1/companies/{company}/verifactu/events/{event}/retryRetry a VeriFactu event
GET/v1/companies/{company}/verifactu/events/{event}Retrieve a VeriFactu event
GET/v1/companies/{company}/verifactu/events/summaryGet VeriFactu event summary
GET/v1/companies/{company}/verifactu/records/{record}/activitiesList VeriFactu record activity timeline
POST/v1/companies/{company}/verifactu/records/find-by-csvFind a VeriFactu record by AEAT CSV
POST/v1/companies/{company}/verifactu/records/find-by-huellaFind a VeriFactu record by hash
POST/v1/companies/{company}/verifactu/records/find-by-invoice-numberFind a VeriFactu record by invoice number
GET/v1/companies/{company}/verifactu/recordsList VeriFactu records
POST/v1/companies/{company}/verifactu/records/{record}/retryRetry VeriFactu transmission
GET/v1/companies/{company}/verifactu/records/{record}Retrieve a VeriFactu record
POST/v1/companies/{company}/verifactu/records/{record}/subsanarSubsanar a VeriFactu record
PATCH/v1/companies/{company}/verifactu/settingsUpdate VeriFactu settings
GET/v1/companies/{company}/verifactu/statsGet VeriFactu stats
POST/v1/companies/{company}/webhook-endpointsCreate a webhook endpoint
DEL/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}Delete a webhook endpoint
GET/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveriesList webhook deliveries
POST/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveries/{delivery}/replayReplay webhook delivery
GET/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveries/{delivery}Retrieve webhook delivery
GET/v1/companies/{company}/webhook-endpointsList all webhook endpoints
POST/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/pingPing webhook endpoint
POST/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/rotate-secretRotate webhook secret
GET/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}Retrieve a webhook endpoint
POST/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/test-eventSend a test event
PATCH/v1/companies/{company}/webhook-endpoints/{webhook_endpoint}Update a webhook endpoint
POST/v1/companies/{company}/woocommerce/stores/{store}/connection-testTest a WooCommerce store connection
POST/v1/companies/{company}/work-schedules/{schedule}/archiveArchive a work schedule
POST/v1/companies/{company}/work-schedules/{schedule}/assignAssign a schedule to an employee
GET/v1/companies/{company}/work-schedules/{schedule}/assignmentsList a schedule’s assignments
POST/v1/companies/{company}/work-schedulesCreate a work schedule
GET/v1/companies/{company}/work-schedules/employee/{employee}Get an employee’s schedule on a date
GET/v1/companies/{company}/work-schedulesList all work schedules
GET/v1/companies/{company}/work-schedules/{schedule}Retrieve a work schedule
GET/v1/companies/{company}/work-schedules/statsGet work schedule stats
POST/v1/companies/{company}/work-schedules/{schedule}/unarchiveUnarchive a work schedule
POST/v1/companies/{company}/work-schedules/{schedule}/unassignUnassign a schedule from an employee
PATCH/v1/companies/{company}/work-schedules/{schedule}Update a work schedule

On this page

Need a hand?Contact support