Runlog docs

Start building

A plan buys a weekly allowance, sized for steady work.

Start

Outbound

For an agent that reaches a person. Reaching someone is three steps, and they are separate on purpose: something drafts, a human approves, and only then does anything leave. An external send is the one class of action the platform will not auto-fire — not from an agent, not from a website visitor, and not from an API key acting unattended — so the approval is a real gate rather than a confirmation dialog. Drafting runs as the `draft_create` action and approving as `outreach_approve`, both on the Actions lane.

GET/v1/gtm/channel-inventoryAPI key

Read sending inventory

Read which connected accounts can send, and the channels each account executive can reach people through.

An account executive with no send channels is listed with an empty list: a plan for them cannot execute, and nothing sends from another person's account in their place.

Request · curl
curl -X GET "https://runlogai.com/runlogapi/gtm/channel-inventory" \
  -H "Authorization: Bearer $RUNLOG_API_KEY" \
  -H "X-Project-Id: p7Kd2mQx"
Response · 200
{
  "aes": [
    {
      "name": "Priya",
      "sendChannels": [
        "linkedin",
        "gmail"
      ],
      "uid": "u_9Kd2Lm"
    }
  ],
  "entries": [
    {
      "capabilities": [
        "send",
        "read"
      ],
      "channel": {
        "channelName": "linkedin",
        "inmailCreditsRemaining": 18,
        "isConnected": true,
        "linkedinTier": "sales_nav"
      },
      "sendCapable": true
    }
  ]
}

Errors

StatuserrorWhen
404project not foundThe project does not exist, or you have no access to it. Projects are non-enumerable, so a denied read is indistinguishable from a missing one.
401invalid API keyThe `Authorization` header is missing, malformed, or names a revoked key.
400name the target project via the X-Project-Id header or projectId queryNo project was named and the key is not bound to one.
429rate limit exceededYou passed 60 requests/minute on this key. `Retry-After` carries the seconds to wait.
500internal errorThe relay failed to serve the request. Retry with backoff; the cause is logged server-side against your request.

People

The roster, the board over it, and the day's queue: who sells, who is being reached, where each lead stands, and which drafts are waiting on a person.

GET/v1/gtm/leadsSession

Read the leads board

Page the project's leads, newest first, or one status column at a time.

A lead is a ROLE on a person, never a record of its own: the row carries the person it stands on, so a lead thrown out drops the role and leaves the person in the graph.

`fit` is rated against the lead's ICP and carries the rationale it was rated on, so a score you disagree with is arguable against its evidence rather than its number.

Query parameters

FieldTypeRequiredDescription
statusstringoptionalOne status column (e.g. `PROSPECT`). Omitted reads every column.
cursorstringoptionalCursor from a previous page.
limitintegeroptionalPage size, capped at 200.
Request · curl
curl -X GET "https://runlogai.com/runlogapi/gtm/leads?status=PROSPECT&limit=25" \
  -H "Authorization: Bearer $RUNLOG_SESSION_TOKEN" \
  -H "X-Project-Id: p7Kd2mQx"
Response · 200
{
  "items": [
    {
      "entityId": "e_2Kd9Lp",
      "fit": 78.5,
      "fullName": "Amber Nunes",
      "gap": {
        "pageUrl": "https://example.com/contact",
        "rule": "no online booking"
      },
      "icpEntityId": "icp_5Hn2Kp",
      "leadId": "ld_4Kd2Qm",
      "personId": "ld_4Kd2Qm",
      "status": "PROSPECT"
    }
  ],
  "nextCursor": ""
}

Errors

StatuserrorWhen
404project not foundThe project does not exist, or you have no access to it. Projects are non-enumerable, so a denied read is indistinguishable from a missing one.
401invalid API keyThe `Authorization` header is missing, malformed, or names a revoked key.
400name the target project via the X-Project-Id header or projectId queryNo project was named and the key is not bound to one.
429rate limit exceededYou passed 60 requests/minute on this key. `Retry-After` carries the seconds to wait.
500internal errorThe relay failed to serve the request. Retry with backoff; the cause is logged server-side against your request.
GET/v1/gtm/membersSession

Read who sells

Read the people with access to this project, each with what they chose and what they are carrying.

The roster is the project's access list. There is no role to grant: someone who can open the project is a member, and `takingLeads` is theirs to set.

`openLeads` is counted from the leads they own at read time, so no stored count can drift from the board.

`writingStyle` is distilled from what that member has already sent, and it is what a draft is written in — so a roster with no sent mail yet drafts in the project's own voice rather than in nobody's.

Request · curl
curl -X GET "https://runlogai.com/runlogapi/gtm/members" \
  -H "Authorization: Bearer $RUNLOG_SESSION_TOKEN" \
  -H "X-Project-Id: p7Kd2mQx"
Response · 200
{
  "items": [
    {
      "email": "amber@example.com",
      "fullName": "Amber Nunes",
      "leadCapacity": 50,
      "openLeads": 14,
      "takingLeads": true,
      "uid": "ae_5Hn2Kp"
    }
  ]
}

Errors

StatuserrorWhen
404project not foundThe project does not exist, or you have no access to it. Projects are non-enumerable, so a denied read is indistinguishable from a missing one.
401invalid API keyThe `Authorization` header is missing, malformed, or names a revoked key.
400name the target project via the X-Project-Id header or projectId queryNo project was named and the key is not bound to one.
429rate limit exceededYou passed 60 requests/minute on this key. `Retry-After` carries the seconds to wait.
500internal errorThe relay failed to serve the request. Retry with backoff; the cause is logged server-side against your request.
GET/v1/gtm/outreach/review-queueSession

Read the day's queue

Read the leads due a touch today, each as the approve-card a person answers.

Due is derived, never stored: a lead is due when its next action falls at or before now and later than its last touch, so nothing has to be swept to keep the queue current.

A suppressed person never reaches this read. Suppression is a gate rather than a column, so a stop added after a card was drawn still stops the send.

Request · curl
curl -X GET "https://runlogai.com/runlogapi/gtm/outreach/review-queue" \
  -H "Authorization: Bearer $RUNLOG_SESSION_TOKEN" \
  -H "X-Project-Id: p7Kd2mQx"
Response · 200
{
  "cards": [
    {
      "channel": "email",
      "draftId": "dr_7Hq2Rm",
      "fullName": "Amber Nunes",
      "leadId": "ld_4Kd2Qm",
      "subject": "Your intake backlog"
    }
  ]
}

Errors

StatuserrorWhen
404project not foundThe project does not exist, or you have no access to it. Projects are non-enumerable, so a denied read is indistinguishable from a missing one.
401invalid API keyThe `Authorization` header is missing, malformed, or names a revoked key.
400name the target project via the X-Project-Id header or projectId queryNo project was named and the key is not bound to one.
429rate limit exceededYou passed 60 requests/minute on this key. `Retry-After` carries the seconds to wait.
500internal errorThe relay failed to serve the request. Retry with backoff; the cause is logged server-side against your request.
POST/v1/gtm/outreach/approve-bulkSession

Approve the day's drafts

Approve one or several staged drafts so the outreach substrate sends them.

Approval is what sends. Nothing before it leaves — a drafted message never dispatched is nobody speaking.

Idempotent per draft: re-posting an approval that already dispatched reports the same result rather than sending twice.

Body

FieldTypeRequiredDescription
itemsobject[]requiredThe drafts to approve, each naming its `leadId` and `draftId`.
Request · curl
curl -X POST "https://runlogai.com/runlogapi/gtm/outreach/approve-bulk" \
  -H "Authorization: Bearer $RUNLOG_SESSION_TOKEN" \
  -H "X-Project-Id: p7Kd2mQx" \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    {
      "draftId": "dr_7Hq2Rm",
      "leadId": "ld_4Kd2Qm"
    }
  ]
}'
Response · 200
{
  "results": [
    {
      "draftId": "dr_7Hq2Rm",
      "leadId": "ld_4Kd2Qm",
      "status": "sent"
    }
  ]
}

Errors

StatuserrorWhen
403editor access requiredYou can read the project but not write to it.
400invalid request bodyThe body is not JSON, or exceeds the 1 MB request-body cap.
404project not foundThe project does not exist, or you have no access to it. Projects are non-enumerable, so a denied read is indistinguishable from a missing one.
401invalid API keyThe `Authorization` header is missing, malformed, or names a revoked key.
400name the target project via the X-Project-Id header or projectId queryNo project was named and the key is not bound to one.
429rate limit exceededYou passed 60 requests/minute on this key. `Retry-After` carries the seconds to wait.
500internal errorThe relay failed to serve the request. Retry with backoff; the cause is logged server-side against your request.