Where time is spent
The vast majority of latency comes from the offer. SocialRouter’s overhead is negligible.
Deadlines
Two timers bound every call:- Per offer: up to 5 min, clamped to whatever the request budget has left — in practice ~255 s today. A stalled offer is cut off and the chain moves to the next one.
- Per request: 270 s, just under the 300 s platform function cap. Hitting it returns
504withrequest_hard_timeout(orrequest_soft_timeoutwhen no activity was seen). A soft-timeout is a global abort, not a failover trigger.
The last two only ever appear on a run placed on your own provider key — they name what to change, because nobody else can change it. Retrying without changing it will fail the same way.
On those same BYOK failures the error carries an extra
provider_detail: the provider’s own explanation, sanitized (their wording, with the key you registered scrubbed out and the length capped). It is what distinguishes “your plan does not include this endpoint” from “this endpoint requires a master key” — two different fixes behind one status code. Runs placed on SocialRouter’s own provider accounts never carry it; there is nothing for you to fix there.
Every failure that happened after routing began also carries an extraction_id — quote it in a bug report, it ties the response to the run’s routing trail. GET /v1/extractions/{id} replays the same error object afterwards.
Larger jobs than that fit in belongs to the asynchronous API (coming).
Performance considerations
Offer selection matters
Two offers of the same service can differ by several seconds. If latency matters more than resilience, pin the fast one:GET /v1/services/{platform}/{service} or at socialrouter.io/services.
Failover adds latency
When the head of the chain fails, the request takes at least twice as long: the failed attempt plus the successful retry. Pinning an offer removes that tail risk, at the cost of the resilience it buys (see the failover guide).Batch caps
Every offer declaresmax_inputs. Sending a batch larger than the chain’s biggest cap is rejected. Sending one larger than a particular offer’s cap simply drops that offer from the chain, which can push you onto a slower or pricier one. Check max_inputs before sizing batches.
Credit balance checks
When your balance is low, SocialRouter runs extra billing checks that add a few milliseconds. Keep the balance above $5 and set up top-ups before large jobs.Best practices
1
Maintain a healthy credit balance
Keep at least $5-10 in your account so pre-flight billing checks stay cheap.
2
Pick per use case
Need speed? Pin the fastest offer. Need reliability? Leave
provider out and let the chain run.3
Set reasonable limits
limit caps the records returned (max 250). 50 records come back much faster than 250.4
Parallelize across requests, not inside one
Runs are independent, so send several concurrently rather than growing a single batch past the caps.