Vocations
API Docs
Integra il monitoraggio delle offerte di lavoro e l'intelligence sulle aziende direttamente nel tuo workflow di recruiting.
Autenticazione
Tutti gli endpoint sotto /v2 richiedono API key valida, anche quelli che non consumano utilizzo.
Gli endpoint sotto /playground non richiedono API key.
Per gli endpoint /v2, la chiave deve essere passata nell'header HTTP Authorization con il valore Bearer <chiave>.
Authorization: Bearer 5tg••••••••••••••••8ux
Tipi condivisi
? dopo qualsiasi chiave di un tipo implica che il valore è opzionale.[] dopo qualsiasi tipo implica che il valore, se passato, deve essere un array.
Tutti gli id hanno lunghezza di 16 caratteri.
Gli endpoint di ricerca accettano page (in base zero, default 0) e pageSize (minimo 1, massimo 128, default 10).
Gli array dei filtri accettano fino a 64 elementi, tranne names, cities, provinces, regions, nations, postalCodes, italy.ivas, italy.ateco, spain.cifNifs e spain.cnae, che ne accettano fino a 256. Gli endpoint batch accettano da 1 a 128 ID. Superare un limite restituisce 400.
Ogni risposta autenticata restituisce X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset per la finestra del minuto corrente. Un 429 restituisce anche Retry-After.
type ErrorResponse = { message: string };
type CountryKey = "italy" | "spain";
type LocationLevel = {
level: 4 | 6 | 8;
value: string;
};
type LocationFilter = {
country: CountryKey;
levels: LocationLevel[];
};
type Location = {
city?: string;
province?: string;
region?: string;
nation?: string;
latitude?: number;
longitude?: number;
};
type PendingStatus =
| "idle"
| "pending"
| "completed"
| "notAvailable"
| "failed";
type NumericRange =
| { min: number; max: number }
| { min: number; max?: undefined }
| { min?: undefined; max: number };
type YearlySalaryRange = {
min?: number;
max?: number;
currency: string;
};
type YearlyValue = {
year: number;
value: number;
};
type SortType =
| "default"
| "name"
| "city"
| "province"
| "region"
| "sectors"
| "currentTotalRevenue"
| "currentEmployees"
| "currentOpenPositions";
type SortOrder = "asc" | "desc";
type PositionSource = "vocations" | "linkedIn" | "indeed" | "infoJobs";
type Hours = "full" | "part" | "shift";
type CompanyStatus = "open" | "bankruptcy" | "liquidation";
type ValueTrend = "increasing" | "decreasing" | "stable";
type ExperienceLevel = "0" | "0-1" | "1-3" | "3-5" | "5-10" | "10+";
type Contract =
| "temporary"
| "internship"
| "permanent"
| "contract"
| "apprenticeship"
| "freelance";
type Collar = "blue" | "white";
type SmartWorking = "yes" | "no" | "hybrid";
type BusinessUnit =
| "finance"
| "hr"
| "purchasing"
| "marketing"
| "sales"
| "customerService"
| "research"
| "operations"
| "it"
| "legal"
| "strategy"
| "sustainability"
| "administration";
type SectorKey =
| "administrationAccounting"
| "textileClothing"
| "mediaCommunicationMarketing"
| "aeronauticsNavalDefense"
| "realEstate"
| "agriculture"
| "horeca"
| "food"
| "artHistoryArchitecture"
| "furniture"
| "craftsmanship"
| "insurance"
| "socialCooperativesAssociations"
| "automotive"
| "banking"
| "biomedical"
| "broadcastingMusicFilm"
| "outsourcingBusinessServices"
| "retail"
| "manufacturingIndustrial"
| "chemical"
| "energyOilGas"
| "trade"
| "consultingITConsulting"
| "consumerGoods"
| "pharmaceutical"
| "environmentSustainabilityEcology"
| "publishing"
| "educationTraining"
| "electronicsElectrotechnics"
| "industrialEngineeringServices"
| "sportsCultureEntertainment"
| "publicEntitiesNonProfitPublicAdmin"
| "financeFinancialServices"
| "gamingBetting"
| "rubberPlastic"
| "largeScaleRetail"
| "healthHygiene"
| "humanResources"
| "warehousePackaging"
| "cybersecurityIT"
| "legalCompliance"
| "logistics"
| "transportShipping"
| "medical"
| "metallurgyMechanics"
| "exhibitionsFairsEvents"
| "motors"
| "cleaning"
| "securitySurveillance"
| "personalServices"
| "professionalFirm"
| "telecommunications"
| "tourismTravel"
| "designFashion"
| "multiservices"
| "technologyScienceData"
| "automation"
| "other";
type ItalyLegalForm =
| "AA"
| "AC"
| "AE"
| "AF"
| "AI"
| "AL"
| "AM"
| "AN"
| "AP"
| "AR"
| "AS"
| "AT"
| "AU"
| "AZ"
| "CC"
| "CE"
| "CF"
| "CI"
| "CL"
| "CM"
| "CN"
| "CO"
| "CR"
| "CS"
| "CZ"
| "DI"
| "EC"
| "ED"
| "EE"
| "EI"
| "EL"
| "EM"
| "EN"
| "EP"
| "ER"
| "ES"
| "FI"
| "FO"
| "GE"
| "IC"
| "ID"
| "IF"
| "IR"
| "LL"
| "MA"
| "OC"
| "OO"
| "OS"
| "PA"
| "PC"
| "PF"
| "PS"
| "RC"
| "RR"
| "RS"
| "SA"
| "SC"
| "SD"
| "SE"
| "SF"
| "SG"
| "SI"
| "SL"
| "SM"
| "SN"
| "SO"
| "SP"
| "SR"
| "SS"
| "ST"
| "SU"
| "SV"
| "SZ";
type SpainLegalForm =
| "GE"
| "IE"
| "IU"
| "PO"
| "AC"
| "CJ"
| "CB"
| "CD"
| "BI"
| "PH"
| "CG"
| "CL"
| "EX"
| "PV"
| "NL"
| "NR"
| "PJ"
| "FN"
| "FJ"
| "FD"
| "MT"
| "MU"
| "OA"
| "PP"
| "AG"
| "SM"
| "SA"
| "ES"
| "SD"
| "SE"
| "SB"
| "SF"
| "SU"
| "CV"
| "CP"
| "CO"
| "CA"
| "CS"
| "SC"
| "SG"
| "GR"
| "LD"
| "SL"
| "LL"
| "LP"
| "NE"
| "LF"
| "LU"
| "UC"
| "UT"
| "OR";Codici delle forme giuridiche
Le forme giuridiche usano codici specifici per paese. Espandi un paese per vedere il significato ufficiale di ogni valore accettato e restituito dall'API.
Usa questi codici in italy.legalForms o spain.legalForms durante la ricerca. L'enrichment aziendale restituisce un singolo codice in italy.legalForm o spain.legalForm.
Italia · ItalyLegalForm (73 valori)
| Codice | Significato |
|---|---|
| AA | Società in accomandita per azioni (S.a.p.A.) |
| AC | Associazione |
| AE | Società consortile in accomandita semplice |
| AF | Altre forme |
| AI | Associazione impresa |
| AL | Azienda speciale di ente locale |
| AM | Azienda municipale |
| AN | Società consortile in nome collettivo |
| AP | Azienda provinciale |
| AR | Azienda regionale |
| AS | Società in accomandita semplice (S.a.s.) |
| AT | Azienda autonoma statale |
| AU | Società per azioni con socio unico |
| AZ | Azienda speciale |
| CC | Consorzio con attività esterna |
| CE | Comunione ereditaria |
| CF | Consorzio fidi |
| CI | Società cooperativa a responsabilità illimitata |
| CL | Società cooperativa a responsabilità limitata |
| CM | Consorzio municipale |
| CN | Società consortile |
| CO | Consorzio |
| CR | Consorzio intercomunale |
| CS | Consorzio senza attività esterna |
| CZ | Consorzio di cui al D.Lgs. 267/2000 |
| DI | Impresa individuale |
| EC | Ente pubblico commerciale |
| ED | Ente diritto pubblico |
| EE | Ente ecclesiastico |
| EI | Ente impresa |
| EL | Ente sociale |
| EM | Ente morale |
| EN | Ente |
| EP | Ente pubblico economico |
| ER | Ente ecclesiastico civilmente riconosciuto |
| ES | Ente di cui alla L.R. 21-12-93 N.88 |
| FI | Fondazione impresa |
| FO | Fondazione |
| GE | Gruppo europeo di interesse economico (GEIE) |
| IC | Istituto di credito |
| ID | Istituto di credito di diritto pubblico |
| IF | Impresa familiare |
| IR | Istituto religioso |
| LL | Azienda speciale di cui al D.Lgs. 267/2000 |
| MA | Mutua assicurazione |
| OC | Società cooperativa consortile |
| OO | Cooperativa sociale |
| OS | Società consortile cooperativa a responsabilità limitata |
| PA | Associazione in partecipazione |
| PC | Piccola società cooperativa |
| PF | Persona fisica |
| PS | Piccola società cooperativa a responsabilità limitata |
| RC | Contratto di rete dotato di soggettività giuridica |
| RR | Società a responsabilità limitata a capitale ridotto |
| RS | Società a responsabilità limitata semplificata (S.r.l.s.) |
| SA | Società anonima |
| SC | Società cooperativa (Soc. Coop.) |
| SD | Società europea |
| SE | Società semplice (S.s.) |
| SF | Società di fatto |
| SG | Società cooperativa europea (SCE) |
| SI | Società irregolare |
| SL | Società consortile a responsabilità limitata |
| SM | Società di mutuo soccorso |
| SN | Società in nome collettivo (S.n.c.) |
| SO | Società consortile per azioni |
| SP | Società per azioni (S.p.A.) |
| SR | Società a responsabilità limitata (S.r.l.) |
| SS | Società costituita in base a leggi di altro stato |
| ST | Soggetto estero |
| SU | Società a responsabilità limitata con unico socio |
| SV | Società tra professionisti (S.t.p.) |
| SZ | Società non prevista dalla legislazione italiana |
Spagna · SpainLegalForm (51 valori)
| Codice | Significato |
|---|---|
| GE | Agrup. Eur. de Interés Económico |
| IE | Agrupación de Interés Económico |
| IU | Agrupación de Interés Urbanístico |
| PO | Agrupación Portuaria de Interés Económico |
| AC | Asociación |
| CJ | Caja |
| CB | Club Deportivo Básico |
| CD | Club Deportivo Elemental |
| BI | Comunidad de Bienes |
| PH | Comunidad de Propietarios en Régimen de Propiedad Horizontal |
| CG | Congregación o Institución Religiosa |
| CL | Corporación Local |
| EX | Empresa Extranjera |
| PV | Entidad de Previsión Social Voluntaria |
| NL | Entidad no Lucrativa |
| NR | Entidad no Residente |
| PJ | Entidad sin personalidad jurídica |
| FN | Fondo |
| FJ | Forma jurídica sin identificar |
| FD | Fundación |
| MT | Mutua |
| MU | Mutualidad de Previsión Social |
| OA | Organismo Autónomo |
| PP | Partido Político |
| AG | Sociedad Agraria de Transformación |
| SM | Sociedad Anonima Municipal |
| SA | Sociedad Anónima |
| ES | Sociedad Anónima de Gestión de Estibadores Portuarios |
| SD | Sociedad Anónima Deportiva |
| SE | Sociedad Anónima Europea |
| SB | Sociedad Anónima Laboral |
| SF | Sociedad Anónima Profesional |
| SU | Sociedad Anónima Unipersonal |
| CV | Sociedad Civil |
| CP | Sociedad Civil Profesional |
| CO | Sociedad Colectiva / Sociedad de Responsabilidad Colectiva |
| CA | Sociedad Comanditaria por Acciones |
| CS | Sociedad Comanditaria Simple / Sociedad en Comandita |
| SC | Sociedad Cooperativa |
| SG | Sociedad Cooperativa Europea |
| GR | Sociedad de Garantía Recíproca |
| LD | Sociedad Limitada |
| SL | Sociedad Limitada |
| LL | Sociedad Limitada Laboral |
| LP | Sociedad Limitada Laboral Profesional |
| NE | Sociedad Limitada Nueva Empresa |
| LF | Sociedad Limitada Profesional |
| LU | Sociedad Limitada Unipersonal |
| UC | Sucursal en España |
| UT | Unión Temporal de Empresas |
| OR | Órgano de la Administración |
Playground
Usa il playground per esplorare gli endpoint senza API key. Il base path del playground è https://vocations.io/api/playground, rispecchia esattamente gli endpoint v2 e usa dati sintetici italiani e spagnoli.
curl -X POST https://vocations.io/api/playground/companies \
-H "Content-Type: application/json" \
-d '{
"page": 0,
"company": {
"locations": [
{
"country": "spain",
"levels": [{ "level": 4, "value": "Cataluña" }]
}
],
"sectors": ["technologyScienceData"],
"employees": [{ "min": 11, "max": 200 }]
},
"sortType": "name",
"sortOrder": "asc",
"withPositions": true
}'{
"companyIDs": [
"pc0000000000000f",
"pc0000000000001j",
"pc0000000000002b"
],
"totalPages": 22,
"totalResults": 217
}Aziende
POST /companies
✓ Non consuma creditiRichiesta
type APICompanyFilter = {
ids?: string[];
parentHoldingIDs?: string[];
names?: string[];
workAgency?: boolean;
locations?: LocationFilter[];
postalCodes?: string[];
italy?: {
ivas?: string[];
ateco?: string[];
legalForms?: ItalyLegalForm[];
};
spain?: {
cifNifs?: string[];
cnae?: string[];
legalForms?: SpainLegalForm[];
};
sectors?: SectorKey[];
employees?: NumericRange[];
totalRevenue?: NumericRange[];
totalRevenueTrend?: ValueTrend[];
employeesCostTrend?: ValueTrend[];
positionCountTrend?: ValueTrend[];
companyStatuses?: CompanyStatus[];
createdAt?: NumericRange[];
};
type V2CompaniesRequest = {
page?: number;
pageSize?: number;
company: APICompanyFilter;
notCompany?: APICompanyFilter;
sortType?: SortType;
sortOrder?: SortOrder;
withPositions?: boolean;
};ids filtra solo sugli ID azienda. parentHoldingIDs filtra le aziende la cui holding di appartenenza è uno degli ID indicati. La stessa distinzione vale per i filtri company e notCompany nelle ricerche di posizioni.
Esempio body (JSON)
{
"page": 0,
"company": {
"locations": [
{
"country": "italy",
"levels": [{ "level": 4, "value": "Lombardia" }]
},
{
"country": "spain",
"levels": [{ "level": 4, "value": "Cataluña" }]
}
],
"sectors": ["technologyScienceData"],
"employees": [{ "min": 11, "max": 200 }]
},
"sortType": "name",
"sortOrder": "asc",
"withPositions": true
}withPositions: true fa sì che l'endpoint restituisca solo le aziende con posizioni aperte.
Risposta 200
type V2CompanySearchResult = {
companyIDs: string[];
totalPages: number;
totalResults: number;
};totalPages è il numero di pagine disponibili per i filtri attuali, con il pageSize richiesto.
Possibili errori
POST /companies/enrich
💳 1 credito/azienda · 2 crediti con dati finanziariEsegue l'enrich delle aziende tramite gli ID passati.
Richiesta
type V2CompanyEnrichRequest = {
companyIDs: string[];
};Risposta 200
type V2EnrichedCompany = {
companyID: string;
parentHolding?: string;
name: string;
workAgency: boolean;
openPositionCount: number;
url?: string;
imageFile?: string;
linkedInURL?: string;
indeedURL?: string;
infoJobsURL?: string;
address?: string;
location?: LocationLevel[];
nation?: string;
sectors: SectorKey[];
employees: YearlyValue[];
totalRevenue: YearlyValue[];
employeesCost: YearlyValue[];
netProfit: YearlyValue[];
italy?: {
ragioneSociale: string;
iva?: string;
ateco?: string;
atecoCode?: string;
rea?: string;
shareCapital?: number;
legalForm?: ItalyLegalForm;
chamberOfCommerce?: string;
};
spain?: {
razonSocial: string;
cifNif?: string;
cnae?: string;
cnaeCode?: string;
legalForm?: SpainLegalForm;
shareCapital?: number;
};
createdAt?: number;
validationKey: string;
};
type V2CompanyEnrichResult = {
companies: V2EnrichedCompany[];
notFoundCompanyIDs: string[];
insufficientCreditsCompanyIDs: string[];
};imageFile contiene solo il nome del file. Per accedere al logo usa la CDN: https://cdn.vocations.io/logos/<imageFile>
notFoundCompanyIDs elenca gli ID inesistenti o non visibili alla tua chiave. insufficientCreditsCompanyIDs elenca le aziende esistenti escluse perché i crediti sono terminati durante il batch: richiedile di nuovo quando hai crediti. Un 402 viene restituito solo quando nessuna azienda richiesta era coperta dai crediti.
Possibili errori
POST /companies/status
✓ Non consuma creditiVerifica se i dati che hai già sono ancora aggiornati. Invia ogni companyID insieme alla validationKey restituita da /companies/enrich.
Richiesta
type V2CompanyStatusRequest = {
companies: {
companyID: string;
validationKey: string;
}[];
};Esempio body (JSON)
{
"companies": [
{
"companyID": "cmp1a2b3c4d5e6f7g",
"validationKey": "eyJhbGciOiJIUzI1NiJ9..."
},
{
"companyID": "cmp8h9i0j1k2l3m4n",
"validationKey": "eyJhbGciOiJIUzI1NiJ9..."
}
]
}Risposta 200
type V2CompanyStatusResult = {
upToDateIDs: string[];
outdatedIDs: string[];
invalidIDs: string[];
};outdatedIDs contiene le aziende i cui dati sono cambiati dopo l'emissione della validationKey: vanno rifatte con enrich. invalidIDs contiene aziende sconosciute, o chiavi che non appartengono al companyID con cui sono state inviate.
Possibili errori
Posizioni
POST /positions
💳 3 crediti se ci sono risultatiRichiesta
type APIPositionFilter = {
ids?: string[];
sources?: PositionSource[];
names?: string[];
cities?: string[];
provinces?: string[];
regions?: string[];
nations?: string[];
languages?: string[];
targets?: string[];
smartWorking?: SmartWorking[];
collar?: (Collar | null)[];
hours?: (Hours | null)[];
contract?: (Contract | null)[];
experience?: (ExperienceLevel | null)[];
protectedCategories?: (boolean | null)[];
skills?: string[];
benefits?: string[];
certifications?: string[];
courses?: string[];
businessUnits?: BusinessUnit[];
yearlySalary?: NumericRange[];
createdAt?: NumericRange[];
};
type V2PositionsRequest = {
page?: number;
pageSize?: number;
position?: APIPositionFilter;
notPosition?: APIPositionFilter;
company?: APICompanyFilter;
notCompany?: APICompanyFilter;
includeNoMatch?: boolean;
};Esempio body (JSON)
{
"page": 0,
"position": {
"sources": ["vocations", "linkedIn"],
"regions": ["Lombardia"],
"contract": ["permanent"],
"experience": ["1-3", "3-5"]
},
"company": {
"sectors": ["technologyScienceData"]
}
}includeNoMatch: true include anche le posizioni senza un'azienda collegata.
Risposta 200
type V2PositionSearchResult = {
positionIDs: string[];
totalPages: number;
totalResults: number;
};Possibili errori
POST /positions/enrich
💳 1 credito ogni 5 posizioniRichiesta
type V2PositionEnrichRequest = {
positionIDs: string[];
};Risposta 200
type V2PositionCompanyContext = {
companyID: string;
workAgency: boolean;
italy?: { ragioneSociale: string; iva?: string };
spain?: { razonSocial: string; cifNif?: string };
};
type V2EnrichedPosition = {
positionID: string;
companyContext: V2PositionCompanyContext;
name: string;
description: string;
urls: string[];
sources: PositionSource[];
targets: string[];
cities: string[];
provinces: string[];
regions: string[];
sites: Location[];
skills: string[];
benefits: string[];
languages: string[];
certifications: string[];
courses: string[];
experience?: ExperienceLevel;
contract?: Contract;
hours?: Hours;
smartWorking: SmartWorking;
collar?: Collar;
protectedCategories?: boolean;
yearlySalaryRange?: YearlySalaryRange;
createdAt: number;
republishedAt?: number;
companyName?: string;
validationKey: string;
};
type V2PositionEnrichResult = {
positions: V2EnrichedPosition[];
failedPositionIDs: string[];
};Per ottenere i dati completi delle aziende usa l'endpoint /companies/enrich.
Possibili errori
POST /positions/check
✓ Non consuma creditiPer ottenere lo stato di una o più posizioni.
Richiesta
type V2PositionsCheckRequest = {
positionIDs: string[];
};Risposta 200
type V2PositionCheckResult = {
openIDs: string[];
closedIDs: string[];
invalidIDs: string[];
};Possibili errori
Contatti
POST /contacts
✓ Non consuma creditiPer cercare i contatti collegati ad un'azienda.
Richiesta
type V2ContactsRequest = {
companyID: string;
jobTitles?: string[];
page?: number;
};Risposta 200
type V2ContactSearchItem = {
contactID: string;
firstName?: string;
lastName?: string;
jobTitle?: string;
hasEmail: boolean;
hasCity: boolean;
};
type V2ContactSearchResult = {
contacts: V2ContactSearchItem[];
totalPages: number;
totalResults: number;
};Possibili errori
POST /contacts/enrich
💳 3 crediti · +2 crediti con numero di telefonoRichiesta
type V2ContactEnrichRequest = {
contactID: string;
enrichPhoneNumber?: boolean;
};Risposta 200
type V2EnrichedContact = {
contactID: string;
firstName?: string;
lastName?: string;
jobTitle?: string;
headline?: string;
linkedInURL?: string;
photoURL?: string;
departments: string[];
email?: string;
emailStatus?: PendingStatus;
mobilePhone?: string;
phoneStatus?: PendingStatus;
location: LocationLevel[];
validationKey: string;
};Possibili errori
POST /contacts/poll
💳 2 crediti quando arriva un numeroRestituisce lo stato attuale di un contatto già arricchito. Da usare quando enrichPhoneNumber ha restituito phoneStatus: "pending": la ricerca del numero è asincrona e arriva qui una volta risolta.
Richiesta
type V2ContactPollRequest = {
contactID: string;
};Risposta 200
type V2ContactPollResult = {
email?: string;
emailStatus?: PendingStatus;
mobilePhone?: string;
phoneStatus: PendingStatus;
};I 2 crediti del telefono vengono addebitati solo quando un numero viene effettivamente restituito. Una ricerca che si chiude con notAvailable o failed non costa nulla.
Possibili errori
Utilizzo
GET /usage
✓ Non consuma creditiRestituisce lo stato di utilizzo corrente della API key.
Risposta 200
type V2UsageSnapshot = {
usedCredits: number;
maxCredits: number;
areCreditsShared: boolean;
lastResetAt: number;
};