Read
get_profile
Returns the full ProfileData snapshot for the authenticated creator's outline — stacks, cards, social links, SEO fields, and subscription status — ready for inspection or as the baseline before editing.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| outlineId | string | — | The Payload numeric outline ID (as a string) to fetch. If omitted, defaults to the first outline owned by the authenticated user. Passing another user's outline ID returns NOT_FOUND — ownership is enforced at fetch time with no admin bypass. |
Response
| Field | Type | What it means |
|---|---|---|
| id | string | Numeric Payload outline ID, coerced to string. Use this as outlineId in subsequent tool calls. |
| name | string | Display name for the profile (maps to Payload `title`; falls back to slug if title is blank). |
| handle | string | URL handle / slug — the profile lives at /<handle>. |
| isPaid | boolean | Whether the outline's subscription is in an entitled (Pro) state. Derived from subscriptionDetails.subscriptionStatus via isEntitled(). |
| seo | SeoData | SEO/OG fields: { title, description, imageId, imageUrl }. title and description are empty strings when unset. imageId is the Payload media doc ID (string or number) or null; imageUrl is the CDN URL or null. |
| stacks | StackData[] | Ordered list of card stacks. Each stack has { id, title, cards[] }. cards[] is the ordered list of cards within that stack. |
| stacks[].id | string | Payload row ID for the stack. |
| stacks[].title | string | Section heading displayed above the card rail. |
| stacks[].cards | CardData[] | Ordered cards in this stack. Each card carries all display + cover + CTA fields. |
| stacks[].cards[].id | string | Payload row ID for the card. |
| stacks[].cards[].kind | CardTemplateKind | Template lens: basic | about | link | portfolio | service | book-me | testimonial | contact | email | embed-booking | buy. Null/missing in DB is normalised to 'basic'. |
| stacks[].cards[].heading | string | Primary card headline. |
| stacks[].cards[].subheading | string | Secondary line beneath the heading. |
| stacks[].cards[].description | string | Body text / longer description. |
| stacks[].cards[].buttonText | string | CTA button label. |
| stacks[].cards[].buttonUrl | string | CTA button destination URL. |
| stacks[].cards[].coverId | string | number | null | Payload media doc ID for the cover image/video. Pass this back to update_card to keep the existing cover without re-uploading. |
| stacks[].cards[].coverUrl | string | null | CDN URL for the cover (900w medium variant when available, else original). Editor-display only — not a stable asset URL to persist. |
| stacks[].cards[].coverColor | string | CSS hex colour used as card background fallback when no cover image is set. Empty string means no colour override. |
| stacks[].cards[].forceHorizontalFit | boolean | When true the cover is letterboxed horizontally instead of cropped. |
| stacks[].cards[].hidden | boolean | True = card is hidden from the public profile (non-destructive; card still exists in DB). |
| stacks[].cards[].badge | string | null | Short pill text for About/Service card kinds. Null when not set. |
| stacks[].cards[].rating | number | null | 1–5 star rating for Testimonial card kind. Null when not set. |
| stacks[].cards[].processingStatus | string | null | Video cover transcode state: none | processing | ready | failed. Null for image covers. |
| stacks[].cards[].errorReason | string | null | Transcode failure description for failed video covers. Null otherwise. |
| stacks[].cards[].coverFocalX | number | null | Horizontal focal point (0–100) from the media doc; drives object-position in the preview. Not saved on the card — edit on the media doc. |
| stacks[].cards[].coverFocalY | number | null | Vertical focal point (0–100) from the media doc. |
| socialLinks | SocialLinkData[] | Ordered list of social link rows. Each entry: { id, platform, unicode, url }. platform is the icon slug; unicode is the display glyph. |
| socialLinks[].id | string | Payload row ID for the social link entry. |
| socialLinks[].platform | string | Icon slug (e.g. 'instagram', 'tiktok'). |
| socialLinks[].unicode | string | Display glyph / unicode value for the icon. |
| socialLinks[].url | string | Full URL for the social link. |
Example
Request
json
{
"outlineId": "42"
}Response
json
{
"id": "42",
"name": "Jade Reyes Photography",
"handle": "jadereyes",
"isPaid": true,
"seo": {
"title": "Jade Reyes — Portrait & Wedding Photographer",
"description": "Candid, film-inspired portrait and wedding photography in Los Angeles.",
"imageId": 108,
"imageUrl": "https://cdn.outli.ne/media/jade-og.jpg"
},
"stacks": [
{
"id": "101",
"title": "Work",
"cards": [
{
"id": "201",
"kind": "portfolio",
"heading": "2024 Wedding Season",
"subheading": "Intimate ceremonies, film look",
"description": "",
"buttonText": "See the full gallery",
"buttonUrl": "https://jadereyes.co/weddings-2024",
"coverId": 55,
"coverUrl": "https://cdn.outli.ne/media/jade-wedding-900.jpg",
"coverColor": "",
"forceHorizontalFit": false,
"hidden": false,
"badge": null,
"rating": null,
"processingStatus": null,
"errorReason": null,
"coverFocalX": 50,
"coverFocalY": 35
}
]
},
{
"id": "102",
"title": "Book Me",
"cards": [
{
"id": "202",
"kind": "book-me",
"heading": "Portrait Session",
"subheading": "2 hrs · Los Angeles",
"description": "Golden-hour outdoor session, 30 edited images delivered in 10 days.",
"buttonText": "Check availability",
"buttonUrl": "https://cal.com/jadereyes",
"coverId": null,
"coverUrl": null,
"coverColor": "#c97b5a",
"forceHorizontalFit": false,
"hidden": false,
"badge": "From $350",
"rating": null,
"processingStatus": null,
"errorReason": null,
"coverFocalX": null,
"coverFocalY": null
}
]
}
],
"socialLinks": [
{
"id": "301",
"platform": "instagram",
"unicode": "",
"url": "https://instagram.com/jadereyesphoto"
}
]
}When to use
Call this at the start of any editing session (step 2 of the create→curate→optimize loop, after get_guidance) to get the current profile state before issuing add_card, update_card, or reorder_cards. Also call it after any write operation to confirm the saved state matches intent.
Watch out
Watch out
- outlineId is optional — omitting it resolves to the caller's first outline, not an error. Always pass it explicitly if you already know the ID to avoid an extra DB lookup.
- Passing another user's outlineId returns a NOT_FOUND error (not FORBIDDEN) — the tool intentionally avoids confirming resource existence for IDs the caller doesn't own. No admin-role bypass exists.
- coverUrl is a preview-display URL (900w variant), not a stable asset to persist or pass back. Use coverId when referencing the cover in update_card calls.
- isPaid reflects the outline's own subscriptionStatus at fetch time. A free outline returns isPaid:false even if the account has paid — call get_profile after a plan change to get a fresh value.