For the complete documentation index, see llms.txt. Any page on this site can be fetched as Markdown by appending .md to its URL.

RoutingToll free verification

Get a presigned upload URL for an opt-in proof screenshot

POST
/v1/sms-registration/opt-in-images

Mint a short-lived (5 minute) presigned S3 PUT URL for one opt-in proof image. Accepts image/png, image/jpeg, or image/webp, up to 5 MB. The image is served only through signed CloudFront URLs, never a public one — store the returned key (in TfvBusinessProfile.optIn.images, as { kind: "upload", key }), not a URL. previewUrl is a 1-hour signed URL for showing the just-uploaded image as a thumbnail; submission itself signs its own 90-day URL from the key at submit/resubmit time. See the PR that added this endpoint for why: Bandwidth's review can run for weeks, longer than any URL signed with the service's own short-lived credentials should stay valid, so a fixed key plus signing on demand is what keeps both the security posture and the review window intact.

Authorization

bearerAuth
AuthorizationBearer <token>

A Tandem bearer token. Requests are scoped to the organization the token belongs to; no organization header is required.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X POST "https://example.com/v1/sms-registration/opt-in-images" \  -H "Content-Type: application/json" \  -d '{    "contentType": "image/png",    "contentLength": 5242880  }'
{  "url": "string",  "key": "string",  "previewUrl": "string"}
{  "error": {    "code": "string",    "message": "string"  }}
{  "error": {    "code": "string",    "message": "string"  }}