Get logs by tracking IDs (comma-separated, max 25 IDs). Use after sending email or SMS to look up delivery status.
const url = 'https://api.pingram.io/logs/example';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.pingram.io/logs/example \ --header 'Authorization: Bearer <token>'Authorizations
Parameters
Path Parameters
Comma-separated tracking IDs (URL encoded)
Responses
200
Successful response
Response type for GET /logs/{trackingIds} and POST /logs/bulk
object
object
Bare POST /email may set this on the email_sent row so Logs Insights latest(email_preview) still resolves after delivered/opened rows. Sender / SQS consumer paths omit this field (unchanged behavior).
Pingram number that received the inbound message.
Truncated JSON string of inbound MMS metadata when present.
Same value as call_delivered_cost_internal (for API/external use)
Unique message ID from the SMS provider
True when the send included MMS (mediaUrls).
Actual carrier cost (internal)
Actual delivery cost from carrier webhook (USD), for internal logging
Example
{ "logs": [ { "failed_code": "SPAM_CONTENT", "inapp_failed_code": "IN_APP_WEB_FAILED", "mobile_push_failed_code": "NO_APN_CONFIG", "email_failed_code": "UNVERIFIED_SENDER", "email_inbound_resolution_type": "reply", "web_push_failed_code": "UNSUBSCIRBED_OR_EXPIRED", "ignored": "THROTTLING", "email_routing": "OFF", "email_routing_reason": "IGNORE_BY_PREFERENCES", "sms_routing": "OFF", "sms_routing_reason": "IGNORE_BY_PREFERENCES", "web_push_routing": "OFF", "web_push_routing_reason": "IGNORE_BY_PREFERENCES", "mobile_push_routing": "OFF", "mobile_push_routing_reason": "IGNORE_BY_PREFERENCES", "call_routing": "OFF", "call_routing_reason": "IGNORE_BY_PREFERENCES", "inapp_routing": "OFF", "inapp_routing_reason": "IGNORE_BY_PREFERENCES", "slack_routing": "OFF", "slack_routing_reason": "IGNORE_BY_PREFERENCES", "slack_failed_code": "CHANNEL_NOT_FOUND", "call_delivered_code": "COMPLETED", "call_failed_code": "13224", "sms_failed_code": "13224" } ]}400
Bad Request - validation errors, invalid input
Standard error response for API errors.
object
Unique tracking ID for the request.
Structured error details for API error responses.
object
Machine-readable error code.
Human-readable error message.
Actionable hint for fixing the error.
Examplegenerated
{ "trackingId": "example", "error": { "code": "example", "message": "example", "fix": "example" }}401
Unauthorized
402
Payment Required - usage limits exceeded
Standard error response for API errors.
object
Unique tracking ID for the request.
Structured error details for API error responses.
object
Machine-readable error code.
Human-readable error message.
Actionable hint for fixing the error.
Examplegenerated
{ "trackingId": "example", "error": { "code": "example", "message": "example", "fix": "example" }}500
Internal Server Error
502
Bad Gateway - provider error
Standard error response for API errors.
object
Unique tracking ID for the request.
Structured error details for API error responses.
object
Machine-readable error code.
Human-readable error message.
Actionable hint for fixing the error.
Examplegenerated
{ "trackingId": "example", "error": { "code": "example", "message": "example", "fix": "example" }}