Profiles
A profile is a client company. For an accounting firm this is the list the whole day is organized around. For a business using Syllevo directly it holds one entry, itself.
Almost everything else on these pages hangs off a profile: its documents, its invoices, its suppliers, its sources, its reminders, and its month-end status. The profile id is the single most useful value in the API, so this is usually the second call you make.
Profiles are called clients in the web app. The API name is profile and it will stay profile.
Routes
| Method | Path | Needs |
|---|---|---|
| GET | /v1/profiles |
Any member |
| POST | /v1/profiles |
Admin |
| GET | /v1/profiles/{id} |
View |
| PUT | /v1/profiles/{id} |
ManageSettings |
| POST | /v1/profiles/{id}/archive |
Admin |
| POST | /v1/profiles/{id}/unarchive |
Admin |
| POST | /v1/profiles/{id}/avatar |
ManageSettings |
| DELETE | /v1/profiles/{id}/avatar |
ManageSettings |
| GET | /v1/profiles/{profileId}/stats |
View |
| GET | /v1/profiles/{profileId}/trend |
View |
The profile shape
| Field | Type | Means |
|---|---|---|
id |
uuid | Use this everywhere a profileId is asked for |
name |
string | The client company's name |
taxIdentifier |
string or null | VAT number or national registration number, null if unknown |
countryCode |
string or null | Two-letter country code |
locale |
string | en or ro. The language this client is written to in |
archivedAt |
date-time, null | Null while the client is in the working set |
createdAt |
date-time | When it was added |
canManageSources |
boolean | Whether this caller holds ManageSources on it |
myPermissions |
integer[] | Every ProfilePermission this caller holds on it |
avatarUrl |
string or null | Logo, 256 px. A short-lived link |
avatarThumbnailUrl |
string or null | Logo, 64 px. A short-lived link |
canManageSources is there so a client application can hide a button without a second request. Do
not treat it as the authoritative answer. The API decides.
myPermissions is the same idea for every permission: 0 View, 1 ManageDocuments, 2
ManageSources, 3 SendReminders, 4 ManageSettings, 5 TransmitInvoices. A member granted
TransmitInvoices on a client sees 5 here, so the app can show them the send to SPV button.
GET /v1/profiles
One page of the client companies this credential can see, and only those.
| Parameter | Type | Default | Means |
|---|---|---|---|
page |
integer | 1 | See Conventions |
pageSize |
integer | 25 | Clamped to 200 |
search |
string | none | Matches anywhere in the name, case-insensitively |
includeArchived |
boolean | false | Whether archived clients are included |
The narrowing happens inside the query, not on the page that came back. A member who handles 30 of
the firm's 200 clients gets 30 rows and a totalCount of 30. Likewise search counts the matches,
not the portfolio.
GET /v1/profiles?search=example&pageSize=2 HTTP/1.1
Host: api.syllevo.com
X-Api-Key: syl_live_examplekeynotreal000000000000
{
"items": [
{
"id": "22222222-2222-4222-8222-222222222222",
"name": "Example Comert SRL",
"taxIdentifier": "RO00000000",
"countryCode": "RO",
"locale": "ro",
"archivedAt": null,
"createdAt": "2026-01-15T09:00:00Z",
"canManageSources": true,
"myPermissions": [0, 1, 2, 3, 4],
"avatarUrl": null,
"avatarThumbnailUrl": null
}
],
"page": 1,
"pageSize": 2,
"totalCount": 1,
"totalPages": 1
}
POST /v1/profiles
Adds a client company. Admin, not a per-client permission, because there is no client yet to hold
a permission on.
| Field | Type | Required | Means |
|---|---|---|---|
name |
string | yes | The client company's name |
taxIdentifier |
string | no | VAT number or national registration number |
countryCode |
string | no | Two-letter country code |
locale |
string | no | en or ro. Defaults to the organization's locale |
Answers 201 with the profile.
Fill in taxIdentifier and countryCode if you have them. They are what lets Syllevo recognize
the client on an incoming e-Factura message and match suppliers to directory entries. A client
created without them still works, but more documents land in review.
The number of clients a package covers is package.includedProfiles on
GET /v1/organizations. Passing it is a billing matter,
not a refusal here.
GET /v1/profiles/{id}
One client company. View.
A client this credential cannot see answers 404, not 403. That is on purpose: a 403 would
confirm the id exists.
PUT /v1/profiles/{id}
Changes the client company's name, tax identifier, country, and locale. ManageSettings.
A full replace, not a patch. Omitting taxIdentifier clears it. Read the profile first, change what
you need, and send the whole shape back.
Changing countryCode or taxIdentifier changes how incoming documents are matched to this
client. Changing locale changes the language of every reminder it receives from that point on.
POST /v1/profiles/{id}/archive and /unarchive
Takes a client out of the firm's working set, or puts it back. Admin.
Archiving does not delete anything. Documents, invoices, and exports stay. What stops is the active handling: the client leaves the default lists and stops being chased.
Both are idempotent. Archiving an archived client answers 200 with the profile, and so does
unarchiving an active one.
Use includeArchived=true on GET /v1/profiles to see archived clients.
POST and DELETE /v1/profiles/{id}/avatar
Sets or removes the client company's logo. ManageSettings.
multipart/form-data, one part named file, at most 5 MB, stored as WebP at 256 px with a 64 px
thumbnail. Same rules as the organization logo, see
Organizations. The delete is
idempotent.
GET /v1/profiles/{profileId}/stats
What Syllevo holds for this client. View.
| Field | Type | Means |
|---|---|---|
documentCount |
integer | Document originals on file |
invoiceCount |
integer | Invoices read out of them |
supplierCount |
integer | Distinct suppliers seen |
GET /v1/profiles/{profileId}/trend
Invoices and documents that arrived for this client per day, one point per day with no gaps.
View.
Same window rules as the organization trend: from and to are both inclusive, omitting both
gives the last 30 days, a backwards range is 400, and a range longer than 366 days is 400. See
Organizations for the response shape.
Where to go next with a profile id
| To find out | Call |
|---|---|
| What arrived | GET /v1/documents |
| What was read out of it | GET /v1/invoices |
| What is still missing | GET /v1/completeness |
| Where documents come from | GET /v1/profiles/{profileId}/accounts |
| Who is being chased | GET /v1/profiles/{profileId}/reminders |
| Everything for a month | GET /v1/profiles/{profileId}/handover-pack |