Reference
CV
The CV a user chose to share, as structured data, as a PDF, and as a durable link. Always current: Tabbio resolves the selection on every read.
Download a CV from a durable link
/v1/cv-links/{token}No authenticationNo scope required
Streams the shared CV as a PDF from the durable link returned in pdf.url by GET /v1/me/cv. No credential is required: the signed token in the path is the credential. The document is always rendered fresh, so a link stored today shows the CV as it is when it is opened. The link lives exactly as long as the consent behind it: it stops working the moment the user disconnects the app, turns CV sharing off in Connected apps, or your client revokes its refresh token. Read pdf.url again after any of those to get a fresh link.
Path parameters
| Field | Type | Description |
|---|---|---|
| tokenrequired | string | The signed link token, in the form |
Status codes
- 200
The CV as a PDF.
- 404
The link is unknown, was revoked, no longer carries the
cv:readgrant, or the user disconnected the app.
curl https://server.tabbio.com/v1/cv-links/$TOKENconst response = await fetch(`https://server.tabbio.com/v1/cv-links/${token}`);
const pdf = Buffer.from(await response.arrayBuffer());import requests
response = requests.get(f"https://server.tabbio.com/v1/cv-links/{token}")
response.raise_for_status()
pdf = response.contentHTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: inline; filename="cv.pdf"
<binary PDF>Get the shared CV
/v1/me/cvUser access tokencv:read
Returns the CV the user chose to share, as the canonical Tabbio CV document. The selection is resolved on every request, so when the connection follows the main CV the partner always reads the current one. Private contact details are stripped without the cv:contact scope, the photo without the photo permission. Send the previous ETag back in If-None-Match to poll cheaply: an unchanged CV answers 304 with no body. pdf.url is a durable link with no expiry, but it dies with the consent behind it: read this endpoint again after the user changes what they share, or after you revoke your refresh token, to get a working one.
Headers
| Field | Type | Description |
|---|---|---|
| If-None-Match | string | The |
Response
These fields sit inside data.
| Field | Type | Description |
|---|---|---|
| idalways | string | "master" for the profile-backed main CV, otherwise the CV id. |
| titlealways | string | What the user calls this CV. |
| updatedAtalways | string | When the CV last changed. Poll this, or use the ETag. |
| isMainCvalways | boolean | True when this is the CV the user set as their main one. |
| languagealways | string | Detected from the CV’s own content: "en" or "ar". |
| documentalways | object | The CV itself. |
| usernamealways | string | The owner’s Tabbio handle. |
| publicCvUrlalways | string or null | Their public profile, or null when that page would not resolve. |
| namealways | string | The name printed at the top of the CV. |
| titlealways | string or null | The headline under the name. |
| summaryalways | string or null | The profile summary paragraph. |
| bioalways | string or null | A shorter bio, when the profile carries one. |
| locationalways | string or null | City and country. |
| avatarUrlalways | string or null | Photo. Null when the user chose not to share it. |
| contactEmailalways | string or null | Contact address. Null without the email scope. |
| isUaePassVerifiedalways | boolean | True only when the identity is UAE PASS verified. |
| socialsalways | object | Links keyed by platform, plus phone. Phone is absent without the cv:contact scope. |
| openToWorkalways | boolean | Whether the person is open to offers. |
| skillsalways | string[] | Every skill, flattened. |
| skillGroupsalways | object[] | The same skills, grouped. |
| categoryalways | string | What the group is called, such as "Design". |
| itemsalways | string[] | The skills in this group. |
| languagesalways | string[] | Languages with proficiency, such as "Arabic (Native)". |
| highlightsalways | object[] | Career highlights. |
| id | string | Stable id, when the CV carries one. |
| titlealways | string | The achievement in a few words. |
| descalways | string | One or two sentences of detail. |
| experiencesalways | object[] | Work history, most recent first. |
| idalways | string | Stable id for this role. |
| titlealways | string | Job title. |
| companyalways | string | Employer name. |
| location | string or null | Where the role was based. |
| locationType | string or null | How the role was worked. One of |
| employmentType | string or null | Full-time, contract, and so on. |
| startDatealways | string or null | When the role started, or null when unknown. |
| endDate | string or null | When it ended. Null if current. |
| currentalways | boolean | True while the person still holds the role. |
| overview | string or null | A paragraph about the role. |
| bulletsalways | string[] | Achievements, one per line. |
| educationsalways | object[] | Education history. |
| idalways | string | Stable id for this entry. |
| schoolalways | string | Institution name. |
| degree | string or null | The qualification earned. |
| fieldOfStudy | string or null | Subject studied. |
| startDate | string or null | When study started. |
| endDate | string or null | When study finished. |
| description | string or null | Grade and any extra detail the person added. |
| certificationsalways | object[] | Certifications and licences. |
| idalways | string | Stable id for this certification. |
| namealways | string | Certification name. |
| issueralways | string | Who issued it. |
| issueDate | string or null | When it was issued. |
| expirationDate | string or null | When it expires. Null when it does not. |
| credentialUrl | string or null | Public verification link, when there is one. |
| projectsalways | object[] | Featured projects. |
| idalways | string | Stable id for this project. |
| titlealways | string | Project name. |
| description | string or null | What the project was. |
| image | string or null | Cover image, when there is one. |
| link | string or null | Where to see the project. |
| technologiesalways | string[] | Tools and stack used. |
| personalDetailsalways | object or null | Private details. Null without the cv:contact scope, and when nothing is stored. |
| dateOfBirthalways | string or null | Date of birth, as the user entered it. |
| genderalways | string or null | Gender, as the user entered it. |
| maritalStatusalways | string or null | Marital status. |
| nationalityalways | string or null | Nationality. |
| residencealways | string or null | Where the user currently lives. |
| visaResidencyalways | string or null | Visa or residency status. |
| nationalServicealways | string or null | National service status. |
| dependentsalways | string or null | Number of dependants. |
| publicProfileUrlalways | string or null | Their public Tabbio profile, when that page resolves. |
| pdfalways | object | Where to download this CV as a PDF. |
| urlalways | string | |
| contentTypealways | string | One of |
Status codes
- 200
The shared CV.
- 304
The CV has not changed since the given ETag.
- 401
The access token is missing, expired, or revoked.
- 403
The user did not grant the cv:read scope.
- 404
This account has no CV to share yet.
curl https://server.tabbio.com/v1/me/cv \
-H "Authorization: Bearer $TABBIO_ACCESS_TOKEN"const response = await fetch(
"https://server.tabbio.com/v1/me/cv",
{
headers: {
Authorization: `Bearer ${process.env.TABBIO_ACCESS_TOKEN}`,
},
},
);
const payload = await response.json();import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['TABBIO_ACCESS_TOKEN']}",
}
response = requests.get("https://server.tabbio.com/v1/me/cv", headers=headers)
response.raise_for_status()
payload = response.json(){
"data": {
"id": "master",
"title": "Main CV",
"updatedAt": "2026-08-30T09:12:04.000Z",
"isMainCv": true,
"language": "en",
"document": {
"username": "sara",
"publicCvUrl": "https://sara.tabbio.com",
"name": "Sara Ahmed",
"title": "Senior Product Designer",
"summary": "Product designer with nine years in fintech and logistics across the UAE and the wider Gulf. I work end to end, from research through to the shipped interface.",
"bio": null,
"location": "Dubai, United Arab Emirates",
"avatarUrl": "https://cdn.tabbio.com/avatars/sara.jpg",
"contactEmail": "sara@example.com",
"isUaePassVerified": true,
"socials": {
"linkedin": "https://www.linkedin.com/in/sara-ahmed-design",
"website": "https://sara.design",
"phone": "+971 50 123 4567"
},
"openToWork": true,
"skills": [
"Product design",
"Design systems",
"User research",
"Figma",
"Prototyping"
],
"skillGroups": [
{
"category": "Design",
"items": [
"Product design",
"Design systems",
"Prototyping"
]
},
{
"category": "Research",
"items": [
"User research",
"Usability testing"
]
}
],
"languages": [
"Arabic (Native)",
"English (Professional)"
],
"highlights": [
{
"id": "hl_3a71",
"title": "Rebuilt merchant onboarding",
"desc": "Cut a payments onboarding flow from eleven screens to four and lifted completion from 54 to 81 percent."
}
],
"experiences": [
{
"id": "exp_41c8",
"title": "Senior Product Designer",
"company": "Mena Pay",
"location": "Dubai, United Arab Emirates",
"locationType": "Hybrid",
"employmentType": "Full-time",
"startDate": "2022-03-01T00:00:00.000Z",
"endDate": null,
"current": true,
"overview": "Own the design of merchant onboarding and payouts for a regional payments platform.",
"bullets": [
"Cut merchant onboarding from eleven screens to four, lifting completion from 54 to 81 percent.",
"Built the design system now used by three product teams."
]
},
{
"id": "exp_7d02",
"title": "Product Designer",
"company": "Aramex",
"location": "Dubai, United Arab Emirates",
"locationType": "On-site",
"employmentType": "Full-time",
"startDate": "2018-09-01T00:00:00.000Z",
"endDate": "2022-02-28T00:00:00.000Z",
"current": false,
"overview": "Designed the courier and dispatch tooling used across the Gulf network.",
"bullets": [
"Redesigned the dispatch console used every day by 400 operators."
]
}
],
"educations": [
{
"id": "edu_2b55",
"school": "American University of Sharjah",
"degree": "Bachelor of Science",
"fieldOfStudy": "Multimedia Design",
"startDate": "2014-09-01T00:00:00.000Z",
"endDate": "2018-06-01T00:00:00.000Z",
"description": null
}
],
"certifications": [
{
"id": "cert_9e13",
"name": "UX Certification",
"issuer": "Nielsen Norman Group",
"issueDate": "2023-05-18T00:00:00.000Z",
"expirationDate": null,
"credentialUrl": "https://www.nngroup.com/ux-certification/verify/1049233"
}
],
"projects": []
},
"personalDetails": {
"dateOfBirth": "1996-02-14",
"gender": "Female",
"maritalStatus": "Single",
"nationality": "Lebanese",
"residence": "Dubai, United Arab Emirates",
"visaResidency": "Employment visa",
"nationalService": null,
"dependents": null
},
"publicProfileUrl": "https://sara.tabbio.com",
"pdf": {
"url": "https://server.tabbio.com/v1/cv-links/9f2b7c41ad83e05d6b1c4f7a2e930d18.4c1d8e05b7a92f36d0c85e41ba7f2d69.pdf",
"contentType": "application/pdf"
}
},
"error": null,
"meta": null
}Download the shared CV as a PDF
/v1/me/cv.pdfUser access tokencv:read
Streams the same CV as a PDF, rendered by the same generator as the in-app export and masked by the same privacy projection as the JSON. For a link you can store and reuse without an access token, read pdf.url from GET /v1/me/cv; that link is revoked whenever the CV grant is.
Status codes
- 200
The CV as a PDF.
- 401
The access token is missing, expired, or revoked.
- 403
The user did not grant the cv:read scope.
- 404
This account has no CV to share yet.
curl https://server.tabbio.com/v1/me/cv.pdf \
-H "Authorization: Bearer $TABBIO_ACCESS_TOKEN"const response = await fetch(
"https://server.tabbio.com/v1/me/cv.pdf",
{
headers: {
Authorization: `Bearer ${process.env.TABBIO_ACCESS_TOKEN}`,
},
},
);
const pdf = Buffer.from(await response.arrayBuffer());import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['TABBIO_ACCESS_TOKEN']}",
}
response = requests.get("https://server.tabbio.com/v1/me/cv.pdf", headers=headers)
response.raise_for_status()
pdf = response.contentHTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: inline; filename="cv.pdf"
<binary PDF>Base URL https://server.tabbio.com. Every response outside the token endpoint uses the { data, error, meta } envelope.