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_atandpaid_onare gone from the published payload. An invoice and a purchase invoice publishpaid_recorded_atandpaid_date. X-Active-Profileis retired. A request that still carries the header is rejected with400 parameter_unknown, subcoderetired_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_untilreplacesseat_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:
| Resource | Routes | Operations |
|---|---|---|
absence-balances | 2 | 2 |
absence-calendar | 1 | 1 |
absence-policies | 8 | 10 |
absence-requests | 5 | 6 |
absence-types | 4 | 6 |
automations | 15 | 18 |
billing | 1 | 1 |
census-verification | 1 | 1 |
connected-accounts | 2 | 4 |
contacts | 23 | 27 |
delivery-notes | 18 | 22 |
emails | 3 | 3 |
employee-invitations | 3 | 4 |
employees | 6 | 8 |
events | 2 | 2 |
face-submissions | 2 | 2 |
holidays | 3 | 3 |
integrations | 3 | 3 |
invoices | 45 | 52 |
monthly-time-record-closes | 7 | 9 |
payouts | 2 | 2 |
personalization | 2 | 2 |
presence | 3 | 3 |
price-lists | 9 | 13 |
products | 31 | 41 |
proformas | 16 | 20 |
purchase-invoices | 13 | 18 |
quotes | 16 | 20 |
recurring-invoices | 15 | 18 |
request-logs | 2 | 2 |
series | 11 | 12 |
shopify | 1 | 1 |
stores | 2 | 5 |
stripe-autoinvoicing | 3 | 4 |
tax-reports | 9 | 9 |
taxes | 11 | 11 |
time-balances | 3 | 3 |
time-corrections | 4 | 5 |
time-entries | 9 | 9 |
time-tracking-settings | 1 | 2 |
verifactu | 24 | 25 |
webhook-endpoints | 8 | 11 |
woocommerce | 1 | 1 |
work-schedules | 9 | 11 |
| Total | 359 | 432 |
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:
| Resource | Routes | Operations |
|---|---|---|
access-level | 1 | 1 |
api-keys | 5 | 6 |
claim-tokens | 1 | 1 |
companies | 10 | 13 |
employee-seats | 5 | 5 |
gestoria | 1 | 1 |
invitations | 3 | 5 |
management | 1 | 1 |
members | 5 | 11 |
nif-transfers | 3 | 4 |
owner | 1 | 1 |
plan | 2 | 2 |
provisioning-usage | 1 | 1 |
request-logs | 2 | 2 |
usage | 1 | 1 |
webhooks | 7 | 10 |
| Total | 49 | 65 |
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.
| Route | What it is |
|---|---|
GET /v1/me | Introspection 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-catalog | Catalog of event types you can subscribe to from a company webhook endpoint. |
GET /v1/payment-methods | Catalog of payment methods accepted on a document. |
GET /v1/payroll-export-formats | Catalog of payroll export formats for the monthly close. |
GET /v1/tax-catalog | Catalog of Spanish tax rates, with no company of its own. |
GET /v1/accounts | Lists the managed accounts your account provisioned, in the environment of the key. |
POST /v1/accounts | Provisions 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/template | CSV template of the bulk import of managed accounts. |
POST /v1/accounts/imports/preview | Previews a bulk import with no effect: every row comes back with its status and its column errors. |
POST /v1/accounts/imports | Applies 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
- Underscore becomes hyphen. Five resources change their separator as they
move:
tax_reports,purchase_invoices,recurring_invoices,delivery_notesandwebhook_endpointsare nowtax-reports,purchase-invoices,recurring-invoices,delivery-notesandwebhook-endpoints. Four action segments follow them:dry_run,mark_paid,rotate_secretandtest_eventare nowdry-run,mark-paid,rotate-secretandtest-event. No path segment of the contract keeps an underscore. - 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,proformasanddelivery-noteseach publish their ownstatuses) read like global catalogs and are not: what they answer depends on the company. {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.- 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}/webhooksis not/v1/companies/{company}/webhook-endpoints, and their operations differ. See the account webhooks guide. - 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 same404 account_not_found. The provisioning root is different: in/v1/accountsandGET /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.
| Operation | Scope | What it does |
|---|---|---|
GET /v1/accounts/{account}/nif-transfers | nif_transfers:read | Lists 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-transfers | nif_transfers:write | Issues 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/accept | nif_transfers:write | Redeems 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}/invitations | invitations:read | Lists the invitations of the account, which you can filter by status (pending, accepted, revoked or expired). |
POST /v1/accounts/{account}/invitations | invitations:write | Invites 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}/resend | invitations:write | Issues 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:write | Revokes 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}/members | members:read | Lists 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}/members | members:write | Adds 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:write | Changes 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:write | Removes 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-access | members:read | Reads 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-access | members:write | Replaces 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}/owner | account:owner | Hands 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}/usage | account:read | Consumption 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-readiness | companies:read | Says 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.
| Before | Now |
|---|---|
GET /v1/companies/{company}/api-keys · api_keys:read | GET /v1/accounts/{account}/api-keys · account:read |
POST /v1/companies/{company}/api-keys · api_keys:write | POST /v1/accounts/{account}/api-keys · account:write |
GET /v1/companies/{company}/api-keys/{api_key} · api_keys:read | GET /v1/accounts/{account}/api-keys/{api_key} · account:read |
POST /v1/companies/{company}/api-keys/{api_key}/rotate-secret · api_keys:write | POST /v1/accounts/{account}/api-keys/{api_key}/rotate-secret · account:write |
DELETE /v1/companies/{company}/api-keys/{api_key} · api_keys:write | POST /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.
| Operation | Before | Scope |
|---|---|---|
public-api.v1.taxes.create | POST /v1/taxes | taxes:write |
public-api.v1.taxes.delete | DELETE /v1/taxes/{tax} | taxes:delete |
public-api.v1.taxes.update | PUT /v1/taxes/{tax} | taxes:write |
public-api.v1.taxes.set_default | POST /v1/taxes/{tax}/set-default | taxes:write |
public-api.v1.taxes.set_default_for_document | PUT /v1/taxes/{tax}/set-default/{docType} | taxes:write |
public-api.v1.taxes.toggle | POST /v1/taxes/{tax}/toggle | taxes: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.
| Operation | Before | Now |
|---|---|---|
public-api.v1.absence-policies.update | PUT /v1/absence-policies/{absence_policy} | PATCH /v1/companies/{company}/absence-policies/{absence_policy} |
public-api.v1.absence-types.update | PUT /v1/absence-types/{absence_type} | PATCH /v1/companies/{company}/absence-types/{absence_type} |
public-api.v1.automations.rules.update | PUT /v1/automations/rules/{rule} | PATCH /v1/companies/{company}/automations/rules/{rule} |
public-api.v1.contacts.change_contact_role_status | PUT /v1/contacts/{contact}/roles/{role}/status | PATCH /v1/companies/{company}/contacts/{contact}/roles/{role}/status |
public-api.v1.contacts.restore | PUT /v1/contacts/{contact}/restore | POST /v1/companies/{company}/contacts/{contact}/restore |
public-api.v1.contacts.update | PUT /v1/contacts/{contact} | PATCH /v1/companies/{company}/contacts/{contact} |
public-api.v1.contacts.update_bank_accounts | PUT /v1/contacts/{contact}/bank-accounts | PATCH /v1/companies/{company}/contacts/{contact}/bank-accounts |
public-api.v1.contacts.update_customer_profile | PUT /v1/contacts/{contact}/customer-profile | PATCH /v1/companies/{company}/contacts/{contact}/customer-profile |
public-api.v1.contacts.update_supplier_profile | PUT /v1/contacts/{contact}/supplier-profile | PATCH /v1/companies/{company}/contacts/{contact}/supplier-profile |
public-api.v1.delivery_notes.public_link.update | PUT /v1/delivery_notes/{delivery_note}/public-link | PATCH /v1/companies/{company}/delivery-notes/{delivery_note}/public-link |
public-api.v1.delivery_notes.update | PUT /v1/delivery_notes/{delivery_note} | PATCH /v1/companies/{company}/delivery-notes/{delivery_note} |
public-api.v1.employees.update | PUT /v1/employees/{employee} | PATCH /v1/companies/{company}/employees/{employee} |
public-api.v1.invoices.public_link_update | PUT /v1/invoices/{invoice}/public-link | PATCH /v1/companies/{company}/invoices/{invoice}/public-link |
public-api.v1.invoices.update | PUT /v1/invoices/{invoice} | PATCH /v1/companies/{company}/invoices/{invoice} |
public-api.v1.price-lists.update | PUT /v1/price-lists/{priceList} | PATCH /v1/companies/{company}/price-lists/{priceList} |
public-api.v1.products.presentations.update | PUT /v1/products/{product}/presentations/{presentation} | PATCH /v1/companies/{company}/products/{product}/presentations/{presentation} |
public-api.v1.products.supplier-offers.update | PUT /v1/products/{product}/supplier-offers/{offer} | PATCH /v1/companies/{company}/products/{product}/supplier-offers/{offer} |
public-api.v1.products.update | PUT /v1/products/{product} | PATCH /v1/companies/{company}/products/{product} |
public-api.v1.products.update_stock | PUT /v1/products/{product}/stock | PATCH /v1/companies/{company}/products/{product}/stock |
public-api.v1.products.variants.update | PUT /v1/products/{product}/variants/{variant} | PATCH /v1/companies/{company}/products/{product}/variants/{variant} |
public-api.v1.proformas.public_link_update | PUT /v1/proformas/{proforma}/public-link | PATCH /v1/companies/{company}/proformas/{proforma}/public-link |
public-api.v1.proformas.update | PUT /v1/proformas/{proforma} | PATCH /v1/companies/{company}/proformas/{proforma} |
public-api.v1.purchase_invoices.update | PUT /v1/purchase_invoices/{purchase_invoice} | PATCH /v1/companies/{company}/purchase-invoices/{purchase_invoice} |
public-api.v1.quotes.public_link_update | PUT /v1/quotes/{quote}/public-link | PATCH /v1/companies/{company}/quotes/{quote}/public-link |
public-api.v1.quotes.update | PUT /v1/quotes/{quote} | PATCH /v1/companies/{company}/quotes/{quote} |
public-api.v1.recurring_invoices.update | PUT /v1/recurring_invoices/{recurring_invoice} | PATCH /v1/companies/{company}/recurring-invoices/{recurring_invoice} |
public-api.v1.stores.update | PUT /v1/stores/{store} | PATCH /v1/companies/{company}/stores/{store} |
public-api.v1.stripe_autoinvoicing.accounts.update | PUT /v1/connected-accounts/{account} | PATCH /v1/companies/{company}/connected-accounts/{account} |
public-api.v1.stripe_autoinvoicing.config.update | PUT /v1/stripe-autoinvoicing/config | PATCH /v1/companies/{company}/stripe-autoinvoicing/config |
public-api.v1.time_tracking_settings.update | PUT /v1/time-tracking-settings | PATCH /v1/companies/{company}/time-tracking-settings |
public-api.v1.verifactu.settings.update | PUT /v1/verifactu/settings | PATCH /v1/companies/{company}/verifactu/settings |
public-api.v1.webhook_endpoints.update | PUT /v1/webhook_endpoints/{webhook_endpoint} | PATCH /v1/companies/{company}/webhook-endpoints/{webhook_endpoint} |
public-api.v1.work_schedules.update | PUT /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.
| Code | Status | Type | Meaning |
|---|---|---|---|
access_level_raise_forbidden | 422 | invalid_request_error | Someone 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_reached | 422 | invalid_request_error | The 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_failed | 402 | payment_required_error | The 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_plan | 403 | authorization_error | The 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_required | 402 | payment_required_error | The 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_provider | 403 | authorization_error | This 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_only | 403 | authorization_error | The 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_restricted | 403 | authorization_error | The 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_required | 422 | invalid_request_error | The 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_assigned | 422 | invalid_request_error | The account already has an external advisor marked: there can only be one per account. |
grant_company_not_in_account | 422 | invalid_request_error | The 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_member | 422 | invalid_request_error | Only 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_invalid | 422 | invalid_request_error | One 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_large | 413 | invalid_request_error | One 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_progress | 409 | conflict_error | A 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_exceeded | 422 | invalid_request_error | One 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_expired | 422 | invalid_request_error | The 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_found | 404 | not_found_error | The identifier matches no pending invitation of the authenticated company: it may have been cancelled, already accepted, or issued by a different company. |
live_credential_required | 403 | authorization_error | A 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_environment | 409 | conflict_error | The 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_claimable | 422 | invalid_request_error | The 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_serve | 422 | invalid_request_error | The 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_trial | 422 | invalid_request_error | The 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_reached | 422 | invalid_request_error | The 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_owner | 422 | invalid_request_error | The 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_found | 404 | not_found_error | The 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_expired | 422 | invalid_request_error | The 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_invalid | 422 | invalid_request_error | The 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_forbidden | 403 | authorization_error | The 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_required | 403 | authorization_error | The 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_claimed | 409 | conflict_error | The 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_exists | 422 | invalid_request_error | There 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_grantor | 422 | invalid_request_error | The 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_expired | 422 | invalid_request_error | The access invitation exists and is still pending, but its acceptance window ran out, so it can no longer be accepted. |
relation_invitation_invalid | 422 | invalid_request_error | The 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_allowed | 422 | invalid_request_error | The 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_allowed | 422 | invalid_request_error | The 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 code | Status | Replaced by |
|---|---|---|
gestoria_module_required | 403 | additional_nif_not_in_plan (403) |
gestoria_plan_required | 402 | additional_nif_plan_required (402) |
seat_charge_failed | 402 | additional_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 read | You read now |
|---|---|
paid_at on an invoice | paid_recorded_at (date-time), the instant the collection was recorded |
paid_on on an invoice | paid_date (date), the declared collection date |
paid_at on a purchase invoice | paid_date (date), the declared payment date, and paid_recorded_at (date-time), the instant the payment was recorded |
paid_on on a purchase invoice payment | paid_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.
| Field | Value |
|---|---|
| Status | 400 |
error.code | parameter_unknown |
error.type | invalid_request_error |
error.param | X-Active-Profile |
error.subcode | retired_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
idof a new configuration, option group or option value inproducts.createandproducts.update— must be a UUID v7. Any other version is rejected with422; 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
idno 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.
| Code | Status | Meaning |
|---|---|---|
idempotency_key_reused | 422 | The 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_required | 422 | The operation delivers an effect that cannot be taken back and the header was missing. Rejected before any business logic runs. |
idempotency_key_in_use | 409 | Another request with the same key is still in flight and its result is not known yet. |
idempotency_key_invalid | 400 | The 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
- Call
GET /v1/meand keepdata.account.idand everydata.scope[].id. If you work for client accounts, readdata.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. - 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. - Swap
PUTforPATCHon the thirty-two operations of the verb table, and callcontacts.restorewithPOST. - Remove
X-Active-Profilefrom your client. If you used it to act on several companies, the company segment now does it per request, without a header. - Parse every money field as a string into a fixed-decimal type, with the
four-decimal
unit_priceof a line; readpaid_recorded_atandpaid_datewhere you readpaid_atandpaid_on, and keep sendingpaid_on; readpaid_untilwhere you readseat_paid_until. - Move any call to the API keys of one company to
/v1/accounts/{account}/api-keys, restrict the key withscoped_company_ids, and swapapi_keys:*foraccount:read/account:writeon your keys. - Change
claim-tokensfornif-transfersif you integrated the tax ID transfer against a pre-release build: scopesnif_transfers:readandnif_transfers:write, codesnif_transfer_expiredandnif_transfer_invalid. - Treat the codes of the additional tax ID gate:
additional_nif_charge_failedwhere you handledseat_charge_failed,additional_nif_plan_requiredwhere you handledgestoria_plan_required,additional_nif_not_in_planwhere you handledgestoria_module_required, andbilling_managed_by_providerfor an account whose billing another account pays. - Treat the
403codes of the account model:privileged_scope_required,live_credential_required,company_read_only,emitter_capability_restricted,owner_transfer_forbidden,additional_nif_not_in_planandbilling_managed_by_provider. Branch oncode, not onmessage. - Stop calling the writes of the tax catalog: read it with
GET /v1/companies/{company}/taxesorGET /v1/tax-catalog. - Add the thirty-seven new codes and
parameter_unknownto your error handling, readidempotency_key_reusedas a422, and treat a404on an axis segment as "out of reach", not as a transient failure. - Replay your integration with a
fact_test_key before you move live traffic. - 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.
| Change | Operations |
|---|---|
error code 400 parameter_unknown/retired_active_profile_header documented | 459 |
error code 400 unsupported_api_version documented | 459 |
error code 403 company_inactive documented | 432 |
error code 404 profile_not_found documented | 432 |
error code 400 parameter_invalid_format documented | 430 |
response 400 added | 426 |
error code 422 idempotency_key_reused documented | 260 |
error code 409 idempotency_key_reused no longer documented | 210 |
response 404 added | 190 |
error code 404 resource_not_found documented | 187 |
response 409 removed | 181 |
error code 422 invalid_param_format documented | 160 |
error code 422 idempotency_key_required documented | 114 |
error code 409 resource_conflict no longer documented | 59 |
error code 409 resource_conflict documented | 54 |
parameter X-Active-Profile removed | 459 |
path parameter {company} added | 432 |
path parameter {account} added | 22 |
amounts and unit_price become decimal strings | 147 |
Absence balances
Operations: 2 — 0 new, 2 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.absence-balances.list — Path moved | GET /v1/absence-balances | GET /v1/companies/{company}/absence-balances | — |
public-api.v1.absence-balances.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.absence-calendar.show — Path moved | GET /v1/absence-calendar | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.absence-policies.archive — Changed | POST /v1/absence-policies/{absence_policy}/archive | POST /v1/companies/{company}/absence-policies/{absence_policy}/archive | responses added: 422 |
public-api.v1.absence-policies.assign — Path moved | POST /v1/absence-policies/{absence_policy}/assign | POST /v1/companies/{company}/absence-policies/{absence_policy}/assign | — |
public-api.v1.absence-policies.assignments — Path moved | GET /v1/absence-policies/{absence_policy}/assignments | GET /v1/companies/{company}/absence-policies/{absence_policy}/assignments | — |
public-api.v1.absence-policies.carryover — Path moved | POST /v1/absence-policies/{absence_policy}/carryover | POST /v1/companies/{company}/absence-policies/{absence_policy}/carryover | — |
public-api.v1.absence-policies.create — Changed | POST /v1/absence-policies | POST /v1/companies/{company}/absence-policies | Location header declared on 201 |
public-api.v1.absence-policies.list — Path moved | GET /v1/absence-policies | GET /v1/companies/{company}/absence-policies | — |
public-api.v1.absence-policies.show — Path moved | GET /v1/absence-policies/{absence_policy} | GET /v1/companies/{company}/absence-policies/{absence_policy} | — |
public-api.v1.absence-policies.unarchive — Changed | POST /v1/absence-policies/{absence_policy}/unarchive | POST /v1/companies/{company}/absence-policies/{absence_policy}/unarchive | responses added: 422 |
public-api.v1.absence-policies.unassign — Path moved | POST /v1/absence-policies/{absence_policy}/unassign | POST /v1/companies/{company}/absence-policies/{absence_policy}/unassign | — |
public-api.v1.absence-policies.update — Path moved | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.absence-requests.approve — Path moved | POST /v1/absence-requests/{absence_request}/approve | POST /v1/companies/{company}/absence-requests/{absence_request}/approve | — |
public-api.v1.absence-requests.cancel — Changed | POST /v1/absence-requests/{absence_request}/cancel | POST /v1/companies/{company}/absence-requests/{absence_request}/cancel | responses added: 422 |
public-api.v1.absence-requests.create — Changed | POST /v1/absence-requests | POST /v1/companies/{company}/absence-requests | Location header declared on 201 |
public-api.v1.absence-requests.list — Path moved | GET /v1/absence-requests | GET /v1/companies/{company}/absence-requests | — |
public-api.v1.absence-requests.reject — Path moved | POST /v1/absence-requests/{absence_request}/reject | POST /v1/companies/{company}/absence-requests/{absence_request}/reject | — |
public-api.v1.absence-requests.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.absence-types.archive — Changed | POST /v1/absence-types/{absence_type}/archive | POST /v1/companies/{company}/absence-types/{absence_type}/archive | responses added: 422 |
public-api.v1.absence-types.create — Changed | POST /v1/absence-types | POST /v1/companies/{company}/absence-types | Location header declared on 201 |
public-api.v1.absence-types.list — Path moved | GET /v1/absence-types | GET /v1/companies/{company}/absence-types | — |
public-api.v1.absence-types.show — Path moved | GET /v1/absence-types/{absence_type} | GET /v1/companies/{company}/absence-types/{absence_type} | — |
public-api.v1.absence-types.unarchive — Changed | POST /v1/absence-types/{absence_type}/unarchive | POST /v1/companies/{company}/absence-types/{absence_type}/unarchive | responses added: 422 |
public-api.v1.absence-types.update — Path moved | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.account.api_keys.create — Changed | POST /v1/account/api-keys | POST /v1/accounts/{account}/api-keys | new 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 — Changed | GET /v1/account/api-keys | GET /v1/accounts/{account}/api-keys | error codes documented: 404 account_not_found |
public-api.v1.account.api_keys.revoke — Changed | POST /v1/account/api-keys/{api_key}/revoke | POST /v1/accounts/{account}/api-keys/{api_key}/revoke | error codes documented: 404 account_not_found |
public-api.v1.account.api_keys.rotate_secret — Changed | POST /v1/account/api-keys/{api_key}/rotate_secret | POST /v1/accounts/{account}/api-keys/{api_key}/rotate-secret | data.secret can now be null; error codes documented: 404 account_not_found |
public-api.v1.account.api_keys.show — Changed | GET /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-scope | New |
public-api.v1.account.billing — Path moved | GET /v1/account/billing | GET /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}/invitations | New |
public-api.v1.account.invitations.list — New | — | GET /v1/accounts/{account}/invitations | New |
public-api.v1.account.invitations.resend — New | — | POST /v1/accounts/{account}/invitations/{invitation}/resend | New |
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}/members | New |
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}/grants | New |
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}/members | New |
public-api.v1.account.members.module_access.show — New | — | GET /v1/accounts/{account}/members/{member}/module-access | New |
public-api.v1.account.members.module_access.update — New | — | PATCH /v1/accounts/{account}/members/{member}/module-access | New |
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/accept | New |
public-api.v1.account.nif_transfers.create — New | — | POST /v1/accounts/{account}/nif-transfers | New |
public-api.v1.account.nif_transfers.list — New | — | GET /v1/accounts/{account}/nif-transfers | New |
public-api.v1.account.nif_transfers.revoke — New | — | POST /v1/accounts/{account}/nif-transfers/{nif_transfer}/revoke | New |
public-api.v1.account.owner.transfer — New | — | PATCH /v1/accounts/{account}/owner | New |
public-api.v1.account.personalization.templates — Path moved | GET /v1/account/personalization/templates | GET /v1/companies/{company}/personalization/templates | — |
public-api.v1.account.personalization.update — Path moved | PATCH /v1/account/personalization | PATCH /v1/companies/{company}/personalization | — |
public-api.v1.account.provisioning_usage — New | — | GET /v1/accounts/{account}/provisioning-usage | New |
public-api.v1.account.request_logs.list — New | — | GET /v1/accounts/{account}/request-logs | New |
public-api.v1.account.request_logs.show — New | — | GET /v1/accounts/{account}/request-logs/{request_id} | New |
public-api.v1.account.show — Changed | GET /v1/account | GET /v1/me | scope 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}/usage | New |
public-api.v1.account.verify_census — Path moved | POST /v1/account/census-verification | POST /v1/companies/{company}/census-verification | — |
public-api.v1.account.webhooks.create — New | — | POST /v1/accounts/{account}/webhooks | New |
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}/deliveries | New |
public-api.v1.account.webhooks.deliveries.retry — New | — | POST /v1/accounts/{account}/webhooks/{webhook}/deliveries/{delivery}/retry | New |
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}/webhooks | New |
public-api.v1.account.webhooks.rotate_secret — New | — | POST /v1/accounts/{account}/webhooks/{webhook}/secret | New |
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}/test | New |
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-level | New |
public-api.v1.managed_accounts.claim_tokens.create — New | — | POST /v1/accounts/{account}/claim-tokens | New |
public-api.v1.managed_accounts.create — New | — | POST /v1/accounts | New |
public-api.v1.managed_accounts.imports.create — New | — | POST /v1/accounts/imports | New |
public-api.v1.managed_accounts.imports.preview — New | — | POST /v1/accounts/imports/preview | New |
public-api.v1.managed_accounts.imports.template — New | — | GET /v1/accounts/imports/template | New |
public-api.v1.managed_accounts.list — New | — | GET /v1/accounts | New |
public-api.v1.managed_accounts.management.end — New | — | DELETE /v1/accounts/{account}/management | New |
public-api.v1.managed_accounts.plan.preview — New | — | GET /v1/accounts/{account}/plan/preview | New |
public-api.v1.managed_accounts.plan.update — New | — | PATCH /v1/accounts/{account}/plan | New |
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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.automations.catalog.show — Changed | GET /v1/automations/catalog | GET /v1/companies/{company}/automations/catalog | 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.automations.catalog.trigger_fields — Changed | GET /v1/automations/catalog/triggers/{trigger}/fields | GET /v1/companies/{company}/automations/catalog/triggers/{trigger}/fields | 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.activate — Changed | POST /v1/automations/rules/{rule}/activate | POST /v1/companies/{company}/automations/rules/{rule}/activate | 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.create — Changed | POST /v1/automations/rules | POST /v1/companies/{company}/automations/rules | 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: 409 resource_already_exists/tax_id_already_exists |
public-api.v1.automations.rules.delete — Changed | DELETE /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 — Changed | POST /v1/automations/rules/{rule}/dry_run | POST /v1/companies/{company}/automations/rules/{rule}/dry-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, 409 resource_already_exists/tax_id_already_exists |
public-api.v1.automations.rules.list — Changed | GET /v1/automations/rules | GET /v1/companies/{company}/automations/rules | 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: 422 invalid_param_format |
public-api.v1.automations.rules.pause — Changed | POST /v1/automations/rules/{rule}/pause | POST /v1/companies/{company}/automations/rules/{rule}/pause | 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.show — Changed | GET /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 — Changed | PUT /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 — Changed | GET /v1/automations/rules/{rule}/versions | GET /v1/companies/{company}/automations/rules/{rule}/versions | 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, 422 invalid_param_format |
public-api.v1.automations.rules.versions.show — Changed | GET /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 — Changed | GET /v1/automations/runs | GET /v1/companies/{company}/automations/runs | 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: 422 invalid_param_format |
public-api.v1.automations.runs.replay — Changed | POST /v1/automations/runs/{run}/replay | POST /v1/companies/{company}/automations/runs/{run}/replay | 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.runs.show — Changed | GET /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 — Changed | GET /v1/automations/runs/{run}/steps | GET /v1/companies/{company}/automations/runs/{run}/steps | 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, 422 invalid_param_format |
public-api.v1.automations.runs.steps.replay — Changed | POST /v1/automations/runs/{run}/steps/{step_index}/replay | POST /v1/companies/{company}/automations/runs/{run}/steps/{step_index}/replay | 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.usage.show — Changed | GET /v1/automations/usage | GET /v1/companies/{company}/automations/usage | 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 |
Companies
Operations: 19 — 2 new, 0 moved to the axis, 12 moved with other changes, 5 removed, 0 unchanged.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.companies.activate — Changed | POST /v1/companies/{company}/activate | POST /v1/accounts/{account}/companies/{company}/activate | response 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 — Changed | POST /v1/companies/activate | POST /v1/accounts/{account}/companies/activate | response 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 — Removed | POST /v1/companies/{company}/api-keys | — | Removed |
public-api.v1.companies.api_keys.list — Removed | GET /v1/companies/{company}/api-keys | — | Removed |
public-api.v1.companies.api_keys.revoke — Removed | DELETE /v1/companies/{company}/api-keys/{api_key} | — | Removed |
public-api.v1.companies.api_keys.rotate_secret — Removed | POST /v1/companies/{company}/api-keys/{api_key}/rotate-secret | — | Removed |
public-api.v1.companies.api_keys.show — Removed | GET /v1/companies/{company}/api-keys/{api_key} | — | Removed |
public-api.v1.companies.create — Changed | POST /v1/companies | POST /v1/accounts/{account}/companies | response 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 — Changed | GET /v1/companies/{company}/creation-status | GET /v1/accounts/{account}/companies/{company}/creation-status | error codes documented: 404 account_not_found |
public-api.v1.companies.deactivate — Changed | POST /v1/companies/{company}/deactivate | POST /v1/accounts/{account}/companies/{company}/deactivate | responses 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 — Changed | DELETE /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-readiness | New |
public-api.v1.companies.list — Changed | GET /v1/companies | GET /v1/accounts/{account}/companies | new 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 — Changed | GET /v1/companies/seat-charge-preview | GET /v1/accounts/{account}/companies/seat-charge-preview | company_ids[] is now optional; error codes documented: 404 account_not_found |
public-api.v1.companies.show — Changed | GET /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/stats | New |
public-api.v1.companies.update — Changed | PATCH /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 — Changed | POST /v1/companies/{company}/verify-creation | POST /v1/accounts/{account}/companies/{company}/verify-creation | responses added: 422; error codes documented: 403 company_read_only, 404 account_not_found |
public-api.v1.gestoria.workforce_summary — Changed | GET /v1/gestoria/workforce-summary | GET /v1/accounts/{account}/gestoria/workforce-summary | error 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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.contacts.activities — Changed | GET /v1/contacts/{contact}/activities | GET /v1/companies/{company}/contacts/{contact}/activities | 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, 422 invalid_param_format |
public-api.v1.contacts.archive — Changed | POST /v1/contacts/{contact}/archive | POST /v1/companies/{company}/contacts/{contact}/archive | 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.assign_contact_role — Changed | POST /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 — Changed | POST /v1/contacts/bulk/archive | POST /v1/companies/{company}/contacts/bulk/archive | 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: 409 resource_already_exists/tax_id_already_exists |
public-api.v1.contacts.bulk_change_contact_role_status — Changed | POST /v1/contacts/bulk/status | POST /v1/companies/{company}/contacts/bulk/status | 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: 409 resource_already_exists/tax_id_already_exists |
public-api.v1.contacts.bulk_create — Path moved | POST /v1/contacts/bulk-create | POST /v1/companies/{company}/contacts/bulk-create | — |
public-api.v1.contacts.bulk_delete — Changed | POST /v1/contacts/bulk-delete | POST /v1/companies/{company}/contacts/bulk-delete | 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: 409 resource_already_exists/tax_id_already_exists |
public-api.v1.contacts.change_contact_role_status — Changed | PUT /v1/contacts/{contact}/roles/{role}/status | PATCH /v1/companies/{company}/contacts/{contact}/roles/{role}/status | 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.contacts.create — Changed | POST /v1/contacts | POST /v1/companies/{company}/contacts | responses 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 — Changed | DELETE /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 — Changed | POST /v1/contacts/find-by-external-id | POST /v1/companies/{company}/contacts/find-by-external-id | error 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 — Changed | POST /v1/contacts/find-by-tax-id | POST /v1/companies/{company}/contacts/find-by-tax-id | error 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 — Changed | POST /v1/contacts/import | POST /v1/companies/{company}/contacts/import | 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) |
public-api.v1.contacts.import_template — Changed | GET /v1/contacts/import/template | GET /v1/companies/{company}/contacts/import/template | 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.list — Changed | GET /v1/contacts | GET /v1/companies/{company}/contacts | 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: 422 invalid_param_format |
public-api.v1.contacts.options — Changed | GET /v1/contacts/options | GET /v1/companies/{company}/contacts/options | 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: 422 invalid_param_format |
public-api.v1.contacts.preview_import — Changed | POST /v1/contacts/import/preview | POST /v1/companies/{company}/contacts/import/preview | 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: 409 resource_already_exists/tax_id_already_exists |
public-api.v1.contacts.remove_contact_role — Changed | DELETE /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 — Changed | PUT /v1/contacts/{contact}/restore | POST /v1/companies/{company}/contacts/{contact}/restore | verb 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 — Changed | GET /v1/contacts/search | GET /v1/companies/{company}/contacts/search | 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: 422 invalid_param_format |
public-api.v1.contacts.show — Changed | GET /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 — Changed | GET /v1/contacts/stats | GET /v1/companies/{company}/contacts/stats | 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.update — Changed | PUT /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 — Changed | PUT /v1/contacts/{contact}/bank-accounts | PATCH /v1/companies/{company}/contacts/{contact}/bank-accounts | 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.contacts.update_customer_profile — Changed | PUT /v1/contacts/{contact}/customer-profile | PATCH /v1/companies/{company}/contacts/{contact}/customer-profile | 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.contacts.update_supplier_profile — Changed | PUT /v1/contacts/{contact}/supplier-profile | PATCH /v1/companies/{company}/contacts/{contact}/supplier-profile | 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.contacts.verify_census — Path moved | POST /v1/contacts/census-verification | POST /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.delivery_notes.bulk_delete — Path moved | POST /v1/delivery_notes/bulk-delete | POST /v1/companies/{company}/delivery-notes/bulk-delete | — |
public-api.v1.delivery_notes.bulk_pdf — Path moved | POST /v1/delivery_notes/bulk-pdf | POST /v1/companies/{company}/delivery-notes/bulk-pdf | — |
public-api.v1.delivery_notes.bulk_send — Path moved | POST /v1/delivery_notes/bulk-send | POST /v1/companies/{company}/delivery-notes/bulk-send | — |
public-api.v1.delivery_notes.bulk_status — Path moved | POST /v1/delivery_notes/bulk-status | POST /v1/companies/{company}/delivery-notes/bulk-status | — |
public-api.v1.delivery_notes.cancel — Path moved | POST /v1/delivery_notes/{delivery_note}/cancel | POST /v1/companies/{company}/delivery-notes/{delivery_note}/cancel | — |
public-api.v1.delivery_notes.convert — Changed | POST /v1/delivery_notes/{delivery_note}/convert | POST /v1/companies/{company}/delivery-notes/{delivery_note}/convert | response 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 moved | POST /v1/delivery_notes | POST /v1/companies/{company}/delivery-notes | — |
public-api.v1.delivery_notes.delete — Path moved | DELETE /v1/delivery_notes/{delivery_note} | DELETE /v1/companies/{company}/delivery-notes/{delivery_note} | — |
public-api.v1.delivery_notes.duplicate — Changed | POST /v1/delivery_notes/{delivery_note}/duplicate | POST /v1/companies/{company}/delivery-notes/{delivery_note}/duplicate | responses added: 422 |
public-api.v1.delivery_notes.find_by_external_id — Path moved | POST /v1/delivery_notes/find-by-external-id | POST /v1/companies/{company}/delivery-notes/find-by-external-id | — |
public-api.v1.delivery_notes.list — Path moved | GET /v1/delivery_notes | GET /v1/companies/{company}/delivery-notes | — |
public-api.v1.delivery_notes.mark_delivered — Path moved | POST /v1/delivery_notes/{delivery_note}/mark-delivered | POST /v1/companies/{company}/delivery-notes/{delivery_note}/mark-delivered | — |
public-api.v1.delivery_notes.pdf — Path moved | GET /v1/delivery_notes/{delivery_note}/pdf | GET /v1/companies/{company}/delivery-notes/{delivery_note}/pdf | — |
public-api.v1.delivery_notes.public_link.get — Path moved | GET /v1/delivery_notes/{delivery_note}/public-link | GET /v1/companies/{company}/delivery-notes/{delivery_note}/public-link | — |
public-api.v1.delivery_notes.public_link.update — Path moved | PUT /v1/delivery_notes/{delivery_note}/public-link | PATCH /v1/companies/{company}/delivery-notes/{delivery_note}/public-link | verb PUT → PATCH |
public-api.v1.delivery_notes.send — Path moved | POST /v1/delivery_notes/{delivery_note}/send | POST /v1/companies/{company}/delivery-notes/{delivery_note}/send | — |
public-api.v1.delivery_notes.show — Path moved | GET /v1/delivery_notes/{delivery_note} | GET /v1/companies/{company}/delivery-notes/{delivery_note} | — |
public-api.v1.delivery_notes.sign — Path moved | POST /v1/delivery_notes/{delivery_note}/sign | POST /v1/companies/{company}/delivery-notes/{delivery_note}/sign | — |
public-api.v1.delivery_notes.signature_audits.forget — Path moved | POST /v1/delivery_notes/signature-audits/{auditId}/forget | POST /v1/companies/{company}/delivery-notes/signature-audits/{auditId}/forget | — |
public-api.v1.delivery_notes.stats — Path moved | GET /v1/delivery_notes/stats | GET /v1/companies/{company}/delivery-notes/stats | — |
public-api.v1.delivery_notes.statuses — Path moved | GET /v1/delivery_notes/statuses | GET /v1/companies/{company}/delivery-notes/statuses | — |
public-api.v1.delivery_notes.update — Changed | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.developers.request_logs.list — Path moved | GET /v1/developers/request-logs | GET /v1/companies/{company}/request-logs | — |
public-api.v1.developers.request_logs.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.emails.indicators — Path moved | GET /v1/emails/indicators | GET /v1/companies/{company}/emails/indicators | — |
public-api.v1.emails.list — Path moved | GET /v1/emails | GET /v1/companies/{company}/emails | — |
public-api.v1.emails.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.employee-invitations.cancel — Changed | DELETE /v1/employee-invitations/{invitation} | DELETE /v1/companies/{company}/employee-invitations/{invitation} | responses added: 422 |
public-api.v1.employee-invitations.list — Path moved | GET /v1/employee-invitations | GET /v1/companies/{company}/employee-invitations | — |
public-api.v1.employee-invitations.resend — Path moved | POST /v1/employee-invitations/{invitation}/resend | POST /v1/companies/{company}/employee-invitations/{invitation}/resend | — |
public-api.v1.employee-invitations.send — Changed | POST /v1/employee-invitations | POST /v1/companies/{company}/employee-invitations | Location header declared on 201 |
public-api.v1.employee-seats.cancel — Changed | POST /v1/employee-seats/cancel | POST /v1/accounts/{account}/employee-seats/cancel | error codes documented: 404 account_not_found |
public-api.v1.employee-seats.change-quantity — Changed | POST /v1/employee-seats/change-quantity | POST /v1/accounts/{account}/employee-seats/change-quantity | error codes documented: 404 account_not_found |
public-api.v1.employee-seats.preview — Changed | GET /v1/employee-seats/preview | GET /v1/accounts/{account}/employee-seats/preview | error codes documented: 404 account_not_found |
public-api.v1.employee-seats.status — Changed | GET /v1/employee-seats | GET /v1/accounts/{account}/employee-seats | error codes documented: 404 account_not_found |
public-api.v1.employee-seats.subscribe — Changed | POST /v1/employee-seats/subscribe | POST /v1/accounts/{account}/employee-seats/subscribe | error codes documented: 404 account_not_found |
public-api.v1.employees.create — Changed | POST /v1/employees | POST /v1/companies/{company}/employees | Location header declared on 201; error codes documented: 409 resource_already_exists/external_id_already_exists |
public-api.v1.employees.deactivate — Path moved | POST /v1/employees/{employee}/deactivate | POST /v1/companies/{company}/employees/{employee}/deactivate | — |
public-api.v1.employees.find_by_external_id — Path moved | POST /v1/employees/find-by-external-id | POST /v1/companies/{company}/employees/find-by-external-id | — |
public-api.v1.employees.list — Path moved | GET /v1/employees | GET /v1/companies/{company}/employees | — |
public-api.v1.employees.reactivate — Path moved | POST /v1/employees/{employee}/reactivate | POST /v1/companies/{company}/employees/{employee}/reactivate | — |
public-api.v1.employees.show — Path moved | GET /v1/employees/{employee} | GET /v1/companies/{company}/employees/{employee} | — |
public-api.v1.employees.stats — Path moved | GET /v1/employees/stats | GET /v1/companies/{company}/employees/stats | — |
public-api.v1.employees.update — Changed | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.event_catalog.list — Unchanged | GET /v1/event-catalog | GET /v1/event-catalog | Unchanged |
public-api.v1.events.list — Changed | GET /v1/events | GET /v1/companies/{company}/events | 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 |
public-api.v1.events.show — Changed | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.face_submissions.cancel — Path moved | POST /v1/face-submissions/{faceSubmission}/cancel | POST /v1/companies/{company}/face-submissions/{faceSubmission}/cancel | — |
public-api.v1.face_submissions.show — Path moved | GET /v1/face-submissions/{faceSubmission} | GET /v1/companies/{company}/face-submissions/{faceSubmission} | — |
public-api.v1.invoices.face_submissions.list — Path moved | GET /v1/invoices/{invoice}/face-submissions | GET /v1/companies/{company}/invoices/{invoice}/face-submissions | — |
public-api.v1.invoices.face_submissions.submit — Changed | POST /v1/invoices/{invoice}/face-submissions | POST /v1/companies/{company}/invoices/{invoice}/face-submissions | error codes documented: 409 resource_already_exists/face_submission_already_exists |
public-api.v1.invoices.facturae — Path moved | GET /v1/invoices/{invoice}/facturae | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.holidays.list — Path moved | GET /v1/holidays | GET /v1/companies/{company}/holidays | — |
public-api.v1.holidays.resolve — Path moved | GET /v1/holidays/resolve | GET /v1/companies/{company}/holidays/resolve | — |
public-api.v1.holidays.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.integrations.events.list — Path moved | GET /v1/integrations/events | GET /v1/companies/{company}/integrations/events | — |
public-api.v1.integrations.events.replay — Path moved | POST /v1/integrations/events/{event}/replay | POST /v1/companies/{company}/integrations/events/{event}/replay | — |
public-api.v1.integrations.events.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.invoices.activities — Path moved | GET /v1/invoices/{invoice}/activities | GET /v1/companies/{company}/invoices/{invoice}/activities | — |
public-api.v1.invoices.annul — Changed | POST /v1/invoices/{invoice}/annul | POST /v1/companies/{company}/invoices/{invoice}/annul | response 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 — Changed | POST /v1/invoices/{invoice}/assign-real-number | POST /v1/companies/{company}/invoices/{invoice}/assign-real-number | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.bulk_create — Changed | POST /v1/invoices/bulk-create | POST /v1/companies/{company}/invoices/bulk-create | new 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 moved | POST /v1/invoices/bulk-delete | POST /v1/companies/{company}/invoices/bulk-delete | — |
public-api.v1.invoices.bulk_pdf — Path moved | POST /v1/invoices/bulk-pdf | POST /v1/companies/{company}/invoices/bulk-pdf | — |
public-api.v1.invoices.bulk_send — Path moved | POST /v1/invoices/bulk-send | POST /v1/companies/{company}/invoices/bulk-send | — |
public-api.v1.invoices.bulk_status — Path moved | POST /v1/invoices/bulk-status | POST /v1/companies/{company}/invoices/bulk-status | — |
public-api.v1.invoices.can_annul — Path moved | GET /v1/invoices/{invoice}/can-annul | GET /v1/companies/{company}/invoices/{invoice}/can-annul | — |
public-api.v1.invoices.corrective — Changed | POST /v1/invoices/{invoice}/corrective | POST /v1/companies/{company}/invoices/{invoice}/corrective | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.correctives — Changed | GET /v1/invoices/{invoice}/correctives | GET /v1/companies/{company}/invoices/{invoice}/correctives | response fields added: data[].paid_date, data[].paid_recorded_at; response fields removed: data[].paid_at, data[].paid_on |
public-api.v1.invoices.create — Changed | POST /v1/invoices | POST /v1/companies/{company}/invoices | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.create_recurring — Changed | POST /v1/invoices/{invoice}/create-recurring | POST /v1/companies/{company}/invoices/{invoice}/create-recurring | Location header declared on 201 |
public-api.v1.invoices.delete — Path moved | DELETE /v1/invoices/{invoice} | DELETE /v1/companies/{company}/invoices/{invoice} | — |
public-api.v1.invoices.duplicate — Changed | POST /v1/invoices/{invoice}/duplicate | POST /v1/companies/{company}/invoices/{invoice}/duplicate | responses 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 moved | POST /v1/invoices/export/excel | POST /v1/companies/{company}/invoices/export/excel | — |
public-api.v1.invoices.find_by_external_id — Changed | POST /v1/invoices/find-by-external-id | POST /v1/companies/{company}/invoices/find-by-external-id | response 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 — Changed | POST /v1/invoices/find-by-number | POST /v1/companies/{company}/invoices/find-by-number | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.list — Changed | GET /v1/invoices | GET /v1/companies/{company}/invoices | new 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 — Changed | POST /v1/invoices/{invoice}/mark-paid | POST /v1/companies/{company}/invoices/{invoice}/mark-paid | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.mark_sent — Changed | POST /v1/invoices/{invoice}/mark-sent | POST /v1/companies/{company}/invoices/{invoice}/mark-sent | response 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 moved | GET /v1/invoices/{invoice}/payment-receipt | GET /v1/companies/{company}/invoices/{invoice}/payment-receipt | — |
public-api.v1.invoices.payments_create — Path moved | POST /v1/invoices/{invoice}/payments | POST /v1/companies/{company}/invoices/{invoice}/payments | — |
public-api.v1.invoices.payments_list — Path moved | GET /v1/invoices/{invoice}/payments | GET /v1/companies/{company}/invoices/{invoice}/payments | — |
public-api.v1.invoices.payments_revert — Path moved | POST /v1/invoices/{invoice}/payments/{payment}/reversal | POST /v1/companies/{company}/invoices/{invoice}/payments/{payment}/reversal | — |
public-api.v1.invoices.pdf — Path moved | GET /v1/invoices/{invoice}/pdf | GET /v1/companies/{company}/invoices/{invoice}/pdf | — |
public-api.v1.invoices.pdf_link — Path moved | GET /v1/invoices/{invoice}/pdf-link | GET /v1/companies/{company}/invoices/{invoice}/pdf-link | — |
public-api.v1.invoices.pdf_preview — Path moved | GET /v1/invoices/{invoice}/pdf/preview | GET /v1/companies/{company}/invoices/{invoice}/pdf/preview | — |
public-api.v1.invoices.public_link_get — Path moved | GET /v1/invoices/{invoice}/public-link | GET /v1/companies/{company}/invoices/{invoice}/public-link | — |
public-api.v1.invoices.public_link_update — Path moved | PUT /v1/invoices/{invoice}/public-link | PATCH /v1/companies/{company}/invoices/{invoice}/public-link | verb PUT → PATCH |
public-api.v1.invoices.quarterly.available — Path moved | GET /v1/invoices/quarterly/available-quarters | GET /v1/companies/{company}/invoices/quarterly/available-quarters | — |
public-api.v1.invoices.quarterly.download_zip — Path moved | POST /v1/invoices/quarterly/download-zip | POST /v1/companies/{company}/invoices/quarterly/download-zip | — |
public-api.v1.invoices.quarterly.send_email — Path moved | POST /v1/invoices/quarterly/send-email | POST /v1/companies/{company}/invoices/quarterly/send-email | — |
public-api.v1.invoices.reminder_preview — Path moved | POST /v1/invoices/{invoice}/reminder-preview | POST /v1/companies/{company}/invoices/{invoice}/reminder-preview | — |
public-api.v1.invoices.reschedule — Changed | PATCH /v1/invoices/{invoice}/reschedule | PATCH /v1/companies/{company}/invoices/{invoice}/reschedule | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.schedule — Changed | POST /v1/invoices/{invoice}/schedule | POST /v1/companies/{company}/invoices/{invoice}/schedule | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.send — Changed | POST /v1/invoices/{invoice}/send | POST /v1/companies/{company}/invoices/{invoice}/send | response 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 moved | POST /v1/invoices/{invoice}/send-reminder | POST /v1/companies/{company}/invoices/{invoice}/send-reminder | — |
public-api.v1.invoices.show — Changed | GET /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 moved | POST /v1/invoices/simplified-eligibility | POST /v1/companies/{company}/invoices/simplified-eligibility | — |
public-api.v1.invoices.stats — Path moved | GET /v1/invoices/stats | GET /v1/companies/{company}/invoices/stats | — |
public-api.v1.invoices.statuses — Path moved | GET /v1/invoices/statuses | GET /v1/companies/{company}/invoices/statuses | — |
public-api.v1.invoices.substitute_simplified — Changed | POST /v1/invoices/substitute-simplified | POST /v1/companies/{company}/invoices/substitute-simplified | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.invoices.unschedule — Changed | POST /v1/invoices/{invoice}/unschedule | POST /v1/companies/{company}/invoices/{invoice}/unschedule | responses 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 — Changed | POST /v1/invoices/{invoice}/unsend | POST /v1/companies/{company}/invoices/{invoice}/unsend | responses 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 — Changed | PUT /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 — Changed | POST /v1/invoices/{invoice}/void | POST /v1/companies/{company}/invoices/{invoice}/void | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.payment_methods.list — Unchanged | GET /v1/payment-methods | GET /v1/payment-methods | Unchanged |
VeriFactu
Operations: 27 — 0 new, 24 moved to the axis, 3 moved with other changes, 0 removed, 0 unchanged.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.invoices.verifactu_create — Path moved | POST /v1/invoices/{invoice}/verifactu | POST /v1/companies/{company}/invoices/{invoice}/verifactu | — |
public-api.v1.invoices.verifactu_get — Path moved | GET /v1/invoices/{invoice}/verifactu | GET /v1/companies/{company}/invoices/{invoice}/verifactu | — |
public-api.v1.verifactu.aeat_access.list — Path moved | GET /v1/verifactu/aeat-access/records | GET /v1/companies/{company}/verifactu/aeat-access/records | — |
public-api.v1.verifactu.aeat_access.show — Path moved | GET /v1/verifactu/aeat-access/records/{record} | GET /v1/companies/{company}/verifactu/aeat-access/records/{record} | — |
public-api.v1.verifactu.certificates.activate — Path moved | POST /v1/verifactu/certificates/{certificate}/activate | POST /v1/companies/{company}/verifactu/certificates/{certificate}/activate | — |
public-api.v1.verifactu.certificates.active — Path moved | GET /v1/verifactu/certificates/active | GET /v1/companies/{company}/verifactu/certificates/active | — |
public-api.v1.verifactu.certificates.list — Path moved | GET /v1/verifactu/certificates | GET /v1/companies/{company}/verifactu/certificates | — |
public-api.v1.verifactu.certificates.revoke — Path moved | DELETE /v1/verifactu/certificates/{certificate} | DELETE /v1/companies/{company}/verifactu/certificates/{certificate} | — |
public-api.v1.verifactu.certificates.upload — Changed | POST /v1/verifactu/certificates | POST /v1/companies/{company}/verifactu/certificates | error 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 moved | GET /v1/verifactu/chain/validate | GET /v1/companies/{company}/verifactu/chain/validate | — |
public-api.v1.verifactu.config — Path moved | GET /v1/verifactu/config | GET /v1/companies/{company}/verifactu/config | — |
public-api.v1.verifactu.declaracion.current — Path moved | GET /v1/verifactu/declaracion-responsable | GET /v1/companies/{company}/verifactu/declaracion-responsable | — |
public-api.v1.verifactu.declaracion.history — Path moved | GET /v1/verifactu/declaracion-responsable/history | GET /v1/companies/{company}/verifactu/declaracion-responsable/history | — |
public-api.v1.verifactu.events.list — Path moved | GET /v1/verifactu/events | GET /v1/companies/{company}/verifactu/events | — |
public-api.v1.verifactu.events.retry — Path moved | POST /v1/verifactu/events/{event}/retry | POST /v1/companies/{company}/verifactu/events/{event}/retry | — |
public-api.v1.verifactu.events.show — Path moved | GET /v1/verifactu/events/{event} | GET /v1/companies/{company}/verifactu/events/{event} | — |
public-api.v1.verifactu.events.summary — Path moved | GET /v1/verifactu/events/summary | GET /v1/companies/{company}/verifactu/events/summary | — |
public-api.v1.verifactu.records.activities — Path moved | GET /v1/verifactu/records/{record}/activities | GET /v1/companies/{company}/verifactu/records/{record}/activities | — |
public-api.v1.verifactu.records.find_by_csv — Changed | POST /v1/verifactu/records/find-by-csv | POST /v1/companies/{company}/verifactu/records/find-by-csv | responses added: 422 |
public-api.v1.verifactu.records.find_by_huella — Path moved | POST /v1/verifactu/records/find-by-huella | POST /v1/companies/{company}/verifactu/records/find-by-huella | — |
public-api.v1.verifactu.records.find_by_invoice_number — Changed | POST /v1/verifactu/records/find-by-invoice-number | POST /v1/companies/{company}/verifactu/records/find-by-invoice-number | responses added: 422 |
public-api.v1.verifactu.records.list — Path moved | GET /v1/verifactu/records | GET /v1/companies/{company}/verifactu/records | — |
public-api.v1.verifactu.records.retry — Path moved | POST /v1/verifactu/records/{record}/retry | POST /v1/companies/{company}/verifactu/records/{record}/retry | — |
public-api.v1.verifactu.records.show — Path moved | GET /v1/verifactu/records/{record} | GET /v1/companies/{company}/verifactu/records/{record} | — |
public-api.v1.verifactu.records.subsanar — Path moved | POST /v1/verifactu/records/{record}/subsanar | POST /v1/companies/{company}/verifactu/records/{record}/subsanar | — |
public-api.v1.verifactu.settings.update — Path moved | PUT /v1/verifactu/settings | PATCH /v1/companies/{company}/verifactu/settings | verb PUT → PATCH |
public-api.v1.verifactu.stats — Path moved | GET /v1/verifactu/stats | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.monthly_time_record_closes.create — Changed | POST /v1/monthly-time-record-closes | POST /v1/companies/{company}/monthly-time-record-closes | Location header declared on 201; error codes documented: 409 resource_already_exists/monthly_register_already_closed |
public-api.v1.monthly_time_record_closes.export — Path moved | GET /v1/monthly-time-record-closes/{monthly_time_record_close}/export | GET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/export | — |
public-api.v1.monthly_time_record_closes.list — Path moved | GET /v1/monthly-time-record-closes | GET /v1/companies/{company}/monthly-time-record-closes | — |
public-api.v1.monthly_time_record_closes.reopen — Changed | POST /v1/monthly-time-record-closes/{monthly_time_record_close}/reopen | POST /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/reopen | responses added: 422 |
public-api.v1.monthly_time_record_closes.report — Path moved | GET /v1/monthly-time-record-closes/{monthly_time_record_close}/report | GET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/report | — |
public-api.v1.monthly_time_record_closes.seal — Changed | POST /v1/monthly-time-record-closes/{monthly_time_record_close}/seal | POST /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/seal | Location 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 moved | GET /v1/monthly-time-record-closes/{monthly_time_record_close}/seal | GET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/seal | — |
public-api.v1.monthly_time_record_closes.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.monthly_time_record_closes.payroll_export — Path moved | GET /v1/monthly-time-record-closes/{monthly_time_record_close}/payroll-export | GET /v1/companies/{company}/monthly-time-record-closes/{monthly_time_record_close}/payroll-export | — |
public-api.v1.payroll_export_formats.list — Unchanged | GET /v1/payroll-export-formats | GET /v1/payroll-export-formats | Unchanged |
Stripe
Operations: 10 — 0 new, 9 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.payouts.list — Path moved | GET /v1/payouts | GET /v1/companies/{company}/payouts | — |
public-api.v1.payouts.show — Path moved | GET /v1/payouts/{payout} | GET /v1/companies/{company}/payouts/{payout} | — |
public-api.v1.stripe_autoinvoicing.accounts.disconnect — Path moved | DELETE /v1/connected-accounts/{account} | DELETE /v1/companies/{company}/connected-accounts/{account} | — |
public-api.v1.stripe_autoinvoicing.accounts.list — Path moved | GET /v1/connected-accounts | GET /v1/companies/{company}/connected-accounts | — |
public-api.v1.stripe_autoinvoicing.accounts.show — Path moved | GET /v1/connected-accounts/{account} | GET /v1/companies/{company}/connected-accounts/{account} | — |
public-api.v1.stripe_autoinvoicing.accounts.update — Path moved | PUT /v1/connected-accounts/{account} | PATCH /v1/companies/{company}/connected-accounts/{account} | verb PUT → PATCH |
public-api.v1.stripe_autoinvoicing.config.show — Path moved | GET /v1/stripe-autoinvoicing/config | GET /v1/companies/{company}/stripe-autoinvoicing/config | — |
public-api.v1.stripe_autoinvoicing.config.update — Changed | PUT /v1/stripe-autoinvoicing/config | PATCH /v1/companies/{company}/stripe-autoinvoicing/config | verb PUT → PATCH; the request body is now optional; enabled is now optional |
public-api.v1.stripe_autoinvoicing.correctives.list — Path moved | GET /v1/stripe-autoinvoicing/correctives | GET /v1/companies/{company}/stripe-autoinvoicing/correctives | — |
public-api.v1.stripe_autoinvoicing.payments.list — Path moved | GET /v1/stripe-autoinvoicing/payments | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.presence.daily — Path moved | GET /v1/presence/daily | GET /v1/companies/{company}/presence/daily | — |
public-api.v1.presence.live — Path moved | GET /v1/presence | GET /v1/companies/{company}/presence | — |
public-api.v1.presence.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.price-lists.create — Changed | POST /v1/price-lists | POST /v1/companies/{company}/price-lists | Location header declared on 201 |
public-api.v1.price-lists.delete — Path moved | DELETE /v1/price-lists/{priceList} | DELETE /v1/companies/{company}/price-lists/{priceList} | — |
public-api.v1.price-lists.items.delete — Path moved | DELETE /v1/price-lists/{priceList}/items/{item} | DELETE /v1/companies/{company}/price-lists/{priceList}/items/{item} | — |
public-api.v1.price-lists.items.list — Path moved | GET /v1/price-lists/{priceList}/items | GET /v1/companies/{company}/price-lists/{priceList}/items | — |
public-api.v1.price-lists.items.purge_retired — Path moved | POST /v1/price-lists/{priceList}/items/{item}/purge | POST /v1/companies/{company}/price-lists/{priceList}/items/{item}/purge | — |
public-api.v1.price-lists.items.reassign_retired — Path moved | POST /v1/price-lists/{priceList}/items/{item}/reassign | POST /v1/companies/{company}/price-lists/{priceList}/items/{item}/reassign | — |
public-api.v1.price-lists.items.upsert — Path moved | POST /v1/price-lists/{priceList}/items | POST /v1/companies/{company}/price-lists/{priceList}/items | — |
public-api.v1.price-lists.list — Path moved | GET /v1/price-lists | GET /v1/companies/{company}/price-lists | — |
public-api.v1.price-lists.options — Path moved | GET /v1/price-lists/options | GET /v1/companies/{company}/price-lists/options | — |
public-api.v1.price-lists.resolve — Path moved | POST /v1/price-lists/resolve | POST /v1/companies/{company}/price-lists/resolve | — |
public-api.v1.price-lists.resolve_many — Path moved | POST /v1/price-lists/resolve-many | POST /v1/companies/{company}/price-lists/resolve-many | — |
public-api.v1.price-lists.show — Path moved | GET /v1/price-lists/{priceList} | GET /v1/companies/{company}/price-lists/{priceList} | — |
public-api.v1.price-lists.update — Path moved | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.products.activities — Path moved | GET /v1/products/{product}/activities | GET /v1/companies/{company}/products/{product}/activities | — |
public-api.v1.products.bulk_delete — Path moved | POST /v1/products/bulk-delete | POST /v1/companies/{company}/products/bulk-delete | — |
public-api.v1.products.bulk_status — Path moved | POST /v1/products/bulk-status | POST /v1/companies/{company}/products/bulk-status | — |
public-api.v1.products.bulk_update_stock — Path moved | POST /v1/products/bulk-update-stock | POST /v1/companies/{company}/products/bulk-update-stock | — |
public-api.v1.products.configurations.impact_preview — Path moved | POST /v1/products/{product}/configurations/impact-preview | POST /v1/companies/{company}/products/{product}/configurations/impact-preview | — |
public-api.v1.products.configurations.list — Path moved | GET /v1/products/{product}/configurations | GET /v1/companies/{company}/products/{product}/configurations | — |
public-api.v1.products.create — Changed | POST /v1/products | POST /v1/companies/{company}/products | error codes documented: 409 resource_already_exists/external_id_already_exists, 409 resource_already_exists/sku_already_exists |
public-api.v1.products.delete — Path moved | DELETE /v1/products/{product} | DELETE /v1/companies/{company}/products/{product} | — |
public-api.v1.products.find_by_external_id — Path moved | POST /v1/products/find-by-external-id | POST /v1/companies/{company}/products/find-by-external-id | — |
public-api.v1.products.find_by_sku — Path moved | POST /v1/products/find-by-sku | POST /v1/companies/{company}/products/find-by-sku | — |
public-api.v1.products.gallery.delete — Path moved | DELETE /v1/products/{product}/gallery/{index} | DELETE /v1/companies/{company}/products/{product}/gallery/{index} | — |
public-api.v1.products.gallery.download — Path moved | GET /v1/products/{product}/gallery/{index}/download | GET /v1/companies/{company}/products/{product}/gallery/{index}/download | — |
public-api.v1.products.gallery.upload — Path moved | POST /v1/products/{product}/gallery | POST /v1/companies/{company}/products/{product}/gallery | — |
public-api.v1.products.list — Path moved | GET /v1/products | GET /v1/companies/{company}/products | — |
public-api.v1.products.low_stock_report — Path moved | GET /v1/products/low-stock-report | GET /v1/companies/{company}/products/low-stock-report | — |
public-api.v1.products.options.list — Path moved | GET /v1/products/{product}/options | GET /v1/companies/{company}/products/{product}/options | — |
public-api.v1.products.presentations.create — Path moved | POST /v1/products/{product}/presentations | POST /v1/companies/{company}/products/{product}/presentations | — |
public-api.v1.products.presentations.delete — Path moved | DELETE /v1/products/{product}/presentations/{presentation} | DELETE /v1/companies/{company}/products/{product}/presentations/{presentation} | — |
public-api.v1.products.presentations.list — Path moved | GET /v1/products/{product}/presentations | GET /v1/companies/{company}/products/{product}/presentations | — |
public-api.v1.products.presentations.update — Path moved | PUT /v1/products/{product}/presentations/{presentation} | PATCH /v1/companies/{company}/products/{product}/presentations/{presentation} | verb PUT → PATCH |
public-api.v1.products.resolve_selection — Path moved | POST /v1/products/{product}/resolve-selection | POST /v1/companies/{company}/products/{product}/resolve-selection | — |
public-api.v1.products.sales_analytics — Path moved | GET /v1/products/{product}/sales-analytics | GET /v1/companies/{company}/products/{product}/sales-analytics | — |
public-api.v1.products.search — Path moved | GET /v1/products/search | GET /v1/companies/{company}/products/search | — |
public-api.v1.products.show — Path moved | GET /v1/products/{product} | GET /v1/companies/{company}/products/{product} | — |
public-api.v1.products.stats — Path moved | GET /v1/products/stats | GET /v1/companies/{company}/products/stats | — |
public-api.v1.products.stock_movements.list — Path moved | GET /v1/products/{product}/stock-movements | GET /v1/companies/{company}/products/{product}/stock-movements | — |
public-api.v1.products.supplier-offers.create — Path moved | POST /v1/products/{product}/supplier-offers | POST /v1/companies/{company}/products/{product}/supplier-offers | — |
public-api.v1.products.supplier-offers.delete — Path moved | DELETE /v1/products/{product}/supplier-offers/{offer} | DELETE /v1/companies/{company}/products/{product}/supplier-offers/{offer} | — |
public-api.v1.products.supplier-offers.list — Path moved | GET /v1/products/{product}/supplier-offers | GET /v1/companies/{company}/products/{product}/supplier-offers | — |
public-api.v1.products.supplier-offers.preferred — Path moved | POST /v1/products/{product}/supplier-offers/{offer}/preferred | POST /v1/companies/{company}/products/{product}/supplier-offers/{offer}/preferred | — |
public-api.v1.products.supplier-offers.update — Path moved | PUT /v1/products/{product}/supplier-offers/{offer} | PATCH /v1/companies/{company}/products/{product}/supplier-offers/{offer} | verb PUT → PATCH |
public-api.v1.products.toggle_active — Changed | POST /v1/products/{product}/toggle-active | POST /v1/companies/{company}/products/{product}/toggle-active | responses added: 422 |
public-api.v1.products.update — Changed | PUT /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 moved | PUT /v1/products/{product}/stock | PATCH /v1/companies/{company}/products/{product}/stock | verb PUT → PATCH |
public-api.v1.products.variants.create — Path moved | POST /v1/products/{product}/variants | POST /v1/companies/{company}/products/{product}/variants | — |
public-api.v1.products.variants.delete — Path moved | DELETE /v1/products/{product}/variants/{variant} | DELETE /v1/companies/{company}/products/{product}/variants/{variant} | — |
public-api.v1.products.variants.list — Path moved | GET /v1/products/{product}/variants | GET /v1/companies/{company}/products/{product}/variants | — |
public-api.v1.products.variants.update — Path moved | PUT /v1/products/{product}/variants/{variant} | PATCH /v1/companies/{company}/products/{product}/variants/{variant} | verb PUT → PATCH |
public-api.v1.products.video.delete — Changed | DELETE /v1/products/{product}/video | DELETE /v1/companies/{company}/products/{product}/video | responses added: 422 |
public-api.v1.products.video.download — Path moved | GET /v1/products/{product}/video/download | GET /v1/companies/{company}/products/{product}/video/download | — |
public-api.v1.products.video.upload — Path moved | POST /v1/products/{product}/video | POST /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.proformas.accept — Path moved | POST /v1/proformas/{proforma}/accept | POST /v1/companies/{company}/proformas/{proforma}/accept | — |
public-api.v1.proformas.bulk_delete — Path moved | POST /v1/proformas/bulk-delete | POST /v1/companies/{company}/proformas/bulk-delete | — |
public-api.v1.proformas.bulk_pdf — Path moved | POST /v1/proformas/bulk-pdf | POST /v1/companies/{company}/proformas/bulk-pdf | — |
public-api.v1.proformas.bulk_send — Path moved | POST /v1/proformas/bulk-send | POST /v1/companies/{company}/proformas/bulk-send | — |
public-api.v1.proformas.bulk_status — Path moved | POST /v1/proformas/bulk-status | POST /v1/companies/{company}/proformas/bulk-status | — |
public-api.v1.proformas.convert — Changed | POST /v1/proformas/{proforma}/convert | POST /v1/companies/{company}/proformas/{proforma}/convert | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.proformas.create — Path moved | POST /v1/proformas | POST /v1/companies/{company}/proformas | — |
public-api.v1.proformas.delete — Path moved | DELETE /v1/proformas/{proforma} | DELETE /v1/companies/{company}/proformas/{proforma} | — |
public-api.v1.proformas.duplicate — Changed | POST /v1/proformas/{proforma}/duplicate | POST /v1/companies/{company}/proformas/{proforma}/duplicate | responses added: 422 |
public-api.v1.proformas.find_by_external_id — Path moved | POST /v1/proformas/find-by-external-id | POST /v1/companies/{company}/proformas/find-by-external-id | — |
public-api.v1.proformas.list — Path moved | GET /v1/proformas | GET /v1/companies/{company}/proformas | — |
public-api.v1.proformas.pdf — Path moved | GET /v1/proformas/{proforma}/pdf | GET /v1/companies/{company}/proformas/{proforma}/pdf | — |
public-api.v1.proformas.public_link_get — Path moved | GET /v1/proformas/{proforma}/public-link | GET /v1/companies/{company}/proformas/{proforma}/public-link | — |
public-api.v1.proformas.public_link_update — Path moved | PUT /v1/proformas/{proforma}/public-link | PATCH /v1/companies/{company}/proformas/{proforma}/public-link | verb PUT → PATCH |
public-api.v1.proformas.reject — Path moved | POST /v1/proformas/{proforma}/reject | POST /v1/companies/{company}/proformas/{proforma}/reject | — |
public-api.v1.proformas.send — Path moved | POST /v1/proformas/{proforma}/send | POST /v1/companies/{company}/proformas/{proforma}/send | — |
public-api.v1.proformas.show — Path moved | GET /v1/proformas/{proforma} | GET /v1/companies/{company}/proformas/{proforma} | — |
public-api.v1.proformas.stats — Path moved | GET /v1/proformas/stats | GET /v1/companies/{company}/proformas/stats | — |
public-api.v1.proformas.statuses — Path moved | GET /v1/proformas/statuses | GET /v1/companies/{company}/proformas/statuses | — |
public-api.v1.proformas.update — Changed | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.purchase_invoices.attach_file — Changed | POST /v1/purchase_invoices/{purchase_invoice}/attach-file | POST /v1/companies/{company}/purchase-invoices/{purchase_invoice}/attach-file | 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.bulk_delete — Path moved | POST /v1/purchase_invoices/bulk-delete | POST /v1/companies/{company}/purchase-invoices/bulk-delete | — |
public-api.v1.purchase_invoices.bulk_status — Path moved | POST /v1/purchase_invoices/bulk-status | POST /v1/companies/{company}/purchase-invoices/bulk-status | — |
public-api.v1.purchase_invoices.create — Changed | POST /v1/purchase_invoices | POST /v1/companies/{company}/purchase-invoices | 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/purchase_invoice_already_exists |
public-api.v1.purchase_invoices.delete — Path moved | DELETE /v1/purchase_invoices/{purchase_invoice} | DELETE /v1/companies/{company}/purchase-invoices/{purchase_invoice} | — |
public-api.v1.purchase_invoices.delete_file — Changed | DELETE /v1/purchase_invoices/{purchase_invoice}/file | DELETE /v1/companies/{company}/purchase-invoices/{purchase_invoice}/file | responses added: 422 |
public-api.v1.purchase_invoices.file — Path moved | GET /v1/purchase_invoices/{purchase_invoice}/file | GET /v1/companies/{company}/purchase-invoices/{purchase_invoice}/file | — |
public-api.v1.purchase_invoices.find_by_external_id — Changed | POST /v1/purchase_invoices/find-by-external-id | POST /v1/companies/{company}/purchase-invoices/find-by-external-id | 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.list — Changed | GET /v1/purchase_invoices | GET /v1/companies/{company}/purchase-invoices | 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.list_payments — Changed | GET /v1/purchase_invoices/{purchase_invoice}/payments | GET /v1/companies/{company}/purchase-invoices/{purchase_invoice}/payments | response fields added: data[].paid_date; response fields removed: data[].paid_on |
public-api.v1.purchase_invoices.mark_paid — Changed | POST /v1/purchase_invoices/{purchase_invoice}/mark_paid | POST /v1/companies/{company}/purchase-invoices/{purchase_invoice}/mark-paid | 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.overdue — Changed | GET /v1/purchase_invoices/overdue | GET /v1/companies/{company}/purchase-invoices/overdue | 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.payment_receipt — Path moved | GET /v1/purchase_invoices/{purchase_invoice}/payment-receipt | GET /v1/companies/{company}/purchase-invoices/{purchase_invoice}/payment-receipt | — |
public-api.v1.purchase_invoices.pending — Changed | GET /v1/purchase_invoices/pending | GET /v1/companies/{company}/purchase-invoices/pending | 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.register_payment — Changed | POST /v1/purchase_invoices/{purchase_invoice}/payments | POST /v1/companies/{company}/purchase-invoices/{purchase_invoice}/payments | response fields added: data.paid_date; response fields removed: data.paid_on; Location header declared on 201 |
public-api.v1.purchase_invoices.show — Changed | GET /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 moved | GET /v1/purchase_invoices/stats | GET /v1/companies/{company}/purchase-invoices/stats | — |
public-api.v1.purchase_invoices.update — Changed | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.quotes.accept — Path moved | POST /v1/quotes/{quote}/accept | POST /v1/companies/{company}/quotes/{quote}/accept | — |
public-api.v1.quotes.bulk_delete — Path moved | POST /v1/quotes/bulk-delete | POST /v1/companies/{company}/quotes/bulk-delete | — |
public-api.v1.quotes.bulk_pdf — Path moved | POST /v1/quotes/bulk-pdf | POST /v1/companies/{company}/quotes/bulk-pdf | — |
public-api.v1.quotes.bulk_send — Path moved | POST /v1/quotes/bulk-send | POST /v1/companies/{company}/quotes/bulk-send | — |
public-api.v1.quotes.bulk_status — Path moved | POST /v1/quotes/bulk-status | POST /v1/companies/{company}/quotes/bulk-status | — |
public-api.v1.quotes.convert — Changed | POST /v1/quotes/{quote}/convert | POST /v1/companies/{company}/quotes/{quote}/convert | response fields added: data.paid_date, data.paid_recorded_at; response fields removed: data.paid_at, data.paid_on |
public-api.v1.quotes.create — Path moved | POST /v1/quotes | POST /v1/companies/{company}/quotes | — |
public-api.v1.quotes.delete — Path moved | DELETE /v1/quotes/{quote} | DELETE /v1/companies/{company}/quotes/{quote} | — |
public-api.v1.quotes.duplicate — Changed | POST /v1/quotes/{quote}/duplicate | POST /v1/companies/{company}/quotes/{quote}/duplicate | responses added: 422 |
public-api.v1.quotes.find_by_external_id — Path moved | POST /v1/quotes/find-by-external-id | POST /v1/companies/{company}/quotes/find-by-external-id | — |
public-api.v1.quotes.list — Path moved | GET /v1/quotes | GET /v1/companies/{company}/quotes | — |
public-api.v1.quotes.pdf — Path moved | GET /v1/quotes/{quote}/pdf | GET /v1/companies/{company}/quotes/{quote}/pdf | — |
public-api.v1.quotes.public_link_get — Path moved | GET /v1/quotes/{quote}/public-link | GET /v1/companies/{company}/quotes/{quote}/public-link | — |
public-api.v1.quotes.public_link_update — Path moved | PUT /v1/quotes/{quote}/public-link | PATCH /v1/companies/{company}/quotes/{quote}/public-link | verb PUT → PATCH |
public-api.v1.quotes.reject — Path moved | POST /v1/quotes/{quote}/reject | POST /v1/companies/{company}/quotes/{quote}/reject | — |
public-api.v1.quotes.send — Path moved | POST /v1/quotes/{quote}/send | POST /v1/companies/{company}/quotes/{quote}/send | — |
public-api.v1.quotes.show — Path moved | GET /v1/quotes/{quote} | GET /v1/companies/{company}/quotes/{quote} | — |
public-api.v1.quotes.stats — Path moved | GET /v1/quotes/stats | GET /v1/companies/{company}/quotes/stats | — |
public-api.v1.quotes.statuses — Path moved | GET /v1/quotes/statuses | GET /v1/companies/{company}/quotes/statuses | — |
public-api.v1.quotes.update — Changed | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.recurring_invoices.activate — Path moved | POST /v1/recurring_invoices/{recurring_invoice}/activate | POST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/activate | — |
public-api.v1.recurring_invoices.activities — Path moved | GET /v1/recurring_invoices/{recurring_invoice}/activities | GET /v1/companies/{company}/recurring-invoices/{recurring_invoice}/activities | — |
public-api.v1.recurring_invoices.bulk-delete — Path moved | POST /v1/recurring_invoices/bulk-delete | POST /v1/companies/{company}/recurring-invoices/bulk-delete | — |
public-api.v1.recurring_invoices.bulk_status — Path moved | POST /v1/recurring_invoices/bulk-status | POST /v1/companies/{company}/recurring-invoices/bulk-status | — |
public-api.v1.recurring_invoices.cancel — Path moved | POST /v1/recurring_invoices/{recurring_invoice}/cancel | POST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/cancel | — |
public-api.v1.recurring_invoices.create — Path moved | POST /v1/recurring_invoices | POST /v1/companies/{company}/recurring-invoices | — |
public-api.v1.recurring_invoices.delete — Path moved | DELETE /v1/recurring_invoices/{recurring_invoice} | DELETE /v1/companies/{company}/recurring-invoices/{recurring_invoice} | — |
public-api.v1.recurring_invoices.find_by_external_id — Path moved | POST /v1/recurring_invoices/find-by-external-id | POST /v1/companies/{company}/recurring-invoices/find-by-external-id | — |
public-api.v1.recurring_invoices.generate — Path moved | POST /v1/recurring_invoices/{recurring_invoice}/generate | POST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/generate | — |
public-api.v1.recurring_invoices.list — Path moved | GET /v1/recurring_invoices | GET /v1/companies/{company}/recurring-invoices | — |
public-api.v1.recurring_invoices.logs — Path moved | GET /v1/recurring_invoices/{recurring_invoice}/logs | GET /v1/companies/{company}/recurring-invoices/{recurring_invoice}/logs | — |
public-api.v1.recurring_invoices.pause — Changed | POST /v1/recurring_invoices/{recurring_invoice}/pause | POST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/pause | responses added: 422 |
public-api.v1.recurring_invoices.preview — Path moved | GET /v1/recurring_invoices/{recurring_invoice}/preview | GET /v1/companies/{company}/recurring-invoices/{recurring_invoice}/preview | — |
public-api.v1.recurring_invoices.resume — Path moved | POST /v1/recurring_invoices/{recurring_invoice}/resume | POST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/resume | — |
public-api.v1.recurring_invoices.show — Path moved | GET /v1/recurring_invoices/{recurring_invoice} | GET /v1/companies/{company}/recurring-invoices/{recurring_invoice} | — |
public-api.v1.recurring_invoices.skip — Changed | POST /v1/recurring_invoices/{recurring_invoice}/skip | POST /v1/companies/{company}/recurring-invoices/{recurring_invoice}/skip | responses added: 422 |
public-api.v1.recurring_invoices.stats — Path moved | GET /v1/recurring_invoices/stats | GET /v1/companies/{company}/recurring-invoices/stats | — |
public-api.v1.recurring_invoices.update — Changed | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.series.active — Path moved | GET /v1/series/active | GET /v1/companies/{company}/series/active | — |
public-api.v1.series.activities — Path moved | GET /v1/series/{series}/activities | GET /v1/companies/{company}/series/{series}/activities | — |
public-api.v1.series.archive — Changed | POST /v1/series/{series}/archive | POST /v1/companies/{company}/series/{series}/archive | responses added: 422 |
public-api.v1.series.bootstrap — Changed | POST /v1/series/bootstrap | POST /v1/companies/{company}/series/bootstrap | responses added: 422 |
public-api.v1.series.create — Path moved | POST /v1/series | POST /v1/companies/{company}/series | — |
public-api.v1.series.default — Path moved | GET /v1/series/default | GET /v1/companies/{company}/series/default | — |
public-api.v1.series.find_by_code — Path moved | POST /v1/series/find-by-code | POST /v1/companies/{company}/series/find-by-code | — |
public-api.v1.series.list — Path moved | GET /v1/series | GET /v1/companies/{company}/series | — |
public-api.v1.series.set_default — Changed | POST /v1/series/{series}/default | POST /v1/companies/{company}/series/{series}/default | responses added: 422 |
public-api.v1.series.show — Path moved | GET /v1/series/{series} | GET /v1/companies/{company}/series/{series} | — |
public-api.v1.series.stats — Path moved | GET /v1/series/stats | GET /v1/companies/{company}/series/stats | — |
public-api.v1.series.unarchive — Changed | POST /v1/series/{series}/unarchive | POST /v1/companies/{company}/series/{series}/unarchive | responses added: 422 |
Shopify
Operations: 1 — 0 new, 1 moved to the axis, 0 moved with other changes, 0 removed, 0 unchanged.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.shopify.stores.connection_test — Path moved | POST /v1/shopify/stores/{store}/connection-test | POST /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.stores.create — Changed | POST /v1/stores | POST /v1/companies/{company}/stores | Location header declared on 201 |
public-api.v1.stores.disconnect — Path moved | DELETE /v1/stores/{store} | DELETE /v1/companies/{company}/stores/{store} | — |
public-api.v1.stores.index — Path moved | GET /v1/stores | GET /v1/companies/{company}/stores | — |
public-api.v1.stores.show — Path moved | GET /v1/stores/{store} | GET /v1/companies/{company}/stores/{store} | — |
public-api.v1.stores.update — Path moved | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.tax-catalog.show — Unchanged | GET /v1/tax-catalog | GET /v1/tax-catalog | Unchanged |
public-api.v1.taxes.active — Path moved | GET /v1/taxes/active | GET /v1/companies/{company}/taxes/active | — |
public-api.v1.taxes.by_type — Path moved | GET /v1/taxes/by-type | GET /v1/companies/{company}/taxes/by-type | — |
public-api.v1.taxes.calculate — Path moved | POST /v1/taxes/calculate | POST /v1/companies/{company}/taxes/calculate | — |
public-api.v1.taxes.calculate_totals — Path moved | POST /v1/taxes/calculate-totals | POST /v1/companies/{company}/taxes/calculate-totals | — |
public-api.v1.taxes.create — Removed | POST /v1/taxes | — | Removed |
public-api.v1.taxes.defaults — Path moved | GET /v1/taxes/defaults/{docType} | GET /v1/companies/{company}/taxes/defaults/{docType} | — |
public-api.v1.taxes.delete — Removed | DELETE /v1/taxes/{tax} | — | Removed |
public-api.v1.taxes.for_purchases — Path moved | GET /v1/taxes/for-purchases | GET /v1/companies/{company}/taxes/for-purchases | — |
public-api.v1.taxes.for_sales — Path moved | GET /v1/taxes/for-sales | GET /v1/companies/{company}/taxes/for-sales | — |
public-api.v1.taxes.is_in_use — Path moved | GET /v1/taxes/{tax}/is-in-use | GET /v1/companies/{company}/taxes/{tax}/is-in-use | — |
public-api.v1.taxes.list — Path moved | GET /v1/taxes | GET /v1/companies/{company}/taxes | — |
public-api.v1.taxes.set_default — Removed | POST /v1/taxes/{tax}/set-default | — | Removed |
public-api.v1.taxes.set_default_for_document — Removed | PUT /v1/taxes/{tax}/set-default/{docType} | — | Removed |
public-api.v1.taxes.show — Path moved | GET /v1/taxes/{tax} | GET /v1/companies/{company}/taxes/{tax} | — |
public-api.v1.taxes.stats — Path moved | GET /v1/taxes/stats | GET /v1/companies/{company}/taxes/stats | — |
public-api.v1.taxes.toggle — Removed | POST /v1/taxes/{tax}/toggle | — | Removed |
public-api.v1.taxes.update — Removed | PUT /v1/taxes/{tax} | — | Removed |
Tax reports
Operations: 9 — 0 new, 8 moved to the axis, 1 moved with other changes, 0 removed, 0 unchanged.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.tax_reports.activities — Path moved | GET /v1/tax_reports/{tax_report}/activities | GET /v1/companies/{company}/tax-reports/{tax_report}/activities | — |
public-api.v1.tax_reports.download — Path moved | GET /v1/tax_reports/{tax_report}/download | GET /v1/companies/{company}/tax-reports/{tax_report}/download | — |
public-api.v1.tax_reports.find_by_period — Path moved | POST /v1/tax_reports/find-by-period | POST /v1/companies/{company}/tax-reports/find-by-period | — |
public-api.v1.tax_reports.generate_130 — Changed | POST /v1/tax_reports/130 | POST /v1/companies/{company}/tax-reports/130 | Location header declared on 201 |
public-api.v1.tax_reports.generate_303 — Path moved | POST /v1/tax_reports/303 | POST /v1/companies/{company}/tax-reports/303 | — |
public-api.v1.tax_reports.generate_347 — Path moved | POST /v1/tax_reports/347 | POST /v1/companies/{company}/tax-reports/347 | — |
public-api.v1.tax_reports.history — Path moved | GET /v1/tax_reports/history | GET /v1/companies/{company}/tax-reports/history | — |
public-api.v1.tax_reports.preview — Path moved | POST /v1/tax_reports/preview | POST /v1/companies/{company}/tax-reports/preview | — |
public-api.v1.tax_reports.stats — Path moved | GET /v1/tax_reports/stats | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.time_balances.employee — Path moved | GET /v1/time-balances/employee/{employee} | GET /v1/companies/{company}/time-balances/employee/{employee} | — |
public-api.v1.time_balances.monthly_sheet — Path moved | GET /v1/time-balances/monthly-sheet | GET /v1/companies/{company}/time-balances/monthly-sheet | — |
public-api.v1.time_balances.team_summary — Path moved | GET /v1/time-balances/team-summary | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.time_corrections.approve — Path moved | POST /v1/time-corrections/{time_correction}/approve | POST /v1/companies/{company}/time-corrections/{time_correction}/approve | — |
public-api.v1.time_corrections.create — Changed | POST /v1/time-corrections | POST /v1/companies/{company}/time-corrections | Location header declared on 201 |
public-api.v1.time_corrections.list — Path moved | GET /v1/time-corrections | GET /v1/companies/{company}/time-corrections | — |
public-api.v1.time_corrections.reject — Path moved | POST /v1/time-corrections/{time_correction}/reject | POST /v1/companies/{company}/time-corrections/{time_correction}/reject | — |
public-api.v1.time_corrections.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.time_entries.chain.validate — Path moved | GET /v1/time-entries/chain/validate | GET /v1/companies/{company}/time-entries/chain/validate | — |
public-api.v1.time_entries.clock_in — Changed | POST /v1/time-entries/clock-in | POST /v1/companies/{company}/time-entries/clock-in | Location header declared on 201 |
public-api.v1.time_entries.clock_out — Changed | POST /v1/time-entries/clock-out | POST /v1/companies/{company}/time-entries/clock-out | Location header declared on 201 |
public-api.v1.time_entries.current — Path moved | GET /v1/time-entries/current | GET /v1/companies/{company}/time-entries/current | — |
public-api.v1.time_entries.list — Path moved | GET /v1/time-entries | GET /v1/companies/{company}/time-entries | — |
public-api.v1.time_entries.manual — Changed | POST /v1/time-entries/manual | POST /v1/companies/{company}/time-entries/manual | Location header declared on 201 |
public-api.v1.time_entries.pause — Changed | POST /v1/time-entries/pause | POST /v1/companies/{company}/time-entries/pause | Location header declared on 201 |
public-api.v1.time_entries.resume — Changed | POST /v1/time-entries/resume | POST /v1/companies/{company}/time-entries/resume | Location header declared on 201 |
public-api.v1.time_entries.show — Path moved | GET /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.time_tracking_settings.show — Path moved | GET /v1/time-tracking-settings | GET /v1/companies/{company}/time-tracking-settings | — |
public-api.v1.time_tracking_settings.update — Changed | PUT /v1/time-tracking-settings | PATCH /v1/companies/{company}/time-tracking-settings | verb 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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.webhook_endpoints.create — Changed | POST /v1/webhook_endpoints | POST /v1/companies/{company}/webhook-endpoints | data.secret can now be null |
public-api.v1.webhook_endpoints.delete — Path moved | DELETE /v1/webhook_endpoints/{webhook_endpoint} | DELETE /v1/companies/{company}/webhook-endpoints/{webhook_endpoint} | — |
public-api.v1.webhook_endpoints.deliveries.list — Changed | GET /v1/webhook_endpoints/{webhook_endpoint}/deliveries | GET /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveries | 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.deliveries.replay — Path moved | POST /v1/webhook_endpoints/{webhook_endpoint}/deliveries/{delivery}/replay | POST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/deliveries/{delivery}/replay | — |
public-api.v1.webhook_endpoints.deliveries.show — Changed | GET /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 moved | GET /v1/webhook_endpoints | GET /v1/companies/{company}/webhook-endpoints | — |
public-api.v1.webhook_endpoints.ping — Path moved | POST /v1/webhook_endpoints/{webhook_endpoint}/ping | POST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/ping | — |
public-api.v1.webhook_endpoints.rotate_secret — Changed | POST /v1/webhook_endpoints/{webhook_endpoint}/rotate_secret | POST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/rotate-secret | data.secret can now be null; error codes documented: 422 business_rule_violation/webhook_secret_recently_rotated |
public-api.v1.webhook_endpoints.show — Path moved | GET /v1/webhook_endpoints/{webhook_endpoint} | GET /v1/companies/{company}/webhook-endpoints/{webhook_endpoint} | — |
public-api.v1.webhook_endpoints.test_event — Path moved | POST /v1/webhook_endpoints/{webhook_endpoint}/test_event | POST /v1/companies/{company}/webhook-endpoints/{webhook_endpoint}/test-event | — |
public-api.v1.webhook_endpoints.update — Changed | PUT /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.woocommerce.stores.connection_test — Path moved | POST /v1/woocommerce/stores/{store}/connection-test | POST /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.
| Operation | Before | Now | What changed |
|---|---|---|---|
public-api.v1.work_schedules.archive — Changed | POST /v1/work-schedules/{schedule}/archive | POST /v1/companies/{company}/work-schedules/{schedule}/archive | responses added: 422 |
public-api.v1.work_schedules.assign — Path moved | POST /v1/work-schedules/{schedule}/assign | POST /v1/companies/{company}/work-schedules/{schedule}/assign | — |
public-api.v1.work_schedules.assignments — Path moved | GET /v1/work-schedules/{schedule}/assignments | GET /v1/companies/{company}/work-schedules/{schedule}/assignments | — |
public-api.v1.work_schedules.create — Changed | POST /v1/work-schedules | POST /v1/companies/{company}/work-schedules | Location header declared on 201 |
public-api.v1.work_schedules.employee_schedule — Path moved | GET /v1/work-schedules/employee/{employee} | GET /v1/companies/{company}/work-schedules/employee/{employee} | — |
public-api.v1.work_schedules.list — Path moved | GET /v1/work-schedules | GET /v1/companies/{company}/work-schedules | — |
public-api.v1.work_schedules.show — Path moved | GET /v1/work-schedules/{schedule} | GET /v1/companies/{company}/work-schedules/{schedule} | — |
public-api.v1.work_schedules.stats — Path moved | GET /v1/work-schedules/stats | GET /v1/companies/{company}/work-schedules/stats | — |
public-api.v1.work_schedules.unarchive — Changed | POST /v1/work-schedules/{schedule}/unarchive | POST /v1/companies/{company}/work-schedules/{schedule}/unarchive | responses added: 422 |
public-api.v1.work_schedules.unassign — Path moved | POST /v1/work-schedules/{schedule}/unassign | POST /v1/companies/{company}/work-schedules/{schedule}/unassign | — |
public-api.v1.work_schedules.update — Changed | PUT /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 |