Home Pricing Docs Contact Start →
Sections
pinqloq · v4.0.3

Introduction

Ship logs from your apps and backend into one central panel. Two ways to log: automatic request logging with one line of middleware, and manual event logging where you call the SDK yourself.

pinqloq is a logging service.

You only need a pinqloq account and a secret key to get started.

The SDK runs inside your backend and sends your logs to the panel.

Before you start

You needWhat to do
A pinqloq accountSign up at pinqloq.pinqponq.io.
A project with a secret keyCreate a project in the dashboard. Your secret key is generated when you create the project. See Create a project.

Two ways to log

04

Client events

Send events from a client app to pinqloq through your own backend.

A client (phone, browser, or POS device) must never hold the secret key. The client sends events to an endpoint you create on your backend. Your backend then uses the pinqloq .NET SDK to forward those events to pinqloq. The secret key stays on your server.

This is manual logging with a Device source Client logging uses the same Enqueue as backend logging. Set LogSourceType to Device and use a separate collection. If you also run automatic request logging, exclude this endpoint. Otherwise the same request is logged twice.

How a client log travels

1
Client app → your backend
The app posts the event to an endpoint you own. See In your client app.
2
Your backend receives it
Your backend receives the client's payload on an endpoint you define.
3
Your backend → pinqloq
The SDK ships the event to pinqloq. See Custom logging.
Client Your backend pinqloq 1 2 3 events logs via .NET SDK
05

In your client app

The app's only job is to send the event to your backend.

The client never calls pinqloq directly. It posts the event and any extra context to an endpoint on your backend. You decide what to include in the payload.

Example request to your backend

bash
curl -X POST https://your-backend.example.com/logs \
  -H "Content-Type: application/json" \
  -d '{ "event": "checkout_completed", "orderId": "A-1042", "screen": "cart" }'
Never ship the secret key The pinqloq secret key is a server credential. Keep it out of mobile bundles, browser code and anything a user can inspect. The client only ever talks to your backend.
03

Custom logging

Inject IPinqloqLogger and call Enqueue from anywhere in your backend. You build the PinqloqLogEntry yourself and decide which fields to include. Use LogSourceType.Backend for backend events and LogSourceType.Device to forward events from a client app.

Before you start

1
Create a project
2
Create a collection
See Create a collection. You will use its name as CollectionName in the SDK.
3
Register the SDK
Call AddPinqloq(...). See SDK configuration.

What are you logging?

Use LogSourceType.Backend for any event that originates on your backend: a business event, an exception, a background job result, an HTTP request, or anything else you want to log manually. You can call Enqueue from a controller, a service, a background job, or a middleware.

Logging HTTP requests via custom logging You can use custom logging to log HTTP requests. There are no restrictions. However, to ensure the log panel displays them correctly, include the following keys inside Detail: RequestMethod, ResponseCode, InputJson, and OutputJson. You can optionally also include RequestHeaders and ResponseHeaders to capture request/response headers, matching what the built-in middleware produces. Missing any of these will not cause an error, but the panel will not be able to render the request details view for that entry.
C#
pinqloqLogger.Enqueue(new PinqloqLogEntry
{
    Event            = "order_placed",
    DeviceIdentifier = "u-9821",
    LogLevel         = PinqloqLogLevel.Information,
    LogSourceType    = PinqloqLogSourceType.Backend,
    Metadata         = new()
    {
        ["userId"]   = "u-9821",
        ["tenantId"] = "t-502"
    },
    Detail           = new()
    {
        ["orderId"]      = "A-1042",
        ["totalAmount"]  = "149.99"
    }
},
onFailed: (entry, error) => Console.WriteLine($"Log failed: {error.Reason}"),
onSent:   entry => Console.WriteLine("Log sent"));

Use LogSourceType.Device when your backend is forwarding an event that originated on a client. The client can be a mobile app, a web app, or any other device. Create a separate collection for these logs so they stay separate from your backend logs. See In your client app for the client-side code.

C#
pinqloqLogger.Enqueue(new PinqloqLogEntry
{
    Event            = "order_placed",
    DeviceIdentifier = "device-8f3a12",
    LogLevel         = PinqloqLogLevel.Information,
    LogSourceType    = PinqloqLogSourceType.Device,
    CollectionName   = "client_logs",
    Metadata         = new()
    {
        ["battery"]     = "72%",
        ["networkType"] = "wifi"
    },
    Detail           = new()
    {
        ["orderId"]    = "A-1042",
        ["itemCount"]  = "3"
    }
},
onFailed: (entry, error) => Console.WriteLine($"Log failed: {error.Reason}"),
onSent:   entry => Console.WriteLine("Log sent"));
Field reference

Event is always required. Without it the entry is skipped.

DeviceIdentifier is always required. If the entry leaves it empty, the global DeviceIdentifier option fills it; if both are empty Enqueue throws (and the request-logging middleware rejects the request with HTTP 400).

Date is optional. If not set, it is assigned when the log is queued.

CollectionName is optional. If not set, it falls back to ApiLogsCollectionName from SDK configuration; if both are empty, the server resolves it (single-collection keys only).

PinqloqLogEntry fields

FieldTypeDefaultDescription
EventstringrequiredLog title shown in the panel. Cannot be empty. Entries without it are dropped; the rest of the batch is sent.
LogLevelPinqloqLogLevelInformationDebug, Information, Warning, Error, Fatal.
LogSourceTypePinqloqLogSourceTypeBackendBackend for backend events, Device for client events forwarded through your backend.
CollectionNamestring?nullTarget collection. Falls back to ApiLogsCollectionName when unset. If neither is set, the server resolves it (single-collection keys only).
DateDateTimeOffset?nullWhen the event happened. Optional: if not set, the SDK assigns the timestamp when the log is queued. You can set it manually to override it.
MetadataDictionary<string,string>?nullShort searchable key-value pairs shown in the panel. Keep values brief.
DetailDictionary<string,string>?nullLarger diagnostic data such as stack traces or full request bodies.
DeviceIdentifierstringrequiredUnique identifier (device, user, or instance). Required — Enqueue throws when it is empty and no global fallback is set; the request-logging middleware rejects the request with HTTP 400. Falls back to the global DeviceIdentifier option when left empty.
AppVersionNamestring?nullOptional version label. Falls back to the global AppVersionName option when unset; if that is also unset, the SDK sends null (not "") and the server stores it as absent.

Which method to call

MethodDeliveryUse it for
Enqueue(entry)Buffered, batchedUse for most cases. Non-blocking; returns false if the queue is full. Pass an optional onFailed callback to react to drops or rejections. See Delivery callbacks.
Enqueue(entries)Buffered, batchedSame as above, but queues a whole list in one call. Returns the number of entries accepted into the queue.
Don't need custom fields? Skip writing the call yourself and go straight to Built-in middleware →
02

Built-in middleware

One line, a fixed template, every request logged.

Call UsePinqloqRequestLogging() once in Program.cs to log every request. The SDK fills in all fields automatically.

Use built-in pinqloq middleware when you want zero per-request code and complete coverage of every HTTP request with no extra effort. It is the right choice for most applications.

How response capture works To capture the response body, the middleware wraps the response stream with a buffer before the request travels down the pipeline. The response is written into memory first, then flushed to the client. This adds a small allocation per request. If your application is latency-sensitive or you prefer not to insert middleware into the pipeline, use custom logging instead and call Enqueue directly at the point where you already have the data you need.

Before you start

1
Create a project
2
Create a collection
See Create a collection. You will use its name as ApiLogsCollectionName.
3
Set ApiLogsCollectionName in SDK configuration
Optional if your secret key allows a single collection — the server resolves it automatically. Required if the key allows more than one. See SDK configuration.
4
Add the middleware
Program.cs
var app = builder.Build();

app.UsePinqloqRequestLogging();
To skip certain paths (health checks, Swagger, endpoints you log manually), use ExcludePaths. Matching is segment-based and case-insensitive: /api matches /api/orders but not /apixyz.
Program.cs
app.UsePinqloqRequestLogging(options =>
{
    options.ExcludePaths("/health", "/swagger", "/api/client-events");
});

Advanced usage

Use AddMetadata or AddDetail to add custom fields to your logs. Each callback receives the HttpContext and runs once per request. If a callback returns null or throws, that key is skipped. Your keys do not overwrite built-in fields. The only exception is event (the panel title). It defaults to "{method} {path}" and lives in Metadata. To override it, use AddMetadata("event", …).

Use SetDeviceIdentifier to resolve the required DeviceIdentifier per request (for example from a claim, header, or trace id). Use SetAppVersionName to set the version label per request. Both fall back to the matching global option (DeviceIdentifier / AppVersionName) when the callback returns null or empty.

Program.cs
app.UsePinqloqRequestLogging(options =>
{
    // Optional: the middleware already reads the "device-identifier" header. Use SetDeviceIdentifier only to override it.
    options.SetDeviceIdentifier(ctx => ctx.User.FindFirst("sub")?.Value);
    // Optional per-request version label — falls back to the global AppVersionName option
    options.SetAppVersionName(ctx => ctx.Request.Headers["X-App-Version"]);

    options.AddMetadata("userId", ctx => ctx.User.FindFirst("sub")?.Value);
    options.AddMetadata("correlationId", ctx => ctx.Request.Headers["X-Correlation-Id"]);

    options.AddDetail("userAgent", ctx => ctx.Request.Headers.UserAgent);
    // Override the default event title (metadata["event"])
    options.AddMetadata("event", ctx => ctx.Request.Path);
});
How the middleware resolves DeviceIdentifier The middleware resolves DeviceIdentifier in this order: SetDeviceIdentifier (overrides everything), then the device-identifier request header, then the global DeviceIdentifier option. If none of these yield a value, the request is rejected with HTTP 400 before it runs — nothing is logged for it. Guarantee a value with SetDeviceIdentifier(ctx => ctx.Request.Headers["device-identifier"].FirstOrDefault() ?? Environment.MachineName) or a global DeviceIdentifier.

What gets logged

Each request becomes one log. The Event field (the log title) is set to "{method} {path}" (e.g. GET /api/orders/42). The level comes from the response status. Request details go into Metadata:

StatusLevelMetadata
2xx / 3xxInformationevent, method, path, statusCode, durationMs
4xxWarning
5xxError

Request and response bodies go into Detail (RequestMethod, ResponseCode, InputJson, OutputJson), truncated at 32 KB. Bodies reach the panel — exclude paths that carry secrets or PII. Request and response headers can also be captured, as RequestHeaders and ResponseHeaders.

Need to mask sensitive fields? See Redacting sensitive values →
06

Create a project

The dashboard is at pinqloq.pinqponq.io. Create a project here to get your secret key.

1
Create a project
A secret key belongs to a project. You may want to use one project per environment to keep production and development logs separated.
2
Copy the secret key
Store it in user-secrets, an environment variable, or a secret manager. Never put it in client apps or front-end code.
07

Create a collection

A collection is a named bucket where logs are stored in the panel. You need at least one before you can send logs.

1
Create a collection
Open the dashboard, go to your project, and create a collection.
2
Copy the collection name
You will use this name in your SDK configuration as ApiLogsCollectionName, or set it per log entry as CollectionName.

Collections can be edited, disabled, or deleted from the dashboard. A key can write only to collections allowed for its project; logging to another collection returns 403 Forbidden.

08

Dashboard panel

After the SDK starts sending logs, use the dashboard panel to read them, manage who can see them, and control active panel sessions.

View logs

1
Open the log panel
Go to pinqloq-panel.pinqponq.io and sign in with the panel account created from the dashboard.
2
Choose a project and collection
Logs are grouped by project and collection. Pick the collection name you configured in ApiLogsCollectionName or sent on each log entry.
3
Filter and inspect logs
Use the panel filters to narrow logs by collection, level, source, event, device, or time range. New logs may appear after the SDK batch delay.

Manage panel users

ActionHow it works
Invite userOpen Team Members, choose Invite User, enter the email, set an initial password, and select the collections this user can access. Passwords must be at least 8 characters.
Set admin passwordFor an admin or owner account, use Edit to set or reset the panel password. This gives the admin access to the live log panel.
Edit permissionsFor regular users, use Edit to change collection access. Users can only see the collections selected for them.
Deactivate userUse the active/inactive badge to disable a non-admin user without deleting the account. Admin and owner accounts cannot be disabled from this control.
Delete userRemove a non-admin user when they should no longer have panel access. Admin and owner accounts are protected from deletion in this screen.

Sessions and devices

Each panel user can have up to 3 active sessions. A session is shown as an active device in the user's Devices panel. If a user reaches the session limit, remove an old device to free a slot before signing in again.

Plan limits

LimitIncluded usage
ProjectsYou can create as many projects as you need.
Collections2 collections are free. Additional collections are paid.
RetentionLogs are kept for 7 days for free in each collection. Keeping logs for more than 7 days is paid.
Panel sessionsEach panel user can have up to 3 active sessions.

The dashboard is used to create projects, collections, keys, and panel users. The log panel at pinqloq-panel.pinqponq.io is where those users sign in to view logs.

09

MCP server

Ask an AI assistant about your logs instead of opening the panel. The MCP server connects Claude, Cursor, or any other Model Context Protocol (MCP) client to your logs.

The MCP server is read-only. It reads your logs through the same panel API the log panel itself uses. It cannot write logs, and it cannot change any project, collection, or user in your dashboard.

What you can ask

ToolWhat it does
get_logsFetch logs. Filter by collection, level, device, app version, or time range.
search_logsSearch logs by text, across the identifier, metadata, and detail fields.
get_collectionsList the collections your key can access.
get_error_summaryGroup the errors in a time range and show which ones happen most.

Example prompts

Ask in plain language. The assistant picks the tool and the arguments for you.

You askWhat runs
"Show me today's errors"get_logs(level="error", startTime="today")
"What's failing the most in the last hour?"get_error_summary(timeRange="1h")
"Search the logs for NullReferenceException"search_logs(query="NullReferenceException")
"Which collections can I see?"get_collections()
It can find a bug and fix it Ask for more than a report: "Find why checkout is failing, and fix it." The assistant calls search_logs or get_error_summary to find the failing log entry, reads the stack trace in its detail field, opens the matching file in your project, and makes the fix. The same assistant session that reads your logs also has your code open.

Before you start

1
Generate an MCP key
Open the dashboard and go to the MCP Key tab to generate one company-wide key, or open Users to generate a key for one member instead.
2
Add the key to your AI client
Add the MCP server to your client's configuration, with your key in the secret_key header.
json
{
  "mcpServers": {
    "pinqloq": {
      "url": "https://pinqloq-mcp.pinqponq.io/mcp",
      "headers": { "secret_key": "<your-mcp-key>" }
    }
  }
}
Company key or member key? A company key, from the MCP Key tab, reaches every collection in the company. Give it only to admins. A member key, generated from Users, reaches only the collections that member is allowed. These are the same collections they see when they sign in to the log panel themselves. If a member's collection access changes, their key updates with it.
Treat an MCP key like a password Whoever holds a key can read every log in its collections. Don't share a company key with someone who should only see a few collections. Generate them a member key instead. If a key leaks, revoke it and generate a new one.
10

SDK configuration

Add the pinqloq NuGet package, then register the SDK once in Program.cs.

bash
dotnet add package pinqloq

SecretKey is required. Set ApiLogsCollectionName when you use the built-in pinqloq middleware or want a default collection. Logs without a CollectionName fall back to this value. Set DeviceIdentifier as the global fallback for the required per-log DeviceIdentifier field, so both middleware and manual logs ship with one.

Program.cs
builder.Services.AddPinqloq(options =>
{
    options.SecretKey             = builder.Configuration["Pinqloq:SecretKey"]!;
    options.ApiLogsCollectionName = builder.Configuration["Pinqloq:ApiLogsCollectionName"]!;
    options.DeviceIdentifier      = Environment.MachineName;
    options.AppVersionName        = builder.Configuration["Pinqloq:AppVersionName"];
    options.BatchSize             = 200;
    options.FlushInterval         = TimeSpan.FromSeconds(2);
    options.QueueCapacity         = 10000;
    options.HttpTimeout           = TimeSpan.FromSeconds(10);
});

Add a matching Pinqloq section to appsettings.json so these values resolve at runtime (see From appsettings.json below).

Options

OptionTypeDefaultDescription
SecretKeystringrequiredYour API secret, sent as the X-Secret-Key header.
ApiLogsCollectionNamestring?nullCollection for the built-in pinqloq middleware and for logs without a CollectionName. Optional for single-collection keys; required when the key allows several.
DeviceIdentifierstring?nullGlobal fallback for the required per-log DeviceIdentifier, applied to any log (middleware or manual) that doesn't set its own. Set this or use SetDeviceIdentifier, otherwise the server rejects logs with an empty DeviceIdentifier.
AppVersionNamestring?nullOptional version label, applied to any log that doesn't set its own.
BatchSizeint200Max logs per batch.
FlushIntervalTimeSpan2sMax wait before a partial batch is sent.
QueueCapacityint10000In-memory queue size. When full, new logs are dropped.
HttpTimeoutTimeSpan10sPer-request HTTP timeout.

From appsettings.json

Bind the options from configuration to keep the secret out of source code:

appsettings.json
{
  "Pinqloq": {
    "SecretKey": "lgl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "ApiLogsCollectionName": "myapp_api_logs",
    "AppVersionName": "1.0.0"
  }
}
Program.cs
builder.Services.AddPinqloq(options =>
    builder.Configuration.GetSection("Pinqloq").Bind(options));

Delivery callbacks

Enqueue takes two optional callbacks. Pass only the ones you need. Most code only uses onFailed:

With Enqueue (fire and forget, batched in the background):

C#
pinqloqLogger.Enqueue(entry,
    onFailed: (failedEntry, error) =>
        _logger.LogError(error.Exception,
            "Pinqloq log failed: {Reason} ({Status}) - {Message}",
            error.Reason, error.StatusCode, error.Message),
    onSent: sentEntry => { /* optional: metrics, tracing, etc. */ });

onSent runs once the log reaches the server. onFailed runs when the log is dropped or rejected. If the in-memory queue is full, onFailed fires immediately with reason QueueFull and Enqueue returns false.

onFailed gives you a PinqloqLogError:

FieldTypeDescription
ReasonPinqloqLogFailureReasonWhy it failed: Unauthorized, Forbidden, MissingCollection, QueueFull, HttpError, Timeout, Network, or Unknown.
StatusCodeint?The HTTP status when the server responded; null for non-HTTP failures.
MessagestringA plain-text description of what went wrong. Always present.
ExceptionException?The underlying exception when one was thrown; otherwise null.
Callbacks are optional. If you skip them, failures are still written to your application log — throttled, with the server's response. The built-in pinqloq middleware logs every request for you and has no call site, so its failures only go to the application log.

Production notes

Keep the secret key server-side It's a server credential. Store it in user-secrets, environment variables, or a secret manager. Never put it in client apps, mobile bundles, or front-end code.
DoWhy
Separate environmentsUse different collections and keys for prod and dev so test data stays out of production.
Don't log secrets or PIIStrip passwords, tokens, auth headers and personal data. Mask anything you must keep.
Trim large valuesTruncate big request/response bodies. Oversized batches are rejected.
Use Enqueue for high volumeNon-blocking and batched. It is the right choice for most logging scenarios.

Types & enums

A PinqloqLogEntry uses two enums. In C# you pass the enum value. On the raw HTTP payload, logLevel is a number and logSourceType is a string.

PinqloqLogLevelWhen to use
DebugVerbose diagnostics.
InformationNormal flow (the default).
WarningRecoverable issues.
ErrorFailures.
FatalUnrecoverable failures.
PinqloqLogSourceTypeMeaning
BackendThe log originated on your backend. Use this for backend events (the default).
DeviceThe log originated on a client/device. Set this for client logging.

On the raw payload, logLevel is the number 1–5 and logSourceType is the string "Backend" / "Device" (case-insensitive).

11

Troubleshooting

SymptomCause & fix
401 UnauthorizedMissing or wrong secret key. Check SecretKey and the value you copied from the dashboard.
403 ForbiddenThe collection isn't allowed for your key. The SDK drops logs for that collection and writes one throttled error to your app logs; other collection groups continue. Add the collection to your project, or log to an allowed one.
400 Bad RequestThe key allows multiple collections but no collection name was sent, logSourceType is invalid, or a required field (Event / DeviceIdentifier) is empty. Set ApiLogsCollectionName or a per-entry CollectionName, and make sure every log has an Event and a DeviceIdentifier. Details are in your app logs.
A single entry is missingEntries with an empty Event are skipped server-side; the rest of the batch is stored. A missing DeviceIdentifier is stricter — Enqueue throws before sending (unless a global DeviceIdentifier is set). Set both on every entry.
Logs not in the panelBatches send every ~2s or at BatchSize. Allow a short delay. Check the collection name and let the host shut down gracefully so the dispatcher can drain remaining logs.
Middleware does nothingMake sure UsePinqloqRequestLogging() is registered early, before any middleware that ends the request.
Same event logged twiceYou log an endpoint manually and also run the built-in pinqloq middleware, so the request is captured by both. Exclude that path: UsePinqloqRequestLogging(o => o.ExcludePaths("/api/client-events")).
Logs dropped under loadThe in-memory queue is full. Raise QueueCapacity or lower FlushInterval.
12

Redacting sensitive values

Sensitive values — passwords, tokens, card numbers — shouldn't end up in your logs. Add one of two attributes to your code and pinqloq masks them automatically; no other changes needed. This works with MVC controllers, not with minimal API endpoints (app.MapGet/MapPost).

Add [PinqloqRedact] above a single field to hide just that field's value, wherever it shows up — even nested inside another object. Everything else in the request and response is still logged as usual.

C#
public class AuthResponse
{
    [PinqloqRedact]
    public string Token { get; set; } = "";

    public string UserId { get; set; } = "";
}

Add [PinqloqRedactEndpoint] above an entire endpoint — or above the whole controller to cover every endpoint in it — to hide everything it sends and receives: every field, every header. Use it for endpoints that only ever handle sensitive data, like payments or password resets.

C#
[ApiController]
[Route("api/user")]
public class UserController : ControllerBase
{
    [HttpPost("Auth")]
    public AuthResponse Auth([FromBody] AuthRequest request) => ...;

    [PinqloqRedactEndpoint]
    [HttpPost("Payment")]
    public IActionResult Payment([FromBody] PaymentRequest request) => ...;
}

Log for Auth:

JSON
{ "token": "*****REDACTED*****", "userId": "64" }

Log for Payment (every value masked, including headers):

JSON
{ "cardNumber": "*****REDACTED*****", "amount": "*****REDACTED*****" }

[PinqloqRedact] only works on JSON bodies — if a request or response isn't JSON (form data, plain text), the field you marked is logged as-is, unmasked. [PinqloqRedactEndpoint] doesn't have this gap: a non-JSON body is still replaced with a single masked value, so it's always protected.

Using redaction from your own middleware If you have your own request-logging middleware instead of UsePinqloqRequestLogging, call PinqloqRedaction.Resolve(httpContext) directly — it runs the same reflection (cached per action) and returns a PinqloqRedactionPlan with RedactAll, HasRedactions, and ShouldRedact(name). Resolve it once per request and reuse it for every field you check.
13

AI helper

Two prompts below cover the two things an AI agent can do for you: add pinqloq logging to your project, or connect an AI assistant to logs you already have. Paste the one you need into Claude Code, Cursor, or any agent.

Integrate the SDK

A machine-readable reference for this prompt is available at documentation.md. The agent reads it, asks you which approach, collection, and fields to use, then applies your choice inside your project.

Prompt Paste into Claude Code, Cursor or any agent
Integrate the pinqloq .NET SDK into my project. First read the full reference: https://pinqloq.pinqponq.io/documentation.md

If you cannot reach that URL or fail to read the reference, stop immediately, do not guess or write any code, and tell me that you could not load the reference. In that case, I can download the markdown file manually from https://pinqloq.pinqponq.io/documentation.html#ai-prompt and provide it to you directly.

Before anything else, ask me which language I prefer to continue in.

Then inspect my project (Program.cs, appsettings.json, existing middleware, and DI setup) and ask me these questions one step at a time before writing any code:

	1. What do you want to log?
	   - Backend only (HTTP requests, business events, services, background jobs, etc.)
	   - Client only (events coming from a mobile app, web app, or any other device forwarded through your backend)
	   - Both

	2. (If backend was included in question 1) What do you want to log on the backend?
	   - HTTP requests
	   - Other backend events (business events, exceptions, background job results, etc.)
	   - Both

	3. (If HTTP requests was included in question 2) How do you want to log HTTP requests?
	   - Automatically log every HTTP request with built-in pinqloq middleware (note: the middleware wraps the response stream with a buffer to capture the response body, which adds a small memory allocation per request)
	   - Manually log specific HTTP requests using custom logging (inject IPinqloqLogger and call Enqueue from wherever I have the data)

You cannot access the pinqloq dashboard yourself, so also tell me the manual setup I must do there first at https://pinqloq.pinqponq.io: (1) create a project, (2) copy its secret key and store it server-side (user-secrets, an environment variable, or a secret manager; never in client or front-end code), (3) create a collection and copy its name to use as ApiLogsCollectionName or per-entry CollectionName, and (4) open Team Members, use Edit on my admin or owner account, and set a panel password of at least 8 characters (this gives me access to the live log panel to view logs).
After I answer, register the SDK once with AddPinqloq(...) in Program.cs, keep the secret key in config, never log secrets or PII, and finish by summarizing both what you changed in code and the exact dashboard steps I still need to complete.

Connect an AI assistant to your logs

Use this instead if you just want to ask an assistant about logs you already have. No SDK integration needed. See MCP server for what this connects to.

Prompt Paste into Claude Code, Claude Desktop, Cursor or any MCP client
Connect me to the pinqloq MCP server.

{
  "mcpServers": {
    "pinqloq": {
      "url": "https://pinqloq-mcp.pinqponq.io/mcp",
      "headers": { "secret_key": "<my-key>" }
    }
  }
}