curl --request POST \
--url https://app.loice.ai/api/v1/company \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"linkedinUrl": "https://www.linkedin.com/company/siemens-healthineers"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({linkedinUrl: 'https://www.linkedin.com/company/siemens-healthineers'})
};
fetch('https://app.loice.ai/api/v1/company', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://app.loice.ai/api/v1/company';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({linkedinUrl: 'https://www.linkedin.com/company/siemens-healthineers'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://app.loice.ai/api/v1/company"
payload = { "linkedinUrl": "https://www.linkedin.com/company/siemens-healthineers" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"found": true,
"company": {
"name": "Siemens Healthineers",
"linkedinUrl": "https://www.linkedin.com/company/siemens-healthineers",
"tagline": "We pioneer breakthroughs in healthcare. For everyone.",
"description": null,
"industry": "Hospitals and Health Care",
"employeeBand": "10,001+ employees",
"employeeCount": 54349,
"followerCount": 2089731,
"websiteUrl": "http://siemens-healthineers.com",
"websiteDomain": "siemens-healthineers.com",
"headquarters": "Forchheim",
"hqLocality": "Forchheim",
"hqRegion": null,
"hqCountry": "DE",
"foundedYear": null,
"companyType": "Public Company",
"specialties": [],
"logoUrl": null,
"logoImageUrl": null,
"phone": null,
"email": null,
"xUrl": null,
"facebookUrl": null,
"instagramUrl": null,
"youtubeUrl": null,
"confirmedAt": "2026-09-24T12:00:00.000Z"
},
"reason": null,
"cached": false,
"charged": true,
"pointsCharged": 2,
"balance": {
"available": 98,
"reserved": 0,
"granted": 100
},
"replay": false,
"creditsCharged": 2,
"servedFromCache": false
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"data": {
"found": true,
"company": {
"name": "<string>",
"linkedinUrl": "<string>",
"tagline": "<string>",
"description": "<string>",
"industry": "<string>",
"employeeBand": "<string>",
"employeeCount": 123,
"followerCount": 123,
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"headquarters": "<string>",
"hqLocality": "<string>",
"hqRegion": "<string>",
"hqCountry": "<string>",
"foundedYear": 123,
"companyType": "<string>",
"specialties": [
"<string>"
],
"logoUrl": null,
"logoImageUrl": "<string>",
"phone": "<string>",
"email": "<string>",
"xUrl": "<string>",
"facebookUrl": "<string>",
"instagramUrl": "<string>",
"youtubeUrl": "<string>",
"confirmedAt": "<string>"
},
"reason": "no-such-company",
"cached": true,
"charged": true,
"pointsCharged": 123,
"balance": {
"available": 123,
"reserved": 123,
"granted": 123
},
"replay": true,
"creditsCharged": 123,
"servedFromCache": true
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"data": {
"found": true,
"company": {
"name": "<string>",
"linkedinUrl": "<string>",
"tagline": "<string>",
"description": "<string>",
"industry": "<string>",
"employeeBand": "<string>",
"employeeCount": 123,
"followerCount": 123,
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"headquarters": "<string>",
"hqLocality": "<string>",
"hqRegion": "<string>",
"hqCountry": "<string>",
"foundedYear": 123,
"companyType": "<string>",
"specialties": [
"<string>"
],
"logoUrl": null,
"logoImageUrl": "<string>",
"phone": "<string>",
"email": "<string>",
"xUrl": "<string>",
"facebookUrl": "<string>",
"instagramUrl": "<string>",
"youtubeUrl": "<string>",
"confirmedAt": "<string>"
},
"reason": "no-such-company",
"cached": true,
"charged": true,
"pointsCharged": 123,
"balance": {
"available": 123,
"reserved": 123,
"granted": 123
},
"replay": true,
"creditsCharged": 123,
"servedFromCache": true
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"data": {
"found": true,
"company": {
"name": "<string>",
"linkedinUrl": "<string>",
"tagline": "<string>",
"description": "<string>",
"industry": "<string>",
"employeeBand": "<string>",
"employeeCount": 123,
"followerCount": 123,
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"headquarters": "<string>",
"hqLocality": "<string>",
"hqRegion": "<string>",
"hqCountry": "<string>",
"foundedYear": 123,
"companyType": "<string>",
"specialties": [
"<string>"
],
"logoUrl": null,
"logoImageUrl": "<string>",
"phone": "<string>",
"email": "<string>",
"xUrl": "<string>",
"facebookUrl": "<string>",
"instagramUrl": "<string>",
"youtubeUrl": "<string>",
"confirmedAt": "<string>"
},
"reason": "no-such-company",
"cached": true,
"charged": true,
"pointsCharged": 123,
"balance": {
"available": 123,
"reserved": 123,
"granted": 123
},
"replay": true,
"creditsCharged": 123,
"servedFromCache": true
}
}Resolve a company LinkedIn page to structured data
Resolves a company or school LinkedIn page URL (linkedinUrl, the only identifier this operation accepts) into a structured company record — industry, size band, headquarters, website, founding year, specialities, social profiles and more — from our own datastore, fetching and parsing the public company page when we have not seen it before. A company we already hold is answered from our records (cached: true, same price) even when live fetching is unavailable. A school is answered from our dataset only, because LinkedIn does not serve school pages publicly. Pass refresh: true to bypass cached freshness (billed again; not available for a school).
The address must be a FULL page URL: a bare slug such as microsoft is refused as invalid-input (400), as is a person, job, group or post URL.
Reasons: no-such-company (200, charged — the page states no such company), invalid-input (400), insufficient-credits (402), login-required (422 — a login wall, a school we do not hold, or a numeric id we cannot prove; retrying cannot help) and unavailable (503 — the source could not be read). A refusal carries the same data body as a success.
Fields the source does not state are returned as null and are never inferred. The company email is returned only when it is a generic role address on the company’s own domain that passed verification and is not on the workspace’s or the platform’s do-not-contact list; the phone is always null until phone verification is available. Rate limited per workspace (shared with the web app).
Billing
- charged per completed lookup — whether a company was found or not, and whether the answer came from owned data or a live fetch — never when the source could not be read, never for a refusal.
The current cost is shown in the app under Settings → Billing and in the live GET /api/v1/openapi.json. Calls that end in a system or provider error (HTTP 500) or are rate limited (HTTP 429) are not billed. The charged and pointsCharged fields of the response state what this call actually consumed.
curl --request POST \
--url https://app.loice.ai/api/v1/company \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"linkedinUrl": "https://www.linkedin.com/company/siemens-healthineers"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({linkedinUrl: 'https://www.linkedin.com/company/siemens-healthineers'})
};
fetch('https://app.loice.ai/api/v1/company', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://app.loice.ai/api/v1/company';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({linkedinUrl: 'https://www.linkedin.com/company/siemens-healthineers'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://app.loice.ai/api/v1/company"
payload = { "linkedinUrl": "https://www.linkedin.com/company/siemens-healthineers" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"found": true,
"company": {
"name": "Siemens Healthineers",
"linkedinUrl": "https://www.linkedin.com/company/siemens-healthineers",
"tagline": "We pioneer breakthroughs in healthcare. For everyone.",
"description": null,
"industry": "Hospitals and Health Care",
"employeeBand": "10,001+ employees",
"employeeCount": 54349,
"followerCount": 2089731,
"websiteUrl": "http://siemens-healthineers.com",
"websiteDomain": "siemens-healthineers.com",
"headquarters": "Forchheim",
"hqLocality": "Forchheim",
"hqRegion": null,
"hqCountry": "DE",
"foundedYear": null,
"companyType": "Public Company",
"specialties": [],
"logoUrl": null,
"logoImageUrl": null,
"phone": null,
"email": null,
"xUrl": null,
"facebookUrl": null,
"instagramUrl": null,
"youtubeUrl": null,
"confirmedAt": "2026-09-24T12:00:00.000Z"
},
"reason": null,
"cached": false,
"charged": true,
"pointsCharged": 2,
"balance": {
"available": 98,
"reserved": 0,
"granted": 100
},
"replay": false,
"creditsCharged": 2,
"servedFromCache": false
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"data": {
"found": true,
"company": {
"name": "<string>",
"linkedinUrl": "<string>",
"tagline": "<string>",
"description": "<string>",
"industry": "<string>",
"employeeBand": "<string>",
"employeeCount": 123,
"followerCount": 123,
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"headquarters": "<string>",
"hqLocality": "<string>",
"hqRegion": "<string>",
"hqCountry": "<string>",
"foundedYear": 123,
"companyType": "<string>",
"specialties": [
"<string>"
],
"logoUrl": null,
"logoImageUrl": "<string>",
"phone": "<string>",
"email": "<string>",
"xUrl": "<string>",
"facebookUrl": "<string>",
"instagramUrl": "<string>",
"youtubeUrl": "<string>",
"confirmedAt": "<string>"
},
"reason": "no-such-company",
"cached": true,
"charged": true,
"pointsCharged": 123,
"balance": {
"available": 123,
"reserved": 123,
"granted": 123
},
"replay": true,
"creditsCharged": 123,
"servedFromCache": true
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"data": {
"found": true,
"company": {
"name": "<string>",
"linkedinUrl": "<string>",
"tagline": "<string>",
"description": "<string>",
"industry": "<string>",
"employeeBand": "<string>",
"employeeCount": 123,
"followerCount": 123,
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"headquarters": "<string>",
"hqLocality": "<string>",
"hqRegion": "<string>",
"hqCountry": "<string>",
"foundedYear": 123,
"companyType": "<string>",
"specialties": [
"<string>"
],
"logoUrl": null,
"logoImageUrl": "<string>",
"phone": "<string>",
"email": "<string>",
"xUrl": "<string>",
"facebookUrl": "<string>",
"instagramUrl": "<string>",
"youtubeUrl": "<string>",
"confirmedAt": "<string>"
},
"reason": "no-such-company",
"cached": true,
"charged": true,
"pointsCharged": 123,
"balance": {
"available": 123,
"reserved": 123,
"granted": 123
},
"replay": true,
"creditsCharged": 123,
"servedFromCache": true
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"error": {
"code": "validation_error",
"message": "<string>",
"retryAfterSeconds": 123
}
}{
"data": {
"found": true,
"company": {
"name": "<string>",
"linkedinUrl": "<string>",
"tagline": "<string>",
"description": "<string>",
"industry": "<string>",
"employeeBand": "<string>",
"employeeCount": 123,
"followerCount": 123,
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"headquarters": "<string>",
"hqLocality": "<string>",
"hqRegion": "<string>",
"hqCountry": "<string>",
"foundedYear": 123,
"companyType": "<string>",
"specialties": [
"<string>"
],
"logoUrl": null,
"logoImageUrl": "<string>",
"phone": "<string>",
"email": "<string>",
"xUrl": "<string>",
"facebookUrl": "<string>",
"instagramUrl": "<string>",
"youtubeUrl": "<string>",
"confirmedAt": "<string>"
},
"reason": "no-such-company",
"cached": true,
"charged": true,
"pointsCharged": 123,
"balance": {
"available": 123,
"reserved": 123,
"granted": 123
},
"replay": true,
"creditsCharged": 123,
"servedFromCache": true
}
}Authorizations
Workspace API key (loice_sk_ + 48 hex characters), created under Settings → API Keys. Sent as Authorization: Bearer loice_sk_…. Invalid, missing, or expired keys are rejected with 401 before any billable work happens.
Headers
Optional, 1–255 printable ASCII characters, scoped to your workspace. Send the same key when you retry the same request: the original outcome is replayed (replay: true, charged: false, pointsCharged: 0) instead of running and charging again. The same key with a different request is refused with 409 idempotency_conflict, as is a key reused after its replay record expired (kept 30 days); a key whose first request is still running answers 409 idempotency_in_progress. Without a key, every request is a new lookup, billed at most once on its own.
1 - 255Body
A full LinkedIn company or school page URL (any locale subdomain, /m/, a sub-page, or a numeric id). A bare slug (microsoft) and a person, job, group or post URL are refused as invalid-input.
Bypass cached freshness and re-confirm against the source. Billed again. True only for the JSON literal true. Not available for a school (answered 422 login-required, never billed): school pages are not public, so there is no source to re-confirm against.
Response
A completed lookup — a company found, or no-such-company (charged). Inspect found, reason, charged and replay.
Show child attributes
Show child attributes

