Your own Grok Bot checks your social media accounts and sends the numbers to your Soulfy workspace, where they appear on your iBrand Board. This page is written for you and for your bot.
In your dashboard, open your workspace's Grok Bot Connection page and click Create connect code. Paste the message it gives you into your Grok chat. The code (sfc_…) works once and expires after 15 minutes, so it is safe even if it stays in chat history. Grok exchanges it for its own credential:
POST https://soulfy.com/api/agent/v1/connect
Content-Type: application/json
{"code": "sfc_…"}
Reply (HTTP 201). The token is shown only this once:
The bot must store token as a secret named SOULFY_AGENT_TOKEN and never show it in chat. Lost it? Click Rotate on the connection page for a fresh code.
2. Check the connection
GET https://soulfy.com/api/agent/v1/me
Authorization: Bearer $SOULFY_AGENT_TOKEN
Returns the workspace, granted permissions and when the credential expires. Nothing is saved.
Read the iBrand Board
Needs the Read iBrand permission (ibrand.read), which a new connection has. Every microsite uses this same API. The credential is bound to one site, and the reply is that site's Board: overview totals, earnings, each platform's metrics, the current and previous date ranges, and last-sync times. A platform is marked stale when its latest measurement is old. connections lists this workspace's Grok Bot connections (status and last use; never a token). weekly_plan is the owner's Weekly Growth Plan for the week when they have one, and null when they don't.
Overview cards are the cross-platform totals. Soulfy stores observed readings, so the reply has no overall score and no 7UP score field.
GET https://soulfy.com/api/agent/v1/ibrand/board?period=30
Authorization: Bearer $SOULFY_AGENT_TOKEN
A shortened reply. board is the full dashboard view model; metric rows, earnings and charts are included.
period is 7, 30 (the default) or 90. Or send from and to as YYYY-MM-DD. week picks the Weekly Growth Plan week. workspace, if you send it, must be this site's domain.
The measurements behind those figures, newest first and in the same shape as the Board's recent list: GET https://soulfy.com/api/agent/v1/ibrand/history. Optional limit (1–100, default 50), platform, and the same period parameters.
3. Send a snapshot
POST https://soulfy.com/api/agent/v1/measurements
Authorization: Bearer $SOULFY_AGENT_TOKEN
Content-Type: application/json
Idempotency-Key: optional
Field
Required
Notes
platform
yes
One of instagram facebook linkedin tiktok youtube x spotify substack
captured_at
yes
ISO 8601 with a timezone, e.g. 2026-09-29T21:10:00+08:00. Up to a year old.
metrics
yes
Object of lowercase_snake_case names to numbers (up to 50). Use the names below.
collection_method
no
One of browser_agent platform_export manual_entry other (default browser_agent)
source, evidence
no
Flat objects of strings, e.g. profile_url, screenshot_url
{
"success": true,
"measurement_id": "5b7f0c1e-…",
"platform": "instagram",
"captured_at": "2026-09-29T13:10:00.000Z",
"received_at": "2026-09-30T00:03:59.858Z",
"idempotent_replay": false,
"warnings": [
{
"code": "unknown_metric",
"metric": "follower_count",
"suggestion": "followers",
"message": "\"follower_count\" isn't a recommended metric name. It was saved under Other reported metrics. Did you mean \"followers\"? …"
}
]
}
Test without saving: send the same request to https://soulfy.com/api/agent/v1/measurements?dry_run=true. You get HTTP 200 with dry_run: true, exactly what would be stored, and any warnings.
Monetization earnings (the number owners watch most)
Send every earnings figure a platform shows, in the same snapshot as the other metrics. The iBrand Board shows estimated_earnings as each platform's headline number, in large type at the top. With any earnings, add "source": {"currency": "<ISO code as shown, e.g. USD>", "earnings_period": "<the period the platform shows, e.g. last_28_days or this_month>"}. Amounts are shown exactly as reported: never convert currencies, estimate, or send a figure the platform doesn't show.
Platform
Where
Platform figure → metric name
Facebook
Professional dashboard or Meta Business Suite, Monetization
Approximate earningsestimated_earnings
Content Monetizationcontent_monetization_earnings
In-stream ads / ads on reelsad_earnings
Starsfan_support_earnings
Subscriptionssubscription_earnings
Bonusesbonus_earnings
Instagram
Professional dashboard, Monetization
Total or approximate earningsestimated_earnings
Gifts and badgesfan_support_earnings
Subscriptionssubscription_earnings
Bonusesbonus_earnings
Ads on reelsad_earnings
YouTube
YouTube Studio, Analytics, Revenue (or Earn)
Estimated revenueestimated_earnings
Ad revenue (watch page and Shorts feed)ad_earnings
Membershipssubscription_earnings
Supers (Super Chat, Super Stickers, Super Thanks)fan_support_earnings
TikTok
TikTok Studio, Rewards or Creator Rewards Program
Estimated rewardsestimated_earnings
LIVE gifts and tipsfan_support_earnings
Subscriptionssubscription_earnings
X
Monetization, Creator Revenue Sharing and Subscriptions
Creator revenue sharing payoutestimated_earnings
Subscriptionssubscription_earnings
LinkedIn
Usually no creator earnings. Send them only if LinkedIn shows an earnings figure.
Any earnings figure LinkedIn showsestimated_earnings
Spotify
Spotify for Artists (or Spotify for Podcasters), Audience and Lifetime / earnings if shown
Estimated royalties or payout (when shown)estimated_earnings
Substack
Substack Dashboard, Stats and Payments / Earnings
Total or approximate earningsestimated_earnings
Paid subscriptionssubscription_earnings
If two platforms report the same currency and the same period, the Board also shows their combined total. Otherwise each platform stands on its own.
Recommended metric names
Use these names so each number lands in the right chart. Board overview metrics are also combined across platforms. Any other name is still saved, shown under "Other reported metrics", and the reply includes a warnings entry with the closest recommended name.
Platform
Metrics
Instagram
estimated_earningsEarnings
fan_support_earningsEarnings
subscription_earningsEarnings
bonus_earningsEarnings
ad_earningsEarnings
followersBoard overview
reachBoard overview
impressionsBoard overview
viewsBoard overview
likesBoard overview
commentsBoard overview
sharesBoard overview
savesBoard overview
postsBoard overview
profile_visitsPlatform card
link_clicksPlatform card
Facebook
estimated_earningsEarnings
content_monetization_earningsEarnings
ad_earningsEarnings
fan_support_earningsEarnings
subscription_earningsEarnings
bonus_earningsEarnings
followersBoard overview
reachBoard overview
impressionsBoard overview
viewsBoard overview
reactionsBoard overview
commentsBoard overview
sharesBoard overview
postsBoard overview
profile_visitsPlatform card
link_clicksPlatform card
LinkedIn
estimated_earningsEarnings
followersBoard overview
impressionsBoard overview
reactionsBoard overview
commentsBoard overview
sharesBoard overview
postsBoard overview
profile_visitsPlatform card
link_clicksPlatform card
TikTok
estimated_earningsEarnings
fan_support_earningsEarnings
subscription_earningsEarnings
followersBoard overview
viewsBoard overview
likesBoard overview
commentsBoard overview
sharesBoard overview
savesBoard overview
videosBoard overview
profile_visitsPlatform card
YouTube
estimated_earningsEarnings
ad_earningsEarnings
subscription_earningsEarnings
fan_support_earningsEarnings
subscribersBoard overview
viewsBoard overview
likesBoard overview
commentsBoard overview
sharesBoard overview
videosBoard overview
link_clicksPlatform card
X
estimated_earningsEarnings
subscription_earningsEarnings
followersBoard overview
impressionsBoard overview
viewsBoard overview
likesBoard overview
commentsBoard overview
sharesBoard overview
savesBoard overview
postsBoard overview
profile_visitsPlatform card
link_clicksPlatform card
Spotify
estimated_earningsEarnings
followersBoard overview
listenersBoard overview
viewsBoard overview
likesBoard overview
commentsBoard overview
savesBoard overview
postsBoard overview
videosBoard overview
Substack
estimated_earningsEarnings
subscription_earningsEarnings
subscribersBoard overview
opensBoard overview
viewsBoard overview
likesBoard overview
commentsBoard overview
sharesBoard overview
postsBoard overview
link_clicksPlatform card
Use only real numbers the bot collected. Never estimate or invent values.
Run Growth Actions (optional)
When the owner clicks Execute on a Growth Action, Soulfy places a job in a queue for your bot. The bot needs the Run Growth Actions permission, which the owner turns on at the Grok Bot Connection page; new connections don't get it automatically. Jobs are pulled by the bot; Soulfy never pushes to it. The bot prepares drafts and checklists only. It never publishes, posts, replies or sends anything, and asks the owner instead of guessing.
Every 30 seconds or slower: GET https://soulfy.com/api/agent/v1/growth/jobs. Jobs you're working on come first (claimed_by_you: true), then the queue.
Claim one: POST https://soulfy.com/api/agent/v1/growth/jobs/{id}/claim. The reply holds instructions, execution_rules, the action, focus, goal, and the owner's niche and the action's topic (each null when not set). Follow the execution rules. If another bot claimed it first you get 409; pick the next.
Add results as you go: POST …/results with {"result_type": "draft", "data": {"text": "…"}, "summary": "…"}. Types: draft text checklist external_reference artifact status
Need a decision? POST …/questions with {"input_type": "choice", "prompt": "…", "options": ["A", "B"]}. The job waits; poll GET …/{id} until its status is RUNNING again and read the answer in questions. Never ask for passwords, keys or other credentials.
Working longer than 30 minutes? POST …/heartbeat keeps the job yours.
Finish with POST …/complete (optionally {"result": {…}}) or POST …/fail with {"reason": "…"}. If the owner cancels, the job's status becomes CANCELLED and further writes return 409, so stop work.
How often, limits and retries
Cadence. Send one snapshot per platform after each daily stats check. Once a day is plenty; the Board shows change over days and weeks.
Rate limits
60 requests per 10 minutes per connection, per endpoint.
300 requests per 60 minutes per workspace, per endpoint, across all its connections.
20 failed sign-ins (bad credential or connect code) per 10 minutes per IP address.
Over a limit you get HTTP 429 with a Retry-After header (seconds).
Retries and duplicates
Send an optional Idempotency-Key header (1-128 characters of A-Z a-z 0-9 . _ : -) to make retries safe.
Without one, the key is a fingerprint of platform, captured_at, collection_method, metrics, source and evidence, so resending the exact same snapshot never creates a duplicate.
A repeat with the same key and the same data returns HTTP 200 with the original measurement_id and idempotent_replay: true.
The same key with different data returns HTTP 409 idempotency_conflict.
Errors
Every error is JSON: {"success": false, "code": "…", "error": "…"}. A GET to https://soulfy.com/api/agent/v1/measurements or https://soulfy.com/api/agent/v1/connect returns the request format instead of an empty 405, and https://soulfy.com/api/agent/v1 lists every endpoint.
HTTP
code
Meaning
400
invalid_json
The body isn't valid JSON.
400
invalid_platform
platform is missing or not one of instagram, facebook, linkedin, tiktok, youtube, x, spotify, substack.
400
invalid_captured_at
captured_at is missing, has no timezone, is in the future, or is over a year old.
400
invalid_metrics
metrics isn't an object, a name isn't lowercase snake_case, or a value isn't a finite number.
400
unknown_field
The body has a top-level field the API doesn't accept.
400
invalid_request
A Growth Actions body field is missing or invalid, too large, or looks like a credential.
400
invalid_connect_code
The connect code is wrong, already used, or expired. Ask the owner for a new one.
401
unauthorized
The Authorization: Bearer header is missing, or the credential is invalid, expired or revoked.
403
insufficient_scope
The connection doesn't have the permission this endpoint needs.
403
workspace_mismatch
The body's workspace field names a different site.
403
custom_domain_required
The site isn't live on its own domain yet.
403
workspace_inactive
The workspace is suspended or cancelled.
403
forbidden
Another connection claimed this Growth Actions job.
404
not_found
No such Growth Actions job for this workspace, or it isn't queued or yours.
405
method_not_allowed
Wrong HTTP method. The reply lists the allowed methods.
409
idempotency_conflict
The Idempotency-Key was already used for different data.
409
invalid_transition
The job's status doesn't allow that, e.g. it was cancelled, already claimed or expired. GET the job to see its status.
409
conflict
The job changed at the same moment. GET it and try again.
413
payload_too_large
The body is over 16 KB.
415
unsupported_media_type
Content-Type isn't application/json.
429
rate_limited
Too many requests. Wait for Retry-After seconds.
Standing instructions for your Grok Bot
Keep the credential secret as SOULFY_AGENT_TOKEN. Never paste it into chat.
Send it as "Authorization: Bearer <token>" with "Content-Type: application/json".
Send one snapshot per platform after each daily stats check. Once a day is plenty; the Board shows change over days and weeks. POST to https://soulfy.com/api/agent/v1/measurements.
Body: {"platform", "captured_at" (ISO 8601 with timezone), "metrics": {name: number}}.
Use the recommended metric names at https://soulfy.com/docs/grok-bot; unknown names are saved but not charted.
Include monetization earnings wherever a platform shows them: estimated_earnings for the platform's headline figure (Facebook Approximate earnings, YouTube Estimated revenue, TikTok Estimated rewards, X Creator revenue sharing, Substack earnings, Spotify royalties when shown), plus content_monetization_earnings, ad_earnings, subscription_earnings, fan_support_earnings and bonus_earnings when shown.
With any earnings, add "source": {"currency": "<ISO code as shown, e.g. USD>", "earnings_period": "<the period the platform shows, e.g. last_28_days or this_month>"}.
Use only real numbers you collected. Never estimate, convert or invent values.
Add ?dry_run=true to check a request without saving it.
Read the iBrand Board those snapshots build with GET https://soulfy.com/api/agent/v1/ibrand/board (needs ibrand.read). It matches the Board the owner sees: overview totals, per-platform metrics, date ranges and last-sync times. GET https://soulfy.com/api/agent/v1/ibrand/history lists the measurements behind it.
If the owner gave you the Run Growth Actions permission: GET https://soulfy.com/api/agent/v1/growth/jobs no more than every 30 seconds, claim a job with POST https://soulfy.com/api/agent/v1/growth/jobs/{id}/claim, and follow its instructions and execution_rules. Post drafts to .../results, ask the owner through .../questions instead of guessing, and finish with .../complete or .../fail. Never publish, post, reply or send anything yourself.