OpenAPI reference
Gruvi API
Content distribution over HTTPS. Upload finished media, publish or schedule posts, and check what happened next.
https://api.agentgruvi.comAuthentication
Create a named key in Agent Access after verifying your account. Keep the key in an environment variable or secret manager. Send Authorization: Bearer $GRUVI_API_KEY to the Gruvi API. Never forward this header to a signed storage upload URL.
Read your account to obtain its userId, then list connected accounts to choose exact destination IDs. Do not derive a userId from the key itself. X uses the platform identifier twitter.
curl --fail-with-body https://api.agentgruvi.com/api/gruvi/social-accounts \
-H "Authorization: Bearer $GRUVI_API_KEY"Limits, access and retries
Setup, connected accounts and media preparation remain available before subscribing. Submitting a post requires verified, active publishing access through a plan, trial or complimentary grant. Eligible accounts can start one three-day trial through hosted checkout.
Keys for an account share these limits. Credential and checkout writes allow 10 requests per five minutes. Free preparation allows five video and 50 image upload allocations daily; an active publishing plan or trial allows 60 videos and 400 images. Authentication and recovery have separate protections.
Honor Retry-After on 429 responses. For schedules, bulk requests and carousel sends, preserve the original requestId and unchanged payload after uncertainty. For an immediate video send, read delivery status before retrying. A queued request, a future schedule and a TikTok inbox draft are different from a confirmed public post.
Endpoint reference
Replace example IDs and timestamps before running a request. An accountId identifies a connected destination; videoId and carouselId identify saved media.
Account
Identify the account authorized by your agent key.
GET/api/user/accountRead the authenticated account
Authentication: bearer agent key. The server resolves the account from your key.
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/user/account' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedBilling
Plans, trial eligibility and secure hosted checkout.
GET/api/user/subscriptionRead subscription status
Authentication: bearer agent key. The server resolves the account from your key.
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/user/subscription' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/publishing/plansList monthly distribution plans
Public endpoint. No agent key is required.
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/publishing/plans'Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedPOST/api/publishing/checkoutCreate hosted Stripe checkout without charging a card
Authentication: bearer agent key. The server resolves the account from your key.
JSON request body
| Field | Type | Details |
|---|---|---|
planIdRequired | string | Values: starter, scale, pro. |
requestIdRequired | string |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/publishing/checkout' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"planId": "starter",
"requestId": "campaign-post-001"
}'Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedMedia
Upload finished videos and thumbnails without generating content.
GET/api/gruvi/social-accountsList connected destination accounts
Authentication: bearer agent key. The server resolves the account from your key.
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/social-accounts' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/gruvi/videos/{userId}List media
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath | |
page | integerquery | |
limit | integerquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/videos/your-userId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/gruvi/videos/{userId}/{videoId}Inspect a video
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath | |
videoIdRequired | stringpath |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/videos/your-userId/your-videoId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedPOST/api/gruvi/videos/{userId}/get-upload-urlGet a signed upload URL for a video up to 512 MB
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath |
JSON request body
| Field | Type | Details |
|---|---|---|
fileNameRequired | string | |
fileTypeRequired | string | Values: video/mp4, video/quicktime, video/webm. |
fileSizeRequired | integer |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/videos/your-userId/get-upload-url' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"fileName": "your-fileName",
"fileType": "video/mp4",
"fileSize": 1024
}'Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedPOST/api/gruvi/videos/{userId}/finalize-uploadSave a completed direct upload
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath |
JSON request body
| Field | Type | Details |
|---|---|---|
videoIdRequired | string | Format: uuid. |
videoKeyRequired | string | |
titleRequired | string | |
description | string | |
aspectRatio | string | Values: portrait, landscape. |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/videos/your-userId/finalize-upload' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"videoId": "your-video-id",
"videoKey": "your-videoKey",
"title": "A closer look",
"description": "The details behind our next release.",
"aspectRatio": "portrait"
}'Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedPOST/api/gruvi/videos/{userId}/{videoId}/upload-thumbnailUpload a custom JPEG thumbnail
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath | |
videoIdRequired | stringpath |
JSON request body
| Field | Type | Details |
|---|---|---|
thumbnailBase64Required | string | JPEG data URL, at most 5 MB decoded. |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/videos/your-userId/your-videoId/upload-thumbnail' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"thumbnailBase64": "your-thumbnailBase64"
}'Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedPUT/api/gruvi/videos/{userId}/{videoId}/social-metadataSet title, description and tags
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath | |
videoIdRequired | stringpath |
JSON request body
| Field | Type | Details |
|---|---|---|
title | string | |
description | string | |
tags | string[] |
curl --fail-with-body --request PUT 'https://api.agentgruvi.com/api/gruvi/videos/your-userId/your-videoId/social-metadata' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"title": "A closer look",
"description": "The details behind our next release.",
"tags": [
"your-tags"
]
}'Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedPublishing
Send a video and inspect delivery for each destination.
POST/api/gruvi/videos/{userId}/{videoId}/batch-social-uploadQueue a video for immediate publishing; requires a publishing plan or trial
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath | |
videoIdRequired | stringpath |
JSON request body
| Field | Type | Details |
|---|---|---|
platformsRequired | object[] | Minimum 1 items. Item fields: platform, accountId. |
title | string | |
description | string | |
tags | string[] | |
tiktokSettings | object | Object fields: postMode, privacyLevel, allowComment, allowDuet, allowStitch, discloseContent, brandOrganic, brandedContent. |
addThumbnailIntro | boolean |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/videos/your-userId/your-videoId/batch-social-upload' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"platforms": [
{
"platform": "twitter",
"accountId": "your-connected-account-id"
}
],
"title": "A closer look",
"description": "The details behind our next release.",
"tags": [
"your-tags"
],
"tiktokSettings": {
"postMode": "draft",
"privacyLevel": "SELF_ONLY"
},
"addThumbnailIntro": false
}'Responses
202Queued; inspect per-platform status before treating delivery as published.403Verified account and active publishing plan required. Free setup remains available.GET/api/gruvi/videos/{userId}/{videoId}/social-upload-statusInspect per-platform immediate delivery
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
userIdRequired | stringpath | |
videoIdRequired | stringpath |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/videos/your-userId/your-videoId/social-upload-status' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedScheduling
Create, inspect and cancel schedules, including batches.
POST/api/gruvi/scheduled-postsSchedule a future video post; requires a publishing plan or trial
Authentication: bearer agent key. The server resolves the account from your key.
JSON request body
| Field | Type | Details |
|---|---|---|
platformsRequired | object[] | Minimum 1 items. Item fields: platform, accountId. |
title | string | |
description | string | |
tags | string[] | |
tiktokSettings | object | Object fields: postMode, privacyLevel, allowComment, allowDuet, allowStitch, discloseContent, brandOrganic, brandedContent. |
addThumbnailIntro | boolean | |
videoIdRequired | string | Format: uuid. |
scheduledTimeRequired | string | Format: date-time. |
thumbnailUrl | string | Format: uri. |
thumbnailKey | string | |
requestId | string | A stable ID for this logical schedule. Reuse it with an unchanged body after an uncertain response. Up to 100 characters. |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/scheduled-posts' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"requestId": "campaign-post-001",
"videoId": "your-video-id",
"title": "A closer look",
"description": "The details behind our next release.",
"platforms": [
{
"platform": "instagram",
"accountId": "your-connected-account-id"
}
],
"scheduledTime": "2026-12-01T09:00:00Z"
}'Responses
201Schedule created; not yet published.403Verified account and active publishing plan required. Free setup remains available.429Monthly scheduling allowance reachedGET/api/gruvi/scheduled-postsRead calendar, delivery history and allowance
Authentication: bearer agent key. The server resolves the account from your key.
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/scheduled-posts' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/gruvi/scheduled-posts/{scheduleId}Inspect one scheduled post
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
scheduleIdRequired | stringpath |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/scheduled-posts/your-scheduleId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedDELETE/api/gruvi/scheduled-posts/{scheduleId}Cancel a scheduled post
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
scheduleIdRequired | stringpath |
curl --fail-with-body --request DELETE 'https://api.agentgruvi.com/api/gruvi/scheduled-posts/your-scheduleId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedPOST/api/gruvi/scheduled-posts/bulkSchedule 1 to 20 videos with one stable requestId and per-item results
Authentication: bearer agent key. The server resolves the account from your key.
JSON request body
| Field | Type | Details |
|---|---|---|
requestIdRequired | string | Up to 100 characters. |
postsRequired | object[] | Minimum 1 items. Maximum 20 items. Item fields: videoId, platforms, scheduledTime, title, description, tags, tiktokSettings, addThumbnailIntro. |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/scheduled-posts/bulk' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"requestId": "campaign-batch-001",
"posts": [
{
"videoId": "your-video-id",
"title": "A closer look",
"description": "The details behind our next release.",
"platforms": [
{
"platform": "instagram",
"accountId": "your-connected-account-id"
}
],
"scheduledTime": "2026-12-01T09:00:00Z"
}
]
}'Responses
201All posts scheduled207Per-item success and failure results. Retry the unchanged batch with the same requestId.400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.Carousels
Prepare image sets and publish or schedule them on Instagram or TikTok.
POST/api/gruvi/carousels/get-upload-urlAllocate a ten-minute signed upload URL for one carousel image
Authentication: bearer agent key. The server resolves the account from your key.
JSON request body
| Field | Type | Details |
|---|---|---|
fileTypeRequired | value | Values: image/jpeg, image/png, image/webp. |
fileSizeRequired | integer |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/carousels/get-upload-url' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"fileType": "image/jpeg",
"fileSize": 1024
}'Responses
200Request result400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.POST/api/gruvi/carouselsSave 2 to 10 uploaded images as a carousel without publishing
Authentication: bearer agent key. The server resolves the account from your key.
JSON request body
| Field | Type | Details |
|---|---|---|
titleRequired | string | Up to 500 characters. |
caption | string | Up to 10000 characters. |
imageKeysRequired | string[] | Minimum 2 items. Maximum 10 items. |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/carousels' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"title": "The story in pictures",
"caption": "A closer look, frame by frame.",
"imageKeys": [
"your-first-uploaded-image-key",
"your-second-uploaded-image-key"
]
}'Responses
201Carousel saved without publishing.400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.GET/api/gruvi/carouselsList this account's saved carousels
Authentication: bearer agent key. The server resolves the account from your key.
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/carousels' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Request result400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.POST/api/gruvi/carousels/{carouselId}/publishPublish one carousel to one Instagram or TikTok account. TikTok defaults to creator-inbox review.
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
carouselIdRequired | stringpath | Format: uuid. |
JSON request body
| Field | Type | Details |
|---|---|---|
requestIdRequired | string | Up to 100 characters. |
caption | string | Up to 10000 characters. |
tiktokSettings | object | Object fields: postMode, privacyLevel, allowComment, allowDuet, allowStitch, discloseContent, brandOrganic, brandedContent. |
platformRequired | value | Values: instagram, tiktok. |
accountIdRequired | string |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/carousels/your-carouselId/publish' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"platform": "instagram",
"accountId": "your-connected-account-id",
"requestId": "carousel-instagram-001",
"caption": "A closer look, frame by frame."
}'Responses
200Request result400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.POST/api/gruvi/carousels/{carouselId}/scheduleSchedule one carousel to one Instagram or TikTok account. TikTok defaults to creator-inbox review.
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
carouselIdRequired | stringpath | Format: uuid. |
JSON request body
| Field | Type | Details |
|---|---|---|
requestIdRequired | string | Up to 100 characters. |
caption | string | Up to 10000 characters. |
tiktokSettings | object | Object fields: postMode, privacyLevel, allowComment, allowDuet, allowStitch, discloseContent, brandOrganic, brandedContent. |
platformsRequired | object[] | Minimum 1 items. Maximum 1 items. Item fields: platform, accountId. |
scheduledTimeRequired | string | Format: date-time. |
curl --fail-with-body --request POST 'https://api.agentgruvi.com/api/gruvi/carousels/your-carouselId/schedule' \
--header "Authorization: Bearer $GRUVI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"requestId": "carousel-schedule-001",
"title": "A closer look",
"description": "The details behind our next release.",
"platforms": [
{
"platform": "instagram",
"accountId": "your-connected-account-id"
}
],
"scheduledTime": "2026-12-01T09:00:00Z"
}'Responses
201Carousel schedule created; not yet published.400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.GET/api/gruvi/carousels/{carouselId}/publications/{requestId}Check an uncertain carousel publication before retrying
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
carouselIdRequired | stringpath | Format: uuid. |
requestIdRequired | stringpath | Up to 100 characters. |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/carousels/your-carouselId/publications/your-requestId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Request result400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.Analytics
Read the metrics available for each connected account.
GET/api/gruvi/youtube/analytics/summaryRead YouTube summary analytics
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
accountId | stringquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/youtube/analytics/summary?accountId=your-accountId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/gruvi/youtube/analytics/trendsRead YouTube trends analytics
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
accountId | stringquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/youtube/analytics/trends?accountId=your-accountId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/gruvi/tiktok/analytics/summaryRead TikTok summary analytics
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
accountId | stringquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/tiktok/analytics/summary?accountId=your-accountId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/gruvi/tiktok/analytics/trendsRead TikTok trends analytics
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
accountId | stringquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/tiktok/analytics/trends?accountId=your-accountId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Successful request; publication status must be checked separately.401Invalid authentication403Access or paid-plan requirement429Limit reachedGET/api/gruvi/instagram/analytics/summaryRead Instagram engagement summary
Beta engagement summary for the most recent posts, cached for five minutes. Requires an exact connected accountId and platform read permissions. Missing metrics are null, not zero. X uses the platform identifier twitter.
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
accountIdRequired | stringquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/instagram/analytics/summary?accountId=your-accountId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Request result400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.GET/api/gruvi/facebook/analytics/summaryRead Facebook engagement summary
Beta engagement summary for the most recent posts, cached for five minutes. Requires an exact connected accountId and platform read permissions. Missing metrics are null, not zero. X uses the platform identifier twitter.
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
accountIdRequired | stringquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/facebook/analytics/summary?accountId=your-accountId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Request result400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.GET/api/gruvi/twitter/analytics/summaryRead X engagement summary
Beta engagement summary for the most recent posts, cached for five minutes. Requires an exact connected accountId and platform read permissions. Missing metrics are null, not zero. X uses the platform identifier twitter.
Authentication: bearer agent key. The server resolves the account from your key.
Parameters
| Field | Type | Details |
|---|---|---|
accountIdRequired | stringquery |
curl --fail-with-body --request GET 'https://api.agentgruvi.com/api/gruvi/twitter/analytics/summary?accountId=your-accountId' \
--header "Authorization: Bearer $GRUVI_API_KEY"Responses
200Request result400Invalid input401Bearer authentication required403Account permission or publishing access required429Rate limit or monthly allowance reached. Honor Retry-After.503Request could not be confirmed. Inspect state and reuse the request ID.Keep the contract close to your workflow.
The OpenAPI document describes these same endpoints. Agents can also read the full plain-text guide, the API notes and the MCP server's built-in resources. Read platform settings before sending content.
